|
|
@@ -12,14 +12,14 @@
|
|
|
<text class="ygoa-icon icon-goToWork"></text>
|
|
|
<text class="title">上班</text>
|
|
|
<text class="time">{{ signInTime || '未打卡' }}</text>
|
|
|
- <text class="signStatus" v-if="!isSignInStatusDisabled">({{signInStatusName}})</text>
|
|
|
+ <text class="signStatus" v-if="!isSignInStatusDisabled">({{ signInStatusName }})</text>
|
|
|
</view>
|
|
|
<view class="record-item">
|
|
|
<text class="ygoa-icon icon-afterWork"></text>
|
|
|
<text class="title">下班</text>
|
|
|
<text class="time">{{ signOutTime || '未打卡' }}</text>
|
|
|
<text class="signStatus" v-if="!isSignOutStatusDisabled"
|
|
|
- style="color: #e64340;">({{signOutStatusName}})</text>
|
|
|
+ style="color: #e64340;">({{ signOutStatusName }})</text>
|
|
|
</view>
|
|
|
<view class="record-item" @click="getAddress">
|
|
|
<text class="ygoa-icon icon-location"></text>
|
|
|
@@ -35,324 +35,323 @@
|
|
|
<!-- 打卡按钮 -->
|
|
|
<view class="footer">
|
|
|
<button type="default" @click="signInOrOut" style="background-color: #3c9cff; color: #fcfcfc;"
|
|
|
- v-if="signName=='上班签到'">上班签到</button>
|
|
|
+ v-if="signName == '上班签到'">上班签到</button>
|
|
|
<button type="default" @click="signInOrOut" style="background-color: #1aad19; color: #fcfcfc;"
|
|
|
- v-else-if="signName=='下班签退'">下班签退</button>
|
|
|
+ v-else-if="signName == '下班签退'">下班签退</button>
|
|
|
</view>
|
|
|
</view>
|
|
|
</template>
|
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
- import {
|
|
|
- onBeforeUnmount,
|
|
|
- onMounted,
|
|
|
- reactive,
|
|
|
- ref
|
|
|
- } from 'vue';
|
|
|
- // 导入地理位置相关函数
|
|
|
- import booleanPointInPolygon from "@turf/boolean-point-in-polygon";
|
|
|
- import {
|
|
|
- point,
|
|
|
- polygon
|
|
|
- } from "@turf/helpers";
|
|
|
- import {
|
|
|
- useUserStore
|
|
|
- } from '@/store/user';
|
|
|
- import $modal from '@/plugins/modal.js'
|
|
|
- import $tab from '@/plugins/tab.js';
|
|
|
- import config from '@/config.js';
|
|
|
- import {
|
|
|
- createAttendance,
|
|
|
- tranAddress,
|
|
|
- checkAttendance
|
|
|
- } from '@/api/mine.js'
|
|
|
- const userStore = useUserStore();
|
|
|
- const thisUser = userStore.user;
|
|
|
- const intervalId = ref(null); // 定时器ID
|
|
|
- onBeforeUnmount(() => {
|
|
|
- clearInterval(intervalId.value);
|
|
|
- })
|
|
|
- // 组件挂载后初始化当前日期与位置
|
|
|
- onMounted(() => {
|
|
|
- dateInit();
|
|
|
- // getlocation();
|
|
|
- });
|
|
|
-
|
|
|
-
|
|
|
- function showNowTime() {
|
|
|
- // let nowMilliseconds=Date.now();
|
|
|
- // intervalId.value = setInterval(() => {
|
|
|
- // nowMilliseconds+=1000;
|
|
|
- // nowTime.value = new Date(nowMilliseconds).toLocaleString('zh-CN', {
|
|
|
- // year: 'numeric',
|
|
|
- // month: '2-digit',
|
|
|
- // day: '2-digit',
|
|
|
- // hour: '2-digit',
|
|
|
- // minute: '2-digit',
|
|
|
- // second: '2-digit',
|
|
|
- // hour12: false // 24小时制
|
|
|
- // });
|
|
|
- // }, 1000); // 每1秒更新一次
|
|
|
-
|
|
|
- intervalId.value = setInterval(() => {
|
|
|
- nowTime.value = getNowTime()
|
|
|
- }, 1000); // 每1秒更新一次
|
|
|
-
|
|
|
- }
|
|
|
- // 当前日期和时间相关信息
|
|
|
- const currentDate = ref('2023-04-01');
|
|
|
- const currentDay = ref('星期三');
|
|
|
- const nowTime = ref(''); // 当前时间
|
|
|
- const weekArr = reactive(['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']); // 星期数组
|
|
|
-
|
|
|
-
|
|
|
- // 初始化日期
|
|
|
- function dateInit() {
|
|
|
- const nowDate = new Date();
|
|
|
- const year = nowDate.getFullYear(); // 获取年份
|
|
|
- const month = nowDate.getMonth() + 1; // 获取月份
|
|
|
- const day = nowDate.getDate(); // 获取日期
|
|
|
- // 格式化月份和日期为两位数
|
|
|
- const formattedMonth = month < 10 ? '0' + month : month;
|
|
|
- const formattedDay = day < 10 ? '0' + day : day;
|
|
|
- currentDate.value = `${year}-${formattedMonth}-${formattedDay}`; // 设置当前日期
|
|
|
- const dayOfWeek = nowDate.getDay(); // 获取当前星期
|
|
|
- currentDay.value = weekArr[dayOfWeek]; // 设置当前星期
|
|
|
- showNowTime();
|
|
|
- getTodayAtt();
|
|
|
+import {
|
|
|
+ onBeforeUnmount,
|
|
|
+ onMounted,
|
|
|
+ reactive,
|
|
|
+ ref
|
|
|
+} from 'vue';
|
|
|
+// 导入地理位置相关函数
|
|
|
+import booleanPointInPolygon from "@turf/boolean-point-in-polygon";
|
|
|
+import {
|
|
|
+ point,
|
|
|
+ polygon
|
|
|
+} from "@turf/helpers";
|
|
|
+import {
|
|
|
+ useUserStore
|
|
|
+} from '@/store/user';
|
|
|
+import $modal from '@/plugins/modal.js'
|
|
|
+import $tab from '@/plugins/tab.js';
|
|
|
+import config from '@/config.js';
|
|
|
+import {
|
|
|
+ createAttendance,
|
|
|
+ tranAddress,
|
|
|
+ checkAttendance
|
|
|
+} from '@/api/mine.js'
|
|
|
+const userStore = useUserStore();
|
|
|
+const thisUser = userStore.user;
|
|
|
+const intervalId = ref(null); // 定时器ID
|
|
|
+onBeforeUnmount(() => {
|
|
|
+ clearInterval(intervalId.value);
|
|
|
+})
|
|
|
+// 组件挂载后初始化当前日期与位置
|
|
|
+onMounted(() => {
|
|
|
+ dateInit();
|
|
|
+ // getlocation();
|
|
|
+});
|
|
|
+
|
|
|
+
|
|
|
+function showNowTime() {
|
|
|
+ // let nowMilliseconds=Date.now();
|
|
|
+ // intervalId.value = setInterval(() => {
|
|
|
+ // nowMilliseconds+=1000;
|
|
|
+ // nowTime.value = new Date(nowMilliseconds).toLocaleString('zh-CN', {
|
|
|
+ // year: 'numeric',
|
|
|
+ // month: '2-digit',
|
|
|
+ // day: '2-digit',
|
|
|
+ // hour: '2-digit',
|
|
|
+ // minute: '2-digit',
|
|
|
+ // second: '2-digit',
|
|
|
+ // hour12: false // 24小时制
|
|
|
+ // });
|
|
|
+ // }, 1000); // 每1秒更新一次
|
|
|
+
|
|
|
+ intervalId.value = setInterval(() => {
|
|
|
+ nowTime.value = getNowTime()
|
|
|
+ }, 1000); // 每1秒更新一次
|
|
|
+
|
|
|
+}
|
|
|
+// 当前日期和时间相关信息
|
|
|
+const currentDate = ref('2023-04-01');
|
|
|
+const currentDay = ref('星期三');
|
|
|
+const nowTime = ref(''); // 当前时间
|
|
|
+const weekArr = reactive(['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']); // 星期数组
|
|
|
+
|
|
|
+
|
|
|
+// 初始化日期
|
|
|
+function dateInit() {
|
|
|
+ const nowDate = new Date();
|
|
|
+ const year = nowDate.getFullYear(); // 获取年份
|
|
|
+ const month = nowDate.getMonth() + 1; // 获取月份
|
|
|
+ const day = nowDate.getDate(); // 获取日期
|
|
|
+ // 格式化月份和日期为两位数
|
|
|
+ const formattedMonth = month < 10 ? '0' + month : month;
|
|
|
+ const formattedDay = day < 10 ? '0' + day : day;
|
|
|
+ currentDate.value = `${year}-${formattedMonth}-${formattedDay}`; // 设置当前日期
|
|
|
+ const dayOfWeek = nowDate.getDay(); // 获取当前星期
|
|
|
+ currentDay.value = weekArr[dayOfWeek]; // 设置当前星期
|
|
|
+ showNowTime();
|
|
|
+ getTodayAtt();
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+const signInTime = ref(''); // 上班签到时间
|
|
|
+const signOutTime = ref(''); // 下班签到时间
|
|
|
+//打卡按钮文字显示
|
|
|
+const signName = ref('')
|
|
|
+
|
|
|
+//迟到早退状态,默认隐藏
|
|
|
+const signInStatusName = ref('迟到')
|
|
|
+const signOutStatusName = ref('早退')
|
|
|
+const isSignInStatusDisabled = ref(true)
|
|
|
+const isSignOutStatusDisabled = ref(true)
|
|
|
+//获取今天考勤状态
|
|
|
+function getTodayAtt() {
|
|
|
+ const params = {
|
|
|
+ universalid: thisUser.useId,
|
|
|
+ rizi: currentDate.value
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
- const signInTime = ref(''); // 上班签到时间
|
|
|
- const signOutTime = ref(''); // 下班签到时间
|
|
|
- //打卡按钮文字显示
|
|
|
- const signName = ref('')
|
|
|
-
|
|
|
- //迟到早退状态,默认隐藏
|
|
|
- const signInStatusName = ref('迟到')
|
|
|
- const signOutStatusName = ref('早退')
|
|
|
- const isSignInStatusDisabled = ref(true)
|
|
|
- const isSignOutStatusDisabled = ref(true)
|
|
|
- //获取今天考勤状态
|
|
|
- function getTodayAtt() {
|
|
|
- const params = {
|
|
|
- universalid: thisUser.useId,
|
|
|
- rizi: currentDate.value
|
|
|
- }
|
|
|
- checkAttendance(params).then(res => {
|
|
|
-
|
|
|
- if ("success" == res.returnMsg) {
|
|
|
- // console.log("kaoqin",res);
|
|
|
- const attList = res.returnParams.list;
|
|
|
- const time1 = attList.find(item => item.att_type_id === '1');
|
|
|
- //拿到所有签退数据后,用pop取最后一个
|
|
|
- const time2 = attList.filter(item => item.att_type_id === '2').pop();
|
|
|
- console.log('time2', time2);
|
|
|
- if (time1 !== undefined) {
|
|
|
- // console.log('getTime1',time1);
|
|
|
- signInTime.value = time1.att_time.split(' ')[1];
|
|
|
- signName.value = '下班签退';
|
|
|
- if (Array.isArray(config.lateTimeRange) && isTimeInRange(signInTime.value, config
|
|
|
- .lateTimeRange[0], '23:59:59')) {
|
|
|
- isSignInStatusDisabled.value = false; //迟到
|
|
|
- }
|
|
|
- } else {
|
|
|
- signName.value = '上班签到';
|
|
|
+ checkAttendance(params).then(res => {
|
|
|
+
|
|
|
+ if ("success" == res.returnMsg) {
|
|
|
+ // console.log("kaoqin",res);
|
|
|
+ const attList = res.returnParams.list;
|
|
|
+ const time1 = attList.find(item => item.att_type_id === '1');
|
|
|
+ //拿到所有签退数据后,用pop取最后一个
|
|
|
+ const time2 = attList.filter(item => item.att_type_id === '2').pop();
|
|
|
+ console.log('time2', time2);
|
|
|
+ if (time1 !== undefined) {
|
|
|
+ // console.log('getTime1',time1);
|
|
|
+ signInTime.value = time1.att_time.split(' ')[1];
|
|
|
+ signName.value = '下班签退';
|
|
|
+ if (Array.isArray(config.lateTimeRange) && isTimeInRange(signInTime.value, config
|
|
|
+ .lateTimeRange[0], '23:59:59')) {
|
|
|
+ isSignInStatusDisabled.value = false; //迟到
|
|
|
}
|
|
|
- if (time2 !== undefined) {
|
|
|
- signOutTime.value = time2.att_time.split(' ')[1];
|
|
|
- if (Array.isArray(config.signOutTimeRange) && isTimeInRange(signOutTime.value, "00:00:00",
|
|
|
- config.signOutTimeRange[0])) {
|
|
|
- isSignOutStatusDisabled.value = false; //早退
|
|
|
- } else {
|
|
|
- isSignOutStatusDisabled.value = true; //隐藏早退状态
|
|
|
- }
|
|
|
+ } else {
|
|
|
+ signName.value = '上班签到';
|
|
|
+ }
|
|
|
+ if (time2 !== undefined) {
|
|
|
+ signOutTime.value = time2.att_time.split(' ')[1];
|
|
|
+ if (Array.isArray(config.signOutTimeRange) && isTimeInRange(signOutTime.value, "00:00:00",
|
|
|
+ config.signOutTimeRange[0])) {
|
|
|
+ isSignOutStatusDisabled.value = false; //早退
|
|
|
+ } else {
|
|
|
+ isSignOutStatusDisabled.value = true; //隐藏早退状态
|
|
|
}
|
|
|
}
|
|
|
- })
|
|
|
- }
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
|
|
|
|
|
|
|
|
|
- //上班卡或下班卡
|
|
|
- function signInOrOut() {
|
|
|
- if ('上班签到' == signName.value) {
|
|
|
- signIn();
|
|
|
- } else {
|
|
|
- signOut();
|
|
|
- }
|
|
|
+//上班卡或下班卡
|
|
|
+function signInOrOut() {
|
|
|
+ if ('上班签到' == signName.value) {
|
|
|
+ signIn();
|
|
|
+ } else {
|
|
|
+ signOut();
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
|
|
|
|
|
|
- function signIn() {
|
|
|
- const now = getNowTime();
|
|
|
- //判断打卡时间是否符合
|
|
|
- if (!isTimeInRange(now, ...config.signInTimeRange)) {
|
|
|
- $modal.msg('不在签到时间8:30--9:30内,请前往补卡')
|
|
|
- return;
|
|
|
- }
|
|
|
- // attType.value=1;
|
|
|
- const signIn = 1;
|
|
|
+function signIn() {
|
|
|
+ const now = getNowTime();
|
|
|
+ //判断打卡时间是否符合
|
|
|
+ if (!isTimeInRange(now, ...config.signInTimeRange)) {
|
|
|
+ $modal.msg('不在签到时间8:30--9:30内,请前往补卡')
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // attType.value=1;
|
|
|
+ const signIn = 1;
|
|
|
+ getAddress().then(() => {
|
|
|
+ clockIn(signIn);
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+// 下班签退
|
|
|
+function signOut() {
|
|
|
+ const now = getNowTime();
|
|
|
+ const signOut = 2;
|
|
|
+ //判断打卡时间是否符合
|
|
|
+ console.log('now', now);
|
|
|
+ if (!isTimeInRange(now, ...config.signOutTimeRange)) {
|
|
|
+ $modal.confirm('当前非正常签退时间,是否继续?').then(res => {
|
|
|
+ if (res) {
|
|
|
+ getAddress().then(() => {
|
|
|
+ clockIn(signOut); // 执行打卡并获取结果
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }).catch(() => { })
|
|
|
+ } else {
|
|
|
getAddress().then(() => {
|
|
|
- clockIn(signIn);
|
|
|
+ clockIn(signOut);
|
|
|
});
|
|
|
- };
|
|
|
-
|
|
|
- // 下班签退
|
|
|
- function signOut() {
|
|
|
- const now = getNowTime();
|
|
|
- const signOut = 2;
|
|
|
- //判断打卡时间是否符合
|
|
|
- console.log('now', now);
|
|
|
- if (!isTimeInRange(now, ...config.signOutTimeRange)) {
|
|
|
- $modal.confirm('当前非正常签退时间,是否继续?').then(res => {
|
|
|
- if (res) {
|
|
|
- getAddress().then(() => {
|
|
|
- clockIn(signOut); // 执行打卡并获取结果
|
|
|
- });
|
|
|
- }
|
|
|
- })
|
|
|
- } else {
|
|
|
- getAddress().then(() => {
|
|
|
- clockIn(signOut);
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- };
|
|
|
-
|
|
|
- //获取当前时间
|
|
|
- function getNowTime() {
|
|
|
- return new Date().toLocaleTimeString('en-US', {
|
|
|
- hour12: false
|
|
|
- }).substring(0, 8)
|
|
|
}
|
|
|
|
|
|
- //判断时间是否在区间内
|
|
|
- function isTimeInRange(time, startTime, endTime) {
|
|
|
- // 将时间字符串转换为Date对象
|
|
|
- const timeObj = new Date('1970-01-01T' + time + 'Z');
|
|
|
- const startObj = new Date('1970-01-01T' + startTime + 'Z');
|
|
|
- const endObj = new Date('1970-01-01T' + endTime + 'Z');
|
|
|
- // 比较时间
|
|
|
- return timeObj >= startObj && timeObj <= endObj;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // 地图配置信息
|
|
|
- // const mapKey = config.mapKey; // 地图API密钥
|
|
|
- const mapType = ref('tmap'); // 地图类型
|
|
|
- const address = ref(''); // 初始化地址
|
|
|
-
|
|
|
- // 打卡定位信息
|
|
|
- const longitude = ref(0); // 经度
|
|
|
- const latitude = ref(0); // 纬度
|
|
|
|
|
|
- // 标记信息
|
|
|
- const marker = reactive({
|
|
|
- id: 1,
|
|
|
- latitude: 25.958812,
|
|
|
- longitude: 119.213036,
|
|
|
- width: 50, // 标记宽度
|
|
|
- height: 50, // 标记高度
|
|
|
- title: '宇光同行' // 标记标题
|
|
|
- });
|
|
|
-
|
|
|
- // 获取当前定位经纬度
|
|
|
- function getlocation() {
|
|
|
- return new Promise((resolve, reject) => {
|
|
|
- //判断用户是否打开位置权限
|
|
|
- uni.getSetting({
|
|
|
- success(res) {
|
|
|
- // 如果用户未授权
|
|
|
- if (!res.authSetting['scope.userLocation']) {
|
|
|
- $modal.confirm('需要您授权获取地理位置信息').then(res => {
|
|
|
- if (res) {
|
|
|
- // 打开权限设置页面
|
|
|
- uni.openSetting({
|
|
|
- success: (settingData) => {
|
|
|
- if (settingData.authSetting[
|
|
|
- 'scope.userLocation']) {
|
|
|
- $modal.msg('授权后请重新打开此页面')
|
|
|
- // reject("用户未授权");
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
+};
|
|
|
+
|
|
|
+//获取当前时间
|
|
|
+function getNowTime() {
|
|
|
+ return new Date().toLocaleTimeString('en-US', {
|
|
|
+ hour12: false
|
|
|
+ }).substring(0, 8)
|
|
|
+}
|
|
|
+
|
|
|
+//判断时间是否在区间内
|
|
|
+function isTimeInRange(time, startTime, endTime) {
|
|
|
+ // 将时间字符串转换为Date对象
|
|
|
+ const timeObj = new Date('1970-01-01T' + time + 'Z');
|
|
|
+ const startObj = new Date('1970-01-01T' + startTime + 'Z');
|
|
|
+ const endObj = new Date('1970-01-01T' + endTime + 'Z');
|
|
|
+ // 比较时间
|
|
|
+ return timeObj >= startObj && timeObj <= endObj;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+// 地图配置信息
|
|
|
+// const mapKey = config.mapKey; // 地图API密钥
|
|
|
+const mapType = ref('tmap'); // 地图类型
|
|
|
+const address = ref(''); // 初始化地址
|
|
|
+
|
|
|
+// 打卡定位信息
|
|
|
+const longitude = ref(0); // 经度
|
|
|
+const latitude = ref(0); // 纬度
|
|
|
+
|
|
|
+// 标记信息
|
|
|
+const marker = reactive({
|
|
|
+ id: 1,
|
|
|
+ latitude: 25.958812,
|
|
|
+ longitude: 119.213036,
|
|
|
+ width: 50, // 标记宽度
|
|
|
+ height: 50, // 标记高度
|
|
|
+ title: '宇光同行' // 标记标题
|
|
|
+});
|
|
|
+
|
|
|
+// 获取当前定位经纬度
|
|
|
+function getlocation() {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ //判断用户是否打开位置权限
|
|
|
+ uni.getSetting({
|
|
|
+ success(res) {
|
|
|
+ // 如果用户未授权
|
|
|
+ if (!res.authSetting['scope.userLocation']) {
|
|
|
+ $modal.confirm('需要您授权获取地理位置信息').then(res => {
|
|
|
+ if (res) {
|
|
|
+ // 打开权限设置页面
|
|
|
+ uni.openSetting({
|
|
|
+ success: (settingData) => {
|
|
|
+ if (settingData.authSetting[
|
|
|
+ 'scope.userLocation']) {
|
|
|
+ $modal.msg('授权后请重新打开此页面')
|
|
|
+ // reject("用户未授权");
|
|
|
+ }
|
|
|
}
|
|
|
- })
|
|
|
- .catch(err => {
|
|
|
- //用户点击取消
|
|
|
- if (!err) {
|
|
|
- uni.showToast({
|
|
|
- title: '获取地理位置授权失败',
|
|
|
- icon: 'none',
|
|
|
- success: () => {
|
|
|
- // 返回上一页
|
|
|
- setTimeout(() => {
|
|
|
- $tab.navigateBack()
|
|
|
- }, 1000);
|
|
|
- }
|
|
|
- });
|
|
|
- // reject("用户未授权");
|
|
|
- }
|
|
|
- })
|
|
|
- } else {
|
|
|
- // 已授权,获取位置
|
|
|
- fetchLocation(resolve, reject);
|
|
|
- }
|
|
|
- },
|
|
|
- fail(err) {
|
|
|
- reject(err); // 拒绝 Promise
|
|
|
+ });
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .catch(err => {
|
|
|
+ //用户点击取消
|
|
|
+ if (!err) {
|
|
|
+ uni.showToast({
|
|
|
+ title: '获取地理位置授权失败',
|
|
|
+ icon: 'none',
|
|
|
+ success: () => {
|
|
|
+ // 返回上一页
|
|
|
+ setTimeout(() => {
|
|
|
+ $tab.navigateBack()
|
|
|
+ }, 1000);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // reject("用户未授权");
|
|
|
+ }
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ // 已授权,获取位置
|
|
|
+ fetchLocation(resolve, reject);
|
|
|
}
|
|
|
- });
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- // 封装获取位置的函数
|
|
|
- function fetchLocation(resolve, reject) {
|
|
|
- wx.getLocation({
|
|
|
- success: (res) => {
|
|
|
- longitude.value = res.longitude; // 保存经度
|
|
|
- latitude.value = res.latitude; // 保存纬度
|
|
|
- $modal.alert('坐标',longitude.value+','+latitude.value)
|
|
|
- resolve(); // 解析 Promise
|
|
|
},
|
|
|
- fail: (err) => {
|
|
|
- if (err.errMsg.includes("频繁调用")) {
|
|
|
- $modal.msg('请勿频繁调用');
|
|
|
- // reject("频繁调用错误");
|
|
|
- return;
|
|
|
- }
|
|
|
- console.log('getLocationErr', err);
|
|
|
+ fail(err) {
|
|
|
reject(err); // 拒绝 Promise
|
|
|
- },
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // 获取当前位置地址
|
|
|
- function getAddress() {
|
|
|
- // getlocation()
|
|
|
- // .then(() => {
|
|
|
- // tranLocationToAddress(); // 执行地址转换
|
|
|
- // })
|
|
|
- // .catch(err => {
|
|
|
- // console.error('获取地址失败', err);
|
|
|
- // });
|
|
|
- return new Promise((resolve, reject) => {
|
|
|
- getlocation()
|
|
|
- .then(res => {
|
|
|
- tranLocationToAddress(); // 执行地址转换
|
|
|
- resolve(res); // 地址获取成功
|
|
|
- })
|
|
|
- .catch(err => {
|
|
|
- // console.error('获取地址失败', err);
|
|
|
- reject(err); // 地址获取失败
|
|
|
- });
|
|
|
+ }
|
|
|
});
|
|
|
- }
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+// 封装获取位置的函数
|
|
|
+function fetchLocation(resolve, reject) {
|
|
|
+ wx.getLocation({
|
|
|
+ success: (res) => {
|
|
|
+ longitude.value = res.longitude; // 保存经度
|
|
|
+ latitude.value = res.latitude; // 保存纬度
|
|
|
+ resolve(); // 解析 Promise
|
|
|
+ },
|
|
|
+ fail: (err) => {
|
|
|
+ if (err.errMsg.includes("频繁调用")) {
|
|
|
+ $modal.msg('请勿频繁调用');
|
|
|
+ // reject("频繁调用错误");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ console.log('getLocationErr', err);
|
|
|
+ reject(err); // 拒绝 Promise
|
|
|
+ },
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+// 获取当前位置地址
|
|
|
+function getAddress() {
|
|
|
+ // getlocation()
|
|
|
+ // .then(() => {
|
|
|
+ // tranLocationToAddress(); // 执行地址转换
|
|
|
+ // })
|
|
|
+ // .catch(err => {
|
|
|
+ // console.error('获取地址失败', err);
|
|
|
+ // });
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ getlocation()
|
|
|
+ .then(res => {
|
|
|
+ tranLocationToAddress(); // 执行地址转换
|
|
|
+ resolve(res); // 地址获取成功
|
|
|
+ })
|
|
|
+ .catch(err => {
|
|
|
+ // console.error('获取地址失败', err);
|
|
|
+ reject(err); // 地址获取失败
|
|
|
+ });
|
|
|
+ });
|
|
|
+}
|
|
|
|
|
|
// 经纬度转地址
|
|
|
function tranLocationToAddress() {
|
|
|
@@ -367,198 +366,195 @@
|
|
|
}
|
|
|
|
|
|
|
|
|
- // 多边形区域设置
|
|
|
- const polygons = reactive([{
|
|
|
- points: [{
|
|
|
- latitude: 25.9591401,
|
|
|
- longitude: 119.21292356
|
|
|
- },
|
|
|
- {
|
|
|
- latitude: 25.95828592,
|
|
|
- longitude: 119.21261955
|
|
|
- },
|
|
|
- {
|
|
|
- latitude: 25.9576709,
|
|
|
- longitude: 119.21458294
|
|
|
- },
|
|
|
- {
|
|
|
- latitude: 25.95845106,
|
|
|
- longitude: 119.21486162
|
|
|
- },
|
|
|
- {
|
|
|
- latitude: 25.9591401,
|
|
|
- longitude: 119.21292356
|
|
|
- }
|
|
|
- ],
|
|
|
- strokeWidth: 1, // 边框宽度
|
|
|
- strokeColor: "#ff000066", // 边框颜色
|
|
|
- fillColor: "#ff000016", // 填充颜色
|
|
|
- }]);
|
|
|
-
|
|
|
- // 打卡
|
|
|
- function clockIn(attType) {
|
|
|
- // 发起打卡请求相关业务逻辑
|
|
|
- //判断是否已经打过卡
|
|
|
- if (isClockIn(attType)) {
|
|
|
- return;
|
|
|
- }
|
|
|
- var now = new Date();
|
|
|
- // 使用toISOString()获取一个ISO格式的字符串,然后替换T为空格,并去除最后的Z(表示UTC时间)
|
|
|
- var formatted = now.toISOString().replace('T', ' ').replace('Z', '');
|
|
|
- var localString = new Date(formatted + '-08:00').toISOString().replace('T', ' ').replace('Z', '');
|
|
|
- // console.log('nowtime',formatted,localString);
|
|
|
- const params = {
|
|
|
- user_name: thisUser.userName,
|
|
|
- user_id: thisUser.useId,
|
|
|
- kaoqin_type: attType,
|
|
|
- now_date: localString,
|
|
|
- longitude: longitude.value,
|
|
|
- latitude: latitude.value,
|
|
|
- address: address.value,
|
|
|
- unitId: thisUser.unitId
|
|
|
- };
|
|
|
- createAttendance(params).then(res => {
|
|
|
- // console.log('createAttendance',res);
|
|
|
- if ("success" == res.returnMsg) {
|
|
|
- uni.showToast({
|
|
|
- title: "打卡成功",
|
|
|
- icon: 'none'
|
|
|
- });
|
|
|
- getTodayAtt(); //更新今日考勤数据
|
|
|
- return true;
|
|
|
- } else {
|
|
|
- uni.showToast({
|
|
|
- title: "未在指定范围,打卡失败",
|
|
|
- icon: 'none'
|
|
|
- });
|
|
|
- return false;
|
|
|
- }
|
|
|
- })
|
|
|
- // const _polygons = polygons.map((polygon) => {
|
|
|
- // return polygon.points.map((i) => [
|
|
|
- // Number(i.longitude),
|
|
|
- // Number(i.latitude),
|
|
|
- // ]);
|
|
|
- // });
|
|
|
- // const _point = point([longitude.value, latitude.value]); // 用当前坐标创建点
|
|
|
- // const _polygon = polygon(_polygons); // 创建多边形
|
|
|
- // const f = booleanPointInPolygon(_point, _polygon); // 判断点是否在多边形内
|
|
|
+// 多边形区域设置
|
|
|
+const polygons = reactive([{
|
|
|
+ points: [{
|
|
|
+ latitude: 25.9591401,
|
|
|
+ longitude: 119.21292356
|
|
|
+ },
|
|
|
+ {
|
|
|
+ latitude: 25.95828592,
|
|
|
+ longitude: 119.21261955
|
|
|
+ },
|
|
|
+ {
|
|
|
+ latitude: 25.9576709,
|
|
|
+ longitude: 119.21458294
|
|
|
+ },
|
|
|
+ {
|
|
|
+ latitude: 25.95845106,
|
|
|
+ longitude: 119.21486162
|
|
|
+ },
|
|
|
+ {
|
|
|
+ latitude: 25.9591401,
|
|
|
+ longitude: 119.21292356
|
|
|
}
|
|
|
-
|
|
|
- //判断是否已经打卡
|
|
|
- function isClockIn(attType) {
|
|
|
- var attTypeData = '';
|
|
|
- switch (attType) {
|
|
|
- case 1:
|
|
|
- attTypeData = signInTime.value;
|
|
|
- break;
|
|
|
- case 2:
|
|
|
- break;
|
|
|
- }
|
|
|
- console.log('attTypeData', attTypeData);
|
|
|
- if ('' !== attTypeData) {
|
|
|
+ ],
|
|
|
+ strokeWidth: 1, // 边框宽度
|
|
|
+ strokeColor: "#ff000066", // 边框颜色
|
|
|
+ fillColor: "#ff000016", // 填充颜色
|
|
|
+}]);
|
|
|
+
|
|
|
+// 打卡
|
|
|
+function clockIn(attType) {
|
|
|
+ // 发起打卡请求相关业务逻辑
|
|
|
+ //判断是否已经打过卡
|
|
|
+ if (isClockIn(attType)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var now = new Date();
|
|
|
+ // 使用toISOString()获取一个ISO格式的字符串,然后替换T为空格,并去除最后的Z(表示UTC时间)
|
|
|
+ var formatted = now.toISOString().replace('T', ' ').replace('Z', '');
|
|
|
+ var localString = new Date(formatted + '-08:00').toISOString().replace('T', ' ').replace('Z', '');
|
|
|
+ // console.log('nowtime',formatted,localString);
|
|
|
+ const params = {
|
|
|
+ user_name: thisUser.userName,
|
|
|
+ user_id: thisUser.useId,
|
|
|
+ kaoqin_type: attType,
|
|
|
+ now_date: localString,
|
|
|
+ longitude: longitude.value,
|
|
|
+ latitude: latitude.value,
|
|
|
+ address: address.value,
|
|
|
+ unitId: thisUser.unitId
|
|
|
+ };
|
|
|
+ createAttendance(params).then(res => {
|
|
|
+ // console.log('createAttendance',res);
|
|
|
+ if ("success" == res.returnMsg) {
|
|
|
uni.showToast({
|
|
|
- title: "请勿重复打卡",
|
|
|
+ title: "打卡成功",
|
|
|
icon: 'none'
|
|
|
});
|
|
|
+ getTodayAtt(); //更新今日考勤数据
|
|
|
return true;
|
|
|
+ } else {
|
|
|
+ uni.showToast({
|
|
|
+ title: "未在指定范围,打卡失败",
|
|
|
+ icon: 'none'
|
|
|
+ });
|
|
|
+ return false;
|
|
|
}
|
|
|
+ })
|
|
|
+ // const _polygons = polygons.map((polygon) => {
|
|
|
+ // return polygon.points.map((i) => [
|
|
|
+ // Number(i.longitude),
|
|
|
+ // Number(i.latitude),
|
|
|
+ // ]);
|
|
|
+ // });
|
|
|
+ // const _point = point([longitude.value, latitude.value]); // 用当前坐标创建点
|
|
|
+ // const _polygon = polygon(_polygons); // 创建多边形
|
|
|
+ // const f = booleanPointInPolygon(_point, _polygon); // 判断点是否在多边形内
|
|
|
+}
|
|
|
+
|
|
|
+//判断是否已经打卡
|
|
|
+function isClockIn(attType) {
|
|
|
+ var attTypeData = '';
|
|
|
+ switch (attType) {
|
|
|
+ case 1:
|
|
|
+ attTypeData = signInTime.value;
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ console.log('attTypeData', attTypeData);
|
|
|
+ if ('' !== attTypeData) {
|
|
|
+ uni.showToast({
|
|
|
+ title: "请勿重复打卡",
|
|
|
+ icon: 'none'
|
|
|
+ });
|
|
|
+ return true;
|
|
|
+ }
|
|
|
return false;
|
|
|
}
|
|
|
</script>
|
|
|
|
|
|
<style>
|
|
|
- @import "@/static/font/ygoa/iconfont.css";
|
|
|
-
|
|
|
- .ygoa-icon {
|
|
|
- margin-right: 20rpx;
|
|
|
- font-size: 50rpx;
|
|
|
- }
|
|
|
-
|
|
|
- .container {
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- align-items: center;
|
|
|
- padding: 20rpx;
|
|
|
- }
|
|
|
-
|
|
|
- .header {
|
|
|
- width: 100%;
|
|
|
- height: 200rpx;
|
|
|
- background-color: #f8f8f8;
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- }
|
|
|
-
|
|
|
- .day {
|
|
|
- font-size: 24px;
|
|
|
- color: #333;
|
|
|
- /* font-weight: bold; */
|
|
|
- }
|
|
|
-
|
|
|
- .date {
|
|
|
- font-size: 16px;
|
|
|
- color: #666;
|
|
|
- }
|
|
|
-
|
|
|
- .nowTime {
|
|
|
- font-size: 16px;
|
|
|
- color: #666;
|
|
|
- }
|
|
|
-
|
|
|
- .record {
|
|
|
- width: 100%;
|
|
|
- margin-top: 20rpx;
|
|
|
- border-top: 1px solid #ddd;
|
|
|
- border-bottom: 1px solid #ddd;
|
|
|
- padding: 0 15rpx;
|
|
|
- }
|
|
|
-
|
|
|
- .record-item {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- height: 100rpx;
|
|
|
- border-bottom: 1px solid #eee;
|
|
|
- }
|
|
|
-
|
|
|
- .icon {
|
|
|
- width: 50rpx;
|
|
|
- height: 50rpx;
|
|
|
- margin-right: 10rpx;
|
|
|
- }
|
|
|
-
|
|
|
- .title {
|
|
|
- font-size: 28rpx;
|
|
|
- }
|
|
|
-
|
|
|
- .time {
|
|
|
- font-size: 24rpx;
|
|
|
- color: #999;
|
|
|
- margin-left: auto;
|
|
|
- }
|
|
|
-
|
|
|
- .signStatus {
|
|
|
- font-size: 24rpx;
|
|
|
- color: orange;
|
|
|
- /* margin-left: auto; */
|
|
|
- }
|
|
|
-
|
|
|
- .map {
|
|
|
- width: 100%;
|
|
|
- height: 500rpx;
|
|
|
- margin-top: 20rpx;
|
|
|
- }
|
|
|
-
|
|
|
- .footer {
|
|
|
- width: 100%;
|
|
|
- margin-top: 20rpx;
|
|
|
- display: flex;
|
|
|
- justify-content: space-around;
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
+@import "@/static/font/ygoa/iconfont.css";
|
|
|
+
|
|
|
+.ygoa-icon {
|
|
|
+ margin-right: 20rpx;
|
|
|
+ font-size: 50rpx;
|
|
|
+}
|
|
|
+
|
|
|
+.container {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ padding: 20rpx;
|
|
|
+}
|
|
|
+
|
|
|
+.header {
|
|
|
+ width: 100%;
|
|
|
+ height: 200rpx;
|
|
|
+ background-color: #f8f8f8;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+}
|
|
|
+
|
|
|
+.day {
|
|
|
+ font-size: 24px;
|
|
|
+ color: #333;
|
|
|
+ /* font-weight: bold; */
|
|
|
+}
|
|
|
+
|
|
|
+.date {
|
|
|
+ font-size: 16px;
|
|
|
+ color: #666;
|
|
|
+}
|
|
|
+
|
|
|
+.nowTime {
|
|
|
+ font-size: 16px;
|
|
|
+ color: #666;
|
|
|
+}
|
|
|
+
|
|
|
+.record {
|
|
|
+ width: 100%;
|
|
|
+ margin-top: 20rpx;
|
|
|
+ border-top: 1px solid #ddd;
|
|
|
+ border-bottom: 1px solid #ddd;
|
|
|
+ padding: 0 15rpx;
|
|
|
+}
|
|
|
+
|
|
|
+.record-item {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ height: 100rpx;
|
|
|
+ border-bottom: 1px solid #eee;
|
|
|
+}
|
|
|
+
|
|
|
+.icon {
|
|
|
+ width: 50rpx;
|
|
|
+ height: 50rpx;
|
|
|
+ margin-right: 10rpx;
|
|
|
+}
|
|
|
+
|
|
|
+.title {
|
|
|
+ font-size: 28rpx;
|
|
|
+}
|
|
|
+
|
|
|
+.time {
|
|
|
+ font-size: 24rpx;
|
|
|
+ color: #999;
|
|
|
+ margin-left: auto;
|
|
|
+}
|
|
|
+
|
|
|
+.signStatus {
|
|
|
+ font-size: 24rpx;
|
|
|
+ color: orange;
|
|
|
+ /* margin-left: auto; */
|
|
|
+}
|
|
|
+
|
|
|
+.map {
|
|
|
+ width: 100%;
|
|
|
+ height: 500rpx;
|
|
|
+ margin-top: 20rpx;
|
|
|
+}
|
|
|
+
|
|
|
+.footer {
|
|
|
+ width: 100%;
|
|
|
+ margin-top: 20rpx;
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-around; }
|
|
|
|
|
|
.footer button {
|
|
|
width: 100%;
|