hldy_app_mini/pages/NursingNew/index.vue

759 lines
22 KiB
Vue
Raw Normal View History

2025-11-05 15:59:48 +08:00
<template>
2026-01-26 13:19:11 +08:00
<view class="backgroundContainer" @touchmove.stop="getxy" @touchend.stop="cleanall">
<!-- 手指拖动 -->
2026-01-28 16:40:50 +08:00
<view class="box" :style="boxStyle" v-if="!whoisit">
2026-01-26 13:19:11 +08:00
<view class="title-time-blue">
<image class="blue-img" lazy-load src="/static/index/target.png" />
</view>
<image class="card-icon" :src="movelook.url" mode="aspectFill"></image>
2026-02-03 15:13:24 +08:00
<view class="card-text" style="margin-top: 0;" :style="movelook.title.length>6?{fontSize:`24rpx`}:{}">
2026-01-26 13:19:11 +08:00
{{ movelook.title }}
</view>
</view>
2026-01-28 16:40:50 +08:00
<view class="card-box" :style="boxStyle" v-if="whoisit">
<view class="title-time-blue-card">
<image class="blue-img" src="/static/index/bluetarget.png" />
</view>
2026-04-07 17:20:59 +08:00
<view class="card-bao" v-if="simpleobj.includesarray.length>1">
指令集合
2026-01-28 16:40:50 +08:00
</view>
<view class="title-time-border-hisOk">
<view class="title-time">
<view class="title-time-font-rel">
{{ splitString(simpleobj.directiveName)[0]}}
</view>
<view v-if="splitString(simpleobj.directiveName)[1]" class="title-time-font-tags">
({{ splitString(simpleobj.directiveName)[1]}})
</view>
<view class="card-time">
<view class="weight-time">
{{ simpleobj.startTime }}
<text style="margin: 0 3rpx;">
-
</text>
{{ simpleobj.endTime }}
</view>
</view>
</view>
</view>
2026-01-29 17:31:38 +08:00
</view>
2026-02-03 15:13:24 +08:00
<view class="delete-view" :style="isblue==`3`?{backgroundColor: `rgba(255, 239, 239, 0.8)`}:{}"
v-if="!startmoveit&&whoisit">
2026-02-02 14:42:43 +08:00
<image class="delete-img" :src="`/static/index/trash${isblue==`3`?`target`:``}.png`" />
2026-01-28 16:40:50 +08:00
</view>
2025-12-30 08:40:09 +08:00
<!-- 左侧菜单 -->
2026-01-09 16:25:02 +08:00
<leftcontent :list="arrlist" @navurl="navurl" :userInfo="userInfo"></leftcontent>
2025-11-05 15:59:48 +08:00
<!-- 主页 -->
2026-01-16 14:28:12 +08:00
<!-- <index :isShow="menuIndex==0" v-if="swipedex==0&&!specialPage" @swip="swip" @gospecial="gospecial" /> -->
2026-04-02 16:03:10 +08:00
<index :isShow="menuIndex=='jcgn_sy'" v-if="swipedex=='jcgn_sy'&&!specialPage" @swip="swip" @gospecial="gospecial" :kf="kf"/>
2026-01-16 14:28:12 +08:00
<!-- 新主页 -->
2026-01-26 13:19:11 +08:00
2026-04-02 14:37:12 +08:00
<!-- <bignurse :isshow="menuIndex==0"
v-if="swipedex==0&&specialPage==1&&uni.getStorageSync('elderId')&&uni.getStorageSync('nuId')" /> -->
2025-11-05 15:59:48 +08:00
<!-- 户嘱页 -->
2026-04-02 14:37:12 +08:00
<newnurse :isshow="menuIndex=='jcgn_fw'" v-if="swipedex=='jcgn_fw'" :canmove="startmoveit" :sendxy="targetrule" :isblue='isblue'
2026-02-06 17:24:51 +08:00
:howtomove="howtomove" :targetrule="targetrule" @handsend="handsend" @rulepush="rulepush"
@cleanall="cleanall" />
2025-12-16 16:54:29 +08:00
<!-- 医嘱 -->
2026-04-02 14:37:12 +08:00
<!-- <doctorask v-if="swipedex==2" /> -->
<!-- <logistics :isshow="menuIndex==3" v-if="swipedex==3" :canmove="startmoveit" :sendxy="targetrule"
2026-02-25 14:38:41 +08:00
:isblue='isblue' :howtomove="howtomove" :targetrule="targetrule" @handsend="handsend" @rulepush="rulepush"
2026-04-02 14:37:12 +08:00
@cleanall="cleanall" /> -->
2026-02-25 14:38:41 +08:00
<!-- <logistics :isshow="menuIndex==3"
v-if="swipedex==3&&uni.getStorageSync('elderId')&&uni.getStorageSync('nuId')" /> -->
2026-01-26 13:19:11 +08:00
2026-04-02 14:37:12 +08:00
<!-- <invoicing :isshow="menuIndex==6"
v-if="swipedex==6&&uni.getStorageSync('elderId')&&uni.getStorageSync('nuId')" /> -->
2026-01-05 09:29:43 +08:00
<!-- 医嘱页 -->
<!-- <logistics :isShow="menuIndexshowfourth" v-if="menuIndex==3" /> -->
2026-04-02 14:37:12 +08:00
<requestform :isShow="menuIndex=='jcgn_ql'" v-if="swipedex=='jcgn_ql'" />
2026-01-07 11:23:47 +08:00
<!-- 设备页 -->
2026-04-02 14:37:12 +08:00
<equipment :isShow="menuIndex=='jcgn_wisb'" v-if="swipedex=='jcgn_wisb'" />
2025-12-30 08:40:09 +08:00
<!-- 没有数据 -->
<view class="nomessageclass" :style="messageopit?{opacity: `1`}:{opacity: `0`}"
v-if="(menuIndex == 1 || menuIndex == 2) && (!uni.getStorageSync('elderId') ||!uni.getStorageSync('nuId'))">
<defaultr cont="暂无老人入住"></defaultr>
</view>
2026-04-02 14:37:12 +08:00
<material :isShow="menuIndex == 'jcgn_cg'" v-if="menuIndex == 'jcgn_cg'&&!specialPagedex" ref="materials"
@changepages="changeNumber"></material>
<materialcar v-if="menuIndex == 'jcgn_cg'&&specialPagedex==1" @gotoitem="specialPagedex=2"></materialcar>
<purchaseorder v-if="menuIndex == 1&&specialPagedex==2"></purchaseorder>
<picking :isShow="menuIndex == 'jcgn_jh'" v-if="menuIndex == 'jcgn_jh'"></picking>
<finish :isShow="menuIndex == 'jcgn_wj'" v-if="menuIndex == 'jcgn_wj'"></finish>
<outbound :isShow="menuIndex == 'jcgn_ql'" v-if="menuIndex == 'jcgn_ql'"></outbound>
<retstock :isShow="menuIndex == 'jcgn_qlrk'" v-if="menuIndex == 'jcgn_qlrk'"></retstock>
<inventory :isShow="menuIndex == 'jcgn_kcpd' " v-if="menuIndex == 'jcgn_kcpd'&& !specialPagedex" ref="inventorys"
@changepages="changepages"></inventory>
<addtory :isShow="menuIndex == 'jcgn_kcpd'" v-if="menuIndex == 'jcgn_kcpd'&&specialPagedex=='1'" :specialitem="specialitem">
</addtory>
2025-11-05 15:59:48 +08:00
</view>
</template>
<script setup lang="ts">
import { ref, onMounted, onBeforeUnmount, nextTick } from 'vue';
2026-04-02 16:03:10 +08:00
import { onLoad } from "@dcloudio/uni-app"
2026-01-26 13:19:11 +08:00
import { queryPadPageList, getPermissionList } from '@/pages/watch/api/lunpan.js'
2025-11-05 15:59:48 +08:00
import index from "./component/index.vue"
2026-01-16 14:28:12 +08:00
import newnurse from "./component/nurse/newindex.vue"
2025-11-05 15:59:48 +08:00
import equipment from "./component/equipment.vue"
2026-02-25 14:38:41 +08:00
import logistics from "./component/logistics/newindex.vue"
2026-01-07 16:06:12 +08:00
import invoicing from "./component/invoicing/index.vue"
2026-01-26 13:19:11 +08:00
2025-11-27 14:47:04 +08:00
import requestform from "./component/pleasetake/takehome.vue"
2025-12-16 16:54:29 +08:00
import doctorask from "./component/doctorask/doctorask.vue"
2026-01-09 16:23:18 +08:00
import bignurse from "./component/nurse/bigindex.vue"
2026-01-26 13:19:11 +08:00
import { onBackPress, onShow } from '@dcloudio/uni-app';
import { getNcPackagelist } from './component/nurse/api.js'
2025-12-25 13:27:31 +08:00
import leftcontent from "./component/leftcontent/leftcontent.vue"
2025-12-30 08:40:09 +08:00
import defaultr from '@/pages/procurement/components/default.vue';
2026-04-02 14:37:12 +08:00
import material from "@/pages/procurement/material.vue";
import materialcar from "@/pages/procurement/materialcar.vue";
import purchaseorder from "@/pages/procurement/purchaseorder.vue";
import picking from "@/pages/Warehouse/picking.vue";
import finish from "@/pages/Warehouse/finish.vue"
import outbound from "@/pages/procurement/outbound.vue";
import inventory from "@/pages/procurement/inventory.vue";
import addtory from "@/pages/procurement/addtory.vue";
import retstock from "@/pages/procurement/retstock.vue";
2026-01-09 16:23:18 +08:00
onBackPress(() => {
2026-01-26 13:19:11 +08:00
if (specialPage.value) {
2026-04-02 14:37:12 +08:00
specialPage.value = ''
2026-01-09 16:23:18 +08:00
return true; // 禁止返回手势返回
2026-01-26 13:19:11 +08:00
} else {
2026-01-09 16:23:18 +08:00
return false; // 禁止返回手势返回
}
2026-01-26 13:19:11 +08:00
2026-01-09 16:23:18 +08:00
})
2026-04-02 16:03:10 +08:00
const kf = ref('0')
onLoad((e)=>{
console.log(e)
kf.value = e.kf;
})
2026-01-05 09:29:43 +08:00
const listarr = ref([]);
2025-11-05 15:59:48 +08:00
onMounted(() => {
2026-04-02 14:37:12 +08:00
menuIndex.value = '';
swipedex.value = '';
2026-01-26 13:19:11 +08:00
2026-02-25 14:38:41 +08:00
getNcPackagelist(`1`).then((res : any) => {
2026-01-26 17:28:01 +08:00
//缓存指令包
2026-01-29 17:31:38 +08:00
// console.log("缓存指令包", res)
2026-01-26 17:28:01 +08:00
uni.setStorageSync("Packagelist", res.result)
})
2026-02-25 14:38:41 +08:00
getNcPackagelist(`2`).then((res : any) => {
//缓存指令包
// console.log("缓存指令包", res)
uni.setStorageSync("Packagelist2", res.result)
})
2026-04-02 14:37:12 +08:00
swip()
2025-11-05 15:59:48 +08:00
})
2026-04-02 14:37:12 +08:00
const changeNumber = (item : any) => {
specialPage.value = item
// specialitem.value = item
}
const specialitem = ref({})
const changepages = (item : any) => {
specialPagedex.value = 1
specialitem.value = item
}
const specialPagedex = ref(0)
const gospecial = (index) => {
specialPagedex.value = index
2026-01-09 16:23:18 +08:00
}
2026-02-06 17:24:51 +08:00
2025-11-05 15:59:48 +08:00
// 通用的生成函数
function genPaths(base, prefix, count, ext = 'png', startIndex = 0, pad = false) {
return Array.from({ length: count }, (_, i) => {
const idx = pad
? String(i + startIndex).padStart(2, '0')
: i + startIndex
return `${base}/${prefix}${idx}.${ext}`
})
}
2025-12-25 13:27:31 +08:00
const tabbrarr = ref([
2026-04-02 14:37:12 +08:00
{ name: '首页', url: '/static/shouye/sy/home0.png', urls: '/static/shouye/sy/home1.png', menuCode: 'jcgn_sy' },
{ name: '服务', url: '/static/shouye/sy/n0.png', urls: '/static/shouye/sy/n1.png', menuCode: 'jcgn_fw' },
{ name: '请领', url: '/static/shouye/sy/l0.png', urls: '/static/shouye/sy/l1.png', menuCode: 'jcgn_ql' },
{ name: '退货', url: '/static/shouye/sy/g0.png', urls: '/static/shouye/sy/g1.png', menuCode: 'jcgn_th' },
{ name: '物料', url: '/static/shouye/sy/g0.png', urls: '/static/shouye/sy/g1.png', menuCode: 'jcgn_wl' },
{ name: '采购', url: '/static/shouye/ck/c0.png', urls: '/static/shouye/ck/c1.png', menuCode: 'jcgn_cg' },
{ name: '拣货', url: '/static/shouye/ck/j0.png', urls: '/static/shouye/ck/j1.png', menuCode: 'jcgn_jh' },
{ name: '完结', url: '/static/shouye/ck/w0.png', urls: '/static/shouye/ck/w1.png', menuCode: 'jcgn_wj' },
{ name: '库存盘点', url: '/static/shouye/ck/p0.png', urls: '/static/shouye/ck/p1.png', menuCode: 'jcgn_kcpd' },
{ name: '请领出库', url: '/static/shouye/ck/q0.png', urls: '/static/shouye/ck/q1.png', menuCode: 'jcgn_qlck' },
{ name: '退货入库', url: '/static/shouye/ck/t0.png', urls: '/static/shouye/ck/t1.png', menuCode: 'jcgn_qlrk' },
{ name: '物联', url: '/static/shouye/sy/g0.png', urls: '/static/shouye/sy/g1.png', menuCode: 'jcgn_wisb' }
2025-12-25 13:27:31 +08:00
])
2026-04-02 14:37:12 +08:00
const specialPage = ref('')
2026-01-26 13:19:11 +08:00
const navurl = (e, v) => {
2026-04-02 14:37:12 +08:00
swipedex.value = '';
specialPage.value = ''
if(v.menuCode == "back"){
uni.navigateBack()
}else{
swipedex.value = v.menuCode;
setTimeout(() => {
menuIndex.value = v.menuCode;
}, 100)
2026-01-05 09:29:43 +08:00
}
2026-01-26 13:19:11 +08:00
2026-01-05 09:29:43 +08:00
}
2026-04-02 14:37:12 +08:00
const arrlist = ref([
{ name: '首页', url: '/static/shouye/sy/h0.png', urls: '/static/shouye/sy/h1.png', menuCode: 'jcgn_sy' },
2026-01-05 11:01:11 +08:00
])
2026-01-26 13:19:11 +08:00
const swip = () => {
2026-04-02 14:37:12 +08:00
getPermissionList({ employeesId: uni.getStorageSync('userInfo').employeesId }).then(res => {
listarr.value = res.result;
})
2026-01-07 11:23:47 +08:00
let nuId = uni.getStorageSync('nuId');
let arrs = [];
2026-01-26 13:19:11 +08:00
listarr.value.forEach(item => {
if (item.nuId == nuId) {
2026-01-07 11:23:47 +08:00
arrs = item.dataList
}
})
2026-01-05 09:29:43 +08:00
let nuName = uni.getStorageSync('nuName')
2026-04-02 14:37:12 +08:00
let arr = []
2026-01-26 13:19:11 +08:00
queryPadPageList({ 'pageNo': -1, 'nuName': nuName }).then((res => {
2026-04-02 14:37:12 +08:00
arr = res.result.records[0].permissionList;
arrlist.value = [
{ name: '首页', url: '/static/shouye/sy/h0.png', urls: '/static/shouye/sy/h1.png', menuCode: 'jcgn_sy' },
];
2026-04-07 17:20:59 +08:00
if(arr){
let result = getIntersection(arrs, arr);
let results = getIntersection( tabbrarr.value,result);
arrlist.value.push(...results);
}
2026-01-26 13:19:11 +08:00
let back = [
2026-04-02 14:37:12 +08:00
{ name: '返回', url: '/static/shouye/sy/f0.png', urls: '/static/shouye/sy/f1.png', menuCode: 'back' }
2026-01-05 09:29:43 +08:00
]
arrlist.value.push(...back);
2026-04-02 14:37:12 +08:00
navurl(0,arrlist.value[0])
2026-01-05 09:29:43 +08:00
}))
2025-12-25 13:27:31 +08:00
}
2026-04-02 14:37:12 +08:00
function getIntersection(arrA, arrB) {
const codeSet = new Set(arrB.map(item => item.menuCode));
return arrA.filter(item => codeSet.has(item.menuCode));
}
2025-11-05 15:59:48 +08:00
// 当前选中的菜单索引
2026-04-02 14:37:12 +08:00
const menuIndex = ref('jcgn_sy');
const swipedex = ref('jcgn_sy');
2025-11-05 15:59:48 +08:00
const menuIndexshow = ref<boolean>(false);
const menuIndexshowsecond = ref<boolean>(false);
2025-11-26 13:26:22 +08:00
const menuIndexshowfourth = ref<boolean>(false);
2025-11-05 15:59:48 +08:00
const menuIndexshowfifth = ref<boolean>(false);
2025-12-30 08:40:09 +08:00
const messageopit = ref<boolean>(false);
2025-11-05 15:59:48 +08:00
// 变更菜单
2026-04-02 14:37:12 +08:00
const changeMenu = (index) => {
2025-12-30 08:40:09 +08:00
if (index === menuIndex.value) {
return
}
2025-11-05 15:59:48 +08:00
menuIndex.value = index;
2026-04-02 14:37:12 +08:00
setTimeout(()=>{
swipedex.value = index;
},50)
2025-11-05 15:59:48 +08:00
};
const clientX = ref(0);
const clientY = ref(0);
const savename = ref("")
2026-01-26 13:19:11 +08:00
2025-11-05 15:59:48 +08:00
// 生命周期钩子
onMounted(() => {
//首次加载和跳转回来需要重新做个动画
setTimeout(() => {
changeMenu(menuIndex.value)
}, 50)
menuIndexshow.value = false
setTimeout(() => {
menuIndexshow.value = true
}, 50)
});
2025-12-30 08:40:09 +08:00
const nomesssageshow = () => {
messageopit.value = false;
setTimeout(() => {
messageopit.value = true;
}, 200)
}
2026-01-09 16:25:02 +08:00
const userInfo = ref({})
2026-01-26 13:19:11 +08:00
onShow(() => {
2026-01-09 16:25:02 +08:00
userInfo.value = uni.getStorageSync('userInfo');
})
2026-01-26 13:19:11 +08:00
const box = ref(null);
const boxStyle = ref({
transform: 'translate3d(-500px, -500px, 0px)',
});
function handmove(wh : number[]) {
// 直接更新 transform父组件可频繁调用
const nx = Number(wh[0]) || 0;
const ny = Number(wh[1]) || 0;
// console.log("----", nx, ny)
2026-01-29 17:31:38 +08:00
if (whoisit.value) {
boxStyle.value = {
transform: `translate3d(${nx - 70}px, ${ny - 60}px, 0)`
};
} else {
boxStyle.value = {
transform: `translate3d(${nx - 100}px, ${ny - 70}px, 0)`
};
2026-01-30 17:24:22 +08:00
2026-01-29 17:31:38 +08:00
}
2026-01-26 13:19:11 +08:00
}
const movelook = ref({
url: "",
2026-01-30 17:24:22 +08:00
title: "",
2026-04-02 14:37:12 +08:00
menuCode: 0
2026-01-26 13:19:11 +08:00
})
const startmoveit = ref(true)
2026-01-28 16:40:50 +08:00
const whoisit = ref(0);
const simpleobj = ref({
startTime: "",
endTime: "",
directiveName: "",
2026-04-07 17:20:59 +08:00
includesarray: [],
2026-01-28 16:40:50 +08:00
})
2026-01-26 13:19:11 +08:00
function handsend(look : any) {
2026-01-29 17:31:38 +08:00
isblue.value = 0;
2026-02-02 14:42:43 +08:00
// console.log("look",look)
2026-01-28 16:40:50 +08:00
if (look.levle) {
whoisit.value = 0;
2026-02-25 14:38:41 +08:00
2026-01-28 16:40:50 +08:00
movelook.value.url = uni.getStorageSync('imagebase') + look.immediateFileFocus;
2026-02-12 16:14:54 +08:00
if (!look.immediateFileFocus) {
movelook.value.url = `/static/logotarget.png`
2026-01-28 16:40:50 +08:00
}
2026-02-12 16:14:54 +08:00
// console.log("咋没了",movelook.value.url)
2026-01-28 16:40:50 +08:00
movelook.value.title = look.title;
2026-04-02 14:37:12 +08:00
movelook.value.menuCode = 0;
2026-01-28 16:40:50 +08:00
startmoveit.value = false
2026-02-03 15:13:24 +08:00
} else if (look.packageName) {
2026-01-30 17:24:22 +08:00
whoisit.value = 0;
movelook.value.url = `/static/index/packtarget.png`
movelook.value.title = look.packageName;
2026-04-02 14:37:12 +08:00
movelook.value.menuCode = 1;
2026-01-30 17:24:22 +08:00
startmoveit.value = false
}
2026-02-03 15:13:24 +08:00
2026-01-30 17:24:22 +08:00
else {
2026-04-07 17:20:59 +08:00
console.log(look)
2026-01-28 16:40:50 +08:00
whoisit.value = 1;
2026-04-07 17:20:59 +08:00
simpleobj.value.startTime = look.startTime?look.startTime.slice(11, 16):'';
simpleobj.value.endTime = look.endTime?look.endTime.slice(11, 16):'';
2026-01-28 16:40:50 +08:00
simpleobj.value.directiveName = look.directiveName;
2026-04-07 17:20:59 +08:00
simpleobj.value.includesarray = look.includesarray;
2026-01-28 16:40:50 +08:00
startmoveit.value = false
2026-01-26 13:19:11 +08:00
}
}
//节流函数
function throttle(fn, delay) {
let lastExecutionTime = 0;
return function (...args) {
const now = Date.now();
if (now - lastExecutionTime >= delay) {
lastExecutionTime = now;
fn.apply(this, args);
}
};
}
const canTrigger = ref(true);
//全局获得x轴和y轴
const animation = uni.createAnimation({
duration: 0,
timingFunction: 'linear',
delay: 0
});
const animationData = ref({});
let ticking = false;
let handle = null;
2026-01-28 16:40:50 +08:00
const sendxy = ref([0, 0])
const isblue = ref(0)
2026-01-26 13:19:11 +08:00
const getxyrel = (event) => {
event.preventDefault()
2026-01-30 17:24:22 +08:00
// console.log("////",)
2026-01-28 16:40:50 +08:00
if (!startmoveit.value) {
2026-01-26 13:19:11 +08:00
const touch = event.touches[0];
const a = touch.clientX.toFixed(2);
const b = touch.clientY.toFixed(2);
2026-01-28 16:40:50 +08:00
isblue.value = inArea(a, b)
// console.log(a, b)
handmove([a, b])
2026-01-30 17:24:22 +08:00
if (whoisit.value) {
detectorMove(a, b); // ← 替换原来的 handmove([a,b])
}
2026-01-26 13:19:11 +08:00
}
}
2026-01-29 17:31:38 +08:00
const rules = ref([])
2026-01-28 16:40:50 +08:00
const rulepush = (array : any) => {
2026-01-29 17:31:38 +08:00
targetrule.value = [-1, -1]
2026-01-28 16:40:50 +08:00
rules.value = array
}
2026-01-29 17:31:38 +08:00
const targetrule = ref([-1, -1])
2026-01-26 13:19:11 +08:00
function inArea(x, y) {
2026-01-28 16:40:50 +08:00
if (!whoisit.value) {
2026-02-25 14:38:41 +08:00
if(menuIndex.value===3){
if (x >= 790 &&
x <= 1062 &&
y >= 37 &&
y <= 255) {
return 1
} else {
return 0
}
}else{
if (x >= 790 &&
x <= 1062 &&
y >= 147 &&
y <= 255) {
return 1
} else {
return 0
}
2026-01-28 16:40:50 +08:00
}
2026-02-25 14:38:41 +08:00
2026-01-29 17:31:38 +08:00
} else {
// console.log("000",x)
2026-01-30 17:24:22 +08:00
if (x > 1000) {
2026-01-29 17:31:38 +08:00
return 3
}
2026-01-30 17:24:22 +08:00
2026-01-28 16:40:50 +08:00
for (let i = rules.value.length - 1; i >= 0; i--) {
2026-01-29 17:31:38 +08:00
const it = rules.value[i]
if (x >= it.left && x <= it.right && y >= it.top && y <= it.bottom) {
const raw0 = it.dataset?.index0
const raw1 = it.dataset?.index1
const n0 = raw0 === undefined ? NaN : Number(raw0)
const n1 = raw1 === undefined ? NaN : Number(raw1)
if (!isNaN(n0) && !isNaN(n1)) {
if (n0 != targetrule.value[0] || n1 != targetrule.value[1]) {
targetrule.value = [n0, n1]
}
return 2
2026-01-28 16:40:50 +08:00
}
}
}
2026-01-29 17:31:38 +08:00
// 没找到匹配项,设为 [-1, -1] 并返回 0
if (targetrule.value[0] !== -1 || targetrule.value[1] !== -1) {
targetrule.value = [-1, -1]
}
return 2
2026-01-28 16:40:50 +08:00
}
2026-01-26 13:19:11 +08:00
}
const getxy = throttle(getxyrel, 40);
const cleanall = (event) => {
2026-02-03 15:13:24 +08:00
// setTimeout(()=>{
if (whoisit.value) {
detectorEnd(); // ← 替换原来的 handmove([a,b])
}
handmove([-200, -200])
startmoveit.value = true;
// },100)
2026-01-28 16:40:50 +08:00
}
// 切割bigArray
function splitString(str) {
// 使用正则表达式找到所有括号的内容
let result = [];
let remainingStr = str;
// 正则匹配最外层括号(支持全角和半角)
let regex = /([^(]*)[(]([^)]+)[)]/;
while (regex.test(remainingStr)) {
let match = remainingStr.match(regex);
if (match) {
// 添加括号前的部分(去掉空白)
if (match[1].trim()) {
result.push(match[1].trim());
}
// 添加括号内的内容
if (match[2].trim()) {
result.push(match[2].trim());
}
// 更新剩余的字符串
remainingStr = remainingStr.replace(match[0], '').trim();
}
}
// 如果最后还有剩余部分,也加入结果
if (remainingStr.trim()) {
result.push(remainingStr.trim());
}
return result;
2026-01-26 13:19:11 +08:00
}
2026-01-30 17:24:22 +08:00
// ---------- 配置 ----------
const HOLD_MS = 350; // 0.5s 窗口
const RESET_MS = 100; // 0.1s 占位
// 判断方向(返回 [-1/0/1, -1/0/1]x方向, y方向
function getDir(x, y) {
2026-02-03 15:13:24 +08:00
const dx = (x <= 150 ? -1 : (x >= 710 && x < 825 ? 1 : 0));
2026-01-30 17:24:22 +08:00
const dy = (y <= 80 ? -1 : (y >= 550 ? 1 : 0));
return [dx, dy];
}
2026-02-03 15:13:24 +08:00
const howtomove = ref([2, 2])
2026-01-30 17:24:22 +08:00
// ---------- 状态 ----------
let windowTimer = null; // 500ms 的计时器 id
let windowStartDir = null; // 初始方向数组 [dx,dy]
let windowValid = false; // 在窗口期间是否一直保持初始方向
let inCooldown = false; // 触发后 0.1s 的占位期间,忽略新窗口
// 触发回调(你可以改成发事件或改成 setState
function onDetected(arr) {
howtomove.value = arr
// console.log('DETECT ->', arr); // 例如 [1,1] 或 [-1,-1] 或 [2,2]
// 在这里把 arr 发给你的业务:比如更新某个 ref / 调用方法等
}
// 窗口到期时处理
function finishWindow() {
windowTimer = null;
// 如果窗口期间一直有效 且 方向不是 [0,0]
if (windowValid && windowStartDir && (windowStartDir[0] !== 0 || windowStartDir[1] !== 0)) {
onDetected(windowStartDir.slice()); // 立即返回方向
inCooldown = true;
// 0.1s 后返回占位 [2,2],并结束 cooldown
setTimeout(() => {
onDetected([2, 2]);
inCooldown = false;
}, RESET_MS);
}
// 清理窗口状态(等待下一次 move 启动新窗口)
windowStartDir = null;
windowValid = false;
}
// 在 touchmove/getxyrel 中调用:传入数字 x,y
function detectorMove(x, y) {
if (inCooldown) return; // 占位期间忽略输入
const dir = getDir(x, y); // [dx,dy]
if (!windowTimer) {
// 没有在计时:开启一个新窗口
windowStartDir = dir.slice ? dir.slice() : [dir[0], dir[1]];
windowValid = true;
windowTimer = setTimeout(finishWindow, HOLD_MS);
return;
}
// 已在窗口中:只要方向与初始方向不同就把窗口标为无效
if (dir[0] !== windowStartDir[0] || dir[1] !== windowStartDir[1]) {
windowValid = false;
}
}
// 在 touchend / touchcancel 时调用,清理所有状态
function detectorEnd() {
if (windowTimer) {
clearTimeout(windowTimer);
windowTimer = null;
}
windowStartDir = null;
windowValid = false;
inCooldown = false;
}
2025-11-05 15:59:48 +08:00
</script>
<style lang="less" scoped>
.backgroundContainer {
display: flex;
position: relative;
2026-01-26 13:19:11 +08:00
width: 100vw;
2025-11-05 15:59:48 +08:00
height: 100vh;
overflow: hidden;
2026-01-30 17:24:22 +08:00
z-index: 9999;
2026-01-29 17:30:42 +08:00
background-color: #f4f4f4;
2025-11-05 15:59:48 +08:00
}
2025-12-30 08:40:09 +08:00
.nomessageclass {
width: 100vw;
transition: opacity 1s ease;
}
2026-01-26 13:19:11 +08:00
.box {
position: fixed;
left: 0;
top: 0;
width: 190rpx;
height: 140rpx;
border-radius: 20rpx;
background: #fff;
will-change: transform;
pointer-events: none;
z-index: 200;
border: 2rpx dashed #0089FE;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
.card-icon {
width: 55rpx;
height: 55rpx;
/* margin-bottom: 10rpx; */
}
.card-text {
margin-top: -10rpx;
color: #0089FE;
font-size: 26rpx;
}
.title-time-blue {
/* 你的定位与尺寸保持不变 */
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 107%;
height: 105%;
z-index: 10;
.blue-img {
width: 100%;
height: 100%;
}
}
}
2026-01-28 16:40:50 +08:00
.card-box {
position: fixed;
left: 0;
top: 0;
width: 259rpx;
height: 245rpx;
border-radius: 20rpx;
background: #fff;
will-change: transform;
pointer-events: none;
z-index: 200;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
.title-time-blue-card {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 98%;
height: 98%;
z-index: 10;
.blue-img {
width: 100%;
height: 100%;
}
}
.card-bao {
position: absolute;
left: 35rpx;
top: 110rpx;
height: 32rpx;
font-size: 24rpx;
display: flex;
justify-content: center;
align-items: center;
background-color: #4690FF;
color: #fff;
border-radius: 5rpx;
2026-04-07 17:20:59 +08:00
white-space: nowrap;
padding: 5rpx;
overflow: hidden;
white-space: nowrap;
2026-01-28 16:40:50 +08:00
}
.title-time-border-hisOk {
border: 2rpx solid #D4E4FE;
width: calc(100% - 15rpx);
height: calc(100% - 15rpx);
border-radius: 20rpx;
display: flex;
align-items: center;
background-color: #F6F9FF;
flex-direction: column;
font-size: 30rpx;
overflow: hidden;
border: 2rpx solid #46B2F6;
.title-time {
display: flex;
width: 100%;
position: relative;
height: 100%;
padding: 25rpx;
padding-top: 18rpx;
flex-direction: column;
.title-time-font-rel {
margin-top: 9rpx;
font-size: 33rpx;
font-weight: 800;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: black;
}
.title-time-font-tags {
font-size: 24rpx;
font-weight: 600;
/* margin-bottom: 5rpx; */
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: #999;
}
.card-time {
position: absolute;
bottom: 30rpx;
left: 30rpx;
font-size: 30rpx;
.weight-time {
display: flex;
}
}
}
}
}
2026-01-30 17:24:22 +08:00
.delete-view {
2026-01-29 17:31:38 +08:00
position: fixed;
right: -950rpx;
top: 3%;
width: 1100rpx;
height: 1100rpx;
border-radius: 50%;
2026-01-30 17:24:22 +08:00
background-color: rgba(238, 240, 248, 0.4);
2026-02-02 14:42:43 +08:00
z-index: 150;
2026-01-30 17:24:22 +08:00
.delete-img {
2026-01-29 17:31:38 +08:00
position: absolute;
top: 50%;
transform: translateY(-50%);
left: 50rpx;
width: 60rpx;
height: 65rpx;
}
}
2025-11-05 15:59:48 +08:00
</style>