mork пре 1 месец
родитељ
комит
c5b0d30a30
5 измењених фајлова са 169 додато и 76 уклоњено
  1. 6 0
      README.md
  2. 4 3
      public/static/config/config.js
  3. 38 11
      src/components/LeftMenu.vue
  4. 120 61
      src/components/Map.vue
  5. 1 1
      src/views/IndexView.vue

+ 6 - 0
README.md

@@ -179,3 +179,9 @@ npm run build
 - 申勤项目数据读取重新替换新接口
 - 读取出来的项目数据,处理成上图展示需要的格式
 - 优化按新项目数据来修改项目信息的功能
+
+### **2026-09-22**
+
+- 申勤项目数据读取,数据重新处理
+- 增加申勤驻地数据读取功能和驻地数据上图展示
+- 由驻地数据所属项目关联,展示项目和员工数据信息

+ 4 - 3
public/static/config/config.js

@@ -8,8 +8,7 @@ var webConfig = {
         username: "user_yztmh_dev", // 默认游客用户名
         adminRoleId: "1", //默认管理员角色id,Oauth中配置“系统管理员”角色
     },
-
-    columnArr: [{id:"1742",mid:"1793",name:"申勤员工"}],
+    columnArr: [{id:"1743",mid:"1794",name:"申勤项目"},{id:"1742",mid:"1793",name:"申勤员工"},{id:"1898",mid:"2057",name:"申勤驻地表"}],
     // oauth 服务ID
     serviceId: '0',
     SCRIPT_OAUTH_URL: 'http://121.43.55.7:10086',
@@ -27,12 +26,14 @@ var webConfig = {
     FILTER_PARAM: [
         {"name":"项目名称","value":"c_xmmc"},
         {"name":"项目地址","value":"c_xmdz"},
+        {"name":"驻地名称","value":"c_zdmc"},
+        {"name":"驻地地址","value":"c_dz"},
         {"name":"省份","value":"c_sfzxs"},
         {"name":"市辖区","value":"c_sq"},
         {"name":"项目员工人数","value":"c_xmygrs"},
         {"name":"管理区域","value":"c_glqynbkj"},
         {"name":"汇总业态","value":"c_hzyt"},
         {"name":"dms_id","value":"id"},
-        {"name":"标识","value":"c_guid"},
+        {"name":"标识","value":"c_father_project"}, //项目的GUID
       ],
 }

+ 38 - 11
src/components/LeftMenu.vue

@@ -59,8 +59,8 @@
 </template>
 
 <script>
-import { CaretRight } from '@element-plus/icons-vue'
-import UTIL from '@/utils/util'
+import * as wellknown from 'wellknown';
+import commonAPI from '@/api/common'
 export default {
 
   data() {
@@ -112,8 +112,8 @@ export default {
                     item.properties.value = item.properties.c_xmmc
                     item.properties.address = item.properties.c_xmdz
                     that.treeFilter.push({value:item.properties.c_glqynbkj==""?"未知":item.properties.c_glqynbkj,lable:item.properties.c_sq});
-                    const center = turf.centerOfMass(item.geometry)
-                    item.properties.center = center.geometry.coordinates;
+                    // const center = turf.centerOfMass(item.geometry)
+                    // item.properties.center = center.geometry.coordinates;
                     that.restaurants.push(item.properties);
                     item.properties.checkItem = new Date().getTime() + Math.random();
                 })
@@ -133,13 +133,20 @@ export default {
           }
         }, 500);
     },
-    selectItem(param){
+    async selectItem(param){
         let that = this;
         this.checkItem = param.checkItem;
         // let Lon = param['point_wgs84'].split(',')[0]
         // let Lat = param['point_wgs84'].split(',')[1]
         // let center = [parseFloat(Lon), parseFloat(Lat)]
-        let center = param.center;
+        const ret = await that.getCurZdData(param.c_guid)
+        let center = [121.184665, 31.158609]
+        if(ret.code == 200){
+           const feature = wellknown.parse(ret.content.data[0].c_polygon.value) || {}
+           const geom = turf.centerOfMass(feature)
+           center = geom.geometry.coordinates
+        }
+        param = {...param, ...ret.content.data[0]}
         window.mapboxMap.flyTo({
             center: center,
             zoom: 16,
@@ -148,16 +155,16 @@ export default {
         })
 
         let str = ""
-          for (var item in param) {
+        Object.entries(param).forEach(([key, value], index) => {
             // if (UTIL.isChinese(item) && !that.arrParam.includes(item)) {
             //   str += `<p style="margin:2px 0;">${item}:${param[item]}</p>`;
             // }
-            if (that.arrParam.map(ev => ev.value).includes(item)) {
-              if(item != "id"){
-                str += `<p style="margin:2px 0;">${that.arrParam.find(et => et.value == item).name}:${param[item]}</p>`;
+            if (that.arrParam.map(ev => ev.value).includes(key)) {
+              if(key != "id"){
+                str += `<p style="margin:2px 0;">${that.arrParam.find(et => et.value == key).name}:${param[key]}</p>`; 
               }
             }
-          }
+          })
           const popupContent = `
           <div style="font-size:14px;line-height:1.6;padding:10px;">
             <h4 style="margin:0 0 6px 0;color:#222;"><span>内容信息</span><span style="display: ${param.c_xmygrs>0 ? 'block' : 'none'};" class="more" id="popup-more-btn">员工信息>></span></h4>
@@ -188,6 +195,25 @@ export default {
         }, 0);
 
     },
+    // 获取当前驻地数据
+    async getCurZdData(guid) {
+       let params = {
+        "columnId": webConfig.columnArr[2].id,
+        "orderBy": JSON.stringify([{"field":"update_time","orderByType":2}]),
+        "states": '0,1,2,3',
+        "pageSize": 1,
+        "page": 0
+      }
+      params.search = JSON.stringify([
+        ...(params.search ? JSON.parse(params.search) : []),
+        {
+          field: 'c_father_project',
+          searchType: 2,
+          content: { value: guid },
+        },
+      ])
+      return await commonAPI.getDmsDataList(params)
+    },
     handleChange(val) {
         // this.activeNames = val;
     },
@@ -221,6 +247,7 @@ export default {
             return flag || flag2;
         };
     },
+    //检索项目列表
     handleSelect(item) {
         let that = this;
         that.activeNames = [];

+ 120 - 61
src/components/Map.vue

@@ -101,6 +101,7 @@ export default {
       mouseCenter: "121.184665, 31.158609",
       center: [121.184665, 31.158609],
       dataList: "",
+      zdDataList: [],
       areaDataList: [],
       tableData:[],
       columnModel:[],
@@ -131,6 +132,8 @@ export default {
       options: [],
       fontText:["concat"],// "concat", ["get", "GUID"], "\n", ["get", "match_status"],"\n", ["get", "range_shape"]
 
+      dmsId: "",
+
       pageSize: 10,
       page: 0,
       total: 0,
@@ -141,13 +144,15 @@ export default {
     that.initData();
   },
   methods: {
+    // 保存编辑的特征
     saveFeature(data){
-      if(!data.properties.id){
+      // if(!data.properties.id){
+      if(!this.dmsId){
         ElMessage.error("请选择正确数据进行保存");
         return;
       }
       let content = {};
-      // content["id"] = data.properties.dms_id;
+      
       // content["c_polygon"] = UTIL.geojsonToWkt(data.geometry);
       // content["c_properties"] = data.properties;
       // let params = {
@@ -156,17 +161,17 @@ export default {
       //   modelId: 1753,
       // };
       
-      content = data.properties;
+      // content = data.properties;
+      content["id"] = this.dmsId;
       content["c_polygon"] = UTIL.geojsonToWkt(data.geometry);
       let params = {
         content: JSON.stringify(content),
-        columnId: 1743, // 保存到申勤项目数据的栏目ID
-        modelId: 1794,  // 保存到申勤项目数据的模型ID
+        columnId: webConfig.columnArr[2].id, // 保存到申勤驻地数据的栏目ID
+        modelId: webConfig.columnArr[2].mid,  // 保存到申勤驻地数据的模型ID
       };
       commonAPI.updateContent(params).then(res => {
         if(res.code == 200){
           ElMessage.success("保存成功");
-          // this.getVectorData();
           this.getDmsData();
           // 清空绘制工具
           // this.mapEditDraw.clearAll();
@@ -176,13 +181,14 @@ export default {
         }
       })
     },
+    // 关闭JsonEditor
     closeJsonEditor(){
       // 清空编辑数据
       this.editDataList = {};
       this.editWinFlag = false;
       // 确保vector-data数据源存在且为有效的GeoJSON对象
-      if (window.mapboxMap.getSource('vector-data') && this.dataList) {
-        window.mapboxMap.getSource('vector-data').setData(this.dataList);
+      if (window.mapboxMap.getSource('vector-data') && this.zdDataList) {
+        window.mapboxMap.getSource('vector-data').setData(this.zdDataList);
       }
       // 确保states数据源存在且为有效的GeoJSON对象
       if (window.mapboxMap.getSource('states') && this.areaDataList) {
@@ -191,6 +197,7 @@ export default {
       // 清空绘制工具
       this.mapEditDraw.clearAll();
     },
+    // 切换地图图层显示
     toggleItem(item){
       if(item == "1"){
         if(this.btn_Aim_show){
@@ -218,7 +225,7 @@ export default {
         }
         this.toggleEditMode(this.editFlag);
         window.mapboxMap.getSource('states').setData(this.areaDataList);
-        window.mapboxMap.getSource('vector-data').setData(this.dataList);
+        window.mapboxMap.getSource('vector-data').setData(this.zdDataList);
 
         this.btn_area_show = false;
         window.mapboxMap.setLayoutProperty('state-fills', 'visibility', 'none')
@@ -252,13 +259,13 @@ export default {
     getModelById() {
       let that = this;
       let requestParams = {
-        modelId: webConfig.columnArr[0].mid, // 申勤员工ID
+        modelId: webConfig.columnArr[1].mid, // 申勤员工ID
       };
       api.getColumnModel(requestParams).then((res) => {
         if (res.code === 200) {
           that.columnModel = res.content;
-          that.columnModel.modelId = webConfig.columnArr[0].mid;
-          that.columnModel.columnId = webConfig.columnArr[0].id;
+          that.columnModel.modelId = webConfig.columnArr[1].mid;
+          that.columnModel.columnId = webConfig.columnArr[1].id;
           that.columnData = that.columnModel;
         }
       });
@@ -294,6 +301,7 @@ export default {
     handleClose() {
       this.tableShow = false;
     },
+    // 创建地图
     creatMap() {
       let that = this;
       mapboxgl.accessToken = webConfig.MAPBOX_ACCESS_TOKEN;
@@ -351,11 +359,13 @@ export default {
           onEditComplete: (data) => {
             // if(data.properties.dms_id){// 对dms_id进行判断
             if(data.properties.id){
+              that.dmsId = data.properties.id;
               that.editDataList = data;
-              delete that.editDataList.properties.center
-              delete that.editDataList.properties.checkItem
-              delete that.editDataList.properties.value
-              delete that.editDataList.properties.address
+              delete that.editDataList.properties
+              // delete that.editDataList.properties.center
+              // delete that.editDataList.properties.checkItem
+              // delete that.editDataList.properties.value
+              // delete that.editDataList.properties.address
             }
             // 你可以在这里提交后端接口,将数据保存到数据库
           }
@@ -364,7 +374,6 @@ export default {
 
       })
       that.drawAreaFeature();
-      // this.getVectorData();
       this.getDmsData();
     },
 
@@ -500,7 +509,8 @@ export default {
       // });
       window.mapboxMap.on('click', that.mapClickValue);
     },
-    mapClickValue(e){
+    // 点击事件
+    async mapClickValue(e){
         let that = this;
       // that.editDataList = fet;
         // 关键:只查询 data-fill-layer,过滤掉所有其他图层
@@ -519,28 +529,32 @@ export default {
         if (!features.length) return;
         //  现在最多只有 1 个要素 → 绝对不会乱
         const feature = features[0];
+        let proData = await that.getCurProData(feature.properties.c_father_project);
+        let pro = {};
+        if(proData.code == 200){
+          pro = proData.content.data[0];
+        }
         //  深拷贝 Geometry:绝对避免引用错乱
         const fet = {
           type: "Feature",
           geometry: JSON.parse(JSON.stringify(feature.geometry)),
-          properties: { ...feature.properties }
+          properties: { ...pro,...feature.properties }
         };
         
         // 以下弹窗(注意要使用 fet.properties)
         
         let str = "";
-        for (let item in fet.properties) {
+        Object.entries(fet.properties).forEach(([key, value], index) => {
           // if (UTIL.isChinese(item) && !that.arrParam.includes(item)) {
           //   str += `<p style="margin:2px 0;">${item}:${fet.properties[item]}</p>`;
           // }
-          if (that.arrParam.map(ev => ev.value).includes(item)) {
-            if(item != "id"){
-              str += `<p style="margin:2px 0;">${that.arrParam.find(et => et.value == item).name}:${fet.properties[item]}</p>`;
+          if (that.arrParam.map(ev => ev.value).includes(key)) {
+            if(key != "id"){
+              str += `<p style="margin:2px 0;">${that.arrParam.find(et => et.value == key).name}:${fet.properties[key]}</p>`; 
             }
           }
 
-        }
-
+        })
         const popupContent = `
         <div style="font-size:14px;line-height:1.6;padding:10px;">
           <h4 style="margin:0 0 6px 0;color:#222;"><span>内容信息</span><span style="display: ${fet.properties.c_xmygrs>0 ? 'block' : 'none'};" class="more" id="popup-more-btn">员工信息>></span></h4>
@@ -571,6 +585,7 @@ export default {
         }, 0);
       
     },
+    // 处理分页变化
     handlePageChange(page, pageSize,text){
       this.page = page;
       this.pageSize = pageSize;
@@ -585,7 +600,7 @@ export default {
       //1743 项目数据  1742 申勤员工
       // 排序条件orderByType  1 升序 2 降序
       let requestParams = {
-        columnId: webConfig.columnArr[0].id,
+        columnId: webConfig.columnArr[1].id,
         states: "0,1,2,3",
         orderBy: JSON.stringify([{ field: "c_xm", orderByType: 2 }]),
         pageSize: that.pageSize,
@@ -698,6 +713,7 @@ export default {
       that.mapEditDraw.isEdit(isEdit);
 
     },
+    // 获取当前地图中心的经纬度
     getCenterPoint(){
       let that = this;
       let center = window.mapboxMap.getCenter();
@@ -852,36 +868,11 @@ export default {
         }).catch((error)=>{})
       
     },
-
-    getVectorData() {
-      let that = this;
-       let param = {
-        "columnId": 1744,
-        "token": localStorage.getItem("token")
-      }
-       axios.post(webConfig.DMS_URL + '/content/getVectorData', qs.stringify(param), 
-       {
-          headers: {
-              'Content-Type': 'application/x-www-form-urlencoded',
-              'token': localStorage.getItem("token")
-          }
-        })
-        .then(function (response) {
-            if(response.data.message == '无效token'){
-              that.$message.success('token过期,请重新登录');
-              that.$router.push({ path: '/' });
-            }else{
-              // that.createVectorLayer(response.data);
-            }
-        })
-        .catch(function (error) {
-            console.log(error);
-        });
-    },
+    // 获取项目数据
     getDmsData() {
       let that = this;
        let param = {
-        "columnId": 1743,
+        "columnId": webConfig.columnArr[0].id,
         "orderBy": JSON.stringify([{"field":"update_time","orderByType":2}]),
         "states": '0,1,2,3',
         "pageSize": 99999,
@@ -898,17 +889,64 @@ export default {
         }else{
           if (res.code == 200){
             const ret = res.content.data || [];
-            ret.forEach(item => {
+            ret.forEach((item) => {
               const prop = Object.fromEntries(
                 Object.entries(item).filter(([key]) => that.arrParam.find(et => et.value == key))
               )
+              prop.c_guid = item.c_guid;
+              let geom = {}
               let feature = {
                 type: "Feature",
-                geometry: wellknown.parse(item.c_polygon.value) || {},
+                geometry: geom,
                 properties: prop || {},
               }
               feat.features.push(feature);
             });
+            that.dataList = feat;
+            that.getAllZdData();
+          }
+        }
+        
+      }).catch((error)=>{
+      })
+    },
+    // 获取驻地数据
+     getAllZdData() {
+      let that = this;
+       let params = {
+        "columnId": webConfig.columnArr[2].id,
+        "orderBy": JSON.stringify([{"field":"update_time","orderByType":2}]),
+        "states": '0,1,2,3',
+        "pageSize": 99999,
+        "page": 0
+      }
+      // params.search = JSON.stringify([
+      //   ...(params.search ? JSON.parse(params.search) : []),
+      //   {
+      //     field: 'c_father_project',
+      //     searchType: 2,
+      //     content: { value: guid },
+      //   },
+      // ])
+      let feat = {
+        type: "FeatureCollection",
+        features: [],
+      }
+      commonAPI.getDmsDataList(params).then((res) => {
+        if(res.message == '无效token'){
+          that.$message.success('token过期,请重新登录');
+          that.$router.push({ path: '/' });
+        }else{
+          if (res.code == 200){
+            const ret = res.content.data || [];
+            ret.forEach((item) => {
+              let feature = {
+                type: "Feature",
+                geometry: wellknown.parse(item.c_polygon.value) || {},
+                properties: item || {},
+              }
+              feat.features.push(feature);
+            });
             that.createVectorLayer(feat);
           }
         }
@@ -916,19 +954,39 @@ export default {
       }).catch((error)=>{
       })
     },
+    // 获取当前项目数据
+    async getCurProData(guid) {
+       let params = {
+        "columnId": webConfig.columnArr[0].id,
+        "orderBy": JSON.stringify([{"field":"update_time","orderByType":2}]),
+        "states": '0,1,2,3',
+        "pageSize": 1,
+        "page": 0
+      }
+      params.search = JSON.stringify([
+        ...(params.search ? JSON.parse(params.search) : []),
+        {
+          field: 'c_guid',
+          searchType: 2,
+          content: { value: guid },
+        },
+      ])
+      return await commonAPI.getDmsDataList(params)
+    },
+    // 创建矢量图层
     createVectorLayer(vectorData) {
       let that = this;
+      that.zdDataList = vectorData;
       that.options = [];
       for (let o in vectorData.features[0].properties) {
         if (that.arrParam.map(ev => ev.value).includes(o)) {
           that.options.push({
-              value: o,
-              label: o,
-            })
-        }
-          
+            value: o,
+            label: that.arrParam.find(ev => ev.value == o).name,
+          })
         }
-      that.dataList = vectorData;
+      }
+      
       if(window.mapboxMap.getSource('vector-data')){
         window.mapboxMap.getSource('vector-data').setData(vectorData);
       }else{
@@ -976,6 +1034,7 @@ export default {
         });
       }
     },
+    // 处理选择字段变化显示文本
     handleSelChange(){
       // 在每个字段后面添加换行符
       const withNewlines = this.selectText.reduce((acc, item, index, array) => {

+ 1 - 1
src/views/IndexView.vue

@@ -103,7 +103,7 @@ export default {
     getDmsDataList(){
       const that = this;
       let requestParams = {
-        columnId: webConfig.columnArr[0].id,
+        columnId: webConfig.columnArr[1].id,
         states: "0,1,2,3",
         orderBy: JSON.stringify([{ field: "c_xm", orderByType: 2 }]),
         pageSize: 99999,