如何实现打卡定位提交校验功能
场景/功能描述
场景1:公司A的全体员工需要在B地址进行公司的季度大会宣导,需要统计员工考勤,如果打卡定位地点在目标B地址500米以内就允许提交打卡,否则不允许
场景2:公司A的某个部门员工需要去拜访客户,到达客户B地址的时候,需要员工进行打卡,如果打卡定位地点在目标B地址500米以内就允许提交打卡,否则不允许
思路流程
通过使用代码块+提交校验来进行实现
逻辑思路:通过使用代码块中调用地图的API接口去获取定位地址以及目标地址的经纬度,再通过计算两个地址的距离是否在500米以内,如果满足就返回true,反之返回false

配置过程
调用API接口准备工作
这里使用的是百度地图的地理编码API接口,所以以调用百度地图为例,其他地图类接口请自行查找。
百度地图开放平台:https://lbsyun.baidu.com
地理编码API接口文档:https://lbsyun.baidu.com/faq/api?title=webapi/guide/webservice-geocoding-base
使用接口前先根据使用准备流程申请完成


表单设计
这里以场景2为例:拜访客户,到达客户地点进行打卡,需要有一个维护客户信息地址的表单,如下图
考勤客户地址信息


外出考勤打卡

客户名称
数据关联字段,关联考勤客户地址信息的客户姓名

客户地址
单行文字字段,关联已有数据,带出对应客户名称的地址

代码块
代码注释
qf_field.{客户地址$$185A76DED$$}:表单客户地址字段
qf_field.{定位$$1853BE60C$$}:表单定位字段
ak:百度地图控制台应用中获取具体参数内容
const axios = require('axios');
const geolib = require('geolib');
// 输入的地址 A,插入表单客户地址字段
const addressA = qf_field.{客户地址$$185A76DED$$};
// 输入的地址 B,插入表单定位字段
const addressB = qf_field.{定位$$1853BE60C$$};
if(addressA==null || addressB==null){
qf_output={'istrue':false}
}else{
// 百度地图地理编码 API 的请求 URL,其中的ak从百度地图控制台应用中获取
const geocodeUrlA = `http://api.map.baidu.com/geocoding/v3/?address=${encodeURIComponent(
addressA
)}&output=json&ak=YGlUOz7nfpwS1ZRIePOqz2HQsG*****`;
const geocodeUrlB = `http://api.map.baidu.com/geocoding/v3/?address=${encodeURIComponent(
addressB
)}&output=json&ak=YGlUOz7nfpwS1ZRIePOqz2HQsG*****`;
axios
.all([
axios.get(geocodeUrlA),
axios.get(geocodeUrlB)
])
.then(axios.spread((responseA, responseB) => {
const resultA = responseA.data;
const resultB = responseB.data;
if (resultA.status === 0 && resultB.status === 0) {
const locationA = resultA.result.location;
const latitudeA = locationA.lat;
const longitudeA = locationA.lng;
const locationB = resultB.result.location;
const latitudeB = locationB.lat;
const longitudeB = locationB.lng;
const distance = geolib.getDistance(
{ latitude: latitudeA, longitude: longitudeA },
{ latitude: latitudeB, longitude: longitudeB }
);
// 判断距离是否小于等于 500 米
if (distance <= 500) {
const istrue=true;//距离小于等于 500 米
qf_output={istrue}
} else {
const istrue=false;//距离大于 500 米
qf_output={istrue}
}
}
}))
}
代码测试

字段接收配置

是否允许打卡

流程设计
外出考勤打卡
申请人节点——高级设置——提交校验
公式:AND(是否允许打卡=="true")


实现效果
由于定位字段需要移动端使用,所以具体测试在移动端测试
