Explorar o código

修改,增加新建项目功能

mork hai 3 semanas
pai
achega
7057372aef

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

@@ -4,11 +4,11 @@ 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:投标/续标 1838:招标公告 1837:招标意向 1821:招标监控 1781:开标监控 
+  //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],
+  //1852:投标/续标栏目 1955:招标公告栏目 1930:招标监控 1854:开标监控 1954:意向公告 1948:澄清公告栏目 1950:续签项目栏目 1794:申勤项目数据
+  MODELIDARR:[1852,1955,1930,1854,1954,1948,1950,1794],
 
   TASKLIST: [
     { id: 1, seq:2, type: 1, text: '客户回访与续标意向确认', done: false,create_time:'',username:'',userid:''},
@@ -20,8 +20,8 @@ window.CONFIG = {
     { id: 7, seq:6, type: 1, text: '开标标书监控', done: false,create_time:'',username:'',userid:''},
     { id: 8, seq:7, type: 1, text: '中标确认与部门推送', done: false,create_time:'',username:'',userid:''},
   ],
-  MAPBOX_ACCESS_TOKEN: "pk.eyJ1Ijoid2FuZ3lvbmdjYW4iLCJhIjoiY2phN2l2YW50MHp0NjJxbGx5eTBjOXpmNCJ9.jPxXPXN_CSnBlYG1jp9XJg",
-  MAPBOX_TILES_NORMAL: "https://service-api.onemap.sh.gov.cn/data-service-manage-service/MapProxyApi/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBsaWNhdGlvbl9pZCI6NjEsImFwcGxpY2F0aW9uX25hbWUiOiLpnZLmtabkuozkuInnu7TmnI3liqHns7vnu58iLCJleHAiOjIwNDY2Nzg0MDN9.IKUMdjUX4U1jncIUNren-iotL7duXI90aLECMjpvUX8/shmap_normal_web/MapServer/tile/{z}/{y}/{x}",
-  MAPBOX_TILES_BLUE: "https://service-api.onemap.sh.gov.cn/data-service-manage-service/MapProxyApi/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBsaWNhdGlvbl9pZCI6NjEsImFwcGxpY2F0aW9uX25hbWUiOiLpnZLmtabkuozkuInnu7TmnI3liqHns7vnu58iLCJleHAiOjIwNDY2Nzg0MDN9.IKUMdjUX4U1jncIUNren-iotL7duXI90aLECMjpvUX8/shmap_blue_web/MapServer/tile/{z}/{y}/{x}",
-  MAPBOX_TILES_YXT:"https://t6.tianditu.gov.cn/img_w/wmts?tilematrix={z}&layer=img&style=default&tilerow={y}&tilecol={x}&tilematrixset=w&format=tiles&service=WMTS&version=1.0.0&request=GetTile&tk=f74e6c0cc247c42af05f7053e0b5fb9b",
+  MAPBOX_ACCESS_TOKEN: "pk.eyJ1Ijoid2FuZ3lvbmdjYW4iLCJhIjoiY2phN2l2YW50MHp0NjJxbGx5eTBjOXpmNCJ9.jPxXPXN_CSnBlYG1jp9XJg",//地图token
+  MAPBOX_TILES_NORMAL: "https://service-api.onemap.sh.gov.cn/data-service-manage-service/MapProxyApi/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBsaWNhdGlvbl9pZCI6NjEsImFwcGxpY2F0aW9uX25hbWUiOiLpnZLmtabkuozkuInnu7TmnI3liqHns7vnu58iLCJleHAiOjIwNDY2Nzg0MDN9.IKUMdjUX4U1jncIUNren-iotL7duXI90aLECMjpvUX8/shmap_normal_web/MapServer/tile/{z}/{y}/{x}",//正常图
+  MAPBOX_TILES_BLUE: "https://service-api.onemap.sh.gov.cn/data-service-manage-service/MapProxyApi/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBsaWNhdGlvbl9pZCI6NjEsImFwcGxpY2F0aW9uX25hbWUiOiLpnZLmtabkuozkuInnu7TmnI3liqHns7vnu58iLCJleHAiOjIwNDY2Nzg0MDN9.IKUMdjUX4U1jncIUNren-iotL7duXI90aLECMjpvUX8/shmap_blue_web/MapServer/tile/{z}/{y}/{x}",//深色图
+  MAPBOX_TILES_YXT:"https://t6.tianditu.gov.cn/img_w/wmts?tilematrix={z}&layer=img&style=default&tilerow={y}&tilecol={x}&tilematrixset=w&format=tiles&service=WMTS&version=1.0.0&request=GetTile&tk=f74e6c0cc247c42af05f7053e0b5fb9b", //影像图
 }

+ 5 - 1
src/api/common.ts

@@ -118,6 +118,9 @@ const getBasicCount = () => {
 const getHistoryPartner = () => {
   return axios.get(CONFIG.SQ_URL + '/count/history_partner')
 }
+const getGenerateTender = (params: any) => {
+  return axios.post(CONFIG.SQ_URL + '/tender/generate', qs.stringify(params))
+}
 
 
 export default {
@@ -132,5 +135,6 @@ export default {
   updateAudit,
   uploadFile,
   getBasicCount,
-  getHistoryPartner
+  getHistoryPartner,
+  getGenerateTender
 }

+ 34 - 22
src/components/bidResult/addContent.vue

@@ -119,9 +119,7 @@
                     />
               </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-radio v-model="addFormZgfw" v-for="item in zgfwOptions" :key="item.value" :label="item.value" >{{ item.label }}</el-radio>
               </el-form-item>
               
               <el-form-item label="服务类型" prop="c_fwlx">
@@ -200,14 +198,15 @@ 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 zgfwOptions = ref<any>([])
+
+// interface TreeItem {
+//   id: string | number
+//   value: string
+//   label: string
+//   children: TreeItem[],
+//   [key: string]: any
+// }
 const areaCascader = ref(null)
 const areaObject = ref({})
 const adminCascader = ref([])
@@ -222,14 +221,33 @@ const finishBidObjectTemp = ref({
 
 onMounted(() => {
   initData()
+  getDmsTypes()
 })
+const getDmsTypes = () => {
+  let params = {
+    type:0,
+    cName: "sq_wtfs",
+  }
+  api.getDmsTypes(params).then(res => {
+    if((res as any).code === 200){
+      let ret  = (res as any).content
+      zgfwOptions.value = ret.map((item: any) => ({
+        ...item,
+        label: item.name,
+        value: item.index
+      }))
+
+    }else{
+      zgfwOptions.value = []
+    }
+  })
+}
 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]) // 业态
-    // console.log(itemFinishList)
     // finishBidOption.value = itemFinishList.data || []
     txbList.value = []
     jkList.value = []
@@ -458,7 +476,7 @@ const submitForm = (formEl: FormInstance | undefined) => {
           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,
@@ -492,9 +510,8 @@ const submitForm = (formEl: FormInstance | undefined) => {
           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) => {
@@ -547,7 +564,6 @@ const submitForm = (formEl: FormInstance | undefined) => {
           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,
@@ -590,7 +606,6 @@ const submitForm = (formEl: FormInstance | undefined) => {
         await addContentParams(tbFormData,CONFIG.COLUMNIDARR[2],CONFIG.MODELIDARR[0])
       }
     } else {
-      // console.log('error submit!')
     }
   
     close()
@@ -623,7 +638,6 @@ const handleProjectChange = async (val: any) => {
   }else{
     selectedObject.value = val
   }
-  // console.log("项目名称:", val)
 }
 const getTypeProjects = async (columnId:number) => {
   const params: any = {
@@ -648,7 +662,6 @@ const updateProject = async (columnId:number,modelId:number,content:string) => {
     modelId: modelId,
     content: content,
   }
-  // console.log(params)
   const res = await api.updateContent(params)
   if ((res as any).code === 200) {
     // ElMessage.success('添加成功')
@@ -669,7 +682,6 @@ const updateProject = async (columnId:number,modelId:number,content:string) => {
 
 const handleXBSwitchChange = (val: any) => {
   addForm.value.c_is_xb = val
-  // console.log(val)
 }
 // 获取投续标内容
 const getTxbBidContent = async (columnId:number,search:string,type:string) => {
@@ -696,7 +708,7 @@ const getTxbBidContent = async (columnId:number,search:string,type:string) => {
 
 
 const handleNodeAreaClick = (value: any[])  => {
-  console.log('选中的值数组:', value)
+  const val = value
   const nodes = (areaCascader.value as any)?.getCheckedNodes?.() || []
   if(nodes.length) {
     const targetNode = nodes[nodes.length - 1]
@@ -708,7 +720,7 @@ const handleNodeAreaClick = (value: any[])  => {
 const handleAdminCascaderChange = (val: any) => {
   const tempObj = finishTreeProjects.value.filter((item: any) => item.id.includes(val[1]))[0]
   finishObject.value = tempObj
-  // console.log(tempObj)
+
 }
 </script>
 

+ 348 - 191
src/components/bidResult/addProject.vue

@@ -4,330 +4,332 @@
       <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 label="项目名称" prop="c_xmmc">
+                <el-input v-model="addForm.c_xmmc" placeholder="请输入项目名称" />
             </el-form-item>
-            <el-form-item label="项目地址" >
-                <el-input v-model="addForm.address" placeholder="请输入项目地址" />
+            <el-form-item label="项目地址" prop="c_xmdz">
+                <el-input v-model="addForm.c_xmdz" placeholder="请输入项目地址" />
             </el-form-item>
-            <el-form-item label="管理区域" prop="c_glqy">
+            <el-form-item label="管理区域" prop="c_glqynbkj">
                 <!-- <el-input v-model="addForm.c_glqy" placeholder="请输入管理区域" /> -->
                  <el-cascader v-model="addFormArea" :options="props.glArea" :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 label="市场部名称" prop="c_scbmc">
+                <el-input v-model="addForm.c_scbmc" placeholder="请输入市场部名称" />
             </el-form-item>
-            <el-form-item label="委托内容(综合)" >
-                <el-input v-model="addForm.wtnr_zh" placeholder="请输入委托内容(综合)" />
+            <el-form-item label="委托内容(综合)" prop="c_wtnrzh">
+                <el-input v-model="addForm.c_wtnrzh" placeholder="请输入委托内容(综合)" />
             </el-form-item>
-            <el-form-item label="招标人数(综合)" >
+            <el-form-item label="招标人数(综合)" prop="c_zbrszh">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbrs_zh"
+                v-model="addForm.c_zbrszh"
                 controls-position="right"
                 placeholder="请输入招标人数(综合)"
                 />
             </el-form-item>
-            <el-form-item label="招标费用(综合)" >
+            <el-form-item label="招标费用(综合)" prop="c_zbfyzh">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbfy_zh"
+                v-model="addForm.c_zbfyzh"
                 controls-position="right"
                 placeholder="请输入招标费用(综合)"
                 />
             </el-form-item>
-            <el-form-item label="委托内容(保安)" >
-                <el-input v-model="addForm.wtnr_ba" placeholder="请输入委托内容(保安)" />
+            <el-form-item label="委托内容(保安)" prop="c_wtnrba">
+                <el-input v-model="addForm.c_wtnrba" placeholder="请输入委托内容(保安)" />
             </el-form-item>
-            <el-form-item label="招标人数(保安)" >
+            <el-form-item label="招标人数(保安)" prop="c_zbrsba">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbrs_ba"
+                v-model="addForm.c_zbrsba"
                 controls-position="right"
                 placeholder="请输入招标人数(保安)"
                 />
             </el-form-item>
-            <el-form-item label="招标费用(保安)" >
+            <el-form-item label="招标费用(保安)" prop="c_zbfyba">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbfy_ba"
+                v-model="addForm.c_zbfyba"
                 controls-position="right"
                 placeholder="请输入招标费用(保安)"
                 />
             </el-form-item>
-            <el-form-item label="委托内容(保洁)" >
-                <el-input v-model="addForm.wtnr_bj" placeholder="请输入委托内容(保洁)" />
+            <el-form-item label="委托内容(保洁)" prop="c_wtnrbj">
+                <el-input v-model="addForm.c_wtnrbj" placeholder="请输入委托内容(保洁)" />
             </el-form-item>
-            <el-form-item label="招标人数(保洁)" >
+            <el-form-item label="招标人数(保洁)" prop="c_zbrsbj">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbrs_bj"
+                v-model="addForm.c_zbrsbj"
                 controls-position="right"
                 placeholder="请输入招标人数(保洁)"
                 />
             </el-form-item>
-            <el-form-item label="招标费用(保洁)" >
+            <el-form-item label="招标费用(保洁)" prop="c_zbfybj">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbfy_bj"
+                v-model="addForm.c_zbfybj"
                 controls-position="right"
                 placeholder="请输入招标费用(保洁)"
                 />
             </el-form-item>
-            <el-form-item label="委托内容(工程)" >
-                <el-input v-model="addForm.wtnr_gc" placeholder="请输入委托内容(工程)" />
+            <el-form-item label="委托内容(工程)" prop="c_wtnrgc">
+                <el-input v-model="addForm.c_wtnrgc" placeholder="请输入委托内容(工程)" />
             </el-form-item>
-            <el-form-item label="招标人数(工程)" >
+            <el-form-item label="招标人数(工程)" prop="c_zbrsgc">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbrs_gc"
+                v-model="addForm.c_zbrsgc"
                 controls-position="right"
                 placeholder="请输入招标人数(工程)"
                 />
             </el-form-item>
-            <el-form-item label="招标费用(工程)" >
+            <el-form-item label="招标费用(工程)" prop="c_zbfygc">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbfy_gc"
+                v-model="addForm.c_zbfygc"
                 controls-position="right"
                 placeholder="请输入招标费用(工程)"
                 />
             </el-form-item>
-             <el-form-item label="委托内容(会务)" >
-                <el-input v-model="addForm.wtnr_hy" placeholder="请输入委托内容(会务)" />
+             <el-form-item label="委托内容(会务)" prop="c_wtnrhw">
+                <el-input v-model="addForm.c_wtnrhw" placeholder="请输入委托内容(会务)" />
             </el-form-item>
-            <el-form-item label="招标人数(会务)" >
+            <el-form-item label="招标人数(会务)" prop="c_zbrshw">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbrs_hy"
+                v-model="addForm.c_zbrshw"
                 controls-position="right"
                 placeholder="请输入招标人数(会务)"
                 />
             </el-form-item>
-            <el-form-item label="招标费用(会务)" >
+            <el-form-item label="招标费用(会务)" prop="c_zbfyhw">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbfy_hy"
+                v-model="addForm.c_zbfyhw"
                 controls-position="right"
                 placeholder="请输入招标费用(会务)"
                 />
             </el-form-item>
-            <el-form-item label="委托内容(绿化)" >
-                <el-input v-model="addForm.wtnr_lh" placeholder="请输入委托内容(绿化)" />
+            <el-form-item label="委托内容(绿化)" prop="c_wtnrlh">
+                <el-input v-model="addForm.c_wtnrlh" placeholder="请输入委托内容(绿化)" />
             </el-form-item>
-            <el-form-item label="招标人数(绿化)" >
+            <el-form-item label="招标人数(绿化)" prop="c_zbrslh">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbrs_lh"
+                v-model="addForm.c_zbrslh"
                 controls-position="right"
                 placeholder="请输入招标人数(绿化)"
                 />
             </el-form-item>
-            <el-form-item label="招标费用(绿化)" >
+            <el-form-item label="招标费用(绿化)" prop="c_zbfylh">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbfy_lh"
+                v-model="addForm.c_zbfylh"
                 controls-position="right"
                 placeholder="请输入招标费用(绿化)"
                 />
             </el-form-item>
-            <el-form-item label="委托内容(宿管)" >
-                <el-input v-model="addForm.wtnr_sg" placeholder="请输入委托内容(宿管)" />
+            <el-form-item label="委托内容(宿管)" prop="c_wtnrsg">
+                <el-input v-model="addForm.c_wtnrsg" placeholder="请输入委托内容(宿管)" />
             </el-form-item>
-            <el-form-item label="招标人数(宿管)" >
+            <el-form-item label="招标人数(宿管)" prop="c_zbrssg">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbrs_sg"
+                v-model="addForm.c_zbrssg"
                 controls-position="right"
                 placeholder="请输入招标人数(宿管)"
                 />
             </el-form-item>
-            <el-form-item label="招标费用(宿管)" >
+            <el-form-item label="招标费用(宿管)" prop="c_zbfysg">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbfy_sg"
+                v-model="addForm.c_zbfysg"
                 controls-position="right"
                 placeholder="请输入招标费用(宿管)"
                 />
             </el-form-item>
-            <el-form-item label="委托内容(客服)" >
-                <el-input v-model="addForm.wtnr_kf" placeholder="请输入委托内容(客服)" />
+            <el-form-item label="委托内容(客服)" prop="c_wtnrkf">
+                <el-input v-model="addForm.c_wtnrkf" placeholder="请输入委托内容(客服)" />
             </el-form-item>
-            <el-form-item label="招标人数(客服)" >
+            <el-form-item label="招标人数(客服)" prop="c_zbrskf">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbrs_kf"
+                v-model="addForm.c_zbrskf"
                 controls-position="right"
                 placeholder="请输入招标人数(客服)"
                 />
             </el-form-item>
-            <el-form-item label="招标费用(客服)" >
+            <el-form-item label="招标费用(客服)" prop="c_zbfykf">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbfy_kf"
+                v-model="addForm.c_zbfykf"
                 controls-position="right"
                 placeholder="请输入招标费用(客服)"
                 />
             </el-form-item>
-            <el-form-item label="委托内容(食堂)" >
-                <el-input v-model="addForm.wtnr_st" placeholder="请输入委托内容(食堂)" />
+            <el-form-item label="委托内容(食堂)" prop="c_wtnrst">
+                <el-input v-model="addForm.c_wtnrst" placeholder="请输入委托内容(食堂)" />
             </el-form-item>
-            <el-form-item label="招标人数(食堂)" >
+            <el-form-item label="招标人数(食堂)" prop="c_zbrsst">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbrs_st"
+                v-model="addForm.c_zbrsst"
                 controls-position="right"
                 placeholder="请输入招标人数(食堂)"
                 />
             </el-form-item>
-            <el-form-item label="招标费用(食堂)" >
+            <el-form-item label="招标费用(食堂)" prop="c_zbfyst">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbfy_st"
+                v-model="addForm.c_zbfyst"
                 controls-position="right"
                 placeholder="请输入招标费用(食堂)"
                 />
             </el-form-item>
-             <el-form-item label="委托内容(其他)" >
-                <el-input v-model="addForm.wtnr_qt" placeholder="请输入委托内容(其他)" />
+             <el-form-item label="委托内容(其他)" prop="c_wtnrqt">
+                <el-input v-model="addForm.c_wtnrqt" placeholder="请输入委托内容(其他)" />
             </el-form-item>
-            <el-form-item label="招标人数(其他)" >
+            <el-form-item label="招标人数(其他)" prop="c_zbrsqt">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbrs_qt"
+                v-model="addForm.c_zbrsqt"
                 controls-position="right"
                 placeholder="请输入招标人数(其他)"
                 />
             </el-form-item>
-            <el-form-item label="招标费用(其他)" >
+            <el-form-item label="招标费用(其他)" prop="c_zbfyqt">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbfy_qt"
+                v-model="addForm.c_zbfyqt"
                 controls-position="right"
                 placeholder="请输入招标费用(其他)"
                 />
-            </el-form-item> -->
-            <el-form-item label="合同面积(平方米)" >
+            </el-form-item>
+            <el-form-item label="合同面积(平方米)" prop="c_htmj">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.htmj"
+                v-model="addForm.c_htmj"
                 controls-position="right"
                 placeholder="请输入合同面积(平方米)"
                 />
             </el-form-item>
-             <el-form-item label="合同签约甲方" >
-                <el-input v-model="addForm.htqyjf" placeholder="请输入合同签约甲方" />
+             <el-form-item label="合同签约甲方" prop="c_htqyjf">
+                <el-input v-model="addForm.c_htqyjf" placeholder="请输入合同签约甲方" />
             </el-form-item>
-            <el-form-item label="首次服务日期">
+            <el-form-item label="首次服务日期" prop="c_scfwrq">
                 <el-date-picker
                 style="width: 100%"
-                v-model="addForm.scfwrq"
+                v-model="addForm.c_scfwrq"
                 type="date"
                 placeholder="请输入首次服务日期"
                 />
             </el-form-item>
-            <!-- <el-form-item label="项目意向公示日期">
+            <el-form-item label="意向公示日期" prop="c_xmyxgsrq">
                 <el-date-picker
                 style="width: 100%"
-                v-model="addForm.xmyxgsrq"
-                type="datetime"
-                placeholder="请输入项目意向公示日期"
+                v-model="addForm.c_xmyxgsrq"
+                type="date"
+                placeholder="请输入意向公示日期"
                 />
             </el-form-item>
-            <el-form-item label="项目招标公告日期">
+            <el-form-item label="招标公告日期" prop="c_xmzbggrq">
                 <el-date-picker
                 style="width: 100%"
-                v-model="addForm.xmzbggrq"
-                type="datetime"
-                placeholder="请输入项目招标公告日期"
+                v-model="addForm.c_xmzbggrq"
+                type="date"
+                placeholder="请输入招标公告日期"
                 />
             </el-form-item>
-            <el-form-item label="项目投标日期">
+            <el-form-item label="投标日期" prop="c_xmtbrq">
                 <el-date-picker
                 style="width: 100%"
-                v-model="addForm.xmtbrq"
-                type="datetime"
-                placeholder="请输入项目投标日期"
+                v-model="addForm.c_xmtbrq"
+                type="date"
+                placeholder="请输入投标日期"
                 />
             </el-form-item>
-            <el-form-item label="项目中标日期(中标函)">
+            <el-form-item label="中标结果" prop="c_zbjgrzbdrhxsj">
+                <el-radio v-model="addFormZbjg" v-for="item in zbjgOptions" :key="item.value" :label="item.value" >{{ item.label }}</el-radio>
+            </el-form-item>
+            <el-form-item label="中标日期(中标函)" prop="c_xmzbrq">
                 <el-date-picker
                 style="width: 100%"
-                v-model="addForm.xmzbrq"
-                type="datetime"
-                placeholder="请输入项目中标日期(中标函)"
+                v-model="addForm.c_xmzbrq"
+                type="date"
+                placeholder="请输入中标日期(中标函)"
                 />
-            </el-form-item> -->
-            <el-form-item label="项目服务合同签订日期">
+            </el-form-item>
+            <el-form-item label="服务合同签订日期" prop="c_xmfwhtqdrq">
                 <el-date-picker
                 style="width: 100%"
-                v-model="addForm.htqdrq"
+                v-model="addForm.c_xmfwhtqdrq"
                 type="date"
-                placeholder="请输入项目服务合同签订日期"
+                placeholder="请输入服务合同签订日期"
                 />
             </el-form-item>
-            <el-form-item label="合同编号" >
-                <el-input v-model="addForm.htbh" placeholder="请输入合同编号" />
+            <el-form-item label="合同编号" prop="c_htbh">
+                <el-input v-model="addForm.c_htbh" placeholder="请输入合同编号" />
             </el-form-item>
-            <el-form-item label="合同开始日期">
+            <el-form-item label="合同开始日期" prop="c_zgxmhtksrq">
                 <el-date-picker
                 style="width: 100%"
-                v-model="addForm.xmhtksrq"
+                v-model="addForm.c_zgxmhtksrq"
                 type="date"
                 placeholder="请输入合同开始日期"
                 />
             </el-form-item>
-            <el-form-item label="合同到期日期">
+            <el-form-item label="合同到期日期" prop="c_zgxmhtdqrq">
                 <el-date-picker
                 style="width: 100%"
-                v-model="addForm.xmhtdqrq"
+                v-model="addForm.c_zgxmhtdqrq"
                 type="date"
                 placeholder="请输入合同到期日期"
                 />
             </el-form-item>
-            <!-- <el-form-item label="本年度合同月数" >
+            <el-form-item label="本年度合同月数" prop="c_bndhtys">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.htys"
+                v-model="addForm.c_bndhtys"
                 controls-position="right"
                 placeholder="请输入本年度合同月数"
                 />
-            </el-form-item> -->
-            <el-form-item label="延伸合同数" >
+            </el-form-item>
+            <el-form-item label="延伸合同数" prop="c_yshts">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.yshts"
+                v-model="addForm.c_yshts"
                 controls-position="right"
                 placeholder="请输入延伸合同数"
                 />
             </el-form-item>
-            <el-form-item label="延伸合同额" >
+            <el-form-item label="延伸合同额" prop="c_yshte">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.yshtje"
+                v-model="addForm.c_yshte"
                 controls-position="right"
                 placeholder="请输入延伸合同额"
                 />
             </el-form-item>
-            <el-form-item label="合同总价" >
+            <el-form-item label="合同总价" prop="c_htzj">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.htzj"
+                v-model="addForm.c_htzj"
                 controls-position="right"
                 placeholder="请输入合同总价"
                 />
             </el-form-item>
-            <el-form-item label="中标得分" >
+            <el-form-item label="中标得分" prop="c_zbdfqk">
                 <el-input-number
                 style="width: 100%"
-                v-model="addForm.zbdf"
+                v-model="addForm.c_zbdfqk"
                 controls-position="right"
                 placeholder="请输入中标得分"
                 />
             </el-form-item>
 
-          
-        <el-form-item label="业态" prop="c_ytfw">
+        <el-form-item label="业态" prop="c_hzyt">
             <el-tree-select
                 placeholder="请选择业态"
                 v-model="addFormYT"
@@ -336,11 +338,9 @@
                 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_wtfs">
+            <el-radio v-model="addFormZgfw" v-for="item in zgfwOptions" :key="item.value" :label="item.value" >{{ item.label }}</el-radio>
         </el-form-item>
         
         <el-form-item label="服务类型" prop="c_fwlx">
@@ -435,19 +435,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'
+import type { FormInstance, FormRules } from 'element-plus'
 // import { ElMessage } from 'element-plus'
 import UTIL from '@/utils/util'
 import MapDraw from '@/components/map/MapDraw.vue'
 import GeoJsonEditor from '@/components/view/GeoJsonEditor.vue'
+import * as turf from '@turf/turf'
+import { title } from 'process'
 
 const mapRef = ref<InstanceType<typeof MapDraw>>()
 // const editRef = ref<InstanceType<typeof GeoJsonEditor>>()
 const geoData = ref<GeoJSON.Feature<GeoJSON.Polygon> | null>(null)
 const area = ref(0)
-
-
-const formRef = ref<FormInstance>()
 const dialogVisible = ref(false)
 
 const soureProjects = ref<any>({})
@@ -484,7 +483,6 @@ const mapFormVisible = ref(false)
 const onGeoJsonChange = (geo: any, num: number) => {
   geoData.value = geo
   area.value = num
-//   console.log('多边形geojson', geo)
 }
 
 
@@ -496,7 +494,6 @@ const clearGeoData = () => {
     mapRef.value?.clearDraw()
 }
 const onGeoJsonEdit = (geo: any) => {
-  console.log('geoJson-edit', geo)
   geoData.value = geo
   mapRef.value?.getBounds(geo)
 }
@@ -507,19 +504,54 @@ const copyGeoJson = async () => {
     const text = JSON.stringify(geoData.value, null, 2);
     UTIL.copyText(text)
   } catch (e) {
-    console.error('复制失败', e)
+
   }
 }
 
 const ytList = ref<resultForm[]>([])
 const addFormZgfw = ref('')
+const addFormZbjg = ref(0)
 const addFormFwlx = ref([])
 const addFormYT = ref('')
-const addFormArea = ref(["310118","QDPQ"])
+const addFormArea = ref([])
+const zgfwOptions = ref<any>([])
+const zbjgOptions = ref<any>([])
+
 
 onMounted(() => {
   initData()
+  initCName()
 })
+const initCName = async () => {
+  // 并行请求两个字典,比await串行更快
+  const [wtOptions, jfOptions] = await Promise.all([
+    getDmsTypes("sq_wtfs"),
+    getDmsTypes("sq_zbjg")
+  ])
+  zgfwOptions.value = wtOptions
+  zbjgOptions.value = jfOptions
+}
+
+const getDmsTypes = async (cName: string) => {
+  const params = {
+    type: 0,
+    cName: cName,
+  }
+  const res = await api.getDmsTypes(params)
+  if ((res as any).code === 200) {
+    const ret = (res as any).content
+    return ret.map((item: any) => ({
+      ...item,
+      label: item.name,
+      value: item.index
+    }))
+  } else {
+    return []
+  }
+}
+
+
+
 const initData = async () => {
     const itemYtList = await getTypeProjects(CONFIG.COLUMNIDARR[8]) // 业态
     ytList.value = []
@@ -530,93 +562,163 @@ const initData = async () => {
         children: item.children || []
     }))
     //源项目数据
-    txbProjects.value = await getSoureProjects(CONFIG.COLUMNIDARR[0],props.projectData.c_glxm,"guid")  // 源项目
-    console.log(txbProjects.value)
+    soureProjects.value = await getSoureProjects(CONFIG.COLUMNIDARR[0],props.projectData.c_glxm,"guid")  // 源项目
+
+    addForm.value.c_xmdz =  soureProjects.value.c_query_address || ''
+    addForm.value.c_htqyjf = soureProjects.value.c_htqyjf || ''
+    addForm.value.c_hzyt = soureProjects.value.c_hzyt || ''
+    addFormYT.value = soureProjects.value.c_hzyt || ''
+    addForm.value.c_father_code = soureProjects.value.c_father_code || ''
+    // addForm.value.scfwrq = soureProjects.value.c_scfwrq || '',  //moment('2019-04-17').format('YYYY-MM-DD'),
+    if(soureProjects.value.c_scfwrq){
+      addForm.value.c_scfwrq = moment(soureProjects.value.c_scfwrq).format('YYYY-MM-DD') || ''
+    }
 
     //投续标项目数据
     txbProjects.value = await getSoureProjects(CONFIG.COLUMNIDARR[2],props.projectData.id,"txb")  // 投续标项目
-    console.log(txbProjects.value)
+
+    const zbInfo = txbProjects.value.zbmsxx ? JSON.parse(txbProjects.value.zbmsxx || '{}') : {}
+    if(zbInfo.zb_publish_time){
+      addForm.value.c_xmzbggrq = moment(zbInfo.zb_publish_time).format('YYYY-MM-DD') || ''
+    }
+    addForm.value.c_xmyxgsrq = ''
+    addForm.value.c_xmtbrq = moment(txbProjects.value.tbrq).format('YYYY-MM-DD') || ''
+
+    const params: any = {
+      columnId: CONFIG.COLUMNIDARR[9],
+      states: '0,1,2,3',
+      pageSize: 1,
+      page: 0
+    }
+     params.search = JSON.stringify([
+        ...(params.search ? JSON.parse(params.search) : []),
+        {
+          field: "c_part_name",
+          searchType: 2,
+          content: { value: `%${soureProjects.value.c_glqynbkj}%` },
+        },
+    ]);
+    if(soureProjects.value.c_glqynbkj){
+      const res = await getDmsDataList(params)
+      const data = (res as any).content.data[0]
+      addFormArea.value = [data?.c_district_code || '', data?.c_part_code || ''] as unknown as never[]
+      addForm.value.c_sq = data.c_district_name || ''
+      addForm.value.c_glqynbkj = data.c_part_name || ''
+    }
+    
  
 }
 const dialogFormVisible = ref(props.flag)
 const close = () => {
   props.close()
 }
-
 const addForm = ref({
   id: '',
-  title: props.projectData.c_xmmc,
-  address: soureProjects.value.c_xmdz || '',
-  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: soureProjects.value.c_htqyjf || '',
-  scfwrq: soureProjects.value.c_scfwrq || '',  //moment('2019-04-17').format('YYYY-MM-DD'),
-  xmyxgsrq: '',
-  xmzbggrq: '',
-  xmtbrq: '',
-  xmzbrq: '',
-  htqdrq: '',
-  htbh: '',
-  xmhtksrq: '',
-  xmhtdqrq: '',
-  htys: null,
-  yshts: null,
-  yshtje: null,
-  htzj: null,
-  zbdf: null,
-  geometry: '',
+  title: '',
+  content: '',
+  c_guid: '',
+  c_father_code: '',
+  c_xmmc: props.projectData.c_xmmc,
+  c_sfzxs: '上海市',
+  c_sq: '',
+  c_glqynbkj: '',
+  c_xmdz: '',
+  c_xfyt: '',
+  c_hzyt: '',
+  c_wtfs: '',
+  c_wtnrzh: '',
+  c_zbrszh: null,
+  c_zbfyzh: null,
+  c_wtnrba: '',
+  c_zbrsba: null,
+  c_zbfyba: null,
+  c_wtnrbj: '',
+  c_zbrsbj: null,
+  c_zbfybj: null,
+  c_wtnrgc: '',
+  c_zbrsgc: null,
+  c_zbfygc: null,
+  c_wtnrhw: '',
+  c_zbrshw: null,
+  c_zbfyhw: null,
+  c_wtnrlh: '',
+  c_zbrslh: null,
+  c_zbfylh: null,
+  c_wtnrsg: '',
+  c_zbrssg: null,
+  c_zbfysg: null,
+  c_wtnrkf: '',
+  c_zbrskf: null,
+  c_zbfykf: null,
+  c_wtnrst: '', 
+  c_zbrsst: null,
+  c_zbfyst: null,
+  c_wtnrqt: '',
+  c_zbrsqt: null,
+  c_zbfyqt: null,
+  c_htmj: null,
+  c_htqyjf: '',
+  c_scfwrq: '',
+  c_xmyxgsrq: '',
+  c_xmzbggrq: '',
+  c_xmtbrq: '',
+  c_zbjgrzbdrhxsj: 0,
+  c_xmzbrq: '',
+  c_xmfwhtqdrq: '',
+  c_htbh: '',
+  c_zgxmhtksrq: '',
+  c_zgxmhtdqrq: '',
+  c_bndhtys: null,
+  c_yshts: null,
+  c_yshte: null,
+  c_htzj: null,
+  c_zbdfqk: null,
+  c_scbmc: '',
+  c_polygon: '',
+  c_bcdzb: '',
 })
 
-const rules = ref({
- 
-})
 // interface ProjectItem {
 //   [key: string]: any
 // }
+const formRef = ref<FormInstance>()
+const rules: FormRules = {
+  c_glqynbkj: [{ required: true, message: '请选择管理区域', trigger: 'change' }],
+  c_xmmc: [{ required: true, message: '请输入项目名称', trigger: 'blur' }],
+  c_xmdz: [{ required: true, message: '请输入项目地址', trigger: 'blur' }],
+  c_htqyjf: [{ required: true, message: '请输入合同签约甲方', trigger: 'blur' }]
+}
 const submitForm = (formEl: FormInstance | undefined) => {
     // ElMessage.success('本项目已推送至市场部负责人,后续将由市场部统一分发至各部门负责人,相关后续流程敬请关注。')
-    console.log(formEl)
-    dialogVisible.value = true
+    if (!formEl) return
+    formEl.validate((valid: boolean) => {
+      if (valid) {
+        // 提交表单数据
+        addProject()
+      } else {
+        // 表单验证失败
+        dialogVisible.value = false
+      }
+    })
+
 }
 const handleConfirm = () => {
   dialogVisible.value = false
   close()
 }
 const handleNodeAreaClick = (item: any) => {
-//   console.log(item)
   addFormArea.value = item
-  console.log(addFormArea)
+  props.glArea.forEach((item: any) => {
+    if(item.value === addFormArea.value[0]){
+      addForm.value.c_sq = item.label
+    }
+    item.children.forEach((child: any) => {
+      if(child.value === addFormArea.value[1]){
+        addForm.value.c_glqynbkj = child.label
+      }
+    })
+  })
+
 }
 
 const getSoureProjects = async (columnId:number,ids: string,type: string) =>{
@@ -637,7 +739,12 @@ const getSoureProjects = async (columnId:number,ids: string,type: string) =>{
     ]);
   }
   const res = await getDmsDataList(params)
-  return (res as any).content.data[0]
+  if((res as any).code == 200){
+    return (res as any).content.data[0]
+  }else{
+    return ''
+  }
+  
 }
 
 const getTypeProjects = async (columnId:number) => {
@@ -666,11 +773,62 @@ const openMapForm = () => {
   }
 }
 const handleMapConfirm = () => {
-    console.log('多边形geojson', geoData.value)
+
     mapFormVisible.value = false
+    addForm.value.c_bcdzb = turf.centerOfMass(geoData.value)?.geometry?.coordinates?.join(',') || ''
+    const wkt =  UTIL.geojsonToWkt(geoData.value?.geometry)
+    addForm.value.c_polygon = wkt || ''
+}
+const addProject = async () => {
+  const curDate = moment().format('YYYYMMDD')
+  const ytcode = ytList.value.find((item: any) => item.c_yt_name === addFormYT.value)?.c_yt_code || ''
+  let guid = `${addFormArea.value[0]}${addFormArea.value[1]}${curDate}${ytcode}`
+  const curNewGUID = await getNewSoureProject(CONFIG.COLUMNIDARR[0],guid,"guid")
+  let count = 0
+  if(curNewGUID){
+    count = Number(curNewGUID.c_guid.substring(curNewGUID.c_guid.length-4,curNewGUID.c_guid.length-2)) || 0
+    count ++
+  }
+  addForm.value.c_guid = `${addFormArea.value[0]}${addFormArea.value[1]}${curDate}${ytcode}${count.toString().length>1?count.toString():'0'+count.toString()}${addForm.value.c_father_code?"01":"00"}`
+  addForm.value.title = addForm.value.c_guid
+  addForm.value.content = addForm.value.c_guid
+  addForm.value.c_hzyt = addFormYT.value
+  addForm.value.c_xfyt = addFormYT.value
+  addForm.value.c_wtfs = addFormZgfw.value
+  addForm.value.c_zbjgrzbdrhxsj = addFormZbjg.value
+  const params: any = {
+    content: JSON.stringify(addForm.value),
+    columnId: CONFIG.COLUMNIDARR[0],
+    modelId: CONFIG.MODELIDARR[7],
+  }
+
+  const res = await api.addContent(params)
+  if ((res as any).code === 200) {
+    // ElMessage.success('添加成功')
+    dialogVisible.value = true
+    updateProject(props.projectData,true)
+  }else{
+    // ElMessage.error('添加失败')
+    dialogVisible.value = false
+  }
 }
 
+const getNewSoureProject = async (columnId:number,ids: string,type: string) =>{
+  return await getSoureProjects(columnId,ids,type)
+}
 
+const updateProject = async (item: any,flag:boolean) => {
+  const params: any = {
+    columnId: CONFIG.COLUMNIDARR[6],
+    modelId: CONFIG.MODELIDARR[3],
+    content: JSON.stringify({
+      id: item.id,
+      c_sfts: flag,
+      c_tssj: moment().format('YYYY-MM-DD HH:mm:ss'),
+    }),
+  }
+  await api.updateContent(params)
+}
 
 
 // const updateProject = async (columnId:number,modelId:number,content:string) => {
@@ -679,7 +837,6 @@ const handleMapConfirm = () => {
 //     modelId: modelId,
 //     content: content,
 //   }
-//   // console.log(params)
 //   const res = await api.updateContent(params)
 //   if ((res as any).code === 200) {
 //     // ElMessage.success('添加成功')

+ 48 - 35
src/components/renewal/BidRenewal.vue

@@ -67,8 +67,8 @@
               <div>
                 <span>{{ item[columnId+'_c_xmbtqc'] }} </span>
                 <span>  ·  合同时间 {{ moment(item[columnId+'_c_kssj']).format('YYYY-MM-DD') }} 至 {{ moment(item[columnId+'_c_dqsj']).format('YYYY-MM-DD') }}</span>
-                <span>  ·  年化 {{ UTIL.formatCurrency(item[columnId+'_c_nh']) }} 万元</span>
-                <span>  ·  {{ item[columnId+'_c_zgfw'] }}  {{ item[columnId+'_c_ytfw'] }}</span>
+                <span>  ·  年化 {{ UTIL.formatCurrency(item[columnId+'_c_nh']/10000) }} 万元</span>
+                <!-- <span>  ·  {{ item[columnId+'_c_zgfw'] }}  {{ item[columnId+'_c_ytfw'] }}</span> -->
               </div>
               <div v-if="item.zb_source_name">
                 <span>{{ item.zb_source_name }}  ·  {{ item.zb_project_name }}</span>
@@ -78,8 +78,8 @@
             </div>
           </div>
           <div class="renewal-row-actions">
-            <span v-if="!['已完成','已中标'].includes(item.type)" :class="['days-badge', item.daysClass]">{{ item.days }}</span>
-            <span :class="['days-badge', item.jdClass]">{{ item.type }}</span>
+            <span v-if="!['已完成','已中标'].includes(item.type)" :class="['badge', item.daysClass]">{{ item.days }}</span>
+            <span :class="['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>
           </div>
@@ -164,15 +164,7 @@
                 />
           </el-form-item>
           <el-form-item label="委托类型" prop="c_zgfw">
-            <!-- <el-input v-model="addForm.c_zgfw" autocomplete="off" placeholder="请输入委托服务" /> -->
-            <!-- <el-checkbox-group v-model="addFormZgfw">
-              <el-checkbox label="全委"></el-checkbox>
-              <el-checkbox label="单一单委"></el-checkbox>
-              <el-checkbox label="多项单委"></el-checkbox>
-            </el-checkbox-group> -->
-            <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-radio v-model="addFormZgfw" v-for="item in zgfwOptions" :key="item.value" :label="item.value" >{{ item.label }}</el-radio>
           </el-form-item>
           <el-form-item label="业态" prop="c_ytfw">
             <el-tree-select
@@ -284,7 +276,7 @@ interface TreeItem {
   children: TreeItem[],
   [key: string]: any
 }
-
+const zgfwOptions = ref<any>([])
 const selectedRegion = ref('')
 const dialogFormVisible = ref(false)
 const addFormZgfw = ref('')
@@ -318,6 +310,7 @@ const renewalStats = ref([
 ])
 
 const jdArr = ref([
+  // { n: 0, label: '已过期',color:'grey‌' },
   { n: 1, label: '预警中',color:'warn' },
   { n: 2, label: '准备中',color:'padding'},  
   { n: 3, label: '匹配中',color:'match'},
@@ -368,7 +361,7 @@ const getTabName = (stat: { label: string; highlight: boolean }) => {
 }
 
 const handleViewClick = (project: any) => {
-  // console.log(project)
+
   let projectName,name,dmsId,progres;
   if(project[columnId+'_c_is_xb'] === true){ // 续标
     projectName = project[columnId+'_c_xmbtqc']
@@ -395,11 +388,12 @@ const handleViewClick = (project: any) => {
 }
 
 const submitForm = (formEl: FormInstance | undefined) => {
+
   if (!formEl) return
   formEl.validate((valid: boolean) => {
     if (valid) {
       getXMProjects(addForm.value.xmbh,'xmbh').then(async res => {
-        // console.log(res)
+
         if(res.length>0){  // 直接进入投续标详情页面
           ElMessage.error('此续标项目已存在,请重新选择')
         }else{
@@ -407,7 +401,7 @@ const submitForm = (formEl: FormInstance | undefined) => {
           const expireDate = moment(moment(addForm.value.c_dqsj).format('YYYY-MM-DD'), 'YYYY-MM-DD')
           const today = moment().startOf('day')
           const days = expireDate.diff(today, 'days')
-          // console.log(days)
+
           if(days>=100){ // 大于百天,不需要预警
             for(let i = 1; i<3; i++){
               let str = {
@@ -433,7 +427,7 @@ const submitForm = (formEl: FormInstance | undefined) => {
           addForm.value.c_ytfw = addFormYT.value
           addForm.value.c_fwlx = addFormFwlx.value.join(',')
           addForm.value.c_xmjd_json = JSON.stringify(tempArr.value)
-          // console.log(addForm.value)
+
           dialogFormVisible.value = false
           addProject()
         }
@@ -448,7 +442,7 @@ const addProject = async () => {
     columnId: columnId,
     modelId: CONFIG.MODELIDARR[0],
   }
-  // console.log(params)
+
   const res = await api.addContent(params)
   if((res as any).code === 200){
     ElMessage.success('添加成功')
@@ -476,6 +470,7 @@ onMounted(() => {
 
 const initData = () => {
   getProjects();
+  getDmsTypes();
   renewalStats.value.forEach(async (element:any) => {
     let time=''
     if(element.label === '全部'){
@@ -491,7 +486,25 @@ const initData = () => {
   });
 
 }
+const getDmsTypes = () => {
+  let params = {
+    type:0,
+    cName: "sq_wtfs",
+  }
+  api.getDmsTypes(params).then(res => {
+    if((res as any).code === 200){
+      let ret  = (res as any).content
+      zgfwOptions.value = ret.map((item: any) => ({
+        ...item,
+        label: item.name,
+        value: item.index
+      }))
 
+    }else{
+      zgfwOptions.value = []
+    }
+  })
+}
 const getytProjects = async () => {
     const params: any = {
       columnId: CONFIG.COLUMNIDARR[8],
@@ -510,7 +523,7 @@ const getytProjects = async () => {
     }else{
       ytList.value = []
     }
-    // console.log(ytList.value)
+
 }
 const getProjects = async () => {
   const params: any = {
@@ -566,7 +579,6 @@ const getProjects = async () => {
   }
   const res = await api.getMultipleFormsOfJointInvestigation(params)
   if ((res as any).code === 200) {
-    // console.log(res) item.c_kssj,item.c_dqsj
     
     // 使用 Promise.all 等待所有异步操作完成
     const data = (res as any).content.data
@@ -584,7 +596,7 @@ const getProjects = async () => {
     
     renewalList.value = promises
     total.value = (res as any).content.count
-    // console.log(renewalList.value)
+
   }else{
     renewalList.value = []
     total.value = 0
@@ -631,7 +643,7 @@ const getCountProjects = async (entTime: string) => {
 const calculateRemaining = (st: string, et: string, xmjd: number): { days: string; daysClass: string; year: string; type: string; jdClass: string;} => {
   if (!et) return { days: '', daysClass: '', year: '', type: '', jdClass: jdArr.value[xmjd-1].color}
   const startDate = moment(moment(st).format('YYYY-MM-DD'), 'YYYY-MM-DD')
-  const expireDate = moment(moment(et).add(45, 'days').format('YYYY-MM-DD'), 'YYYY-MM-DD')
+  const expireDate = moment(moment(et).add(0, 'days').format('YYYY-MM-DD'), 'YYYY-MM-DD')
   
   if (!startDate.isValid() || !expireDate.isValid()) {
     return { days: '', daysClass: '', year: '', type: '', jdClass: jdArr.value[xmjd-1].color}
@@ -651,9 +663,9 @@ const calculateRemaining = (st: string, et: string, xmjd: number): { days: strin
     if (yearNum < 0) yearNum = 0
   }
   if (diffDays < 0) {
-    return { days: `已过期${Math.abs(diffDays)}天`, daysClass: 'grey', year: yearNum.toString(), type: jdArr.value[xmjd-1].label, jdClass: jdArr.value[xmjd-1].color}
+    return { days: `已过期${Math.abs(diffDays)}天`, daysClass: 'grey', year: yearNum.toString(), type: jdArr.value[xmjd-1].label, jdClass: jdArr.value[xmjd-1].color}
   } else if (diffDays === 0) {
-    return { days: '今天到期', daysClass: 'grey', year: yearNum.toString(), type: jdArr.value[xmjd-1].label, jdClass: jdArr.value[xmjd-1].color}
+    return { days: '今天到期', daysClass: 'red', year: yearNum.toString(), type: jdArr.value[xmjd-1].label, jdClass: jdArr.value[xmjd-1].color}
   } else if (diffDays <= 60) {
     return { days: `剩余${diffDays}天`, daysClass: 'red', year: yearNum.toString(), type: jdArr.value[xmjd-1].label, jdClass: jdArr.value[xmjd-1].color}
   } else if (diffDays <= 90) {
@@ -682,11 +694,11 @@ const handleSwitchChange = (val: boolean) => {
   addForm.value.c_glqy = ''
   addForm.value.c_is_xb = val
   addForm.value.rwlcqd = JSON.stringify(CONFIG.TASKLIST)
-  // console.log(addForm.value)
+
 }
 
 // const handleNodeClick = (item: any) => {
-//   // console.log(item)
+
 //   addForm.value.title = item.title
 //   addForm.value.content = item.content
 //   addForm.value.c_fbz = item.c_htqyjf
@@ -709,10 +721,11 @@ const handleSwitchChange = (val: boolean) => {
 
 
 const handleCascaderChange = (val: any) => {
+
   addForm.value.c_qx = val[0]
   let tempObj = finishTreeProjects.value.filter((item: any) => item.id.includes(val[1]))[0]
   finishObject.value = tempObj
-  addForm.value.title = tempObj.title
+  addForm.value.title = tempObj.c_xmmc
   addForm.value.content = tempObj.content
   addForm.value.c_fbz = tempObj.c_htqyjf
   addForm.value.c_jdbm = ''
@@ -725,19 +738,19 @@ const handleCascaderChange = (val: any) => {
   addForm.value.c_kssj = moment(tempObj.c_zgxmhtksrq).format('YYYY-MM-DD HH:mm')
   addForm.value.c_dqsj = moment(tempObj.c_zgxmhtdqrq as any).format('YYYY-MM-DD HH:mm').toString()
   addForm.value.c_xmbt = tempObj.c_xmmc
-  addForm.value.xmbh = tempObj.c_guid
+  addForm.value.xmbh = tempObj.c_father_code?tempObj.c_father_code:tempObj.c_guid
   // addForm.value.c_is_xb = false
   addForm.value.rwlcqd = JSON.stringify(CONFIG.TASKLIST)
   
 }
 
 // const handleNodeAreaClick = (item: any) => {
-//   // console.log(item)
+
 //   addForm.value.c_qx = item.value
 //   finishObject.value = {id:'',title:'',content:'',c_guid:'',c_htqyjf:'',c_jdbm:'',c_wtfs:'',c_nhhtsr:'',c_xmmc:'',c_sq:'',c_zgxmhtksrq:'',c_zgxmhtdqrq:'',c_father_code:''}
 // }
 const handleNodeGlAreaClick = (item: any) => {
-  // console.log(item)
+
   addForm.value.c_glqy = item.value
 }
 
@@ -749,7 +762,7 @@ const getXMProjects = async (id: string,type: string) => {
     pageSize: 1,
     page: 0
   }
-  // console.log(params)
+
   if (id !== "") {
     params.search = JSON.stringify([
         ...(params.search ? JSON.parse(params.search) : []),
@@ -783,7 +796,7 @@ const getFinishProjects = async () => {
   const res = await getDmsDataList(params)
   if ((res as any).code === 200) {
     finishTreeProjects.value = buildTree((res as any).content.data)
-    // console.log(finishTreeProjects.value)
+
   }else{
     finishTreeProjects.value = []
   }
@@ -796,7 +809,7 @@ const buildTree = (data: any[]): any[] => {
     map.set(item.c_guid, {
       ...item,
       value: item.id,
-      label: item.title,
+      label: item.c_xmmc,
       children: []
     })
   })
@@ -842,7 +855,7 @@ const getAdminArea = async () => {
     const uniqueGlTree = Array.from(
       new Map(glArea.value.map(item => [item.value, item])).values()
     )
-    // console.log(uniqueGlTree)
+
     adminArea.value = uniqueTree
     glArea.value = uniqueGlTree
     

+ 1 - 1
src/components/renewal/Renew.vue

@@ -155,7 +155,7 @@ const getProjects = async () => {
     )
     renewalList.value = await Promise.all(promises)
     total.value = (res as any).content.count
-    // console.log(renewalList.value)
+
   }else{
     renewalList.value = []
     total.value = 0

+ 3 - 3
src/components/tenderpool/Intention.vue

@@ -169,7 +169,7 @@ const getProjects = async () => {
   }
   
   const res = await getDmsDataList(params)
-  // console.log(res)
+
   if ((res as any).code === 200) {
     dataList.value = (res as any).content.data.map((item: any) => ({
       ...item,
@@ -178,7 +178,7 @@ const getProjects = async () => {
       ...calculateRemaining(JSON.parse(item.c_content_document).sections[0].blocks[0].rows[0]['预计采购时间(填写到月)'])
     }))
     total.value = (res as any).content.count
-    // console.log(dataList.value)
+
   }else{
     dataList.value = []
     total.value = 0
@@ -193,7 +193,7 @@ const calculateRemaining = (et: string): { days: string; daysClass: string; } =>
   if (!et) return { days: '', daysClass: '' }
   // 1. 正则剔除末尾 (北京时间) 多余字符
   const expireDate = moment(moment(et).add(1, 'months').format('YYYY-MM-DD HH:mm'), 'YYYY-MM-DD HH:mm')
-  // console.log(expireDate)
+
   if (!expireDate.isValid()) {
     return { days: '', daysClass: '' }
   }

+ 30 - 33
src/components/tenderpool/Monitor.vue

@@ -149,9 +149,7 @@
                         />
                   </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-radio v-model="addFormZgfw" v-for="item in zgfwOptions" :key="item.value" :label="item.value" >{{ item.label }}</el-radio>
                   </el-form-item>
                   <el-form-item label="业态" prop="c_zgfw">
                     <el-tree-select
@@ -224,10 +222,8 @@
                         />
                   </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-radio v-model="addFormZgfw" v-for="item in zgfwOptions" :key="item.value" :label="item.value" >{{ item.label }}</el-radio>
+                 </el-form-item>
                   <el-form-item label="业态" prop="c_zgfw">
                     <el-tree-select
                           placeholder="请选择业态"
@@ -382,7 +378,7 @@ const glArea = ref([{} as TreeItem])
 const finishTreeProjects = ref([{} as TreeItem])
 const finishProjects = ref([{} as PoolItem])
 const finishObject = ref<any>({id:'',title:'',content:'',c_guid:'',c_htqyjf:'',c_jdbm:'',c_wtfs:'',c_nhhtsr:'',c_xmmc:'',c_sq:'',c_zgxmhtksrq:'',c_zgxmhtdqrq:'',c_father_code:''})
-
+const zgfwOptions = ref<any>([])
 const areaList = ref(['全部','黄浦区','徐汇区','长宁区','静安区','普陀区','虹口区','杨浦区','闵行区','宝山区','嘉定区','浦东新区','金山区','松江区','青浦区','奉贤区','崇明区'])
 
 const monitorStats = ref([
@@ -463,7 +459,7 @@ const handleCascaderChange = (val: any) => {
     }
     tempArr.push(str)
   }
-  addForm.value.title = tempObj.title
+  addForm.value.title = tempObj.c_xmmc
   addForm.value.content = tempObj.content
   addForm.value.c_fbz = tempObj.c_htqyjf
   addForm.value.c_jdbm = ''
@@ -478,21 +474,19 @@ const handleCascaderChange = (val: any) => {
   addForm.value.xmbh = tempObj.c_guid
   addForm.value.c_is_xb = false
   addForm.value.rwlcqd = JSON.stringify(CONFIG.TASKLIST)
-  console.log(val)
+
 }
 
 
 // const handleNodeAreaClick = (item: any) => {
-//   // console.log(item)
+
 //   addForm.value.c_qx = item.value
 //   finishObject.value = {id:'',title:'',content:'',c_guid:'',c_htqyjf:'',c_jdbm:'',c_wtfs:'',c_nhhtsr:'',c_xmmc:'',c_sq:'',c_zgxmhtksrq:'',c_zgxmhtdqrq:'',c_father_code:''}
 // }
 const handleNodeGlAreaClick = (item: any) => {
-  // console.log(item)
   addForm.value.c_glqy = item.value
 }
 const handleViewClick = async (item: any,name:string) => {
-  // console.log(item) 
   addFormZgfw.value = ''
   addFormYT.value = ''
   addForm.value.c_glqy = ''
@@ -508,9 +502,7 @@ const handleViewClick = async (item: any,name:string) => {
   }else if(name == "原公告链接"){ // 打开原公告链接
     window.open(item.c_detail_url)
   }else if(name == "标书编制"){ // 打开标书编制
-    // console.log(item)
     getXMProjects(item.id,'zbxmbh').then(async res => {
-      // console.log(res)
       if(res.length>0){
         sessionStorage.setItem('projectName', res[0].c_xmbt)
         sessionStorage.setItem('name', res[0].c_xmbtqc)
@@ -534,7 +526,6 @@ const getXMProjects = async (id: string,type: string) => {
     pageSize: 1,
     page: 0
   }
-  // console.log(params)
   if (id !== "") {
     params.search = JSON.stringify([
         ...(params.search ? JSON.parse(params.search) : []),
@@ -555,14 +546,12 @@ const getXMProjects = async (id: string,type: string) => {
 
 // 标书类型对应 (招标:0;投标:1;续标:2;储备:3;忽略:改成草稿0)
 const handleConfirmClick =(formEl: FormInstance | undefined) => {
-  // console.log(dialogName.value)
   if(!formEl){
     if(dialogName.value == "储备"){
       updateProject(project.value,3)
     }else if(dialogName.value == "忽略"){
       updateAudit(project.value,0)
     }else if(dialogName.value == "移出"){
-      // console.log(dialogName.value)
       updateProject(project.value,0)
     }
     dialogFormVisible.value = false
@@ -573,7 +562,6 @@ const handleConfirmClick =(formEl: FormInstance | undefined) => {
     if (valid) {
       if(dialogName.value == "投标"){
         getXMProjects(finishObject.value.id,'zbxmbh').then(res => {
-          // console.log(res)
           if(res>0){
             ElMessage.error('此标已投标,不能重复投标')
           }else{
@@ -586,7 +574,6 @@ const handleConfirmClick =(formEl: FormInstance | undefined) => {
           return
         }
         getXMProjects(finishObject.value.id,'xmbh').then(res => {
-          // console.log(res)
           if(res>0){
             ElMessage.error('此项目已续标,不能重复续标')
           }else{
@@ -598,8 +585,6 @@ const handleConfirmClick =(formEl: FormInstance | undefined) => {
       updateCountData();
     }
   })
-
-  
 }
 
 const updateProject = async (item: any,type:number) => {
@@ -627,9 +612,28 @@ onMounted(() => {
 
 const initData = () => {
   getProjects()
+  getDmsTypes()
   updateCountData()
   windLoadData()
 }
+const getDmsTypes = () => {
+  let params = {
+    type:0,
+    cName: "sq_wtfs",
+  }
+  api.getDmsTypes(params).then(res => {
+    if((res as any).code === 200){
+      let ret  = (res as any).content
+      zgfwOptions.value = ret.map((item: any) => ({
+        ...item,
+        label: item.name,
+        value: item.index
+      }))
+    }else{
+      zgfwOptions.value = []
+    }
+  })
+}
 
 const windLoadData = () => {
   getFinishProjects()
@@ -656,7 +660,6 @@ const getytProjects = () => {
         ytList.value = []
       }
     })
-    // console.log(ytList.value)
 }
 
 const updateCountData = async () => {
@@ -753,14 +756,12 @@ const getProjects = async () => {
     ]);
   }
   const res = await getDmsDataList(params)
-  // console.log(res)
   if ((res as any).code === 200) {
     poolList.value = (res as any).content.data.map((item: any) => ({
       ...item,
       ...calculateRemainingDays(item.c_publish_time,item.c_bid_deadline)
     }))
     total.value = (res as any).content.count
-    // console.log(poolList.value)
   }else{
     poolList.value = []
     total.value = 0
@@ -779,7 +780,6 @@ const getFinishProjects = () => {
     if ((res as any).code === 200) {
       finishProjects.value = (res as any).content.data
       finishTreeProjects.value = buildTree(finishProjects.value)
-      // console.log(finishTreeProjects.value)
       getAdminArea()
     }else{
       finishProjects.value = []
@@ -809,7 +809,7 @@ const buildTree = (data: any[]): any[] => {
     map.set(item.c_guid, {
       ...item,
       value: item.id,
-      label: item.title,
+      label: item.c_xmmc,
       children: []
     })
   })
@@ -880,7 +880,6 @@ const addProject = async (isType: boolean) => {
           const expireDate = moment(moment(finishObject.value.c_zgxmhtdqrq).format('YYYY-MM-DD'), 'YYYY-MM-DD')
           const today = moment().startOf('day')
           const days = expireDate.diff(today, 'days')
-          // console.log(days)
           if(days>=100){ // 大于百天,不需要预警
             for(let i = 1; i<3; i++){
               let str = {
@@ -905,12 +904,12 @@ const addProject = async (isType: boolean) => {
 
         formData = {
             //项目
-            title: finishObject.value.title,
+            title: finishObject.value.c_xmmc,
             content: finishObject.value.content,
             c_fbz: finishObject.value.c_htqyjf,
             // c_jdbm: finishObject.value.c_jdbm,
             c_zgfw: addFormZgfw.value,
-            c_nh: finishObject.value.c_nhhtsr,
+            c_nh: finishObject.value.c_nh || "0",
             c_xmbtqc: finishObject.value.c_xmmc,
             c_qx: finishObject.value.c_sq,
             c_xmjd_json:JSON.stringify(tempArr),
@@ -946,7 +945,7 @@ const addProject = async (isType: boolean) => {
             c_fbz:  addForm.value.c_fbz,
             // c_jdbm: addForm.value.c_jdbm,
             c_zgfw: addFormZgfw.value,
-            c_nh: addForm.value.c_nh,
+            c_nh: addForm.value.c_nh || "0",
             c_xmbtqc: addForm.value.c_xmbtqc,
             c_qx: addForm.value.c_qx,
             c_kssj: moment(finishObject.value.c_zgxmhtksrq).format('YYYY-MM-DD HH:mm'),
@@ -995,7 +994,6 @@ const addProject = async (isType: boolean) => {
     columnId: CONFIG.COLUMNIDARR[2],
     modelId: CONFIG.MODELIDARR[0],
   }
-  // console.log(params)
   const res = await api.addContent(params)
   if((res as any).code === 200){
     if(isType){ // 续标
@@ -1046,7 +1044,6 @@ const getAdminArea = () => {
       const uniqueGlTree = Array.from(
         new Map(glArea.value.map(item => [item.value, item])).values()
       )
-      // console.log(uniqueGlTree)
       adminArea.value = uniqueTree
       glArea.value = uniqueGlTree
     }else{

+ 0 - 4
src/components/tenderpool/Notice.vue

@@ -120,7 +120,6 @@ interface PoolItem {
 const poolList = ref<PoolItem[]>([])
 
 const handleViewClick = (item: any) => {
-  // console.log(item) 
  window.open(item.c_detail_url)
 }
 
@@ -190,14 +189,12 @@ const getProjects = async () => {
     ]);
   }
   const res = await getDmsDataList(params)
-  // console.log(res)
   if ((res as any).code === 200) {
     poolList.value = (res as any).content.data.map((item: any) => ({
       ...item,
       ...calculateRemainingDays(item.c_publish_time,item.c_bid_deadline)
     }))
     total.value = (res as any).content.count
-    // console.log(poolList.value)
   }else{
     poolList.value = []
     total.value = 0
@@ -219,7 +216,6 @@ const calculateRemainingDays = (st: string, et: string): { days: string; daysCla
   if (!startDate.isValid() || !expireDate.isValid()) {
     return { days: '', daysClass: '', year: '' }
   }
-  // console.log(startDate, expireDate)
   
   const today = moment().startOf('day')
   const diffDays = expireDate.diff(today, 'days')

+ 0 - 3
src/components/view/GeoJsonEditor.vue

@@ -29,7 +29,6 @@ const initEditor = () => {
     onChange: function () {
         // 内容发生变化触发(手动输入、拖拽、修改都触发)
         // const jsonData = editor?.get();
-        // console.log('数据变更:', jsonData);
         // emit('geoJson-edit', jsonData)
         // const errors = editor.validate();
         const errors = editor?.validate() || []
@@ -37,11 +36,9 @@ const initEditor = () => {
           if (errList.length === 0) {
             const jsonData = safeGetEditorData(editor)
             emit('geoJson-edit', jsonData)
-            console.log(jsonData)
           } else {
             // emit('geoJson-edit', null)
             ElMessage.error("存在语法错误")
-            console.log("存在语法错误", errList)
           }
         })
     }

+ 0 - 2
src/layouts/MainLayout.vue

@@ -91,10 +91,8 @@ const navItems = [
 ]
 
 const currentTitle = computed(() => {
-  // console.log("currentTitle",router.currentRoute.value.path)
   // sessionStorage.setItem('activeTab','ongoing')
   const item = navItems.find(n => n.path === router.currentRoute.value.path)
-  // console.log("item", item,router.currentRoute.value.path)
   if(!item){
     return sessionStorage.getItem('name')
   }else{

+ 0 - 1
src/utils/request.ts

@@ -41,7 +41,6 @@ instance.interceptors.response.use(
   },
   (error) => {
     if (error.response) {
-      console.log(error.response)
       const status = error.response.status
       if (status === 401 || status === 403) {
         localStorage.removeItem('token')

+ 67 - 1
src/utils/util.ts

@@ -37,9 +37,75 @@ const copyText = function (text:any) {
   } catch (e) { }
 }
 
+/**
+ * 完整版 GeoJSON 转 WKT
+ * 支持:Point / LineString / Polygon / MultiPoint / MultiLineString / MultiPolygon / GeometryCollection
+ */
+function geojsonToWkt(geojson: any) {
+  // 处理 Feature,取出 geometry
+  let geom = geojson;
+  if (geojson.type === 'Feature') {
+    geom = geojson.geometry;
+  }
+
+  // 点
+  if (geom.type === 'Point') {
+    const [x, y] = geom.coordinates;
+    return `POINT (${x} ${y})`;
+  }
+
+  // 线
+  if (geom.type === 'LineString') {
+    const coords = geom.coordinates.map((c: any) => `${c[0]} ${c[1]}`).join(', ');
+    return `LINESTRING (${coords})`;
+  }
+
+  // 面
+  if (geom.type === 'Polygon') {
+    const rings = geom.coordinates.map((ring: any) => 
+      ring.map((c: any) => `${c[0]} ${c[1]}`).join(', ')
+    ).map((ringStr: any) => `(${ringStr})`).join(', ');
+    return `POLYGON (${rings})`;
+  }
+
+  // 多点
+  if (geom.type === 'MultiPoint') {
+    const coords = geom.coordinates.map((c: any) => `${c[0]} ${c[1]}`).join(', ');
+    return `MULTIPOINT (${coords})`;
+  }
+
+  // 多线
+  if (geom.type === 'MultiLineString') {
+    const lines = geom.coordinates.map((line: any) => 
+      `(${line.map((c: any) => `${c[0]} ${c[1]}`).join(', ')})`
+    ).join(', ');
+    return `MULTILINESTRING (${lines})`;
+  }
+
+  // 多面
+  if (geom.type === 'MultiPolygon') {
+    const polygons = geom.coordinates.map((polygon: any) => {
+      const rings = polygon.map((ring: any) => 
+        `(${ring.map((c: any) => `${c[0]} ${c[1]}`).join(', ')})`
+      ).join(', ');
+      return `(${rings})`;
+    }).join(', ');
+    return `MULTIPOLYGON (${polygons})`;
+  }
+
+  // 几何集合
+  if (geom.type === 'GeometryCollection') {
+    const geometries = geom.geometries.map((g: any) => geojsonToWkt(g)).join(', ');
+    return `GEOMETRYCOLLECTION (${geometries})`;
+  }
+
+  throw new Error('不支持的几何类型: ' + geom.type);
+}
+
 export default {
   formatCurrency,
   generateUUID,
   downloadFile,
-  copyText
+  copyText,
+  geojsonToWkt
 }

+ 0 - 2
src/views/bidPreparation/RenewalDetail.vue

@@ -96,13 +96,11 @@ const getProjects = async () => {
     ]);
   }
   const res = await getDmsDataList(params)
-  // console.log(res)
   if ((res as any).code === 200) {
     projects.value = (res as any).content.data.map((item: any) => ({
       ...item,
       ...calculateRemainingDays(item.c_kssj,item.c_dqsj)
     }))[0]
-    // console.log(projects.value)
   }
 }
 

+ 128 - 84
src/views/bidPreparation/RenewalExpireDetail.vue

@@ -6,7 +6,7 @@
         <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 || ''}} · {{projects.zbmsxx ?.zb_project_name || ''}} · 金额{{UTIL.formatCurrency(projects.c_nh/10000 || '0')}}万元</div>
         <!-- <div class="project-meta">{{projects.c_fbz || projects.zbmsxx ?.zb_source_name || '上海市杨浦区政府采购中心'}} · 杨浦区图书馆总馆物业管理服务项目 · 金额{{UTIL.formatCurrency(projects.c_nh || '0')}}万元</div> -->
 
 
@@ -213,11 +213,11 @@
             </div>
             <div class="info-row">
               <span class="label">合同金额</span>
-              <span class="value">{{UTIL.formatCurrency(projects.c_nh)}}万元</span>
+              <span class="value">{{UTIL.formatCurrency(projects.c_nh/10000)}}万元</span>
             </div>
             <div class="info-row">
               <span class="label">委托服务</span>
-              <span class="value">{{wtArr[projects.c_zgfw]}}</span>
+              <span class="value">{{getWTFWLabel(projects.c_zgfw)}}</span>
             </div>
             <!-- <div class="info-row">
               <span class="label">合同状况</span>
@@ -475,19 +475,21 @@
               class="upload-demo"
               drag
               :auto-upload="false"
-              v-model="ruleBidForm.file1"
+              v-model="ruleBidForm.file1.name"
               :accept="'.pdf,.docx,.doc'"
-              :max-size="500 * 1024 * 1024"
+              :max-size="10 * 1024 * 1024"
+              :limit="1"
               :on-change="handleFileChange"
               action=""
             >
+            <!-- :on-change="handleFileChange" -->
               <el-icon class="el-icon--upload"><upload-filled /></el-icon>
               <div class="el-upload__text">
                 <em>拖拽或点击选择文件到此处</em>
               </div>
               <template #tip>
                 <div class="el-upload__tip">
-                  仅支持PDF、DOCX、DOC格式,大小不超过500MB
+                  仅支持PDF、DOCX、DOC格式,大小不超过10MB
                 </div>
               </template>
             </el-upload>
@@ -497,19 +499,21 @@
               class="upload-demo"
               drag
               :auto-upload="false"
-              v-model="ruleBidForm.file2"
+              v-model="ruleBidForm.file2.name"
               :accept="'.pdf,.docx,.doc'"
-              :max-size="500 * 1024 * 1024"
+              :max-size="10 * 1024 * 1024"
+              :limit="1"
               :on-change="handleFileChange2"
               action=""
             >
+            <!--  -->
               <el-icon class="el-icon--upload"><upload-filled /></el-icon>
               <div class="el-upload__text">
                 <em>拖拽或点击选择文件到此处</em>
               </div>
               <template #tip>
                 <div class="el-upload__tip">
-                  仅支持PDF、DOCX、DOC格式,大小不超过500MB
+                  仅支持PDF、DOCX、DOC格式,大小不超过10MB
                 </div>
               </template>
             </el-upload>
@@ -519,22 +523,23 @@
             <el-upload
               class="upload-demo"
               drag
-               v-model="ruleBidForm.file3.name"
+              v-model="ruleBidForm.file3.name"
               :auto-upload="false"
               :accept="'.pdf,.docx,.doc'"
-              :max-size="500 * 1024 * 1024"
+              :max-size="10 * 1024 * 1024"
+              :limit="1"
               :on-change="handleFileChange3"
-              :on-remove="handleFileRemove3"
-              :file-list="ruleBidForm.file3.file"
               action=""
             >
+            <!-- :on-remove="handleFileRemove3"
+              :file-list="ruleBidForm.file3.file" -->
               <el-icon class="el-icon--upload"><upload-filled /></el-icon>
               <div class="el-upload__text">
                 <em>拖拽或点击选择文件到此处</em>
               </div>
               <template #tip>
                 <div class="el-upload__tip">
-                  仅支持PDF、DOCX、DOC格式,大小不超过500MB
+                  仅支持PDF、DOCX、DOC格式,大小不超过10MB
                 </div>
               </template>
             </el-upload>
@@ -658,14 +663,9 @@ const ruleBidForm = reactive<RuleForm>({
   },
   file3: {
     name:'',
-    file:[],
+    file:null,
   },
 })
-const wtArr = ref<any>([
-  '全委',
-  '单一单委',
-  '多项单委'
-])
 const historyBidList = ref<any>([
   {
     year: '2019',
@@ -841,7 +841,8 @@ const ruleKBJKForm = reactive<RuleForm>({
   c_sfzb:false,
   c_kbsj:'',
   c_xmmc:'',
-  c_zbtjr:moment('2026-06-29 10:00:00').format('YYYY-MM-DD HH:mm:ss'),
+  // c_zbtjr:moment('2026-06-29 10:00:00').format('YYYY-MM-DD HH:mm:ss'),
+  c_zbtjr:'',
   c_tbbj:'',
   c_glxm:'',
   c_enable: true
@@ -860,9 +861,38 @@ const goToPage = (path: string) => {
 }
 
 onMounted(() => {
+  initCName()
   initData()
 })
+const wtfwOptions = ref<any>([])
+const getWTFWLabel = (value: string) => {
+  return wtfwOptions.value.find((item: any) => item.value == value)?.label || '-'
+}
+const getDmsTypes = async (cName: string) => {
+  const params = {
+    type: 0,
+    cName: cName,
+  }
+  const res = await api.getDmsTypes(params)
+  if ((res as any).code === 200) {
+    const ret = (res as any).content
+    return ret.map((item: any) => ({
+      ...item,
+      label: item.name,
+      value: item.index
+    }))
+  } else {
+    return []
+  }
+}
 
+const initCName = async () => {
+  // 并行请求两个字典,比await串行更快
+  const [wtOptions,] = await Promise.all([
+    getDmsTypes("sq_wtfs"),
+  ])
+  wtfwOptions.value = wtOptions
+}
 const initData = () => {
   stage.value = Number(Number(sessionStorage.getItem('progres')) || 0);
   getProjects();
@@ -878,7 +908,6 @@ const getStage = () => {
     { n: 6, label: '开标监控', status: '', title:'开标监控中',text:'已登记投标,在开标时间内监控开标结果。',left_btn_text:'查看监控详情',left_url:'/bid-result',right_btn_text:'进入中标推送',right_url:''},
     { n: 7, label: '中标推送', status: '', title:'中标推送',text:'开标结果已出,请确认中标信息并推送至各职能部门',left_btn_text:'',left_url:'/bid-result',right_btn_text:'',right_url:''},
   ]
-  // console.log(steps.value)
   steps.value.forEach((item: any) => {
     if (item.n < stage.value) {
       item.status = 'done'
@@ -888,12 +917,10 @@ const getStage = () => {
       item.status = ''
     }
   })
-  // console.log(steps.value)
 }
 const confirmTask = async (task: any) => {
   tempTask.value = {}
   if(task.id == "1" || task.id == "2"){
-    // console.log(task)
     const msg = getMessage(2)
     if(msg){
       ElMessage.error(msg)
@@ -938,7 +965,6 @@ const confirmTask = async (task: any) => {
     sessionStorage.setItem('jkId', projects.value.c_xgjk);
     goToPage('/bid-result')
   }
-  // console.log(task)
 }
 const getMessage = (ids: any) => {
     if(ids == stage.value){
@@ -956,7 +982,6 @@ const handleViewClick = (item: any,type: string) => {
       let flag2 = projects.value.rwlcqd.find((p: any) => p.id == '2').done
       if(flag && flag2){
         updateProject()
-        // console.log(item)
         ruleZBJKForm.title = projects.value.title,
         ruleZBJKForm.content = projects.value.content,
         ruleZBJKForm.c_province = projects.value.sourceProject.c_sfzxs,
@@ -971,7 +996,6 @@ const handleViewClick = (item: any,type: string) => {
         addContentParams(ruleZBJKForm,CONFIG.COLUMNIDARR[5],CONFIG.MODELIDARR[2])
         
         if(projects.value.c_xgzb){
-          // console.log(item)
           let str = {id: (item.n+1)}
           updaterwlcqdProject(str)
         }
@@ -987,9 +1011,7 @@ const handleViewClick = (item: any,type: string) => {
       }
       
     }else if(item.n == 4){
-      // console.log(item)
       if(type == 'cqgg'){
-          // console.log("cqgg=====",item)
           dialogFormFileVisible.value = true
       }else if(stepsType.value == '1'){
         let flag =  projects.value.rwlcqd.find((p: any) => p.id == '4').done
@@ -1003,11 +1025,14 @@ const handleViewClick = (item: any,type: string) => {
         let flag =  projects.value.rwlcqd.find((p: any) => p.id == '5').done
         if(flag){
           updateTypeProject(3)
+          // 生成招标文件
+          // api.getGenerateTender({
+          //   txbId: projects.value.id,
+          // })
         }else{
           ElMessage.error("请先确认标书需求拆解与生成")
         }
       }else if(stepsType.value == '4'){
-        // console.log(item)
         updateProject()
       }
     }else if(item.n == 5){
@@ -1018,7 +1043,6 @@ const handleViewClick = (item: any,type: string) => {
           ElMessage.error("请先确认登记投标信息")
         }
     }else if(item.n == 6){
-      // console.log(item)
       if(type == 'detail'){
         goToPage(item.left_url)
       }else{
@@ -1055,7 +1079,6 @@ const updateProject = async () => {
       c_xmjd_json: xmjd_json
     }),
   }
-  // console.log(params)
   const res = await api.updateContent(params)
   if ((res as any).code === 200) {
     sessionStorage.setItem('progres', (stage.value+1).toString());
@@ -1091,7 +1114,6 @@ const updateTXBProject = async (columnId:any,modelId:any,content:any) => {
     modelId: modelId,
     content: JSON.stringify(content),
   }
-  // console.log(params)
   const res = await api.updateContent(params)
   if ((res as any).code === 200) {
     sessionStorage.setItem('progres', (stage.value+1).toString());
@@ -1145,7 +1167,6 @@ const getProjects = async () => {
      stepsType.value = projects.value.c_xmjd_json[projects.value.c_xmjd_json.length-1].type
     //  swb_status.value = projects.value.c_xmjd_json[projects.value.c_xmjd_json.length-1].typeObj?.swb || ''
     //  jsb_status.value = projects.value.c_xmjd_json[projects.value.c_xmjd_json.length-1].typeObj?.jsb || ''
-    // console.log(projects.value)
   }
 }
 
@@ -1155,7 +1176,7 @@ const getDmsDataList = async (params: any) => {
 const calculateRemaining = async  (st: string, et: string, zbxmbh: string,xmbh: string): Promise<{ days: string; daysClass: string; year: string; type: string, zbProject: any,sourceProject:any }> => {
   if (!et) return { days: '', daysClass: '', year: '', type: '', zbProject: {},sourceProject:{} }
   const startDate = moment(moment(st).format('YYYY-MM-DD'), 'YYYY-MM-DD')
-  const expireDate = moment(moment(et).add(45, 'days').format('YYYY-MM-DD'), 'YYYY-MM-DD')
+  const expireDate = moment(moment(et).add(0, 'days').format('YYYY-MM-DD'), 'YYYY-MM-DD')
   
   if (!startDate.isValid() || !expireDate.isValid()) {
     return { days: '', daysClass: '', year: '', type: '', zbProject: {},sourceProject:{} }
@@ -1234,7 +1255,6 @@ const getfinishProjects = async () => {
 //         columnId: CONFIG.COLUMNIDARR[3],
 //         modelId: CONFIG.MODELIDARR[1],
 //       }
-//       console.log(params)
 //       const res = await api.addContent(params)
 //       if((res as any).code === 200){
 //         ElMessage.success('添加成功')
@@ -1284,7 +1304,6 @@ const updateZBProject = async (item:any,formData:any,contentId:any) => {
       zbjzsj:moment(formData.c_bid_deadline).format('YYYY-MM-DD HH:mm'),
     }),
   }
-  // console.log(params)
   const res = await api.updateContent(params)
   if ((res as any).code === 200) {
     ElMessage.success('更新成功')
@@ -1296,8 +1315,6 @@ const handleZBSubmit = async (formEl: FormInstance | undefined) => {
   if (!formEl) return
   await formEl.validate((valid) => {
       if (valid) {
-        // console.log('submit!')
-        // console.log(ruleZBForm)
         let formData = {
           c_project_code:ruleZBForm.c_project_code,
           c_project_name:ruleZBForm.c_project_name,
@@ -1309,8 +1326,7 @@ const handleZBSubmit = async (formEl: FormInstance | undefined) => {
           c_publish_time:ruleZBForm.c_publish_time,
           c_detail_url:ruleZBForm.c_detail_url,
         }
-        updateZBProject(tempTask.value,formData,'')
-        // console.log(projects.value.id)
+        updateZBProject(tempTask.value,formData,ruleZBForm.c_project_code)
         getProjectParams(projects.value.id,'c_gl_xm',CONFIG.COLUMNIDARR[5]).then(async res => {
           const reslust = (res as any)[0]
           const content = {  
@@ -1318,7 +1334,6 @@ const handleZBSubmit = async (formEl: FormInstance | undefined) => {
             c_complete: true,
             c_enable: false
           }
-          // console.log(content)
           updateProjectParams(CONFIG.COLUMNIDARR[5],CONFIG.MODELIDARR[2], content)
         })
         
@@ -1327,7 +1342,6 @@ const handleZBSubmit = async (formEl: FormInstance | undefined) => {
       } else {
         // ElMessage.error('请填写完整信息')
         // dialogZBVisible.value = false
-        console.log('error submit!')
       }
   })
 }
@@ -1335,17 +1349,13 @@ const handleZBSubmit = async (formEl: FormInstance | undefined) => {
 //   if (!formEl) return
 //   await formEl.validate(async (valid) => {
 //       if (valid) {
-//         // console.log('submit!')
-//         // console.log(ruleZBJKForm)
 //         ruleZBJKForm.c_project_code = projects.value.xmbh
 //         ruleZBJKForm.c_gl_xm = projects.value.id
-//         // console.log(ruleZBJKForm)
 //         const res = await addContentParams(ruleZBJKForm,CONFIG.COLUMNIDARR[5],CONFIG.MODELIDARR[2])
 //         if((res as any).code === 200){
 //           // updateTypeProject(2)
 //         }
 //       } else {
-//         // console.log('error submit!')
 //       }
 //       dialogZBJKVisible.value = false
 //   })
@@ -1355,8 +1365,6 @@ const handleKBJKSubmit = async (formEl: FormInstance | undefined) => {
   if (!formEl) return
   await formEl.validate(async (valid) => {
       if (valid) {
-        // console.log('submit!')
-        // console.log(ruleKBJKForm)
         ruleKBJKForm.c_glxm = projects.value.xmbh
         ruleKBJKForm.c_xmmc = projects.value.c_xmbt
         ruleKBJKForm.c_zbbh = projects.value.zbxmbh
@@ -1364,7 +1372,6 @@ const handleKBJKSubmit = async (formEl: FormInstance | undefined) => {
         ruleKBJKForm.title = projects.value.c_xmbt
         ruleKBJKForm.content = projects.value.content
         ruleKBJKForm.c_enable = true
-        // console.log(ruleKBJKForm)
         const res = await addContentParams(ruleKBJKForm,CONFIG.COLUMNIDARR[6],CONFIG.MODELIDARR[3])
         
         projects.value.rwlcqd.find((p: any) => p.id == 5).done = true
@@ -1389,11 +1396,9 @@ const handleKBJKSubmit = async (formEl: FormInstance | undefined) => {
           tbrq:ruleKBJKForm.c_zbtjr,
           tbbj:ruleKBJKForm.c_tbbj,
         }
-        // console.log(constParams)
         updateTXBProject(CONFIG.COLUMNIDARR[2],CONFIG.MODELIDARR[0],constParams)
         dialogKBJKVisible.value = false
       } else {
-        // console.log('error submit!', fields)
       }
       
   })
@@ -1403,30 +1408,29 @@ const handleBidSubmit = async (formEl: FormInstance | undefined) => {
   if (!formEl) return
   await formEl.validate((valid) => {
       if (valid) {
-        // console.log('submit!')
-        // console.log(ruleBidForm)
-        
-        updateTypeProject(2)
-        ruleBidForm.file3.file.forEach((item: any) => {
-          submitFileForm(item.raw)
-        })
+        // 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);
+        updateTypeProject(2)
+        if(ruleBidForm.file3.name){//做澄清文件
+          submitFileForm(ruleBidForm.file3.raw)
+        }
+        updateFIleProject(loading)//更新项目文件
+        // setTimeout(() => {
+        //   dialogBidVisible.value = false
+        //   loading.close()
+        //   ElMessage.success('上传成功')
+        // }, 2000);
       } else {
-        // console.log('error submit!')
       }
   })
 }
 const handleOpenViewClick = (type:any) => {
-  // console.log(projects.value.zbmsxx.zb_detail_url)
   if(type == '0'){
     window.open(finishBidObject.value.c_detail_url)
   }else if(type == '1'){
@@ -1441,7 +1445,6 @@ const dialogFormFileVisible = ref(false)
 const FileForm = ref<RuleForm>({})
 const fileList = ref([])
 const handleCQFileChange = (file: any) => {
-  // console.log(file)
   FileForm.value.name = file.name
   FileForm.value.file = file
 }
@@ -1455,11 +1458,9 @@ const submitFileForm = (file:any) => {
     type: 3,
     file: file
   }
-  // console.log(fileList.value)
   api.uploadFile(params).then((res: any) => {
     if((res as any).code === 200){
-      ElMessage.success('上传成功')
-      // console.log((res as any).content)
+      // ElMessage.success('上传成功')
       const path = (res as any).content
       getProjectParams(projects.value.id,'c_gltxbid',columnId).then(async res2 => {
         let arr = []
@@ -1472,7 +1473,6 @@ const submitFileForm = (file:any) => {
             create_time: moment().format('YYYY-MM-DD HH:mm'),
             author: userName,
           })
-          // console.log(arr)
           const params: any = {
             columnId: columnId,
             modelId: modelId,
@@ -1520,7 +1520,6 @@ const getProjectParams = async (id: string,type: string,columnId: number) => {
     pageSize: 1,
     page: 0
   }
-  // console.log(params)
   if (id !== "") {
     params.search = JSON.stringify([
         ...(params.search ? JSON.parse(params.search) : []),
@@ -1538,21 +1537,25 @@ const getProjectParams = async (id: string,type: string,columnId: number) => {
     return []
   }
 }
-const filename = ref('')
+// const filename = ref('')
 const handleFileChange = (file: any) => {
-  ruleBidForm.file1 = file.name
+  ruleBidForm.file1 = file
 }
 const handleFileChange2 = (file: any) => {
-  ruleBidForm.file2 = file.name
-}
-const handleFileChange3 = (file: any,fileList:any) => {
-  filename.value = file.raw.name
-  ruleBidForm.file3.file = fileList
+  ruleBidForm.file2 = file
 }
-const handleFileRemove3 = (file: any,fileList:any) => {
-  filename.value = file.raw.name
-  ruleBidForm.file3.file = fileList
+const handleFileChange3 = (file: any) => {
+  // filename.value = file.raw.name
+  ruleBidForm.file3 = file
 }
+// const handleFileChange3 = (file: any,fileList:any) => {
+//   filename.value = file.raw.name
+//   ruleBidForm.file3.file = fileList
+// }
+// const handleFileRemove3 = (file: any,fileList:any) => {
+//   filename.value = file.raw.name
+//   ruleBidForm.file3.file = fileList
+// }
 // 更新项目进度状态
 const updateTypeProject = async (type:any) => {
   let xmjd_json = projects.value.c_xmjd_json;
@@ -1571,6 +1574,49 @@ const updateTypeProject = async (type:any) => {
 
   }
 }
+// 更新项目文件
+const updateFIleProject = async (loading:any) => {
+    let param = {
+      columnId: CONFIG.COLUMNIDARR[2],
+      contentId: projects.value.id,
+      paraName: '',
+      type: 3,
+      file: ''
+    }
+    const [file1, file2, file3] = await Promise.all([
+      ruleBidForm.file1.name ? getFIlePath({ ...param, paraName: ruleBidForm.file1.name, file: ruleBidForm.file1.raw }) : '',
+      ruleBidForm.file2.name ? getFIlePath({ ...param, paraName: ruleBidForm.file2.name, file: ruleBidForm.file2.raw }) : '',
+      ruleBidForm.file3.name ? getFIlePath({ ...param, paraName: ruleBidForm.file3.name, file: ruleBidForm.file3.raw }) : '',
+    ])
+    const params: any = {
+      columnId: CONFIG.COLUMNIDARR[2],
+      modelId: CONFIG.MODELIDARR[0],
+      content: JSON.stringify({
+        id: projects.value.id,
+        c_zbwj: file1,
+        c_cgxqwj: file2,
+        c_cqggwj: file3,
+      }),
+    }
+    const res = await api.updateContent(params)
+    dialogBidVisible.value = false
+    loading.close()
+    if ((res as any).code === 200) {
+      ElMessage.success('上传成功')
+    }else{
+      ElMessage.error('上传失败')
+    }
+}
+const getFIlePath = async (params: any) => {
+  const res = await api.uploadFile(params)
+  if ((res as any).code === 200) {
+    return (res as any).content
+  } else {
+    return null
+  }
+}
+
+
 const bidFile = ref({
   flag:false,
   swb:false,
@@ -1600,7 +1646,6 @@ const getBidFile = async () => {
 }
 
 const handleChange = (val: any) => {
-  // console.log(val)
   finishBidObject.value = val
 }
 const handleSwitchChange = (val: any) => {
@@ -1645,7 +1690,6 @@ const updateJKLCProject = async () => {
         c_type:"投续标",
         c_enable: false
       }
-      // console.log(content)
       updateProjectParams(CONFIG.COLUMNIDARR[6],CONFIG.MODELIDARR[3], content)
 }
 

+ 21 - 17
src/views/bidPreparation/RenewalXQDetail.vue

@@ -191,9 +191,7 @@
               />
             </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-radio v-model="addFormZgfw" v-for="item in zgfwOptions" :key="item.value" :label="item.value" >{{ item.label }}</el-radio>
             </el-form-item>
             <el-form-item label="业态" prop="c_zgfw">
               <el-tree-select
@@ -301,14 +299,12 @@ const addFormYT = ref('')
 const ytList = ref<TreeItem[]>([])
 const adminArea = ref([{} as TreeItem])
 const glArea = ref([{} as TreeItem])
+const zgfwOptions = ref<any>([])
 
 const handleSubmit = async (formEl: FormInstance | undefined) => {
   if (!formEl) return
   await formEl.validate(async (valid) => {
       if (valid) {
-        console.log('submit!')
-        console.log(ruleForm)
-
        let json = projects.value.c_xmjd_json.map((item:any) => {
         return {
           create_time: item.create_time ? item.create_time : moment().format('YYYY-MM-DD HH:mm'),
@@ -361,13 +357,10 @@ const handleSubmit = async (formEl: FormInstance | undefined) => {
             c_fwdasj: ruleForm.c_fwdq_time,
           })
           updateProject(CONFIG.COLUMNIDARR[11],CONFIG.MODELIDARR[6],content)
-
-
         }
        
       } else {
         dialogVisible.value = false
-        // console.log('error submit!')
       }
   })
 }
@@ -388,8 +381,26 @@ const goToPage = (path: string) => {
 
 onMounted(() => {
   initData()
+  getDmsTypes()
 })
-
+const getDmsTypes = () => {
+  let params = {
+    type:0,
+    cName: "sq_wtfs",
+  }
+  api.getDmsTypes(params).then(res => {
+    if((res as any).code === 200){
+      let ret  = (res as any).content
+      zgfwOptions.value = ret.map((item: any) => ({
+        ...item,
+        label: item.name,
+        value: item.index
+      }))
+    }else{
+      zgfwOptions.value = []
+    }
+  })
+}
 const initData = () => {
   stage.value = Number(Number(sessionStorage.getItem('progres')) || 0);
   getProjects();
@@ -401,7 +412,6 @@ const getStage = () => {
     { n: 2, label: '项目续签', status: '', title:'项目续签',text:'确认续签,续签完成后,以便进入中标监控',left_btn_text:'',left_url:'' },  
     { n: 3, label: '中标推送', status: '', title:'中标推送',text:'开标结果已出,请确认中标信息并推送至各职能部门',left_btn_text:'进入中标推送',left_url:'/bid-result'},
   ]
-  // console.log(steps.value)
   steps.value.forEach((item: any) => {
     if (item.n < stage.value) {
       item.status = 'done'
@@ -411,7 +421,6 @@ const getStage = () => {
       item.status = ''
     }
   })
-  // console.log(steps.value)
 }
 // 点击进入下一步
 const handleViewClick = (item: any) => {
@@ -445,7 +454,6 @@ const updateProject = async (columnId:number,modelId:number,content:any) => {
     modelId: modelId,
     content: content,
   }
-  // console.log(params)
   const res = await api.updateContent(params)
   if ((res as any).code === 200) {
     sessionStorage.setItem('progres', (stage.value+1).toString());
@@ -490,7 +498,6 @@ const getProjects = async () => {
     )
     const result = await Promise.all(promises)
      projects.value = result[0]
-     console.log(projects.value)
   }
 }
 
@@ -559,7 +566,6 @@ const getytProjects = () => {
         ytList.value = []
       }
     })
-    // console.log(ytList.value)
 }
 const getAdminArea = () => {
   const params: any = {
@@ -598,7 +604,6 @@ const getAdminArea = () => {
       const uniqueGlTree = Array.from(
         new Map(glArea.value.map(item => [item.value, item])).values()
       )
-      console.log(uniqueGlTree)
       adminArea.value = uniqueTree
       glArea.value = uniqueGlTree
     }else{
@@ -608,7 +613,6 @@ const getAdminArea = () => {
   })
 }
 const handleNodeGlAreaClick = (item: any) => {
-  // console.log(item)
   ruleForm.c_glqy = item.value
 }
 </script>

+ 7 - 13
src/views/bidResult/BidResult.vue

@@ -124,8 +124,8 @@
            <div class="markdown-content" v-if="jkObject.c_gljg" v-html="markdownContent"></div>
            <div class="markdown-content"v-else>人工处理结果:<span style="cursor: pointer;color: var(--primary);"  @click="handleOpenPageClick()">点击查看中标结果详情</span></div>
           </div>
-          <div style="padding: 20px;">
-            <el-button type="primary" class="btn enter-btn" @click="handleConfirmBidPush">确认中标 · 一键推送</el-button>
+          <div style="padding: 20px;" >
+            <el-button type="primary" class="btn enter-btn" @click="handleConfirmBidPush" :disabled="jkObject.c_sfts">确认中标 · 一键推送</el-button>
 
             <el-button type="primary" class="btn enter-btn" @click="openFileForm('1')">上传合同</el-button>
             <el-button type="primary" class="btn enter-btn" @click="openFileForm('2')">上传投标文件</el-button>
@@ -147,7 +147,7 @@
                   >
                     <strong :style="{'color': pushStartsOptions.done ? '' : 'var(--text3)'}">{{ item.name }}</strong>
                     <span :style="{'color': pushStartsOptions.done ? '' : 'var(--text3)'}">{{ item.desc }}</span><br/>
-                    <span v-if="pushStartsOptions.done" style="color: var(--text3);">{{ item.time }}</span>
+                    <span v-if="pushStartsOptions.done" style="color: var(--text3);">{{ moment(item.time).format('YYYY-MM-DD HH:mm') }}</span>
                   </div>
                 </div>
             </div>
@@ -253,7 +253,6 @@ 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')
 })
 
@@ -355,12 +354,10 @@ const handleTabClick = (tab: string) => {
 }
 
 const closeAddForm = () => {
-  console.log("关闭弹窗")
   addFormVisible.value = false
   initData()
 }
 const closeAddProjectForm = () => {
-  console.log("关闭弹窗")
   addProjectFormVisible.value = false
   initData()
 }
@@ -370,7 +367,6 @@ const handleBidRegistration = async () => {
 }
 
 const handleFinishProjectChange = (val: any) => {
-  console.log(val)
   if (val && typeof val === 'object' && val.project) {
     jkObject.value = val
     // jkObject.value.c_lcsjx = JSON.parse(val.c_lcsjx || '[]')
@@ -470,14 +466,16 @@ const getProjects = async (label:string,type:string) => {
       bidStats.value.filter(item => item.label == '已中标')[0].value = result.count
       if(selectedBid.value){
         jkObject.value = finishProjects.value.find(item => item.id == selectedBid.value) || {}
-        // console.log(jkObject.value)
         if(jkObject.value.project){
           openMD(jkObject.value.project.c_content_html_path || '')
         }
       }else{
         jkObject.value = finishProjects.value[0] || {}
       }
-      // console.log(jkObject.value)
+      pushStartsOptions.value.done = jkObject.value.c_sfts == true ? true : false
+      pushStartsOptions.value.data.forEach(item => {
+        item.time = jkObject.value.c_tssj || ''
+      })
     }
   }else{
     if(label == ''){
@@ -539,7 +537,6 @@ const calculateRemainingDays = (st: string, et: string): { days: string;} => {
  
 }
 const handleConfirmBidPush = async () => {
-  // console.log(jkObject.value)
   // let arr = jkObject.value.c_lcsjx ? jkObject.value.c_lcsjx : []
   // arr.push({
   //   create_time: moment().format('YYYY-MM-DD HH:mm'),
@@ -554,7 +551,6 @@ const handleConfirmBidPush = async () => {
   // })
   // updateAudit(jkObject.value,4)
   // updateKBJKProject(jkObject.value,arr)
-  // console.log(arr)
   addProjectFormVisible.value = true
 }
 // const updateKBJKProject = async (item: any,arr:any[]) => {
@@ -566,7 +562,6 @@ const handleConfirmBidPush = async () => {
 //       c_lcsjx: arr,
 //     }),
 //   }
-//   // console.log(params)
 //   const res = await api.updateContent(params)
 //   if ((res as any).code === 200) {
 //     // ElMessage.success('添加成功')
@@ -594,7 +589,6 @@ const handleConfirmBidPush = async () => {
 // }
 
 const handleFileChange = (file: any) => {
-  // console.log(file)
   FileForm.value = file
 }
 const submitFileForm = async () => {

+ 1 - 3
src/views/home/Dashboard.vue

@@ -256,7 +256,6 @@ const getProjects = async () => {
     page: 0
   }
   const res = await getDmsDataList(params)
-  // console.log(res)
   if ((res as any).code === 200) {
     projects.value = (res as any).content.data.map((item: any) => ({
       ...item,
@@ -276,13 +275,12 @@ const getProjects = async () => {
     //   ...calculateRemaining(item.c_zgxmhtksrq, item.c_zgxmhtdqrq)
     // }))
 
-    // console.log(projects.value)
   }
 }
 const calculateRemaining = (st: string, et: string): { days: string; daysClass: string; statusClass: string; statusText: string } => {
   if (!et) return { days: '', daysClass: '', statusClass: '', statusText: ''}
   const startDate = moment(moment(st).format('YYYY-MM-DD'), 'YYYY-MM-DD')
-  const expireDate = moment(moment(et).add(45, 'days').format('YYYY-MM-DD'), 'YYYY-MM-DD')
+  const expireDate = moment(moment(et).add(0, 'days').format('YYYY-MM-DD'), 'YYYY-MM-DD')
   
   if (!startDate.isValid() || !expireDate.isValid()) {
     return { days: '', daysClass: '', statusClass: '', statusText: ''}

+ 47 - 28
src/views/ledger/ProjectDetail.vue

@@ -87,11 +87,11 @@
           </div>
           <div class="info-row">
             <span class="label">委托服务</span>
-            <span class="value">{{ wtArr[projects.c_wtfs] }}</span>
+            <span class="value">{{ getWTFWLabel(projects.c_wtfs) }}</span>
           </div>
           <div class="info-row">
             <span class="label">计费方式</span>
-            <span class="value">{{ jfArr[projects.c_jffs] }}</span>
+            <span class="value">{{ getJFLabel(projects.c_jffs) }}</span>
           </div>
          
         </div>
@@ -105,27 +105,27 @@
         <div class="card-body">
           <div class="info-row">
             <span class="label">合同金额</span>
-            <span class="value">{{ formatCurrency(projects.c_htzj) }} 万元</span>
+            <span class="value">{{ formatCurrency(projects.c_htzj/10000) }} 万元</span>
           </div>
           <div class="info-row">
             <span class="label">年化合同额</span>
-            <span class="value">{{ formatCurrency(projects.c_nhhtsr) }} 万元</span>
+            <span class="value">{{ formatCurrency(projects.c_nhhtsr/10000) }} 万元</span>
           </div>
           <div class="info-row">
             <span class="label">当年饱和收入</span>
-            <span class="value">{{ formatCurrency(projects.c_dnbhsr) }} 万元</span>
+            <span class="value">{{ formatCurrency(projects.c_dnbhsr/10000) }} 万元</span>
           </div>
           <div class="info-row">
             <span class="label">投标核算年度总成本</span>
-            <span class="value">{{ formatCurrency(projects.c_tbhsndzcb) }} 万元</span>
+            <span class="value">{{ formatCurrency(projects.c_tbhsndzcb/10000) }} 万元</span>
           </div>
           <div class="info-row">
             <span class="label">自用人力总成本</span>
-            <span class="value">{{ formatCurrency(projects.c_zyrlzcbjss) }} 万元</span>
+            <span class="value">{{ formatCurrency(projects.c_zyrlzcbjss/10000) }} 万元</span>
           </div>
           <div class="info-row">
             <span class="label">综合成本</span>
-            <span class="value">{{ formatCurrency(projects.c_zhcbjss) }} 万元</span>
+            <span class="value">{{ formatCurrency(projects.c_zhcbjss/10000) }} 万元</span>
           </div>
         </div>
       </div>
@@ -193,15 +193,8 @@ const formatCurrency = (value: string | number): string => {
 const projects = ref<any>({})
 const tempArr = ref<any>([])
 
-const wtArr = ref<any>([
-  '全委',
-  '单一单委',
-  '多项单委'
-])
-const jfArr = ref<any>([
-  '包干',
-  '酬金'
-])
+const wtfwOptions = ref<any>([])
+const jffsOptions = ref<any>([])
 
 const historyBidList = ref<any>([
   {
@@ -235,12 +228,47 @@ const historyBidList = ref<any>([
 ])
 
 onMounted(() => {
+  initCName()
   initData()
 })
 
 const initData = () => {
   getProjects();
 }
+const getJFLabel = (value: string) => {
+  return jffsOptions.value.find((item: any) => item.value == value)?.label || '-'
+}
+const getWTFWLabel = (value: string) => {
+  return wtfwOptions.value.find((item: any) => item.value == value)?.label || '-'
+}
+const getDmsTypes = async (cName: string) => {
+  const params = {
+    type: 0,
+    cName: cName,
+  }
+  const res = await api.getDmsTypes(params)
+  if ((res as any).code === 200) {
+    const ret = (res as any).content
+    return ret.map((item: any) => ({
+      ...item,
+      label: item.name,
+      value: item.index
+    }))
+  } else {
+    return []
+  }
+}
+
+const initCName = async () => {
+  // 并行请求两个字典,比await串行更快
+  const [wtOptions, jfOptions] = await Promise.all([
+    getDmsTypes("sq_wtfs"),
+    getDmsTypes("sq_jffs")
+  ])
+  wtfwOptions.value = wtOptions
+  jffsOptions.value = jfOptions
+}
+
 const getProjects = async () => {
   const params: any = {
     columnId: CONFIG.COLUMNIDARR[0],
@@ -260,20 +288,18 @@ const getProjects = async () => {
     ]);
   }
   const res = await getDmsDataList(params)
-  // console.log(res)
   if ((res as any).code === 200) {
     projects.value = (res as any).content.data.map((item: any) => ({
       ...item,
       ...calculateRemaining(item.c_zgxmhtksrq, item.c_zgxmhtdqrq)
     }))[0]
   }
-  // console.log(projects.value)
 }
 const calculateRemaining = (st: string, et: string): { days: string; daysClass: string; year: string } => {
   if (!et) return { days: '', daysClass: '', year: '' }
   
   const startDate = moment(moment(st).format('YYYY-MM-DD'), 'YYYY-MM-DD')
-  const expireDate = moment(moment(et).add(45, 'days').format('YYYY-MM-DD'), 'YYYY-MM-DD')
+  const expireDate = moment(moment(et).add(0, 'days').format('YYYY-MM-DD'), 'YYYY-MM-DD')
   
   if (!startDate.isValid() || !expireDate.isValid()) {
     return { days: '', daysClass: '', year: '' }
@@ -322,7 +348,6 @@ const getServiceYear = (start: string | Date, end?: string | Date) => {
 
 const handleRenewalClick = () => {
    getXMProjects(projects.value.c_guid,'xmbh',CONFIG.COLUMNIDARR[2]).then(async res => {
-      // console.log(res)
       if(res.length>0){  // 直接进入投续标详情页面
         sessionStorage.setItem('projectName', projects.value.c_xmmc)
         sessionStorage.setItem('name', projects.value.c_xmmc)
@@ -331,7 +356,6 @@ const handleRenewalClick = () => {
         router.push(`/renewal-expire-detail/${res[0].id}`)
       }else{
         const ids = await addProject()
-        // console.log("新增项目id:",ids)
         if(ids){
           sessionStorage.setItem('projectName', projects.value.c_xmmc)
           sessionStorage.setItem('name', projects.value.c_xmmc)
@@ -346,7 +370,6 @@ const handleRenewalClick = () => {
 }
 const handleRenewaXQlClick = () => {
    getXMProjects(projects.value.c_guid,'c_xmbh',CONFIG.COLUMNIDARR[11]).then(async res => {
-      // console.log(res)
       if(res.length>0){  // 直接进入投续标详情页面
         sessionStorage.setItem('projectName', projects.value.c_xmmc)
         sessionStorage.setItem('name', projects.value.c_xmmc)
@@ -375,7 +398,6 @@ const getXMProjects = async (id: string,type: string,columnId:number) => {
     pageSize: 1,
     page: 0
   }
-  // console.log(params)
   if (id !== "") {
     params.search = JSON.stringify([
         ...(params.search ? JSON.parse(params.search) : []),
@@ -396,7 +418,6 @@ const getXMProjects = async (id: string,type: string,columnId:number) => {
 
 const addProject = async () => {
     tempArr.value = []
-    // console.log(projects.value.days)
     if(projects.value.days>=100){ // 大于百天,不需要预警
       for(let i = 1; i<3; i++){
         let str = {
@@ -432,7 +453,7 @@ const addProject = async () => {
         c_kssj: moment(projects.value.c_zgxmhtksrq).format('YYYY-MM-DD HH:mm'),
         c_dqsj: moment(projects.value.c_zgxmhtdqrq).format('YYYY-MM-DD HH:mm'),
         c_xmbt: projects.value.c_xmmc,
-        xmbh:projects.value.c_guid,
+        xmbh:projects.value.c_father_code?projects.value.c_father_code:projects.value.c_guid,
         c_glqy: projects.value.c_glqynbkj,
         c_is_xb: true,
         rwlcqd:JSON.stringify(CONFIG.TASKLIST)
@@ -444,7 +465,6 @@ const addProject = async () => {
     columnId: CONFIG.COLUMNIDARR[2],
     modelId: CONFIG.MODELIDARR[0],
   }
-  // console.log(params)
   const res = await api.addContent(params)
   if((res as any).code === 200){
     // updateProject(projects.value,2)
@@ -482,7 +502,6 @@ const addXQProject = async () => {
     columnId: CONFIG.COLUMNIDARR[11],
     modelId: CONFIG.MODELIDARR[6],
   }
-  // console.log(params)
   const res = await api.addContent(params)
   if((res as any).code === 200){
     return (res as any)?.content

+ 2 - 5
src/views/ledger/Projects.vue

@@ -90,8 +90,7 @@ interface ProjectItem {
 
 const calculateRemainingDays = (dateStr: string): { days: string; daysClass: string } => {
   if (!dateStr) return { days: '', daysClass: '' }
-  // console.log(dateStr)`
-  const expireDate = moment(moment(dateStr).add(45, 'days').format('YYYY-MM-DD'), 'YYYY-MM-DD')
+  const expireDate = moment(moment(dateStr).add(0, 'days').format('YYYY-MM-DD'), 'YYYY-MM-DD')
   if (!expireDate.isValid()) return { days: '', daysClass: '' }
   
   const today = moment().startOf('day')
@@ -119,7 +118,6 @@ const total = ref(0)
 const projects = ref<ProjectItem[]>([])
 
 const handleViewClick = (project: any) => {
-  // console.log(project)
   sessionStorage.setItem('projectName', (project as any)[columnId+'_c_xmmc'])
   sessionStorage.setItem('name', (project as any)[columnId+'_c_xmmc'] || '')
   sessionStorage.setItem('dmsId', (project as any)[columnId+'_id'] || '')
@@ -184,13 +182,12 @@ const getProjects = async () => {
         columnId: columnId,
         columnName: "c_zgxmhtdqrq",
         condition: "between",
-        value: [moment().add(-10, 'days').format('YYYY-MM-DD HH:mm:ss'), '2099-01-01 00:00:00']
+        value: [moment().add(0, 'days').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,

+ 0 - 2
src/views/login/Login.vue

@@ -66,8 +66,6 @@ const handleLogin = async () => {
     ElMessage.warning('请输入用户名和密码')
     return
   }
-  // console.log("登录参数:", loginForm)
-  
   try {
     sessionStorage.setItem('tempUser', JSON.stringify(loginForm))
     await encrypt({ username: loginForm.username, password: loginForm.password })

+ 0 - 10
src/views/map/OneMap.vue

@@ -55,27 +55,23 @@ const checkIframeFullyRendered = (): boolean => {
     
     // 检查文档状态
     if (doc.readyState !== 'complete') {
-      // console.log('iframe document not complete:', doc.readyState)
       return false
     }
     
     // 检查是否有实际内容
     if (!doc.body || !doc.body.innerHTML || doc.body.innerHTML.trim().length < 100) {
-      // console.log('iframe body content too small')
       return false
     }
     
     // 检查是否有可渲染的元素
     const hasVisibleContent = doc.body.querySelector('div, svg, canvas, img') !== null
     if (!hasVisibleContent) {
-      // console.log('iframe has no visible elements')
       return false
     }
     
     return true
   } catch (e) {
     // 跨域情况下,无法访问 document,说明 iframe 已加载但有跨域限制
-    // console.log('iframe 跨域,无法检查内容')
     return true
   }
 }
@@ -99,18 +95,15 @@ const startRenderCheck = () => {
     
     // 检查是否渲染完成
     if (checkIframeFullyRendered()) {
-      // console.log('iframe 渲染完成,关闭 loading')
       isIframeReady.value = true
       closeLoading()
       if (renderCheckTimer) clearInterval(renderCheckTimer)
     } else {
-      // console.log('iframe 尚未完全渲染,继续等待...')
     }
   }, 500) // 每 500ms 检查一次
   
   // 设置最大超时
   maxTimeoutTimer = window.setTimeout(() => {
-    // console.log('iframe 加载超时,强制关闭 loading')
     isIframeReady.value = true
     closeLoading()
     if (renderCheckTimer) clearInterval(renderCheckTimer)
@@ -119,8 +112,6 @@ const startRenderCheck = () => {
 
 // iframe onload 事件处理
 const onIframeLoad = () => {
-  // console.log('iframe onload 触发')
-  
   // 发送登录信息
   const iframe = iframeRef.value
   const tempUser = sessionStorage.getItem('tempUser')
@@ -162,7 +153,6 @@ const handleMessage = (event: MessageEvent) => {
   
   // 如果子页面发送加载完成的消息,立即关闭 loading
   if (event.data && event.data.type === 'IFRAME_READY') {
-    // console.log('收到子页面 IFRAME_READY 消息')
     isIframeReady.value = true
     closeLoading()
     if (renderCheckTimer) clearInterval(renderCheckTimer)