Selaa lähdekoodia

增加中标登记和中标推送输入信息内容

mork 2 viikkoa sitten
vanhempi
sitoutus
4c21f7b01e

+ 6 - 6
public/static/config/config.js

@@ -4,17 +4,17 @@ window.CONFIG = {
   DMS_URL: 'http://121.43.55.7:10081/dms',
   ONEMAP_URL: 'http://121.43.55.7:2120/autoLogin',
   SQ_URL: 'http://121.43.55.7:10026/shenqin',
-  //1743:在管项目 1783:待办项目 1779:投标/续标 1794:招标公告 1793:招标意向 1821:招标监控 1781:开标监控 
-  // 1795:结果公告 1813:业态服务栏目 1809:行政编码及片区 1832:澄清公告栏目 1833:续签项目栏目
-  COLUMNIDARR:[1743,1783,1779,1794,1793,1821,1781,1795,1813,1809,1832,1833],
-  //1852:投标/续标栏目 1872:招标公告栏目 1930:招标监控 1854:开标监控 1870:意向公告 1948:澄清公告栏目 1950:续签项目栏目
-  MODELIDARR:[1852,1872,1930,1854,1870,1948,1950],
+  //1743:在管项目 1783:待办项目 1779:投标/续标 1838:招标公告 1837:招标意向 1821:招标监控 1781:开标监控 
+  // 1839:结果公告 1813:业态服务栏目 1809:行政编码及片区 1832:澄清公告栏目 1833:续签项目栏目
+  COLUMNIDARR:[1743,1783,1779,1838,1837,1821,1781,1839,1813,1809,1832,1833],
+  //1852:投标/续标栏目 1955:招标公告栏目 1930:招标监控 1854:开标监控 1954:意向公告 1948:澄清公告栏目 1950:续签项目栏目
+  MODELIDARR:[1852,1955,1930,1854,1954,1948,1950],
 
   TASKLIST: [
     { id: 1, seq:2, type: 1, text: '客户回访与续标意向确认', done: false,create_time:'',username:'',userid:''},
     { id: 2, seq:2, type: 1, text: '现场踏勘与服务评估', done: false,create_time:'',username:'',userid:''},
     { id: 3, seq:3, type: 1, text: '关注招标公告发布(监控中)', done: false,create_time:'',username:'',userid:''},
-    { id: 4, seq:4, type: 1, text: '报名并获取招标文件', done: false,create_time:'',username:'',userid:''},
+    { id: 4, seq:4, type: 1, text: '报名并获取招标公告', done: false,create_time:'',username:'',userid:''},
     { id: 5, seq:4, type: 1, text: '标书需求拆解与生成', done: false,create_time:'',username:'',userid:''},
     { id: 6, seq:5, type: 1, text: '登记投标信息', done: false,create_time:'',username:'',userid:''},
     { id: 7, seq:6, type: 1, text: '开标标书监控', done: false,create_time:'',username:'',userid:''},

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 88 - 0
public/static/data/index.html


+ 784 - 0
src/components/bidResult/addContent.vue

@@ -0,0 +1,784 @@
+<template>
+  <div class="bid-content-page">
+    <div class="bid-container">
+
+      <el-dialog v-model="dialogFormVisible" draggable title="提示信息" width="500" @close="close">
+        <el-form label-width="auto" :model="addForm" :rules="rules" ref="formRef" style="max-height: 500px;overflow: auto;">
+          <el-form-item label="登记类型">
+            <el-select v-model="addForm.type" placeholder="请选择登记类型"  value-key="value" @change="handleTypeChange" >
+              <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="项目名称" v-if="addForm.type == '监控中'">
+            <el-select v-model="addForm.title" placeholder="请选择项目名称" @change="handleProjectChange"  value-key="id">
+              <el-option v-for="item in jkList" :key="item.id" :label="item.title" :value="item" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="项目名称" v-else-if="addForm.type == '投续标'">
+            <el-select v-model="addForm.title" placeholder="请选择项目名称" @change="handleProjectChange"  value-key="id">
+              <el-option v-for="item in txbList" :key="item.id" :label="item.title" :value="item" />
+            </el-select>
+          </el-form-item>
+           <el-form-item label="类似项目名称" prop="title"  v-else>
+              <el-cascader v-model="adminCascader" :options="adminArea" :show-all-levels="true"  @change="handleAdminCascaderChange" style="width: 100%"></el-cascader>
+            </el-form-item>
+          <!-- <el-form-item label="项目名称" v-else>
+            <el-input v-model="addForm.title" autocomplete="off" placeholder="请输入项目名称"/>
+          </el-form-item> -->
+          <!-- <el-form-item label="中标类型选项">
+            <el-switch v-model="finishBidObjectTemp.flag" inline-prompt active-text="从中标结果中选择" inactive-text="手动输入" style="background-color: unset;" @change="handleSwitchChange"/>
+          </el-form-item>
+          <div v-if="finishBidObjectTemp.flag">
+            <el-form-item label="中标项目">
+              <el-select v-model="finishBidObject" filterable placeholder="请选择中标项目" style="width: 100%;overflow: auto;"  @change="handleChange" value-key="id">
+                <el-option v-for="item in finishBidOption" :key="item.id" :label="item.title" :value="item" :title="item.title" style="width: 380px;"/>
+              </el-select>
+            </el-form-item>
+          </div>
+          <div v-else> -->
+            <div v-if="addForm.type == '新创建'">
+              <el-form-item label="是否续标">
+                <el-switch v-model="addForm.c_is_xb" inline-prompt active-text="是" inactive-text="否" style="background-color: unset;" @change="handleXBSwitchChange"/>
+              </el-form-item>
+            </div>
+            <el-form-item label="中标结果URL">
+              <el-input v-model="finishBidObjectTemp.url" placeholder="请输入中标结果URL"/>
+            </el-form-item>
+          <!-- </div> -->
+          <div  v-if="addForm.type != '监控中'">
+              <el-form-item label="管理区域" prop="c_glqy">
+                <el-cascader ref="areaCascader" v-model="addFormArea" :options="allArea" :show-all-levels="true"  @change="handleNodeAreaClick" style="width: 100%"></el-cascader>
+              </el-form-item>
+              <el-form-item label="投标日期" prop="tb_date">
+                <el-date-picker
+                  style="width: 100%;"
+                  v-model="addForm.tb_date"
+                  type="date"
+                  placeholder="请选择投标日期"
+                />
+              </el-form-item>
+              <el-form-item label="投标报价" prop="tb_money">
+                <el-input-number
+                  style="width: 100%"
+                  v-model="addForm.tb_money"
+                  controls-position="right"
+                  placeholder="请输入投标报价"
+                />
+              </el-form-item>
+              <el-form-item label="招标编号" prop="zb_code">
+                <el-input v-model="addForm.zb_code" autocomplete="off" placeholder="请输入招标编号"/>
+              </el-form-item>
+              <el-form-item label="招标项目名称" prop="zb_name">
+                <el-input v-model="addForm.zb_name" autocomplete="off" placeholder="请输入招标项目名称"/>
+              </el-form-item>
+              <el-form-item label="招标发布机构" prop="zb_org">
+                <el-input v-model="addForm.zb_org" autocomplete="off" placeholder="请输入招标发布机构"/>
+              </el-form-item>
+              <el-form-item label="招标数据来源" prop="zb_source">
+                <el-input v-model="addForm.zb_source" autocomplete="off" placeholder="请输入招标数据来源"/>
+              </el-form-item>
+              <el-form-item label="招标金额" prop="zb_money">
+                <el-input-number
+                  style="width: 100%"
+                  v-model="addForm.zb_money"
+                  controls-position="right"
+                  placeholder="请输入招标金额"
+                />
+              </el-form-item>
+              <el-form-item label="开标发布日期" prop="zb_startdate">
+                <el-date-picker
+                  style="width: 100%;"
+                  v-model="addForm.zb_startdate"
+                  type="datetime"
+                  placeholder="请选择开标发布日期"
+                />
+              </el-form-item>
+              <el-form-item label="开标截止日期" prop="zb_enddate">
+                <el-date-picker
+                  style="width: 100%;"
+                  v-model="addForm.zb_enddate"
+                  type="datetime"
+                  placeholder="请选择开标截止日期"
+                />
+              </el-form-item>
+              <el-form-item label="招标详情URL" prop="zb_url">
+                <el-input v-model="addForm.zb_url" autocomplete="off" placeholder="请输入招标详情URL"/>
+              </el-form-item>
+                
+          </div>
+
+          <div  v-if="addForm.type != '监控中'">
+              <el-form-item label="业态" prop="c_ytfw">
+                <el-tree-select
+                      placeholder="请选择业态"
+                      v-model="addFormYT"
+                      :data="ytList"
+                      collapse-tags
+                      filterable
+                      style="width: 100%"
+                    />
+              </el-form-item>
+              <el-form-item label="委托类型" prop="c_zgfw">
+                <el-radio v-model="addFormZgfw" label="全委">全委</el-radio>
+                <el-radio v-model="addFormZgfw" label="单一单委">单一单委</el-radio>
+                <el-radio v-model="addFormZgfw" label="多项单委">多项单委</el-radio>
+              </el-form-item>
+              
+              <el-form-item label="服务类型" prop="c_fwlx">
+                <el-checkbox-group v-model="addFormFwlx">
+                  <el-checkbox label="会务"></el-checkbox>
+                  <el-checkbox label="工程"></el-checkbox>
+                  <el-checkbox label="绿化"></el-checkbox>
+                  <el-checkbox label="保安"></el-checkbox>
+                  <el-checkbox label="保洁"></el-checkbox>
+                </el-checkbox-group>
+              </el-form-item>
+
+          </div>
+
+
+        </el-form>
+        <template #footer>
+          <div class="dialog-footer">
+            <el-button @click="close" class="btn">取消</el-button>
+            <el-button type="primary" class="btn enter-btn" @click="submitForm(formRef)">
+              确认
+            </el-button>
+          </div>
+        </template>
+      </el-dialog>
+
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref,onMounted } from 'vue'
+import moment from 'moment'
+import api from '@/api/common'
+import CONFIG from '@/utils/config'
+import type { FormInstance } from 'element-plus'
+const formRef = ref<FormInstance>()
+
+const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
+const userName = userInfo?.username =='user_xtw' ? '徐天炜' : userInfo?.username || ''
+
+const props = defineProps({
+  flag: {
+    type: Boolean,
+    default: false,
+  },
+  close: {
+    type: Function,
+    default: () => {},
+  }
+})
+
+
+interface resultForm {
+  [key: string]: any
+}
+const finishObject = ref<resultForm>({})
+const finishProjects = ref<any[]>([])
+const finishTreeProjects = ref<any[]>([])
+
+const txbList = ref<any[]>([])
+const jkList = ref<any[]>([])
+
+const ytList = ref<resultForm[]>([])
+const glArea = ref([{} as TreeItem])
+const addFormZgfw = ref('')
+const addFormFwlx = ref([])
+const addFormYT = ref('')
+const addFormArea = ref([])
+
+interface TreeItem {
+  id: string | number
+  value: string
+  label: string
+  children: TreeItem[],
+  [key: string]: any
+}
+const areaCascader = ref(null)
+const areaObject = ref({})
+const adminCascader = ref([])
+const adminArea = ref([{} as TreeItem])
+const allArea = ref([{} as TreeItem])
+const finishBidOption = ref([{} as resultForm])
+const jkBidObject = ref<any>(null)
+const txbBidObject = ref<any>(null)
+const finishBidObject = ref<any>(null)
+const finishBidObjectTemp = ref({
+  flag:false,
+  url:''
+})
+
+onMounted(() => {
+  initData()
+})
+const initData = async () => {
+    await getFinishProjects()
+    const itemTxbList = await getTypeProjects(CONFIG.COLUMNIDARR[2]) // 投续标项目
+    const itemJkList = await getTypeProjects(CONFIG.COLUMNIDARR[6]) // 中标监控项目
+    const itemFinishList = await getTypeProjects(CONFIG.COLUMNIDARR[7]) // 已中标项目
+    const itemYtList = await getTypeProjects(CONFIG.COLUMNIDARR[8]) // 业态
+    const itemGLList = await getTypeProjects(CONFIG.COLUMNIDARR[9]) // 管理区域
+    console.log(itemFinishList)
+    finishBidOption.value = itemFinishList.data || []
+    txbList.value = []
+    jkList.value = []
+    glArea.value = []
+    allArea.value = []
+    ytList.value = []
+    itemTxbList.data.filter((item: any) => {
+        const json = JSON.parse(item.c_xmjd_json)
+        if(json.length > 0 &&  json[json.length - 1].xmjd < 6){
+        txbList.value.push(item)
+        }
+    })
+    itemJkList.data.filter((item: any) => {
+        const flag = item.c_sfzb
+        if(flag == false){// 已中标
+            jkList.value.push(item)
+        }
+    })
+    ytList.value = itemYtList.data.map((item: any) => ({
+        ...item,
+        label: item.c_yt_name,
+        value: item.c_yt_name,
+        children: item.children || []
+    }))
+    // glArea.value = itemGLList.data
+    //     .filter((item: any) => item?.c_part_name && item?.c_district_code?.startsWith('3101')) // 过滤空、null、undefined、''
+    //     .map((item: any) => ({
+    //     label: item.c_part_name,
+    //     value: item.c_part_name,
+    //     children: []
+    // }))
+    // const uniqueGlTree = Array.from(
+    //     new Map(glArea.value.map(item => [item.value, item])).values()
+    // )
+    // glArea.value = uniqueGlTree
+
+    adminArea.value = itemGLList.data.filter((item: any) => item?.c_district_name && item?.c_district_code?.startsWith('310')) // 过滤空、null、undefined、''
+      .map((item: any) => ({
+        label: item.c_district_name,
+        value: item.c_district_name,
+        children: finishTreeProjects.value.filter((item2: any) => item.c_district_name.includes(item2.c_sq))
+      }))
+      const uniqueTree = Array.from(
+        new Map(adminArea.value.map(item => [item.value, item])).values()
+      )
+    adminArea.value = uniqueTree
+    allArea.value = buildAreaTree(itemGLList.data)
+    console.log(itemFinishList)
+}
+const dialogFormVisible = props.flag
+const close = () => {
+  props.close()
+}
+
+const getFinishProjects = async () => {
+  const params: any = {
+    columnId: CONFIG.COLUMNIDARR[0], //原项目数据
+    orderBy: JSON.stringify([{ field: "c_zgxmhtdqrq", orderByType: 1 }]),
+    states: '0',// 只看草稿箱
+    pageSize: 9999,
+    page: 0
+  }
+  await api.getDmsDataList(params).then(res => {
+    if ((res as any).code === 200) {
+      finishProjects.value = (res as any).content.data
+      finishTreeProjects.value = buildTree(finishProjects.value)
+      
+    }else{
+      finishProjects.value = []
+    }
+  })
+}
+const buildTree = (data: any[]): any[] => {
+  const map = new Map()
+  const tree: any[] = []
+
+  data.forEach((item: any) => {
+    map.set(item.c_guid, {
+      ...item,
+      value: item.id,
+      label: item.title,
+      children: []
+    })
+  })
+
+  data.forEach((item: any) => {
+    const node = map.get(item.c_guid)
+    if (item.c_father_code && map.has(item.c_father_code)) {
+      // map.get(item.c_father_code).children.push(node)
+    } else {
+      tree.push(node)
+    }
+  })
+  return tree
+}
+
+const typeOptions = ref([
+{
+    value: '新创建',
+    label: '新创建',
+},
+{
+    value: '监控中',
+    label: '监控中',
+},
+{
+    value: '投续标',
+    label: '投续标',
+},
+])
+
+
+const addForm = ref({
+  id: '',
+  type: '新创建',
+  title: '',
+  tb_date:'',
+  tb_money:'',
+  zb_code:'',
+  zb_name:'',
+  zb_org:'',
+  zb_source:'',
+  zb_money:'',
+  zb_startdate:'',
+  zb_enddate:'',
+  zb_url:'',
+  c_is_xb:false,
+})
+
+const rules = ref({
+  
+})
+// interface ProjectItem {
+//   [key: string]: any
+// }
+const submitForm = (formEl: FormInstance | undefined) => {
+  if (!formEl) return
+  formEl.validate(async (valid) => {
+    if (valid) {
+      if(addForm.value.type == '监控中'){
+        //流程
+        const id = 7  // 固定进度数值
+        const rwlcqd = JSON.parse(txbBidObject.value.rwlcqd || '[]')
+        rwlcqd.find((p: any) => p.id == id).done = true
+        rwlcqd.find((p: any) => p.id == id).create_time = moment().format('YYYY-MM-DD HH:mm')
+        rwlcqd.find((p: any) => p.id == id).username = userName
+        rwlcqd.find((p: any) => p.id == id).userid = userInfo?.id || ''
+        rwlcqd.find((p: any) => p.id == id).type = 0
+
+        // 进度
+        let xmjd_json = JSON.parse(txbBidObject.value.c_xmjd_json || '[]');
+        xmjd_json[5].create_time = moment().format('YYYY-MM-DD HH:mm')
+        xmjd_json[5].username = userName
+        xmjd_json[5].userid = userInfo?.id || ''
+        xmjd_json[5].type = 0
+        if(!xmjd_json[6]){
+          xmjd_json.push({xmjd: id, type: 1, create_time: '', username: '', userid: ''})
+        }
+        const content = JSON.stringify({
+          id: txbBidObject.value.id,
+          rwlcqd:rwlcqd,
+          c_xmjd_json:xmjd_json
+        })
+        updateProject(CONFIG.COLUMNIDARR[2],CONFIG.MODELIDARR[0],content)
+        // 修改中标监控
+        const steps = [
+          { n: 1, label: '预警触发'},
+          { n: 2, label: '投/续标准备'},  
+          { n: 3, label: '招标监控'},
+          { n: 4, label: '标书制作'},
+          { n: 5, label: '投标提交'},
+          { n: 6, label: '开标监控'},
+          { n: 7, label: '确认中标'},
+        ]
+        let json = xmjd_json.map((item:any) => {
+          return {
+            create_time: item.create_time ? item.create_time : moment().format('YYYY-MM-DD HH:mm'),
+            desc:steps.find((s:any) => s.n == item.xmjd)?.label || '',
+            username:item.username ? item.username : userName,
+            userid:item.userid ? item.userid : userInfo?.id || '',
+          }
+        })
+        const content2 = JSON.stringify({
+          id: jkBidObject.value.id || '',
+          c_gljg: finishBidObjectTemp.value?.flag ? finishBidObject.value?.id : '',
+          c_jgjk_url: finishBidObjectTemp.value?.flag ? finishBidObject.value?.c_detail_url : finishBidObjectTemp.value?.url || '',
+          c_lcsjx:json || '',
+          c_sfzb:true,
+          c_type:"中标登记",
+          c_enable: false
+        })
+        updateProject(CONFIG.COLUMNIDARR[6],CONFIG.MODELIDARR[3],content2)
+
+      }else if(addForm.value.type == '投续标'){
+        //流程
+        const rwlcqd = JSON.parse(selectedObject.value.rwlcqd || '[]')
+        rwlcqd.forEach((p: any) => {
+          if(!p.danger && p.id !=8){//未处理的流程全部重新处理
+            p.done = true,
+            p.create_time = moment().format('YYYY-MM-DD HH:mm'),
+            p.username = userName,
+            p.userid = userInfo?.id || '',
+            p.type = 0
+          }
+        })
+        let xmjd_json = JSON.parse(selectedObject.value.c_xmjd_json || '[]');
+        const curNumber = xmjd_json[xmjd_json.length - 1].xmjd
+        for(let i = curNumber; i < 8; i++){
+           if(i == curNumber){
+            xmjd_json[i-1].create_time = moment().format('YYYY-MM-DD HH:mm')
+            xmjd_json[i-1].username = userName
+            xmjd_json[i-1].userid = userInfo?.id || ''
+            xmjd_json[i-1].type = 0
+           }else{
+              if( i == 7){
+                xmjd_json.push({xmjd: i, type: 1, create_time: '', username: '', userid: ''})
+              }else{
+                xmjd_json.push({xmjd: i, type: 0, create_time: moment().format('YYYY-MM-DD HH:mm'), username: userName, userid: userInfo?.id || ''}) 
+              }
+           }
+        }
+        const steps = [
+          { n: 1, label: '预警触发'},
+          { n: 2, label: '投/续标准备'},  
+          { n: 3, label: '招标监控'},
+          { n: 4, label: '标书制作'},
+          { n: 5, label: '投标提交'},
+          { n: 6, label: '开标监控'},
+          { n: 7, label: '确认中标'},
+        ]
+        let json = xmjd_json.map((item:any) => {
+          return {
+            create_time: item.create_time ? item.create_time : moment().format('YYYY-MM-DD HH:mm'),
+            desc:steps.find((s:any) => s.n == item.xmjd)?.label || '',
+            username:item.username ? item.username : userName,
+            userid:item.userid ? item.userid : userInfo?.id || '',
+          }
+        })
+
+
+        // 开标监控
+        let kbFormData = {
+          title: selectedObject.value.title,
+          content: selectedObject.value.content,
+          c_zbbh: selectedObject.value.c_xgzb ? selectedObject.value.c_xgzb : addForm.value.zb_code,
+          c_sfzb: true,
+          c_jgjk_url: finishBidObjectTemp.value?.url || '',
+          c_kbsj: selectedObject.value.zbjzsj ? selectedObject.value.zbjzsj : addForm.value.zb_enddate,
+          c_xmmc: selectedObject.value.c_xmbt,
+          c_zbtjr: selectedObject.value.tbrq ? selectedObject.value.tbrq : addForm.value.tb_date,
+          c_tbbj: selectedObject.value.tbbj ? selectedObject.value.tbbj : addForm.value.tb_money,
+          c_glxm: selectedObject.value.xmbh,
+          c_lcsjx: json || '',
+          c_type: '中标登记',
+          c_enable: false
+        }
+        console.log(kbFormData)
+        const res = await addContentParams(kbFormData,CONFIG.COLUMNIDARR[6],CONFIG.MODELIDARR[3])
+        let desc = {
+          zb_project_code: selectedObject.value.c_xgzb ? selectedObject.value.c_xgzb : addForm.value.zb_code,
+          zb_source_name: addForm.value.zb_source,
+          zb_project_name: addForm.value.zb_name,
+          zb_budget_amount: selectedObject.value.tbbj ? selectedObject.value.tbbj : addForm.value.tb_money,
+          zb_detail_url: finishBidObjectTemp.value?.url || '',
+          zb_publish_time:  selectedObject.value.zbkssj ? selectedObject.value.zbkssj : addForm.value.zb_startdate,
+          zb_bid_deadline: selectedObject.value.zbjzsj ? selectedObject.value.zbjzsj : addForm.value.zb_enddate,
+          zb_author: userName
+        }
+        let areaArr = (areaObject.value as any)?.pathLabels || []
+        let tbFormData = {
+          id: selectedObject.value.id || '',
+          c_zgfw: selectedObject.value.c_zgfw ? selectedObject.value.c_zgfw : addFormZgfw.value,
+          c_xgzb: selectedObject.value.c_xgzb ? selectedObject.value.c_xgzb : addForm.value.zb_code,
+          c_xgjk: (res as any).content || '',
+          c_xmbtqc: selectedObject.value.c_xmbt,
+          c_qx: selectedObject.value.c_qx ? selectedObject.value.c_qx : areaArr[0] || '',
+          c_xmbt: selectedObject.value.c_xmbt,
+          c_xmjd_json:xmjd_json,
+          zbxmbh: selectedObject.value.c_xgzb ? selectedObject.value.c_xgzb : addForm.value.zb_code,
+          tbrq: selectedObject.value.tbrq ? selectedObject.value.tbrq : addForm.value.tb_date,
+          tbbj: selectedObject.value.tbbj ? selectedObject.value.tbbj : addForm.value.tb_money,
+          zbkssj: selectedObject.value.zbkssj ? selectedObject.value.zbkssj : addForm.value.zb_startdate,
+          zbjzsj: selectedObject.value.zbjzsj ? selectedObject.value.zbjzsj : addForm.value.zb_enddate,
+          rwlcqd: rwlcqd,
+          zbmsxx: selectedObject.value.zbmsx ? selectedObject.value.zbmsx : desc,
+          c_ytfw: selectedObject.value.ytfxw ? selectedObject.value.ytfxw : addFormYT.value,
+          c_fwlx: selectedObject.value.fwlx ? selectedObject.value.fwlx : addFormFwlx.value.toString(),
+          c_glqy: selectedObject.value.glqy ? selectedObject.value.glqy : areaArr[1] || '',
+        }
+        updateProject(CONFIG.COLUMNIDARR[2],CONFIG.MODELIDARR[0],JSON.stringify(tbFormData))
+        // console.log("其他")
+      }else{
+        console.log("其他")
+         //流程
+        const rwlcqd = CONFIG.TASKLIST
+        rwlcqd.forEach((p: any) => {
+          if(!p.danger && p.id !=8){//未处理的流程全部重新处理
+            p.done = true,
+            p.create_time = moment().format('YYYY-MM-DD HH:mm'),
+            p.username = userName,
+            p.userid = userInfo?.id || '',
+            p.type = 0
+          }
+        })
+        let xmjd_json = [];
+        for(let i = 1; i < 8; i++){
+            if( i == 7){
+              xmjd_json.push({xmjd: i, type: 1, create_time: '', username: '', userid: ''})
+            }else{
+              xmjd_json.push({xmjd: i, type: 0, create_time: moment().format('YYYY-MM-DD HH:mm'), username: userName, userid: userInfo?.id || ''}) 
+            }
+        }
+        const steps = [
+          { n: 1, label: '预警触发'},
+          { n: 2, label: '投/续标准备'},  
+          { n: 3, label: '招标监控'},
+          { n: 4, label: '标书制作'},
+          { n: 5, label: '投标提交'},
+          { n: 6, label: '开标监控'},
+          { n: 7, label: '确认中标'},
+        ]
+        let json = xmjd_json.map((item:any) => {
+          return {
+            create_time: item.create_time ? item.create_time : moment().format('YYYY-MM-DD HH:mm'),
+            desc:steps.find((s:any) => s.n == item.xmjd)?.label || '',
+            username:item.username ? item.username : userName,
+            userid:item.userid ? item.userid : userInfo?.id || '',
+          }
+        })
+        // 开标监控
+        let kbFormData = {
+          title: finishObject.value.title,
+          content: finishObject.value.content,
+          c_zbbh: addForm.value.zb_code,
+          c_sfzb: true,
+          c_jgjk_url: finishBidObjectTemp.value?.url || '',
+          c_kbsj: addForm.value.zb_enddate,
+          c_xmmc: finishObject.value.c_xmmc,
+          c_zbtjr: addForm.value.tb_date,
+          c_tbbj: addForm.value.tb_money,
+          c_glxm: finishObject.value.c_guid,
+          c_lcsjx: json || '',
+          c_type: '中标登记',
+          c_enable: false
+        }
+        console.log(kbFormData)
+        const res = await addContentParams(kbFormData,CONFIG.COLUMNIDARR[6],CONFIG.MODELIDARR[3])
+        let desc = {
+          zb_project_code: addForm.value.zb_code,
+          zb_source_name: addForm.value.zb_source,
+          zb_project_name: addForm.value.zb_name,
+          zb_budget_amount: addForm.value.tb_money,
+          zb_detail_url: finishBidObjectTemp.value?.url || '',
+          zb_publish_time:  addForm.value.zb_startdate,
+          zb_bid_deadline: addForm.value.zb_enddate,
+          zb_author: userName
+        }
+        let areaArr = (areaObject.value as any)?.pathLabels || []
+        let tbFormData = {
+          title: finishObject.value.title,
+          content: finishObject.value.content,
+          c_sfzb: finishObject.value.c_htqyjf,
+          c_zgfw: addFormZgfw.value ? addFormZgfw.value : finishObject.value.c_wtfs || '',
+          c_kssj: moment(finishObject.value.c_zgxmhtksrq).format('YYYY-MM-DD HH:mm') || '',
+          c_dqsj: moment(finishObject.value.c_zgxmhtdqrq).format('YYYY-MM-DD HH:mm') || '',
+          xmbh: finishObject.value.c_guid,
+          c_nh: finishObject.value.c_nhhtsr || '',
+          c_is_xb: addForm.value.c_is_xb,
+          c_xgzb: addForm.value.zb_code,
+          c_xgjk: (res as any).content || '',
+          c_xmbtqc: finishObject.value.c_xmmc,
+          c_qx: areaArr[0] ? areaArr[0] : finishObject.value.c_sq || '',
+          c_xmbt: finishObject.value.c_xmmc,
+          c_xmjd_json:xmjd_json,
+          zbxmbh: addForm.value.zb_code,
+          tbrq: addForm.value.tb_date,
+          tbbj: addForm.value.tb_money,
+          zbkssj: addForm.value.zb_startdate,
+          zbjzsj: addForm.value.zb_enddate,
+          rwlcqd: rwlcqd,
+          zbmsxx: desc,
+          c_ytfw: addFormYT.value,
+          c_fwlx: addFormFwlx.value.toString(),
+          c_glqy: areaArr[1] ? areaArr[1] : finishObject.value.c_glqynbkj || '',
+        }
+        await addContentParams(tbFormData,CONFIG.COLUMNIDARR[2],CONFIG.MODELIDARR[0])
+      }
+    } else {
+      // console.log('error submit!')
+    }
+  
+    close()
+  })
+}
+const addContentParams = async (formData: any,columnId:number,modelId:number) => {
+    const params = {
+        content: JSON.stringify(formData),
+        columnId: columnId,
+        modelId: modelId,
+      }
+      const res = await api.addContent(params)
+      return res
+}
+
+const handleTypeChange = (val: any) => {
+  addForm.value.title = ''
+  addForm.value.type = val || ''
+}
+const selectedObject = ref<any>({})
+const handleProjectChange = async (val: any) => {
+  addForm.value.title = val.title || ''
+  jkBidObject.value = null
+  txbBidObject.value = null
+  finishBidObject.value = null
+  if(addForm.value.type == '监控中'){
+    jkBidObject.value = val
+    const res = await getTxbBidContent(CONFIG.COLUMNIDARR[2],val.id,"c_xgjk")
+    txbBidObject.value = res || {}
+  }else{
+    selectedObject.value = val
+  }
+  console.log("项目名称:", val)
+}
+const getTypeProjects = async (columnId:number) => {
+  const params: any = {
+    columnId: columnId,
+    orderBy: JSON.stringify([{ field: "update_time", orderByType: 2 }]),
+    states: '0,1,2,3,4',
+    pageSize: 9999,
+    page: 0
+  }
+  const res = await getDmsDataList(params)
+  return (res as any).content
+}
+
+
+const getDmsDataList = async (params: any) => {
+  return await api.getDmsDataList(params)
+}
+
+const updateProject = async (columnId:number,modelId:number,content:string) => {
+  const params: any = {
+    columnId: columnId,
+    modelId: modelId,
+    content: content,
+  }
+  // console.log(params)
+  const res = await api.updateContent(params)
+  if ((res as any).code === 200) {
+    // ElMessage.success('添加成功')
+    initData()
+  }else{
+    // ElMessage.error('添加失败')
+  }
+}
+
+// const handleSwitchChange = (val: any) => {
+//   finishBidObjectTemp.value.flag = val
+//   finishBidObjectTemp.value.url = ''
+//   finishObject.value = {}
+// }
+// const handleChange = (val: any) => {
+//   finishBidObject.value = val
+// }
+
+const handleXBSwitchChange = (val: any) => {
+  addForm.value.c_is_xb = val
+  console.log(val)
+}
+// 获取投续标内容
+const getTxbBidContent = async (columnId:number,search:string,type:string) => {
+  const params: any = {
+      columnId: columnId,
+      orderBy: JSON.stringify([{ field: "update_time", orderByType: 2 }]),
+      states: '0,1,2,3,4',
+      pageSize: 1,
+      page: 0
+  }
+  if (search) {
+    params.search = JSON.stringify([
+        ...(params.search ? JSON.parse(params.search) : []),
+        {
+          field: type,
+          searchType: 1,
+          content: { value: search },
+        },
+    ]);
+  }
+  const res = await getDmsDataList(params)
+  return (res as any).content.data[0]
+}
+const buildAreaTree = (flatList: any[]) => {
+  const districtMap = new Map<string, TreeItem>()
+  const filteredList = flatList.filter(item => item?.c_district_code?.startsWith('3101'))
+  for (const item of filteredList) {
+    const districtCode = item.c_district_code
+    const districtName = item.c_district_name
+    if (!districtCode || !districtName) continue
+    let districtNode = districtMap.get(districtCode)
+    if (!districtNode) {
+      districtNode = {
+        id: districtCode,
+        label: districtName,
+        value: districtCode,
+        children: [],
+        ...item
+      }
+      districtMap.set(districtCode, districtNode as TreeItem)
+    }
+   const partCode = item.c_part_code
+    const partName = item.c_part_name
+    if (!partCode || !partName) continue
+    const partMap = new Map<string, TreeItem>()
+    for (const child of (districtNode?.children || []) as TreeItem[]) {
+      partMap.set(child.value, child)
+    }
+    let partNode = partMap.get(partCode)
+    if (!partNode) {
+      partNode = {
+        id: partCode,
+        label: partName,
+        value: partCode,
+        children: [],
+        ...item
+      }
+      districtNode?.children?.push(partNode as TreeItem)
+    }
+  }
+  return Array.from(districtMap.values())
+}
+
+const handleNodeAreaClick = (value: any[])  => {
+  console.log('选中的值数组:', value)
+  const nodes = (areaCascader.value as any)?.getCheckedNodes?.() || []
+  if(nodes.length) {
+    const targetNode = nodes[nodes.length - 1]
+    areaObject.value = targetNode
+  }
+  
+}
+
+const handleAdminCascaderChange = (val: any) => {
+  const tempObj = finishTreeProjects.value.filter((item: any) => item.id.includes(val[1]))[0]
+  finishObject.value = tempObj
+  console.log(tempObj)
+}
+</script>
+
+<style scoped>
+.bid-content-page {
+  width: 100%;
+}
+.bid-container{
+  height: calc(100vh - 180px);
+  overflow-y: auto;
+}
+
+</style>

+ 717 - 0
src/components/bidResult/addProject.vue

@@ -0,0 +1,717 @@
+<template>
+  <div class="bid-content-page">
+    <div class="bid-container">
+      <el-dialog v-model="dialogFormVisible" draggable title="提示信息" width="600" @close="close">
+        <el-form label-width="auto" :model="addForm" :rules="rules" ref="formRef" style="max-height: 500px;overflow: auto;">
+            
+            <el-form-item label="项目名称" >
+                <el-input v-model="addForm.title" placeholder="请输入项目名称" />
+            </el-form-item>
+            <el-form-item label="项目地址" >
+                <el-input v-model="addForm.address" placeholder="请输入项目地址" />
+            </el-form-item>
+            <el-form-item label="管理区域" prop="c_glqy">
+                <!-- <el-input v-model="addForm.c_glqy" placeholder="请输入管理区域" /> -->
+                <el-cascader v-model="addFormArea" :options="allArea" :show-all-levels="true"  @change="handleNodeAreaClick" style="width: 100%"></el-cascader>
+            </el-form-item>
+            <!-- <el-form-item label="市场部名称" >
+                <el-input v-model="addForm.marketName" placeholder="请输入市场部名称" />
+            </el-form-item>
+            <el-form-item label="委托内容(综合)" >
+                <el-input v-model="addForm.wtnr_zh" placeholder="请输入委托内容(综合)" />
+            </el-form-item>
+            <el-form-item label="招标人数(综合)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbrs_zh"
+                controls-position="right"
+                placeholder="请输入招标人数(综合)"
+                />
+            </el-form-item>
+            <el-form-item label="招标费用(综合)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbfy_zh"
+                controls-position="right"
+                placeholder="请输入招标费用(综合)"
+                />
+            </el-form-item>
+            <el-form-item label="委托内容(保安)" >
+                <el-input v-model="addForm.wtnr_ba" placeholder="请输入委托内容(保安)" />
+            </el-form-item>
+            <el-form-item label="招标人数(保安)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbrs_ba"
+                controls-position="right"
+                placeholder="请输入招标人数(保安)"
+                />
+            </el-form-item>
+            <el-form-item label="招标费用(保安)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbfy_ba"
+                controls-position="right"
+                placeholder="请输入招标费用(保安)"
+                />
+            </el-form-item>
+            <el-form-item label="委托内容(保洁)" >
+                <el-input v-model="addForm.wtnr_bj" placeholder="请输入委托内容(保洁)" />
+            </el-form-item>
+            <el-form-item label="招标人数(保洁)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbrs_bj"
+                controls-position="right"
+                placeholder="请输入招标人数(保洁)"
+                />
+            </el-form-item>
+            <el-form-item label="招标费用(保洁)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbfy_bj"
+                controls-position="right"
+                placeholder="请输入招标费用(保洁)"
+                />
+            </el-form-item>
+            <el-form-item label="委托内容(工程)" >
+                <el-input v-model="addForm.wtnr_gc" placeholder="请输入委托内容(工程)" />
+            </el-form-item>
+            <el-form-item label="招标人数(工程)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbrs_gc"
+                controls-position="right"
+                placeholder="请输入招标人数(工程)"
+                />
+            </el-form-item>
+            <el-form-item label="招标费用(工程)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbfy_gc"
+                controls-position="right"
+                placeholder="请输入招标费用(工程)"
+                />
+            </el-form-item>
+             <el-form-item label="委托内容(会务)" >
+                <el-input v-model="addForm.wtnr_hy" placeholder="请输入委托内容(会务)" />
+            </el-form-item>
+            <el-form-item label="招标人数(会务)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbrs_hy"
+                controls-position="right"
+                placeholder="请输入招标人数(会务)"
+                />
+            </el-form-item>
+            <el-form-item label="招标费用(会务)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbfy_hy"
+                controls-position="right"
+                placeholder="请输入招标费用(会务)"
+                />
+            </el-form-item>
+            <el-form-item label="委托内容(绿化)" >
+                <el-input v-model="addForm.wtnr_lh" placeholder="请输入委托内容(绿化)" />
+            </el-form-item>
+            <el-form-item label="招标人数(绿化)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbrs_lh"
+                controls-position="right"
+                placeholder="请输入招标人数(绿化)"
+                />
+            </el-form-item>
+            <el-form-item label="招标费用(绿化)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbfy_lh"
+                controls-position="right"
+                placeholder="请输入招标费用(绿化)"
+                />
+            </el-form-item>
+            <el-form-item label="委托内容(宿管)" >
+                <el-input v-model="addForm.wtnr_sg" placeholder="请输入委托内容(宿管)" />
+            </el-form-item>
+            <el-form-item label="招标人数(宿管)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbrs_sg"
+                controls-position="right"
+                placeholder="请输入招标人数(宿管)"
+                />
+            </el-form-item>
+            <el-form-item label="招标费用(宿管)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbfy_sg"
+                controls-position="right"
+                placeholder="请输入招标费用(宿管)"
+                />
+            </el-form-item>
+            <el-form-item label="委托内容(客服)" >
+                <el-input v-model="addForm.wtnr_kf" placeholder="请输入委托内容(客服)" />
+            </el-form-item>
+            <el-form-item label="招标人数(客服)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbrs_kf"
+                controls-position="right"
+                placeholder="请输入招标人数(客服)"
+                />
+            </el-form-item>
+            <el-form-item label="招标费用(客服)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbfy_kf"
+                controls-position="right"
+                placeholder="请输入招标费用(客服)"
+                />
+            </el-form-item>
+            <el-form-item label="委托内容(食堂)" >
+                <el-input v-model="addForm.wtnr_st" placeholder="请输入委托内容(食堂)" />
+            </el-form-item>
+            <el-form-item label="招标人数(食堂)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbrs_st"
+                controls-position="right"
+                placeholder="请输入招标人数(食堂)"
+                />
+            </el-form-item>
+            <el-form-item label="招标费用(食堂)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbfy_st"
+                controls-position="right"
+                placeholder="请输入招标费用(食堂)"
+                />
+            </el-form-item>
+             <el-form-item label="委托内容(其他)" >
+                <el-input v-model="addForm.wtnr_qt" placeholder="请输入委托内容(其他)" />
+            </el-form-item>
+            <el-form-item label="招标人数(其他)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbrs_qt"
+                controls-position="right"
+                placeholder="请输入招标人数(其他)"
+                />
+            </el-form-item>
+            <el-form-item label="招标费用(其他)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbfy_qt"
+                controls-position="right"
+                placeholder="请输入招标费用(其他)"
+                />
+            </el-form-item> -->
+            <el-form-item label="合同面积(万平米)" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.htmj"
+                controls-position="right"
+                placeholder="请输入合同面积(万平米)"
+                />
+            </el-form-item>
+             <el-form-item label="合同签约甲方" >
+                <el-input v-model="addForm.htqyjf" placeholder="请输入合同签约甲方" />
+            </el-form-item>
+            <el-form-item label="首次服务日期">
+                <el-date-picker
+                style="width: 100%"
+                v-model="addForm.scfwrq"
+                type="date"
+                placeholder="请输入首次服务日期"
+                />
+            </el-form-item>
+            <!-- <el-form-item label="项目意向公示日期">
+                <el-date-picker
+                style="width: 100%"
+                v-model="addForm.xmyxgsrq"
+                type="datetime"
+                placeholder="请输入项目意向公示日期"
+                />
+            </el-form-item>
+            <el-form-item label="项目招标公告日期">
+                <el-date-picker
+                style="width: 100%"
+                v-model="addForm.xmzbggrq"
+                type="datetime"
+                placeholder="请输入项目招标公告日期"
+                />
+            </el-form-item>
+            <el-form-item label="项目投标日期">
+                <el-date-picker
+                style="width: 100%"
+                v-model="addForm.xmtbrq"
+                type="datetime"
+                placeholder="请输入项目投标日期"
+                />
+            </el-form-item>
+            <el-form-item label="项目中标日期(中标函)">
+                <el-date-picker
+                style="width: 100%"
+                v-model="addForm.xmzbrq"
+                type="datetime"
+                placeholder="请输入项目中标日期(中标函)"
+                />
+            </el-form-item> -->
+            <el-form-item label="项目服务合同签订日期">
+                <el-date-picker
+                style="width: 100%"
+                v-model="addForm.htqdrq"
+                type="date"
+                placeholder="请输入项目服务合同签订日期"
+                />
+            </el-form-item>
+            <el-form-item label="合同编号" >
+                <el-input v-model="addForm.htbh" placeholder="请输入合同编号" />
+            </el-form-item>
+            <el-form-item label="合同开始日期">
+                <el-date-picker
+                style="width: 100%"
+                v-model="addForm.xmhtksrq"
+                type="date"
+                placeholder="请输入合同开始日期"
+                />
+            </el-form-item>
+            <el-form-item label="合同到期日期">
+                <el-date-picker
+                style="width: 100%"
+                v-model="addForm.xmhtdqrq"
+                type="date"
+                placeholder="请输入合同到期日期"
+                />
+            </el-form-item>
+            <!-- <el-form-item label="本年度合同月数" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.htys"
+                controls-position="right"
+                placeholder="请输入本年度合同月数"
+                />
+            </el-form-item> -->
+            <el-form-item label="延伸合同数" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.yshts"
+                controls-position="right"
+                placeholder="请输入延伸合同数"
+                />
+            </el-form-item>
+            <el-form-item label="延伸合同额" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.yshtje"
+                controls-position="right"
+                placeholder="请输入延伸合同额"
+                />
+            </el-form-item>
+            <el-form-item label="合同总价" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.htzj"
+                controls-position="right"
+                placeholder="请输入合同总价"
+                />
+            </el-form-item>
+            <el-form-item label="中标得分" >
+                <el-input-number
+                style="width: 100%"
+                v-model="addForm.zbdf"
+                controls-position="right"
+                placeholder="请输入中标得分"
+                />
+            </el-form-item>
+
+          
+        <el-form-item label="业态" prop="c_ytfw">
+            <el-tree-select
+                placeholder="请选择业态"
+                v-model="addFormYT"
+                :data="ytList"
+                collapse-tags
+                filterable
+                style="width: 100%"
+            />
+        </el-form-item>
+            <el-form-item label="委托类型" prop="c_zgfw">
+            <el-radio v-model="addFormZgfw" label="全委">全委</el-radio>
+            <el-radio v-model="addFormZgfw" label="单一单委">单一单委</el-radio>
+            <el-radio v-model="addFormZgfw" label="多项单委">多项单委</el-radio>
+        </el-form-item>
+        
+        <el-form-item label="服务类型" prop="c_fwlx">
+            <el-checkbox-group v-model="addFormFwlx">
+                <el-checkbox label="会务"></el-checkbox>
+                <el-checkbox label="工程"></el-checkbox>
+                <el-checkbox label="绿化"></el-checkbox>
+                <el-checkbox label="保安"></el-checkbox>
+                <el-checkbox label="保洁"></el-checkbox>
+            </el-checkbox-group>
+        </el-form-item>
+
+
+
+        </el-form>
+        <template #footer>
+          <div class="dialog-footer">
+            <el-button @click="close" class="btn">取消</el-button>
+            <el-button type="primary" class="btn enter-btn" @click="submitForm(formRef)">
+              确认
+            </el-button>
+          </div>
+        </template>
+      </el-dialog>
+
+      <el-dialog
+        v-model="dialogVisible"
+        title="提示信息"
+        width="300"
+        align-center
+        draggable
+        show-close="false"
+    >
+        <span>本项目已推送至市场部负责人,后续将由市场部统一分发至各部门负责人,相关后续流程敬请期待。</span>
+        <template #footer>
+        <div class="dialog-footer">
+            <el-button type="primary" @click="handleConfirm">
+            确认
+            </el-button>
+        </div>
+        </template>
+    </el-dialog>
+
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref,onMounted } from 'vue'
+// import moment from 'moment'
+import api from '@/api/common'
+import CONFIG from '@/utils/config'
+import type { FormInstance } from 'element-plus'
+// import { ElMessage } from 'element-plus'
+const formRef = ref<FormInstance>()
+const dialogVisible = ref(false)
+
+// const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
+// const userName = userInfo?.username =='user_xtw' ? '徐天炜' : userInfo?.username || ''
+
+const props = defineProps({
+  flag: {
+    type: Boolean,
+    default: false,
+  },
+  close: {
+    type: Function,
+    default: () => {},
+  },
+  projectData:{
+    type : Object,
+    default : () => {}
+  }
+})
+
+
+interface resultForm {
+  [key: string]: any
+}
+
+
+const txbList = ref<any[]>([])
+const jkList = ref<any[]>([])
+
+const ytList = ref<resultForm[]>([])
+const allArea = ref([{} as TreeItem])
+const addFormZgfw = ref('')
+const addFormFwlx = ref([])
+const addFormYT = ref('')
+const addFormArea = ref([])
+
+interface TreeItem {
+  id: string | number
+  value: string
+  label: string
+  children: TreeItem[],
+  [key: string]: any
+}
+
+const finishBidOption = ref([{} as resultForm])
+// const finishBidObject = ref<any>(null)
+// const finishBidObjectTemp = ref({
+//   flag:false,
+//   url:''
+// })
+const buildAreaTree = (flatList: any[]) => {
+  const districtMap = new Map<string, TreeItem>()
+  const filteredList = flatList.filter(item => item?.c_district_code?.startsWith('3101'))
+  for (const item of filteredList) {
+    const districtCode = item.c_district_code
+    const districtName = item.c_district_name
+    if (!districtCode || !districtName) continue
+    let districtNode = districtMap.get(districtCode)
+    if (!districtNode) {
+      districtNode = {
+        id: districtCode,
+        label: districtName,
+        value: districtCode,
+        children: []
+      }
+      districtMap.set(districtCode, districtNode)
+    }
+   const partCode = item.c_part_code
+    const partName = item.c_part_name
+    if (!partCode || !partName) continue
+    const partMap = new Map<string, TreeItem>()
+    for (const child of districtNode.children) {
+      partMap.set(child.value, child)
+    }
+    let partNode = partMap.get(partCode)
+    if (!partNode) {
+      partNode = {
+        id: partCode,
+        label: partName,
+        value: partCode,
+        children: []
+      }
+      districtNode.children.push(partNode)
+    }
+  }
+  return Array.from(districtMap.values())
+}
+// 省市区县管理区域树
+// const buildAreaTree2 = (flatList: any[]) => {
+//   const provinceMap = new Map<string, TreeItem>()
+//   const filteredList = flatList.filter(item => item?.c_province_code?.startsWith('310'))
+//   for (const item of filteredList) {
+//     const provinceCode = item.c_province_code
+//     const provinceName = item.c_province_name
+//     if (!provinceCode || !provinceName) continue
+//     let provinceNode = provinceMap.get(provinceCode)
+//     if (!provinceNode) {
+//       provinceNode = {
+//         id: provinceCode,
+//         label: provinceName,
+//         value: provinceCode,
+//         children: []
+//       }
+//       provinceMap.set(provinceCode, provinceNode)
+//     }
+//     const cityCode = item.c_city_code
+//     const cityName = item.c_city_name
+//     if (!cityCode || !cityName) continue
+//     const cityMap = new Map<string, TreeItem>()
+//     for (const child of provinceNode.children) {
+//       cityMap.set(child.value, child)
+//     }
+//     let cityNode = cityMap.get(cityCode)
+//     if (!cityNode) {
+//       cityNode = {
+//         id: cityCode,
+//         label: cityName,
+//         value: cityCode,
+//         children: []
+//       }
+//       provinceNode.children.push(cityNode)
+//     }
+
+//     const districtCode = item.c_district_code
+//     const districtName = item.c_district_name
+//     if (!districtCode || !districtName) continue
+//     const districtMap = new Map<string, TreeItem>()
+//     for (const child of cityNode.children) {
+//       districtMap.set(child.value, child)
+//     }
+//     let districtNode = districtMap.get(districtCode)
+//     if (!districtNode) {
+//       districtNode = {
+//         id: districtCode,
+//         label: districtName,
+//         value: districtCode,
+//         children: []
+//       }
+//       cityNode.children.push(districtNode)
+//     }
+//     const partCode = item.c_part_code
+//     const partName = item.c_part_name
+//     if (!partCode || !partName) continue
+//     const partMap = new Map<string, TreeItem>()
+//     for (const child of districtNode.children) {
+//       partMap.set(child.value, child)
+//     }
+//     if (!partMap.get(partCode)) {
+//       districtNode.children.push({
+//         id: partCode,
+//         label: partName,
+//         value: partCode,
+//         children: []
+//       })
+//     }
+//   }
+//   return Array.from(provinceMap.values())
+// }
+
+onMounted(() => {
+  initData()
+})
+const initData = async () => {
+    const itemTxbList = await getTypeProjects(CONFIG.COLUMNIDARR[2]) // 投续标项目
+    const itemJkList = await getTypeProjects(CONFIG.COLUMNIDARR[6]) // 中标监控项目
+    const itemFinishList = await getTypeProjects(CONFIG.COLUMNIDARR[7]) // 已中标项目
+    const itemYtList = await getTypeProjects(CONFIG.COLUMNIDARR[8]) // 业态
+    const itemGLList = await getTypeProjects(CONFIG.COLUMNIDARR[9]) // 管理区域
+    console.log(itemFinishList)
+    finishBidOption.value = itemFinishList.data || []
+    txbList.value = []
+    jkList.value = []
+    allArea.value = []
+    ytList.value = []
+    itemTxbList.data.filter((item: any) => {
+        const json = JSON.parse(item.c_xmjd_json)
+        if(json.length > 0 &&  json[json.length - 1].xmjd < 6){
+        txbList.value.push(item)
+        }
+    })
+    itemJkList.data.filter((item: any) => {
+        const flag = item.c_sfzb
+        if(flag == false){// 已中标
+            jkList.value.push(item)
+        }
+    })
+    ytList.value = itemYtList.data.map((item: any) => ({
+        ...item,
+        label: item.c_yt_name,
+        value: item.c_yt_name,
+        children: item.children || []
+    }))
+    allArea.value = buildAreaTree(itemGLList.data)
+}
+const dialogFormVisible = props.flag
+const close = () => {
+  props.close()
+}
+
+const addForm = ref({
+  id: '',
+  title: props.projectData.c_xmmc,
+  address: '上海市杨浦区长海路 366 号',
+  c_glqy: '杨浦区/中心区域',
+  marketName: '',
+  wtnr_zh: '',
+  zbrs_zh: null,
+  zbfy_zh: null,
+  wtnr_ba: '',
+  zbrs_ba: null,
+  zbfy_ba: null,
+  wtnr_bj: '',
+  zbrs_bj: null,
+  zbfy_bj: null,
+  wtnr_gc: '',
+  zbrs_gc: null,
+  zbfy_gc: null,
+  wtnr_hy: '',
+  zbrs_hy: null,
+  zbfy_hy: null,
+  wtnr_lh: '',
+  zbrs_lh: null,
+  zbfy_lh: null,
+  wtnr_sg: '',
+  zbrs_sg: null,
+  zbfy_sg: null,
+  wtnr_kf: '',
+  zbrs_kf: null,
+  zbfy_kf: null,
+  wtnr_st: '',
+  zbrs_st: null,
+  zbfy_st: null,
+  wtnr_qt: '',
+  zbrs_qt: null,
+  zbfy_qt: null,
+  htmj: null,
+  htqyjf: '上海市杨浦区图书馆',
+  scfwrq: '',
+  xmyxgsrq: '',
+  xmzbggrq: '',
+  xmtbrq: '',
+  xmzbrq: '',
+  htqdrq: '',
+  htbh: '',
+  xmhtksrq: '',
+  xmhtdqrq: '',
+  htys: null,
+  yshts: null,
+  yshtje: null,
+  htzj: null,
+  zbdf: null,
+})
+
+const rules = ref({
+ 
+})
+// interface ProjectItem {
+//   [key: string]: any
+// }
+const submitForm = (formEl: FormInstance | undefined) => {
+    // ElMessage.success('本项目已推送至市场部负责人,后续将由市场部统一分发至各部门负责人,相关后续流程敬请关注。')
+    console.log(formEl)
+    dialogVisible.value = true
+}
+const handleConfirm = () => {
+  dialogVisible.value = false
+  close()
+}
+const handleNodeAreaClick = (item: any) => {
+  console.log(item)
+}
+
+
+
+const getTypeProjects = async (columnId:number) => {
+  const params: any = {
+    columnId: columnId,
+    orderBy: JSON.stringify([{ field: "update_time", orderByType: 2 }]),
+    states: '0,1,2,3,4',
+    pageSize: 9999,
+    page: 0
+  }
+  const res = await getDmsDataList(params)
+  return (res as any).content
+}
+
+
+const getDmsDataList = async (params: any) => {
+  return await api.getDmsDataList(params)
+}
+
+// const updateProject = async (columnId:number,modelId:number,content:string) => {
+//   const params: any = {
+//     columnId: columnId,
+//     modelId: modelId,
+//     content: content,
+//   }
+//   // console.log(params)
+//   const res = await api.updateContent(params)
+//   if ((res as any).code === 200) {
+//     // ElMessage.success('添加成功')
+//     initData()
+//   }else{
+//     // ElMessage.error('添加失败')
+//   }
+// }
+
+</script>
+
+<style scoped>
+.bid-content-page {
+  width: 100%;
+}
+.bid-container{
+  height: calc(100vh - 180px);
+  overflow-y: auto;
+}
+
+</style>

+ 2 - 2
src/components/renewal/BidRenewal.vue

@@ -78,7 +78,7 @@
             </div>
           </div>
           <div class="renewal-row-actions">
-            <span v-if="item.type != '已完成'" :class="['days-badge', item.daysClass]">{{ item.days }}</span>
+            <span v-if="!['已完成','已中标'].includes(item.type)" :class="['days-badge', item.daysClass]">{{ item.days }}</span>
             <span :class="['days-badge', item.jdClass]">{{ item.type }}</span>
             <el-button type="primary" size="small" class="btn enter-btn" v-if="item.jdClass === 'ok'" @click="handleViewClick(item)">进入</el-button>
             <el-button type="primary" size="small" class="btn enter-btn" v-else @click="handleViewClick(item)">进入</el-button>
@@ -270,7 +270,7 @@ const cascaderArr = ref([])
 
 const tempArr = ref<any>([])
 const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
-const userName = userInfo?.username =='user_zmg' ? '张茂果' : userInfo?.username || ''
+const userName = userInfo?.username =='user_xtw' ? '徐天炜' : userInfo?.username || ''
 
 const statsType = ref('')
 const porjectType = ref('c_dqsj')

+ 20 - 20
src/components/tenderpool/Monitor.vue

@@ -63,8 +63,8 @@
                     <div>
                         <div class="monitorStatsrow-title">
                         <span @click="handleViewClick(item,'详情')" style="cursor: pointer;">{{ item.title }}</span>
-                        <span style="margin-left: 5px;"  :class="['badge', item.bid_type == '1' ? 'ok' : item.bid_type == '2' ? 'warn' : (item.bid_type == '3' || Number(item.days) <= 0 ) ? 'grey‌' : 'danger']">
-                            {{ item.bid_type == '1' ? '投标' : item.bid_type == '2' ? '续标' : item.bid_type == '3' ? '储备' : Number(item.days) > 0 ? 'new' : '已过期' }}
+                        <span style="margin-left: 5px;"  :class="['badge', item.c_bid_type == '1' ? 'ok' : item.c_bid_type == '2' ? 'warn' : (item.c_bid_type == '3' || Number(item.days) <= 0 ) ? 'grey‌' : 'danger']">
+                            {{ item.c_bid_type == '1' ? '投标' : item.c_bid_type == '2' ? '续标' : item.c_bid_type == '3' ? '储备' : Number(item.days) > 0 ? 'new' : '已过期' }}
                         </span> 
                         <span style="margin-left: 5px;"  :class="['badge', 'ok']" v-if="props.historyProjectData && props.historyProjectData.filter(item2 => item2 == item.c_author)[0]">
                           {{props.historyProjectData && props.historyProjectData.filter(item2 => item2 == item.c_author)[0]? '历史客户' : '新客户'}}
@@ -74,7 +74,7 @@
                         <span>{{ item.c_source_name }}</span>
                         <span>{{item.c_district}}</span>
                         <span>发布 {{ moment(item.c_publish_time).format('YYYY-MM-DD HH:mm') }}</span>
-                        <span>截止 {{ moment(item.c_bid_deadline.replace(/\s*\(.*\)$/, '') , 'YYYY年MM月DD日 HH:mm').format('YYYY-MM-DD HH:mm') }}</span>
+                        <span>截止 {{ item.c_bid_deadline ? moment(item.c_bid_deadline.replace(/\s*\(.*\)$/, '') , 'YYYY年MM月DD日 HH:mm').format('YYYY-MM-DD HH:mm') : '-'  }}</span>
                         <span>{{Number(item.days) > 0 ? '剩余':'已过期'}} {{ Math.abs(Number(item.days)) }} 天</span>
                         <span>预算 {{ item.c_budget_amount }}</span>
                         <!-- <span :class="['badge', item.daysClass]">{{ item.type }}</span>
@@ -83,13 +83,13 @@
                     </div>
                     <div class="monitorStatsrow-actions">
                         <el-button type="primary" size="small" class="btn" @click="handleViewClick(item,'详情')">详情</el-button>
-                        <el-button type="primary" size="small" class="btn enter-btn"  style="margin-left: 6px !important;" v-if="item.bid_type == '1' || item.bid_type == '2'" @click="handleViewClick(item,'标书编制')">标书编制</el-button>
-                        <el-button type="primary" size="small" class="btn enter-btn"  style="margin-left: 6px !important;" v-if="item.bid_type != '1' && item.bid_type != '2' && Number(item.days) > 0" @click="handleViewClick(item,'投标')">投标</el-button>
-                        <el-button type="primary" size="small" class="btn enter-btn"  style="margin-left: 6px !important;" v-if="item.bid_type != '1' && item.bid_type != '2' && Number(item.days) > 0" @click="handleViewClick(item,'续标')">续标</el-button>
-                        <el-button type="primary" size="small" class="btn enter-btn"  style="margin-left: 6px !important;" v-if="item.bid_type != '1' && item.bid_type != '2' && item.bid_type != '3'" @click="handleViewClick(item,'储备')">储备</el-button>
-                        <el-button type="primary" size="small" class="btn"  style="margin-left: 6px !important;" v-if="item.bid_type == '0' || item.bid_type == null " @click="handleViewClick(item,'忽略')">忽略</el-button>
-                        <el-button type="primary" size="small" class="btn"  style="margin-left: 6px !important;" v-if="item.bid_type == '1' || item.bid_type == '2' || item.bid_type == '3'" @click="handleViewClick(item,'原公告链接')">原公告</el-button>
-                        <el-button type="primary" size="small" class="btn"  style="margin-left: 6px !important;" v-if="item.bid_type == '3'" @click="handleViewClick(item,'移出')">移出</el-button>
+                        <el-button type="primary" size="small" class="btn enter-btn"  style="margin-left: 6px !important;" v-if="item.c_bid_type == '1' || item.c_bid_type == '2'" @click="handleViewClick(item,'标书编制')">标书编制</el-button>
+                        <el-button type="primary" size="small" class="btn enter-btn"  style="margin-left: 6px !important;" v-if="item.c_bid_type != '1' && item.c_bid_type != '2' && Number(item.days) > 0" @click="handleViewClick(item,'投标')">投标</el-button>
+                        <el-button type="primary" size="small" class="btn enter-btn"  style="margin-left: 6px !important;" v-if="item.c_bid_type != '1' && item.c_bid_type != '2' && Number(item.days) > 0" @click="handleViewClick(item,'续标')">续标</el-button>
+                        <el-button type="primary" size="small" class="btn enter-btn"  style="margin-left: 6px !important;" v-if="item.c_bid_type != '1' && item.c_bid_type != '2' && item.c_bid_type != '3'" @click="handleViewClick(item,'储备')">储备</el-button>
+                        <el-button type="primary" size="small" class="btn"  style="margin-left: 6px !important;" v-if="item.c_bid_type == '0' || item.c_bid_type == null " @click="handleViewClick(item,'忽略')">忽略</el-button>
+                        <el-button type="primary" size="small" class="btn"  style="margin-left: 6px !important;" v-if="item.c_bid_type == '1' || item.c_bid_type == '2' || item.c_bid_type == '3'" @click="handleViewClick(item,'原公告链接')">原公告</el-button>
+                        <el-button type="primary" size="small" class="btn"  style="margin-left: 6px !important;" v-if="item.c_bid_type == '3'" @click="handleViewClick(item,'移出')">移出</el-button>
                     </div>
                 </div>
             </div>
@@ -331,12 +331,12 @@
             <div class="action-buttons">
               <el-button type="primary" class="btn enter-btn" @click="handleViewClick(project,'原公告链接')">打开原公告链接</el-button>
               <!-- <el-button type="primary" class="btn enter-btn">获取标书并拆解</el-button> -->
-              <el-button type="primary" class="btn enter-btn" style="margin-left: 0px !important;" v-if="project.bid_type == '1' || project.bid_type == '2'" @click="handleViewClick(project,'标书编制')">标书编制</el-button>
-              <el-button type="primary" class="btn enter-btn" style="margin-left: 0px !important;" v-if="project.bid_type != '1' && project.bid_type != '2' && Number(project.days) > 0" @click="handleViewClick(project,'投标')">投标</el-button>
-              <el-button type="primary" class="btn enter-btn" style="margin-left: 0px !important;" v-if="project.bid_type != '1' && project.bid_type != '2' && Number(project.days) > 0" @click="handleViewClick(project,'续标')">续标</el-button>
-              <el-button type="primary" class="btn enter-btn" style="margin-left: 0px !important;" v-if="project.bid_type != '1' && project.bid_type != '2' && project.bid_type != '3'" @click="handleViewClick(project,'储备')">储备</el-button>
-              <el-button type="primary" class="btn" style="margin-left: 0px !important;" v-if="project.bid_type == '0' || project.bid_type == null" @click="handleViewClick(project,'忽略')">忽略</el-button>
-              <el-button type="primary" class="btn"  style="margin-left: 0px !important;" v-if="project.bid_type == '3'" @click="handleViewClick(project,'移出')">移出</el-button>
+              <el-button type="primary" class="btn enter-btn" style="margin-left: 0px !important;" v-if="project.c_bid_type == '1' || project.c_bid_type == '2'" @click="handleViewClick(project,'标书编制')">标书编制</el-button>
+              <el-button type="primary" class="btn enter-btn" style="margin-left: 0px !important;" v-if="project.c_bid_type != '1' && project.c_bid_type != '2' && Number(project.days) > 0" @click="handleViewClick(project,'投标')">投标</el-button>
+              <el-button type="primary" class="btn enter-btn" style="margin-left: 0px !important;" v-if="project.c_bid_type != '1' && project.c_bid_type != '2' && Number(project.days) > 0" @click="handleViewClick(project,'续标')">续标</el-button>
+              <el-button type="primary" class="btn enter-btn" style="margin-left: 0px !important;" v-if="project.c_bid_type != '1' && project.c_bid_type != '2' && project.c_bid_type != '3'" @click="handleViewClick(project,'储备')">储备</el-button>
+              <el-button type="primary" class="btn" style="margin-left: 0px !important;" v-if="project.c_bid_type == '0' || project.c_bid_type == null" @click="handleViewClick(project,'忽略')">忽略</el-button>
+              <el-button type="primary" class="btn"  style="margin-left: 0px !important;" v-if="project.c_bid_type == '3'" @click="handleViewClick(project,'移出')">移出</el-button>
             </div>
 
             <div class="secondary-buttons">
@@ -358,7 +358,7 @@ import api from '@/api/common'
 import CONFIG from '@/utils/config'
 import UTIL from '@/utils/util'
 const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
-const userName = userInfo?.username =='user_zmg' ? '张茂果' : userInfo?.username || ''
+const userName = userInfo?.username =='user_xtw' ? '徐天炜' : userInfo?.username || ''
 const props = defineProps({
   historyProjectData: {
     type: Array,
@@ -608,7 +608,7 @@ const updateProject = async (item: any,type:number) => {
     modelId: CONFIG.MODELIDARR[1],
     content: JSON.stringify({
       id: item.id,
-      bid_type: type
+      c_bid_type: type
     }),
   }
   const res = await api.updateContent(params)
@@ -682,7 +682,7 @@ const getCountProjects = async (type: string,states: string) => {
     params.search = JSON.stringify([
         ...(params.search ? JSON.parse(params.search) : []),
         {
-          field: "bid_type",
+          field: "c_bid_type",
           searchType: 2,
           content: { value: `%${type}%` },
         },
@@ -746,7 +746,7 @@ const getProjects = async () => {
     params.search = JSON.stringify([
         ...(params.search ? JSON.parse(params.search) : []),
         {
-          field: "bid_type",
+          field: "c_bid_type",
           searchType: 2,
           content: { value: `%${porjectType.value}%` },
         },

+ 1 - 1
src/layouts/MainLayout.vue

@@ -78,7 +78,7 @@ import { UserFilled } from '@element-plus/icons-vue'
 
 const userStore = useUserStore()
 const router = useRouter()
-const userName = localStorage.getItem('username')
+const userName = "徐天炜"
 const navItems = [
   { path: '/dashboard', name: '工作台' },
   { path: '/onemap', name: '空间一张图' },

+ 10 - 2
src/utils/request.ts

@@ -28,12 +28,20 @@ instance.interceptors.request.use(
 
 instance.interceptors.response.use(
   (response) => {
-    return response.data
+    let data = response.data || {}
+    if(data.message == "无效token"){
+      localStorage.removeItem('token')
+      localStorage.removeItem('username')
+      localStorage.removeItem('userInfo')
+      window.location.href = '/#/'
+      return null
+    }else{
+      return data
+    }
   },
   (error) => {
     if (error.response) {
       console.log(error.response)
-
       const status = error.response.status
       if (status === 401 || status === 403) {
         localStorage.removeItem('token')

+ 18 - 1
src/utils/util.ts

@@ -10,7 +10,24 @@ const generateUUID = () =>{
           return v.toString(16);
       });
   }
+
+/**
+ * 前端生成文件,浏览器下载到本地
+ * @param {String} fileName 保存文件名
+ * @param {String} filePath 文件路径
+ */
+ const downloadFile = (fileName: string,filePath:string) => {
+  // 生成a标签触发浏览器下载
+  const aDom = document.createElement('a')
+  aDom.href = filePath
+  aDom.download = fileName
+  document.body.appendChild(aDom)
+  aDom.click()
+  // 释放内存,防止内存泄漏
+  document.body.removeChild(aDom)
+}
 export default {
   formatCurrency,
-  generateUUID
+  generateUUID,
+  downloadFile
 }

+ 63 - 22
src/views/bidPreparation/RenewalExpireDetail.vue

@@ -5,7 +5,11 @@
       <div class="header-info">
         <div class="project-title">{{projects.title}}</div>
         <!-- <div class="project-subtitle">{{ projects.c_xmbtqc }}</div> -->
+
         <div class="project-meta">{{projects.c_fbz || projects.zbmsxx ?.zb_source_name || ''}} · {{projects.c_zgfw || projects.zbmsxx ?.zb_project_name || ''}} · 金额{{UTIL.formatCurrency(projects.c_nh || '0')}}元</div>
+        <!-- <div class="project-meta">{{projects.c_fbz || projects.zbmsxx ?.zb_source_name || '上海市杨浦区政府采购中心'}} · 杨浦区图书馆总馆物业管理服务项目 · 金额{{UTIL.formatCurrency(projects.c_nh || '0')}}元</div> -->
+
+
         <!-- <div class="project-subtitle">{{ projects.c_is_xb == true ? projects.c_xmbtqc : projects.zbmsxx ?.zb_project_name || ''}}</div>
         <div class="project-meta">{{projects.c_is_xb == true ? projects.c_fbz : projects.zbmsxx ?.zb_source_name || ''}} · {{projects.c_is_xb == true ? projects.c_zgfw: projects.zbmsxx?.zb_project_name || ''}} · 金额{{UTIL.formatCurrency(projects.c_is_xb == true ? projects.c_nh : projects.zbmsxx ?.zb_budget_amount || '0')}}元</div>   -->
       </div>
@@ -129,14 +133,14 @@
               <li :class="['checklist-item']" v-for="task in projects.rwlcqd" :key="task.id">
                 <span :class="['checklist-status', task.done ? 'done' : '']">{{task.done ? '✓' : '○'}} &nbsp;&nbsp; {{task.text}}</span>
                 <!-- <span class="checklist-text">{{task.text}}</span> -->
-                 <strong style="cursor: pointer;color: var(--primary);" v-if="task.done && projects.zbmsxx?.zb_detail_url && task.id == 4" @click="handleOpenViewClick('1')">查看招标文件</strong>
+                 <strong style="cursor: pointer;color: var(--primary);" v-if="task.done && projects.zbmsxx?.zb_detail_url && task.id == 4" @click="handleOpenViewClick('1')">查看招标公告</strong>
                 <div class="checklist-actions" v-if="task.seq<=stage">
                   <el-button type="primary" size="small" :disabled="task.done" :plain="task.done"  v-if="[3].includes(task.id) && !task.done && stepsType == '1'">
                     <span v-if="!task.done" @click="confirmTask(task)">人工处理</span>
                   </el-button>
                   <el-button type="primary" size="small" :disabled="task.done" :plain="task.done" v-if="task.id == 3"  :loading="task.type == 1">
-                    <span v-if="task.done">已完成</span>
-                    <span v-else @click="confirmTask(task)">{{task.type == 1 ? '匹配中' : task.type == 0 ? '待确认' :''}}</span>
+                    <span v-if="task.done">匹配成功</span>
+                    <span v-else @click="confirmTask(task)">{{task.type == 1 ? '匹配中' : task.type == 2 ? '待确认' :''}}</span>
                   </el-button>
                   <el-button type="primary" size="small" :disabled="task.done" :plain="task.done"  v-if="[7].includes(task.id) && !task.done">
                     <span v-if="!task.done" @click="confirmTask(task)">人工处理</span>
@@ -327,7 +331,7 @@
              <el-date-picker
                 style="width: 100%"
                 v-model="ruleKBJKForm.c_zbtjr"
-                type="datetime"
+                type="date"
                 placeholder="请输入投标日期"
               />
             </el-form-item>
@@ -577,7 +581,7 @@
 
       <el-dialog v-model="dialogBidFileVisible" draggable title="提示信息" width="300">
         <div>
-          <strong style="cursor: pointer;" @click="handleOpenViewClick('1')">点击查看招标文件</strong>
+          <strong style="cursor: pointer;" @click="handleOpenViewClick('1')">点击查看招标公告</strong>
         </div>
         
         <template #footer>
@@ -629,10 +633,11 @@ import moment from 'moment'
 import api from '@/api/common'
 import CONFIG from '@/utils/config'
 import UTIL from '@/utils/util'
-import { ElMessage } from 'element-plus'
+import { ElMessage,ElLoading } from 'element-plus'
 import type { FormInstance, FormRules } from 'element-plus'
+// const filePath = '/static/data/杨浦区图书馆总馆物业管理服务项目投标文件.docx'
 const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
-const userName = userInfo?.username =='user_zmg' ? '张茂果' : userInfo?.username || ''
+const userName = userInfo?.username =='user_xtw' ? '徐天炜' : userInfo?.username || ''
 const projects = ref<any>({})
 const left_btn_disabled = ref(false)
 const right_btn_disabled = ref(false)
@@ -658,9 +663,9 @@ const ruleBidForm = reactive<RuleForm>({
 })
 const dialogBidFileVisible = ref(false)
 const bidRules = reactive<FormRules<RuleForm>>({
-  // file1: [
-  //   { required: true, message: '请上传招标需求文件', trigger: 'blur' },
-  // ],
+  file1: [
+    { required: true, message: '请上传招标需求文件', trigger: 'blur' },
+  ],
   file2: [
     { required: true, message: '请上传采购需求文件', trigger: 'blur' },
   ],
@@ -753,7 +758,7 @@ const ruleZBForm = reactive<RuleForm>({
   c_category_label:'',
   c_project_overview:'',
   c_procurement_method:'',
-  bid_type:'0',//招标
+  c_bid_type:'0',//招标
 })
 
 // const dialogZBJKVisible = ref(false)
@@ -776,7 +781,8 @@ const ruleZBJKForm = reactive<RuleForm>({
   c_title_key_word:'',
   c_publisher_key_word:'',
   c_complete:false,
-  c_gl_xm:''
+  c_gl_xm:'',
+  c_enable: true
 })
 const dialogKBJKVisible = ref(false)
 const ruleKBJKFormRef = ref<FormInstance>()
@@ -802,9 +808,10 @@ const ruleKBJKForm = reactive<RuleForm>({
   c_sfzb:false,
   c_kbsj:'',
   c_xmmc:'',
-  c_zbtjr:'',
+  c_zbtjr:moment('2026-06-22 10:00:00').format('YYYY-MM-DD HH:mm:ss'),
   c_tbbj:'',
-  c_glxm:''
+  c_glxm:'',
+  c_enable: true
 })
 
 const dialogFinishBidVisible = ref(false)
@@ -926,7 +933,8 @@ const handleViewClick = (item: any,type: string) => {
         ruleZBJKForm.c_title_key_word = projects.value.title,
         ruleZBJKForm.c_publisher_key_word = projects.value.c_xfyt,
         ruleZBJKForm.c_complete = false,
-        ruleZBJKForm.c_gl_xm = projects.value.id
+        ruleZBJKForm.c_gl_xm = projects.value.id,
+        ruleZBJKForm.c_enable = true
         addContentParams(ruleZBJKForm,CONFIG.COLUMNIDARR[5],CONFIG.MODELIDARR[2])
         
         if(projects.value.c_xgzb){
@@ -1174,7 +1182,7 @@ const getfinishProjects = async () => {
   const params: any = {
     columnId: CONFIG.COLUMNIDARR[7],
     orderBy: JSON.stringify([{ field: "update_time", orderByType: 2 }]),
-    states: '1,2,3',
+    states: '0,1,2,3',
     pageSize: 9999,
     page: 0
   }
@@ -1261,12 +1269,23 @@ const handleZBSubmit = async (formEl: FormInstance | undefined) => {
           c_budget_amount:ruleZBForm.c_budget_amount, 
           c_bid_open_time:ruleZBForm.c_bid_open_time, 
           c_bid_deadline:ruleZBForm.c_bid_open_time,
-          c_source_name:ruleZBForm.c_source_name,
+          c_source_name:ruleZBForm.c_source_name, 
           c_author:ruleZBForm.c_author,
           c_publish_time:ruleZBForm.c_publish_time,
           c_detail_url:ruleZBForm.c_detail_url,
         }
         updateZBProject(tempTask.value,formData,'')
+        console.log(projects.value.id)
+        getProjectParams(projects.value.id,'c_gl_xm',CONFIG.COLUMNIDARR[5]).then(async res => {
+          const reslust = (res as any)[0]
+          const content = {  
+            id: reslust.id,
+            c_enable: false
+          }
+          console.log(content)
+          updateProjectParams(CONFIG.COLUMNIDARR[5],CONFIG.MODELIDARR[2], content)
+        })
+        
         dialogZBVisible.value = false
 
       } else {
@@ -1308,6 +1327,7 @@ const handleKBJKSubmit = async (formEl: FormInstance | undefined) => {
         ruleKBJKForm.c_kbsj = moment(projects.value.zbkssj).format('YYYY-MM-DD HH:mm')
         ruleKBJKForm.title = projects.value.title
         ruleKBJKForm.content = projects.value.content
+        ruleKBJKForm.c_enable = true
         // console.log(ruleKBJKForm)
         const res = await addContentParams(ruleKBJKForm,CONFIG.COLUMNIDARR[6],CONFIG.MODELIDARR[3])
         
@@ -1349,12 +1369,21 @@ const handleBidSubmit = async (formEl: FormInstance | undefined) => {
       if (valid) {
         // console.log('submit!')
         console.log(ruleBidForm)
-        dialogBidVisible.value = false
+        
         updateTypeProject(2)
         ruleBidForm.file3.file.forEach((item: any) => {
           submitFileForm(item.raw)
         })
-
+        const loading = ElLoading.service({
+          lock: true,
+          text: '上传中...',
+          background: 'rgba(0, 0, 0, 0.7)',
+        })
+        setTimeout(() => {
+          dialogBidVisible.value = false
+          loading.close()
+          ElMessage.success('上传成功')
+        }, 2000);
       } else {
         // console.log('error submit!')
       }
@@ -1512,8 +1541,19 @@ const bidFile = ref({
   jsb:false,
 })
 const getBidFile = async () => {
-   ElMessage.success('获取标书成功')
-  bidFile.value.flag = true
+  const loading = ElLoading.service({
+    lock: true,
+    text: '获取中...',
+    background: 'rgba(0, 0, 0, 0.7)',
+  })
+  setTimeout(() => {
+    // const fileName = `杨浦区图书馆总馆物业管理服务项目投标文件.docx`
+    // UTIL.downloadFile(fileName, filePath)
+    loading.close()
+    ElMessage.success('获取标书成功')
+    bidFile.value.flag = true
+  }, 3000);
+  
   // if(bittype == 'swb'){
   //   ElMessage.success('获取商务标书成功')
   //   bidFile.value.swb = true
@@ -1566,7 +1606,8 @@ const updateJKLCProject = async () => {
         c_jgjk_url: finishBidObjectTemp.value.url ? finishBidObjectTemp.value.url : finishBidObject.value?.c_detail_url || '',
         c_lcsjx:json || '',
         c_sfzb:true,
-        c_type:"投续标"
+        c_type:"投续标",
+        c_enable: false
       }
       // console.log(content)
       updateProjectParams(CONFIG.COLUMNIDARR[6],CONFIG.MODELIDARR[3], content)

+ 1 - 1
src/views/bidPreparation/RenewalXQDetail.vue

@@ -249,7 +249,7 @@ const projects = ref<any>({})
 const dialogVisible = ref(false)
 
 const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
-const userName = userInfo?.username =='user_zmg' ? '张茂果' : userInfo?.username || ''
+const userName = userInfo?.username =='user_xtw' ? '徐天炜' : userInfo?.username || ''
 
 const steps = ref<any[]>([]);
 const stage = ref(Number(sessionStorage.getItem('progres')) || 0);

+ 52 - 366
src/views/bidResult/BidResult.vue

@@ -96,7 +96,7 @@
           <div>
             <span style="font-size: large;font-weight: bold;">{{ showWin ? '🎉 中标' : '😔 未中标' }} </span> · <span>{{finishObject.c_xmmc}}</span>
             <!-- {{finishObject.project?.c_winning_suppliers || '未中标'}} -->
-            <p>{{ showWin ? '恭喜您的标书在本次招标中脱颖而出!' : '请再接再厉,下次一定成功!' }} · 结果发布:{{ finishObject.project?.c_publish_time || '未发布' }} · 中标单位:上海申勤物业发展有限公司</p> 
+            <p>{{ showWin ? '恭喜您的标书在本次招标中脱颖而出!' : '请再接再厉,下次一定成功!' }} · 结果发布:{{ finishObject.project?.c_publish_time || '2025-07-11' }} · 中标单位:上海申勤物业管理服务有限公司</p> 
           </div>
         </div>
 
@@ -119,6 +119,8 @@
         <div class="card">
           <div class="card-head">中标结果确认</div>
           <div class="card-body markdown-container">
+            
+            <!-- <div class="markdown-content"  v-html="markdownContent"></div> -->
            <div class="markdown-content" v-if="finishObject.c_gljg" v-html="markdownContent"></div>
            <div class="markdown-content"v-else>人工处理结果:<span style="cursor: pointer;color: var(--primary);"  @click="handleOpenPageClick()">点击查看中标结果详情</span></div>
           </div>
@@ -161,6 +163,13 @@
         </div>
       </div>
 
+      <div v-if="addFormVisible" >
+        <addContent :flag="addFormVisible" :close="closeAddForm"/>
+      </div>
+      <div v-if="addProjectFormVisible" >
+        <addProject :flag="addProjectFormVisible" :projectData="finishObject" :close="closeAddProjectForm"/>
+      </div>
+
        <el-dialog v-model="dialogFormFileVisible" draggable title="提示信息" width="300">
         <el-input v-model="FileForm.name" autocomplete="off" placeholder="请输入文件名称"/>
         <div style="margin-top: 10px;">
@@ -189,115 +198,6 @@
         </template>
        </el-dialog>
 
-      <el-dialog v-model="dialogFormVisible" draggable title="提示信息" width="500">
-        <el-form label-width="auto" :model="addForm" :rules="rules" ref="formRef">
-          <el-form-item label="登记类型">
-            <el-select v-model="addForm.type" placeholder="请选择登记类型"  value-key="value" @change="handleTypeChange" >
-              <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value" />
-            </el-select>
-          </el-form-item>
-          <el-form-item label="项目名称" v-if="addForm.type == '监控中'">
-            <el-select v-model="addForm.title" placeholder="请选择项目名称" @change="handleProjectChange"  value-key="id">
-              <el-option v-for="item in jkList" :key="item.id" :label="item.title" :value="item" />
-            </el-select>
-          </el-form-item>
-          <el-form-item label="项目名称" v-else-if="addForm.type == '投续标'">
-            <el-select v-model="addForm.title" placeholder="请选择项目名称" @change="handleProjectChange"  value-key="id">
-              <el-option v-for="item in txbList" :key="item.id" :label="item.title" :value="item" />
-            </el-select>
-          </el-form-item>
-          <el-form-item label="项目名称" v-else>
-            <el-input v-model="addForm.title" autocomplete="off" placeholder="请输入项目名称"/>
-          </el-form-item>
-          <el-form-item label="中标类型选项">
-            <el-switch v-model="finishBidObjectTemp.flag" inline-prompt active-text="从中标结果中选择" inactive-text="手动输入" style="background-color: unset;" @change="handleSwitchChange"/>
-          </el-form-item>
-          <div v-if="finishBidObjectTemp.flag">
-            <el-form-item label="中标项目">
-              <el-select v-model="finishBidObject" filterable placeholder="请选择中标项目" style="width: 100%;overflow: auto;"  @change="handleChange" value-key="id">
-                <el-option v-for="item in finishBidOption" :key="item.id" :label="item.title" :value="item" :title="item.title" style="width: 380px;"/>
-              </el-select>
-            </el-form-item>
-          </div>
-          <div v-else>
-            <el-form-item label="中标结果URL">
-              <el-input v-model="finishBidObjectTemp.url" placeholder="请输入中标结果URL"/>
-            </el-form-item>
-          </div>
-          <!-- <div  v-if="addForm.type != '监控中'">
-            <el-form-item label="招标编号" prop="zb_code">
-              <el-input v-model="addForm.zb_code" autocomplete="off" placeholder="请输入招标编号"/>
-            </el-form-item>
-            <el-form-item label="招标项目名称" prop="zb_name">
-              <el-input v-model="addForm.zb_name" autocomplete="off" placeholder="请输入招标项目名称"/>
-            </el-form-item>
-            <el-form-item label="招标机构" prop="zb_org">
-              <el-input v-model="addForm.zb_org" autocomplete="off" placeholder="请输入招标机构"/>
-            </el-form-item>
-            <el-form-item label="招标来源" prop="zb_source">
-              <el-input v-model="addForm.zb_source" autocomplete="off" placeholder="请输入招标来源"/>
-            </el-form-item>
-            <el-form-item label="招标金额" prop="zb_money">
-              <el-input-number
-                style="width: 100%"
-                v-model="addForm.zb_money"
-                controls-position="right"
-                placeholder="请输入招标金额"
-              />
-            </el-form-item>
-            <el-form-item label="开标日期" prop="zb_startdate">
-              <el-date-picker
-                style="width: 100%;"
-                v-model="addForm.zb_startdate"
-                type="datetime"
-                placeholder="请选择开标日期"
-              />
-            </el-form-item>
-            <el-form-item label="开标截止日期" prop="zb_enddate">
-              <el-date-picker
-                style="width: 100%;"
-                v-model="addForm.zb_enddate"
-                type="datetime"
-                placeholder="请选择开标截止日期"
-              />
-            </el-form-item>
-            <el-form-item label="招标详情URL" prop="zb_url">
-              <el-input v-model="addForm.zb_url" autocomplete="off" placeholder="请输入招标详情URL"/>
-            </el-form-item>
-          </div>
-
-          <div  v-if="addForm.type != '监控中'">
-              <el-form-item label="投标日期" prop="tb_date">
-                <el-date-picker
-                  style="width: 100%;"
-                  v-model="addForm.tb_date"
-                  type="datetime"
-                  placeholder="请选择投标日期"
-                />
-              </el-form-item>
-              <el-form-item label="投标报价" prop="tb_money">
-                <el-input-number
-                  style="width: 100%"
-                  v-model="addForm.tb_money"
-                  controls-position="right"
-                  placeholder="请输入投标报价"
-                />
-              </el-form-item>
-
-          </div> -->
-
-
-        </el-form>
-        <template #footer>
-          <div class="dialog-footer">
-            <el-button @click="dialogFormVisible = false" class="btn">取消</el-button>
-            <el-button type="primary" class="btn enter-btn" @click="submitForm(formRef)">
-              确认
-            </el-button>
-          </div>
-        </template>
-      </el-dialog>
-
     </div>
   </div>
 </template>
@@ -307,18 +207,18 @@ import { ref,onMounted } from 'vue'
 import moment from 'moment'
 import api from '@/api/common'
 import CONFIG from '@/utils/config'
-import type { FormInstance } from 'element-plus'
-const formRef = ref<FormInstance>()
+// import type { FormInstance } from 'element-plus'
+import addContent from '@/components/bidResult/addContent.vue'
+import addProject from '@/components/bidResult/addProject.vue'
 import MarkdownIt from 'markdown-it'
 const activeTab = ref('ongoing')
 const selectedBid = ref('')
-const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
-const userName = userInfo?.username =='user_zmg' ? '张茂果' : userInfo?.username || ''
+// const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
+// const userName = userInfo?.username =='user_xtw' ? '徐天炜' : userInfo?.username || ''
 const showWin = ref(true)
 const markdownContent = ref('')
+
 interface jgForm {
-  title?: string
-  content?: string
   [key: string]: any
 }
 const finishObject = ref<jgForm>({})
@@ -331,18 +231,6 @@ const page = ref(1)
 const total = ref(0)
 const md = ref<MarkdownIt>()
 
-const txbList = ref<any[]>([])
-const jkList = ref<any[]>([])
-
-const finishBidOption = ref([{} as jgForm])
-const jkBidObject = ref<any>(null)
-const txbBidObject = ref<any>(null)
-const finishBidObject = ref<any>(null)
-const finishBidObjectTemp = ref({
-  flag:false,
-  url:''
-})
-
 onMounted(() => {
   initData()
   md.value = new MarkdownIt({
@@ -353,23 +241,9 @@ onMounted(() => {
   activeTab.value = sessionStorage.getItem('activeTab') || 'ongoing'
   selectedBid.value = sessionStorage.getItem('jkId') || ''
   // console.log(activeTab.value)
+  // openMD('http://localhost:5173/public/static/data/index.html')
 })
 
- const typeOptions = ref([
-    {
-      value: '新创建',
-      label: '新创建',
-    },
-    {
-      value: '监控中',
-      label: '监控中',
-    },
-    {
-      value: '投续标',
-      label: '投续标',
-    },
-  ])
-
 const openMD = async (url: string) => {
   try {
     let proxyUrl = url
@@ -418,30 +292,8 @@ const bidStats = ref([
   { label: '已中标', value: '0', highlight: false }
 ])
 
-const dialogFormVisible = ref(false)
-const addForm = ref({
-  id: '',
-  type: '',
-  name: '',
-  title: '',
-  projectName: '',
-  code: '',
-  createTime: '',
-  openBidDate:'',
-  quote:'',
-  nh:'',
-  url:'',
-  desc: '',
-})
-
-const rules = ref({
-  projectName: [{ required: true, message: '请输入项目名称', trigger: 'blur' }],
-  code: [{ required: true, message: '请输入招标编号', trigger: 'blur' }],
-  createTime: [{ required: true, message: '请输入投标提交时间', trigger: 'blur' }],
-  openBidDate: [{ required: true, message: '请输入开标日期', trigger: 'blur' }],
-  quote: [{ required: true, message: '请输入投标报价', trigger: 'blur' }],
-  nh: [{ required: true, message: '请输入年化(万元)', trigger: 'blur' }]
-})
+const addFormVisible = ref(false)
+const addProjectFormVisible = ref(false)
 interface ProjectItem {
   id: string | number
   title: string
@@ -489,128 +341,21 @@ const handleTabClick = (tab: string) => {
   }
 }
 
-const submitForm = (formEl: FormInstance | undefined) => {
-  if (!formEl) return
-  formEl.validate((valid) => {
-    if (valid) {
-      if(addForm.value.type == '监控中'){
-        console.log("监控中")
-        //流程
-        const id = 7  // 固定进度数值
-        const rwlcqd = JSON.parse(txbBidObject.value.rwlcqd || '[]')
-        rwlcqd.find((p: any) => p.id == id).done = true
-        rwlcqd.find((p: any) => p.id == id).create_time = moment().format('YYYY-MM-DD HH:mm')
-        rwlcqd.find((p: any) => p.id == id).username = userName
-        rwlcqd.find((p: any) => p.id == id).userid = userInfo?.id || ''
-        rwlcqd.find((p: any) => p.id == id).type = 0
-
-        // 进度
-        let xmjd_json = JSON.parse(txbBidObject.value.c_xmjd_json || '[]');
-        xmjd_json[5].create_time = moment().format('YYYY-MM-DD HH:mm')
-        xmjd_json[5].username = userName
-        xmjd_json[5].userid = userInfo?.id || ''
-        xmjd_json[5].type = 0
-        if(!xmjd_json[6]){
-          xmjd_json.push({xmjd: id, type: 1, create_time: '', username: '', userid: ''})
-        }
-        const content = JSON.stringify({
-          id: txbBidObject.value.id,
-          rwlcqd:rwlcqd,
-          c_xmjd_json:xmjd_json
-        })
-        updateProject(CONFIG.COLUMNIDARR[2],CONFIG.MODELIDARR[0],content)
-        // 修改中标监控
-        const steps = [
-          { n: 1, label: '预警触发'},
-          { n: 2, label: '投/续标准备'},  
-          { n: 3, label: '招标监控'},
-          { n: 4, label: '标书制作'},
-          { n: 5, label: '投标提交'},
-          { n: 6, label: '开标监控'},
-          { n: 7, label: '确认中标'},
-        ]
-        let json = xmjd_json.map((item:any) => {
-          return {
-            create_time: item.create_time ? item.create_time : moment().format('YYYY-MM-DD HH:mm'),
-            desc:steps.find((s:any) => s.n == item.xmjd)?.label || '',
-            username:item.username ? item.username : userName,
-            userid:item.userid ? item.userid : userInfo?.id || '',
-          }
-        })
-        const content2 = JSON.stringify({
-          id: jkBidObject.value.id || '',
-          c_gljg: finishBidObjectTemp.value?.flag ? finishBidObject.value?.id : '',
-          c_jgjk_url: finishBidObjectTemp.value?.flag ? finishBidObject.value?.c_detail_url : finishBidObjectTemp.value?.url || '',
-          c_lcsjx:json || '',
-          c_sfzb:true,
-          c_type:"中标登记"
-        })
-        updateProject(CONFIG.COLUMNIDARR[6],CONFIG.MODELIDARR[3],content2)
-
-      }else if(addForm.value.type == '投续标'){
-        console.log("投续标")
-      }else{
-        console.log("其他")
-      }
-
-      // let content = {
-      //   id: addForm.value.id,
-      //   c_xmjd: '6',
-      //   tbbj: addForm.value.quote,
-      //   c_nh:addForm.value.nh,
-      //   kbrq: addForm.value.openBidDate,
-      //   tbrq: addForm.value.createTime,
-      // }
-
-      // updateProject(CONFIG.COLUMNIDARR[2],CONFIG.MODELIDARR[0],JSON.stringify(content))
-    } else {
-      // console.log('error submit!')
-    }
-    dialogFormVisible.value = false
-  })
+const closeAddForm = () => {
+  console.log("关闭弹窗")
+  addFormVisible.value = false
+  initData()
+}
+const closeAddProjectForm = () => {
+  console.log("关闭弹窗")
+  addProjectFormVisible.value = false
+  initData()
 }
 
 const handleBidRegistration = async () => {
-  dialogFormVisible.value = true
-  const itemTxbList = await getTypeProjects(CONFIG.COLUMNIDARR[2])
-  const itemJkList = await getTypeProjects(CONFIG.COLUMNIDARR[6])
-  const itemFinishList = await getTypeProjects(CONFIG.COLUMNIDARR[7])
-  finishBidOption.value = itemFinishList.data || []
-  console.log(finishBidOption.value)
-  txbList.value = []
-  jkList.value = []
-  itemTxbList.data.filter((item: any) => {
-    const json = JSON.parse(item.c_xmjd_json)
-    if(json.length > 0 &&  json[json.length - 1].xmjd < 6){
-      txbList.value.push(item)
-    }
-  })
-  itemJkList.data.filter((item: any) => {
-    const flag = item.c_sfzb
-      if(flag == false){// 已中标
-        jkList.value.push(item)
-      }
-  })
-}
-const handleTypeChange = (val: any) => {
-  addForm.value.title = ''
-  addForm.value.type = val || ''
-}
-const selectedObject = ref<any>({})
-const handleProjectChange = async (val: any) => {
-  addForm.value.title = val.title || ''
-  jkBidObject.value = null
-  txbBidObject.value = null
-  finishBidObject.value = null
-  if(addForm.value.type == '监控中'){
-    jkBidObject.value = val
-    const res = await getTxbBidContent(CONFIG.COLUMNIDARR[2],val.id,"c_xgjk")
-    txbBidObject.value = res || {}
-  }else{
-    selectedObject.value = val
-  }
-  console.log("项目名称:", val)
+  addFormVisible.value = true 
 }
+
 const handleFinishProjectChange = (val: any) => {
   console.log(val)
   if (val && typeof val === 'object' && val.project) {
@@ -622,7 +367,6 @@ const handleFinishProjectChange = (val: any) => {
 }
 
 const handleOpenClick = (item: ProjectItem) => {
-  console.log(item)
   if(item.c_sfzb == true){
     sessionStorage.setItem('activeTab', 'won')
     activeTab.value = 'won'
@@ -781,37 +525,9 @@ const calculateRemainingDays = (st: string, et: string): { days: string;} => {
   return { days: diffDays.toString() };
  
 }
-
-const updateProject = async (columnId:number,modelId:number,content:string) => {
-  const params: any = {
-    columnId: columnId,
-    modelId: modelId,
-    content: content,
-  }
-  // console.log(params)
-  const res = await api.updateContent(params)
-  if ((res as any).code === 200) {
-    // ElMessage.success('添加成功')
-    initData()
-  }else{
-    // ElMessage.error('添加失败')
-  }
-}
-const getTypeProjects = async (columnId:number) => {
-  const params: any = {
-    columnId: columnId,
-    orderBy: JSON.stringify([{ field: "update_time", orderByType: 2 }]),
-    states: '0,1,2,3,4',
-    pageSize: 9999,
-    page: 0
-  }
-  const res = await getDmsDataList(params)
-  return (res as any).content
-}
-
 const handleConfirmBidPush = async () => {
   // console.log(finishObject.value)
-  let arr = finishObject.value.c_lcsjx ? finishObject.value.c_lcsjx : []
+  // let arr = finishObject.value.c_lcsjx ? finishObject.value.c_lcsjx : []
   // arr.push({
   //   create_time: moment().format('YYYY-MM-DD HH:mm'),
   //   desc:'市场部确认',
@@ -824,27 +540,28 @@ const handleConfirmBidPush = async () => {
   //   userid:userInfo?.id || ''
   // })
   // updateAudit(finishObject.value,4)
-  updateKBJKProject(finishObject.value,arr)
-  
-}
-const updateKBJKProject = async (item: any,arr:any[]) => {
-  const params: any = {
-    columnId: CONFIG.COLUMNIDARR[6],
-    modelId: CONFIG.MODELIDARR[3],
-    content: JSON.stringify({
-      id: item.id,
-      c_lcsjx: arr,
-    }),
-  }
-  // console.log(params)
-  const res = await api.updateContent(params)
-  if ((res as any).code === 200) {
-    // ElMessage.success('添加成功')
-    initData()
-  }else{
-    // ElMessage.error('添加失败')
-  }
+  // updateKBJKProject(finishObject.value,arr)
+  // console.log(arr)
+  addProjectFormVisible.value = true
 }
+// const updateKBJKProject = async (item: any,arr:any[]) => {
+//   const params: any = {
+//     columnId: CONFIG.COLUMNIDARR[6],
+//     modelId: CONFIG.MODELIDARR[3],
+//     content: JSON.stringify({
+//       id: item.id,
+//       c_lcsjx: arr,
+//     }),
+//   }
+//   // console.log(params)
+//   const res = await api.updateContent(params)
+//   if ((res as any).code === 200) {
+//     // ElMessage.success('添加成功')
+//     initData()
+//   }else{
+//     // ElMessage.error('添加失败')
+//   }
+// }
 
 // const updateAudit = async (item: any,type:number) => {
 //   const params: any = {
@@ -875,37 +592,6 @@ const openFileForm = (type: string) => {
   dialogFormFileVisible.value = true
 }
 
-const handleSwitchChange = (val: any) => {
-  finishBidObjectTemp.value.flag = val
-  finishBidObjectTemp.value.url = ''
-  finishObject.value = {}
-}
-const handleChange = (val: any) => {
-  finishBidObject.value = val
-}
-// 获取投续标内容
-const getTxbBidContent = async (columnId:number,search:string,type:string) => {
-  const params: any = {
-      columnId: columnId,
-      orderBy: JSON.stringify([{ field: "update_time", orderByType: 2 }]),
-      states: '0,1,2,3,4',
-      pageSize: 1,
-      page: 0
-  }
-  if (search) {
-    params.search = JSON.stringify([
-        ...(params.search ? JSON.parse(params.search) : []),
-        {
-          field: type,
-          searchType: 1,
-          content: { value: search },
-        },
-    ]);
-  }
-  const res = await getDmsDataList(params)
-  return (res as any).content.data[0]
-}
-
 </script>
 
 <style scoped>

+ 2 - 2
src/views/ledger/ProjectDetail.vue

@@ -178,7 +178,7 @@ const router = useRouter()
 import { ElMessage } from 'element-plus'
 
 const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
-const userName = userInfo?.username =='user_zmg' ? '张茂果' : userInfo?.username || ''
+const userName = userInfo?.username =='user_xtw' ? '徐天炜' : userInfo?.username || ''
 
 const formatCurrency = (value: string | number): string => {
   if (!value) return '0.00'
@@ -453,7 +453,7 @@ const addXQProject = async () => {
 //     modelId: CONFIG.MODELIDARR[1],
 //     content: JSON.stringify({
 //       id: item.id,
-//       bid_type: type
+//       c_bid_type: type
 //     }),
 //   }
 //   const res = await api.updateContent(params)

+ 53 - 30
src/views/ledger/Projects.vue

@@ -33,14 +33,14 @@
               </tr>
             </thead>
             <tbody>
-              <tr v-for="item in projects" :key="item.title">
-                <td><span class="link-text" @click="handleViewClick(item)">{{ item.title }}</span></td>
-                <td>{{ item.c_hzyt }}</td>
-                <td>{{ item.c_glqynbkj }}</td>
-                <td>{{ moment(item.c_zgxmhtksrq).format('YYYY-MM-DD') }} - {{ moment(item.c_zgxmhtdqrq).format('YYYY-MM-DD') }}</td>
-                <td><span :class="['badge', item.daysClass]">{{ item.days }}</span></td>
+              <tr v-for="item in projects" :key="(item as any)[columnId+'_title']">
+                <td><span class="link-text" @click="handleViewClick(item)">{{ (item as any)[columnId+'_title'] }}</span></td>
+                <td>{{ (item as any)[columnId+'_c_hzyt']}}</td>
+                <td>{{ (item as any)[columnId+'_c_glqynbkj'] }}</td>
+                <td>{{ moment((item as any)[columnId+'_c_zgxmhtksrq']).format('YYYY-MM-DD') }} - {{ moment((item as any)[columnId+'_c_zgxmhtdqrq']).format('YYYY-MM-DD') }}</td>
+                <td><span :class="['badge', (item as any)['daysClass']]">{{ (item as any)['days'] }}</span></td>
                 <td>
-                  <span class="link-text" @click="handleViewClick(item)">查看</span>
+                  <span class="link-text" @click="handleViewClick(item)">{{ (item as any)[columnId+'_name'] || '详情' }}</span>
                 </td>
               </tr>
             </tbody>
@@ -71,6 +71,8 @@ import CONFIG from '@/utils/config'
 import { useRouter } from 'vue-router'
 const router = useRouter()
 
+const columnId = CONFIG.COLUMNIDARR[0]
+
 interface ProjectItem {
   title: string
   c_hzyt: string
@@ -113,10 +115,11 @@ const total = ref(0)
 const projects = ref<ProjectItem[]>([])
 
 const handleViewClick = (project: any) => {
-  sessionStorage.setItem('projectName', project.c_xmdz)
-  sessionStorage.setItem('name', project.title)
-  sessionStorage.setItem('dmsId', project.id)
-  router.push(`/project-detail/${project.id}`)
+  console.log(project)
+  sessionStorage.setItem('projectName', (project as any)[columnId+'_title'])
+  sessionStorage.setItem('name', (project as any)[columnId+'_title'] || '')
+  sessionStorage.setItem('dmsId', (project as any)[columnId+'_id'] || '')
+  router.push(`/project-detail/${(project as any)[columnId+'_id']}`)
 }
 
 const handleCurrentChange = (val: number) => {
@@ -134,29 +137,49 @@ const initData = () => {
   getProjects();
 }
 const getProjects = async () => {
+  // const params: any = {
+  //   columnId: CONFIG.COLUMNIDARR[0],
+  //   orderBy: JSON.stringify([{ field: "c_zgxmhtdqrq", orderByType: 1 }]),
+  //   states: '0,1,2,3',
+  //   pageSize: pageSize.value,
+  //   page: (page.value-1)
+  // }
+  // if (searchText.value) {
+  //   params.search = JSON.stringify([
+  //       ...(params.search ? JSON.parse(params.search) : []),
+  //       {
+  //         field: "title",
+  //         searchType: 2,
+  //         content: { value: searchText.value },
+  //       },
+  //   ]);
+  // }
+  // const res = await getDmsDataList(params)
+
   const params: any = {
-    columnId: CONFIG.COLUMNIDARR[0],
-    orderBy: JSON.stringify([{ field: "c_zgxmhtdqrq", orderByType: 1 }]),
+    columnId: columnId,
+    orderBy: columnId+','+'c_zgxmhtdqrq,asc',
     states: '0,1,2,3',
     pageSize: pageSize.value,
-    page: (page.value-1)
-  }
-  if (searchText.value) {
-    params.search = JSON.stringify([
-        ...(params.search ? JSON.parse(params.search) : []),
-        {
-          field: "title",
-          searchType: 2,
-          content: { value: searchText.value },
-        },
-    ]);
+    page: (page.value)
   }
-  const res = await getDmsDataList(params)
-  // console.log(res)
+  params.conditionsList = JSON.stringify([
+      ...(params.conditionsList ? JSON.parse(params.conditionsList) : []),
+      {
+        columnId: columnId,
+        columnName: "c_zgxmhtdqrq",
+        condition: "between",
+        value: [moment().format('YYYY-MM-DD HH:mm:ss'), '2099-01-01 00:00:00']
+      }
+  ]);
+  
+  const res = await api.getMultipleFormsOfJointInvestigation(params)
+
+  console.log(res)
   if ((res as any).code === 200) {
     projects.value = (res as any).content.data.map((item: any) => ({
       ...item,
-      ...calculateRemainingDays(item.c_zgxmhtdqrq)
+      ...calculateRemainingDays((item as any)[columnId+'_c_zgxmhtdqrq'])
     }))
     total.value = (res as any).content.count
   }else{
@@ -165,9 +188,9 @@ const getProjects = async () => {
   }
 }
 
-const getDmsDataList = async (params: any) => {
-  return await api.getDmsDataList(params)
-}
+// const getDmsDataList = async (params: any) => {
+//   return await api.getDmsDataList(params)
+// }
 
 </script>
 

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä