Explorar el Código

设备定位和生活轨迹

xiao547607 hace 5 años
padre
commit
1bc2347bd7

+ 5 - 1
src/api/base/personInfo.js

@@ -91,8 +91,12 @@ function dataSync(idList) {
   });
 }
 
+function lifeRecordList(formData){
+  return request.post(constant.serverUrl + "/base/personInfo/lifeRecordList", formData);
+}
+
 export default {
   pageList, create, edit, add, update, remove, batchRemove, exportXls,
   enabledFace, enabledCard, enabledApp, enabledGuest, dataSync, enabledFaceList,
-  enabledWechatNotice
+  enabledWechatNotice,lifeRecordList
 }

+ 175 - 0
src/views/base/deviceInfo-amap.vue

@@ -0,0 +1,175 @@
+
+<style scoped>
+.user-panel {
+  margin: 10px auto;
+}
+</style>
+<template>
+  <el-dialog
+    :visible.sync="showDialog"
+    :title="title"
+    :modal-append-to-body="false"
+    style="text-align:left;"
+    @close="closeDialog"
+    :close-on-click-modal="false"
+  >
+    <div class="user-panel" v-loading="loading">
+      <el-form ref="form" :model="formModel" :label-width="'100px'">
+        <el-row>
+          <el-col :span="24" style="height:400px;">
+            <!-- <baidu-map
+              class="bm-view"
+              :center="mapCenter"
+              :zoom="mapZoom"
+              @dblclick="ondblclick"
+              @dblclick="ondblclick"
+              :showAddressBar="true"
+              :autoLocation="true"
+              :double-click-zoom="false"
+              :scroll-wheel-zoom="true"
+            >
+              <bm-marker :position="pointPosition" :dragging="true" animation="BMAP_ANIMATION_BOUNCE"></bm-marker>
+            </baidu-map> -->
+             <el-amap 
+                  ref="map" 
+                  vid="amapDemo" 
+                  :amap-manager="amapManager" 
+                  :center="pointPosition" 
+                  :zoom="zoom" 
+                  :events="events" 
+                  class="amap-demo">
+                    <el-amap-marker vid="amapDemo" :position="pointPosition"></el-amap-marker>
+                </el-amap>
+          </el-col>
+          <el-col :span="24">
+            <el-input v-model="formModel.longtitude" readonly style="width:20%"></el-input>
+            <el-input v-model="formModel.latitude" readonly style="width:20%"></el-input>
+          </el-col>
+        </el-row>
+      </el-form>
+    </div>
+    <span slot="footer" class="dialog-footer">
+      <el-button @click="closeDialog">取 消</el-button>
+      <el-button type="primary" @click="handleSubmit" :loading="submitting">确 定</el-button>
+    </span>
+  </el-dialog>
+</template>
+<script>
+import Constant from "@/constant";
+import deviceInfoApi from "@/api/base/deviceInfo";
+import AMap from "vue-amap";
+let amapManager = new AMap.AMapManager();
+
+export default {
+  props: ["businessKey", "title"],
+  data() {
+    return {
+      amapManager,
+      zoom: 12,
+      formModel: {},
+      showDialog: true,
+      loading: false,
+      submitting: false,
+      canQuery: true,
+      mapZoom: 12,
+      pointPosition: [112.240222, 30.337053],
+      showPosition: false,
+      events: {
+        click: e => {
+          var pt = e.lnglat;//点击选择新地址为中心点
+          console.log(pt);
+          
+          this.pointPosition = [pt.lng, pt.lat];
+          this.formModel.longtitude = pt.lng;
+          this.formModel.latitude = pt.lat;
+        }
+      }
+    };
+  },
+  methods: {
+    mapLoad(longtitude, latitude) {
+      this.pointPosition = [longtitude,latitude];
+    },
+    closeDialog() {
+      this.$emit("close", false);
+    },
+    handleSubmit() {
+      var self = this;
+
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          (function() {
+            var id = self.formModel.id;
+
+            if (id == null || id.length == 0) {
+              return deviceInfoApi.add(self.formModel);
+            } else {
+              return deviceInfoApi.update(self.formModel);
+            }
+          })().then(function(response) {
+            var jsonData = response.data;
+
+            if (jsonData.result) {
+              self.$message({
+                message: "保存成功!",
+                type: "success"
+              });
+
+              self.$emit("close", true);
+            } else {
+              self.$message({
+                message: jsonData.message + "",
+                type: "warning"
+              });
+
+              //self.$emit("close", false);
+            }
+          });
+        }
+      });
+    }
+  },
+  mounted: function() {
+    var self = this;
+    (function() {
+      if (self.businessKey.length == 0) {
+        self.$message({
+          message: "查无学校编号",
+          type: "warning"
+        });
+        return null;
+      } else {
+        return deviceInfoApi.edit(self.businessKey);
+      }
+    })()
+      .then(response => {
+        var jsonData = response.data;
+        self.loading = false;
+
+        if (jsonData.result) {
+          self.formModel = jsonData.data;
+          
+          if(self.formModel.longtitude!=null && self.formModel.latitude!=null){
+            this.mapLoad(self.formModel.longtitude, self.formModel.latitude);
+          }
+        } else {
+          self.$message.error(jsonData.message + "");
+        }
+      })
+      .catch(error => {
+        self.$message.error(error + "");
+      });
+  }
+};
+</script>
+<style>
+.bm-view {
+  width: 100%;
+  height: 400px;
+}
+
+.amap-demo{
+  width: 100%;
+  height: 400px;
+}
+</style>

+ 22 - 2
src/views/base/deviceInfo-detail.vue

@@ -88,13 +88,25 @@
               </el-select>
             </el-form-item>
           </el-col>
+           <el-col :span="12">
+            <el-form-item label="场景值" prop="type">
+              <el-select v-model="formModel.deviceAddress" filterable placeholder="请选择" style="width:90%">
+                <el-option
+                  v-for="result in deviceAddressData"
+                  :key="result.id"
+                  :label="result.name"
+                  :value="result.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
           <el-col :span="12">
             <el-form-item label="开锁密码" prop="unlockPassword">
               <el-input v-model="formModel.unlockPassword" placeholder="请输入开锁密码" style="width:80%"></el-input>
             </el-form-item>
           </el-col>
-        </el-row>
-        <el-row>
           <el-col :span="12">
             <el-form-item label="二维码地址" prop="codeAddress">
               <el-input v-model="formModel.codeAddress" placeholder="请输入二维码地址" style="width:80%"></el-input>
@@ -113,6 +125,7 @@
 import Constant from "@/constant";
 import deviceInfoApi from "@/api/base/deviceInfo";
 import companyInfoApi from "@/api/base/companyInfo";
+import dataDictionaryApi from "@/api/sys/dataDictionary";
 import SelectTree from "@/components/SelectTree";
 
 export default {
@@ -158,6 +171,13 @@ export default {
   },
   created() {
     this.loadTree();
+
+    var formData = new FormData();
+    formData.append("catalogName", "设备场景值");
+    dataDictionaryApi.findByCatalogName(formData).then(response => {
+      var jsonData = response.data;
+      this.deviceAddressData = jsonData.data;
+    });
   },
   methods: {
     getSelectedValue(value) {

+ 26 - 6
src/views/base/deviceInfo-list.vue

@@ -84,7 +84,7 @@
       <el-table-column prop="deviceNo" label="设备编号" width="200" fixed="left"></el-table-column>
       <el-table-column type="index" label="序号" :index="indexMethod" width="50"></el-table-column>
       <el-table-column prop="companyName" label="单位" width="280" show-overflow-tooltip></el-table-column>
-      
+
       <el-table-column prop="aliasName" label="设备别名" width="250" show-overflow-tooltip></el-table-column>
       <el-table-column prop="isOnline" label="运行状态" width="80">
         <template slot-scope="{row}">
@@ -115,6 +115,9 @@
               <el-button size="mini" type="primary" @click="handleQRcode(row)">二维码地址</el-button>-->
               <el-link type="danger" @click="handleDelete(row)">删除</el-link>
             </el-col>
+            <el-col :span="8">
+              <el-link type="primary" @click="handlePoint(row)">定位</el-link>
+            </el-col>
             <el-col :span="6">
               <el-link type="primary" @click="handleEditRule(row)">验证规则</el-link>
             </el-col>
@@ -263,11 +266,20 @@
       </span>
     </el-dialog>
     <!-------------设备验证规则end------------------>
+    <deviceInfo-map
+      v-if="showMapModal"
+      :businessKey="businessKey"
+      :title="modalTitle"
+      :typeData="typeData"
+      :companyResult="companyResult"
+      @close="onDetailModalClose"
+    ></deviceInfo-map>
   </div>
 </template>
 <script>
 import Constant from "@/constant";
 import DeviceInfoDetail from "./deviceInfo-detail";
+import DeviceInfoMap from "./deviceInfo-amap";
 import deviceInfoApi from "@/api/base/deviceInfo";
 import dataDictionaryApi from "@/api/sys/dataDictionary";
 import companyInfoApi from "@/api/base/companyInfo";
@@ -330,7 +342,8 @@ export default {
         value: "id",
         label: "name",
         children: "children"
-      }
+      },
+      showMapModal: false
     };
   },
   created() {
@@ -352,8 +365,8 @@ export default {
     this.loadTree();
   },
   methods: {
-    indexMethod(index){
-      return (this.pageIndex-1)*this.pageSize + (index+1);
+    indexMethod(index) {
+      return (this.pageIndex - 1) * this.pageSize + (index + 1);
     },
     getSelectedValue(value) {
       this.queryModel.companyId = value;
@@ -515,6 +528,7 @@ export default {
     onDetailModalClose(refreshed) {
       //保存成功后回调
       this.showModal = false;
+      this.showMapModal = false;
 
       if (refreshed) {
         this.changePage(this.pageIndex);
@@ -600,7 +614,12 @@ export default {
           });
         }
       });
-    }
+    },
+    handlePoint(record) {
+      this.modalTitle = "定位";
+      this.businessKey = record.id;
+      this.showMapModal = true;
+    },
   },
   mounted: function() {
     var self = this;
@@ -608,7 +627,8 @@ export default {
   },
   components: {
     "deviceInfo-detail": DeviceInfoDetail,
-    "el-select-tree": SelectTree
+    "el-select-tree": SelectTree,
+    "deviceInfo-map": DeviceInfoMap
   }
 };
 </script>

+ 177 - 0
src/views/base/lifeRecord-list.vue

@@ -0,0 +1,177 @@
+<template>
+  <el-dialog
+    :visible.sync="showDialog"
+    title="生活记录"
+    :modal-append-to-body="false"
+    append-to-body
+    :modal="true"
+    style="text-align:left;"
+    @close="closeDialog"
+    :close-on-click-modal="false"
+    width="60%"
+  >
+    <div>
+      <!--
+      要resetFields起作用,必须配置:model和prop
+      -->
+      <el-divider></el-divider>
+      <el-form
+        ref="queryForm"
+        :model="queryModel"
+        :rules="ruleValidate"
+        inline
+        class="demo-form-inline"
+      >
+        <el-row>
+          <el-form-item label="日期" prop="queryDate">
+            <el-date-picker
+              size="mini"
+              v-model="queryModel.queryDate"
+              type="date"
+              placeholder="选择日期"
+              style="width:100%"
+              value-format="yyyy-MM-dd"
+            ></el-date-picker>
+          </el-form-item>
+          <el-form-item>
+            <el-button
+              type="primary"
+              size="mini"
+              icon="ios-search"
+              @click="handleQuery"
+              :loading="loading"
+            >查询</el-button>
+          </el-form-item>
+        </el-row>
+      </el-form>
+      <el-table
+        :data="tableData"
+        style="min-height:400px;"
+        height="420px"
+        v-loading="loading"
+        stripe
+      >
+        <el-table-column type="index" label width="50"></el-table-column>
+        <el-table-column prop="deviceName" label="打卡地点" width="180"></el-table-column>
+        <el-table-column prop="recordTime" label="打卡时间" width="200"></el-table-column>
+      </el-table>
+    </div>
+  </el-dialog>
+</template>
+<script>
+import Constant from "@/constant";
+import personInfoApi from "@/api/base/personInfo";
+import NProgress from "nprogress"; // progress bar
+import "nprogress/nprogress.css"; // progress bar style
+
+export default {
+  props: ["personId"],
+  data() {
+    var self = this;
+
+    return {
+      ruleValidate: {
+        queryDate: [
+          { required: true, message: "请选择查询日期", trigger: "blur" }
+        ]
+      },
+      queryModel: { queryDate: "" },
+      loading: false,
+      tableData: [],
+      field: "",
+      direction: "",
+      multipleSelection: [],
+      showModal: false,
+      modalTitle: "",
+      showDialog: true,
+    };
+  },
+  created() {
+    //var nowDate = new Date;
+    //this.queryModel.queryDate = new Date();
+    //this.queryModel.queryDate = new Date();
+    //this.queryModel.queryDate.setMonth(new Date().getMonth() - 1);
+
+    this.getCurrentMonthFirst();
+  },
+  methods: {
+    closeDialog() {
+      this.$emit("close", false);
+    },
+    changePage() {
+      var self = this;
+
+      self.loading = true;
+
+      var formData = new FormData();
+      formData.append("queryDate", self.queryModel.queryDate);
+      formData.append("personId", self.personId);
+      personInfoApi
+        .lifeRecordList(formData)
+        .then(function(response) {
+          self.loading = false;
+          var jsonData = response.data.data;
+          self.tableData = jsonData;
+        })
+        .catch(error => {
+          self.loading = false;
+          // self.$message.error(error + "");
+        });
+    },
+    onDetailModalClose(refreshed) {
+      //保存成功后回调
+      this.showModal = false;
+
+      if (refreshed) {
+        this.changePage();
+      }
+    },
+    handleQuery() {
+      var self = this;
+      this.$refs["queryForm"].validate(valid => {
+        if (valid) {
+          self.changePage();
+        }
+      });
+    },
+    getCurrentMonthFirst() {
+      var self = this;
+      var date = new Date();
+      var year = date.getFullYear();
+      var month = date.getMonth() + 1;
+      if (month < 10) {
+        month = "0" + month;
+      }
+      var data = date.getDate();
+      if (data < 10) {
+        data = "0" + data;
+      }
+      var startTime = year + "-" + month + "-" + data;
+      self.queryModel.queryDate = startTime;
+    },
+  },
+  mounted: function() {
+    this.changePage();
+  }
+};
+</script>
+<style lang="scss" scoped>
+.el-breadcrumb {
+  margin: 10px;
+  line-height: 20px;
+}
+
+.el-divider {
+  margin: 5px 0;
+}
+
+.demo-form-inline {
+  margin-left: 10px;
+  text-align: left;
+}
+
+.button-group {
+  margin-left: 10px;
+  text-align: left;
+}
+</style>

+ 5 - 2
src/views/base/personInfo-list.vue

@@ -477,6 +477,7 @@ import companyPositionApi from "@/api/base/companyPosition";
 import deviceInfoApi from "@/api/base/deviceInfo";
 import personDeviceRelationApi from "@/api/base/personDeviceRelation";
 import SelectTree from "@/components/SelectTree";
+import LifeRecordList from "./lifeRecord-list";
 
 import { getToken } from "@/utils/auth"; // get token from cookie
 import NProgress from "nprogress"; // progress bar
@@ -557,7 +558,8 @@ export default {
         value: "id",
         label: "name",
         children: "children"
-      }
+      },
+      showRecordModal:false
     };
   },
   created() {
@@ -1197,7 +1199,8 @@ export default {
     "personInfo-detail": PersonInfoDetail,
     "personDeviceRelation-list": PersonDeviceRelationList,
     "personDeviceRelation-BoundList": PersonDeviceRelationBoundList,
-    "el-select-tree": SelectTree
+    "el-select-tree": SelectTree,
+    "lifeRecord-list": LifeRecordList
   }
 };
 </script>