Commit 18b0b11d by zhonghao

无人值守屏保

parent 8c76f0c0
This source diff could not be displayed because it is too large. You can view the blob instead.
import AsyncStorage from '@react-native-community/async-storage';
import * as api from '../services/store';
export default {
namespace: 'store',
state: {
auth: {},
socket: '',
ai: {
temperature: 0,
humidity: 0,
shock: 0,
trigger: {
text: 0,
data: 0,
},
offset: 0,
},
},
reducers: {
initScaleData(state) {
state.ai = {
...state.ai,
shock: 0,
trigger: {
text: 0,
data: 0,
},
offset: 0,
};
return {...state};
},
setAuth(state, {id, auth}) {
state.id = id;
state.auth = auth;
window.auth = auth;
if (window.socket) {
window.socket.io.opts.query = {
token: auth.token,
};
}
return {...state};
},
setScaleData(state, {data}) {
state.ai = data;
return {...state};
},
setSocket(state, {socket}) {
state.socket = socket;
return {...state};
},
},
effects: {
*auth(action, {put, call}) {
const {data} = action.key
? yield call(api.token, action)
: yield call(api.refreshToken);
if (data && data.code === 1) {
let set = [];
if (action.key) {
set = [
['KEY', action.key],
['SECRET', action.secret],
['DEVICE', action.device],
];
}
if (action.host) {
set.push(['HOST', action.host]);
}
if (data.data && data.data.contact) {
set.push(['CONTACT', data.data.contact]);
}
set.push(['auth', JSON.stringify(data.data)]);
yield call(AsyncStorage.multiSet, set);
// 缓存数据到内存,方便调用
const getValues = () =>
AsyncStorage.multiGet(['HOST', 'KEY', 'DEVICE', 'CONTACT']);
const values = yield call(getValues);
window.deviceInfo = {};
values.map(r => {
const k = r[0];
const v = r[1];
if (k && v) {
window.deviceInfo[k.toLowerCase()] = v;
}
});
yield put({type: 'setAuth', id: data.id, auth: data.data});
yield put({type: 'region'});
}
return data;
},
*logout(action, {put, call}) {
yield call(AsyncStorage.removeItem, 'auth');
yield put({type: 'app/replace', route: 'home'});
},
*version(action, {call}) {
yield call(api.version);
},
*region(action, {call}) {
const {data} = yield call(api.region);
if (data.code === 1) {
window.region = data.data;
window.regionArr = [];
['citycode', 'adcode', 'towncode'].map(k => {
const v = window.region[k];
if (v) {
window.regionArr.push(v);
}
});
window.regionArr.push(window.region.key);
window.regionArr = window.regionArr.reverse();
}
},
*door(action, {call}) {
const {data} = yield call(api.door, action);
if (data.code === 1) {
return data.data;
}
},
*wxdoor(action, {call}) {
const {data} = yield call(api.wxdoor, action);
if (data.code === 1) {
return data.data;
}
},
*scaleData(action, {put, call, select}) {
let {data} = yield call(api.scaleData);
if (data.code === 1 && data.data) {
let trigger = yield select(state => state.store.ai.trigger);
const dataTran = tranAIData(data.data, trigger);
yield put({type: 'setScaleData', data: dataTran});
return data.data;
}
},
*sendsms(action, {call}) {
const {data} = yield call(api.sendsms, action);
return data;
},
*verifysms(action, {call}) {
const {data} = yield call(api.verifysms, action);
return data;
},
*getAdvertising(action, {call}) {
return yield call(api.getAdvertising, action);
},
*getStore(action, {call}) {
return yield call(api.getStore, action);
},
*findModuleSetting(action, {call}) {
return yield call(api.findModuleSetting, action);
},
},
};
const randomData = Math.random();
let tranAIData = (data, trigger) => {
let aiData = {
shock: 0,
trigger: {
text: 0,
data: 0,
},
offset: 0,
};
let max = 0;
let min = 500000;
let sum = 0;
data.weights.map(v => {
if (v > max) {
max = v;
}
if (v < min) {
min = v;
}
sum += v;
});
let ave = sum / 10;
if (max - min >= 600) {
aiData.shock = (100 + Math.random() * 80) * (ave / 75000);
} else {
aiData.shock = ((max - min) / 4) * (ave / 75000);
}
if (data.stableWeight && data.stableWeight > 0) {
aiData.trigger.data = 96;
aiData.trigger.text = data.stableWeight;
} else {
aiData.trigger.data = trigger.data + Math.random() * 30;
aiData.trigger.text = ave;
}
if (data.stableWeight && data.stableWeight > 0) {
aiData.offset = randomData * 30;
} else if (max - ave > 30 && ave - min > 30) {
aiData.offset = 30 + Math.random() * 30;
} else {
aiData.offset = max - ave > ave - min ? ave - min : max - ave;
}
if (
!data.weights ||
(Number(data.weights[0]) === 0 &&
Number(data.weights[data.weights.length - 1]) === 0)
) {
aiData = {
shock: 0,
trigger: {
text: 0,
data: 0,
},
offset: 0,
};
}
return {temperature: data.temperature, humidity: data.humidity, ...aiData};
};
import AsyncStorage from '@react-native-community/async-storage';
import * as api from '../services/store';
export default {
namespace: 'store',
state: {
auth: {},
socket: '',
ai: {
temperature: 0,
humidity: 0,
shock: 0,
trigger: {
text: 0,
data: 0,
},
offset: 0,
},
},
reducers: {
initScaleData(state) {
state.ai = {
...state.ai,
shock: 0,
trigger: {
text: 0,
data: 0,
},
offset: 0,
};
return {...state};
},
setAuth(state, {id, auth}) {
state.id = id;
state.auth = auth;
window.auth = auth;
if (window.socket) {
window.socket.io.opts.query = {
token: auth.token,
};
}
return {...state};
},
setScaleData(state, {data}) {
state.ai = data;
return {...state};
},
setSocket(state, {socket}) {
state.socket = socket;
return {...state};
},
},
effects: {
*auth(action, {put, call}) {
const {data} = action.key
? yield call(api.token, action)
: yield call(api.refreshToken);
if (data && data.code === 1) {
let set = [];
if (action.key) {
set = [
['KEY', action.key],
['SECRET', action.secret],
['DEVICE', action.device],
];
}
if (action.host) {
set.push(['HOST', action.host]);
}
if (data.data && data.data.contact) {
set.push(['CONTACT', data.data.contact]);
}
set.push(['auth', JSON.stringify(data.data)]);
yield call(AsyncStorage.multiSet, set);
// 缓存数据到内存,方便调用
const getValues = () =>
AsyncStorage.multiGet(['HOST', 'KEY', 'DEVICE', 'CONTACT']);
const values = yield call(getValues);
window.deviceInfo = {};
values.map(r => {
const k = r[0];
const v = r[1];
if (k && v) {
window.deviceInfo[k.toLowerCase()] = v;
}
});
yield put({type: 'setAuth', id: data.id, auth: data.data});
yield put({type: 'region'});
}
return data;
},
*logout(action, {put, call}) {
yield call(AsyncStorage.removeItem, 'auth');
yield put({type: 'app/replace', route: 'home'});
},
*version(action, {call}) {
yield call(api.version);
},
*region(action, {call}) {
const {data} = yield call(api.region);
if (data.code === 1) {
window.region = data.data;
window.regionArr = [];
['citycode', 'adcode', 'towncode'].map(k => {
const v = window.region[k];
if (v) {
window.regionArr.push(v);
}
});
window.regionArr.push(window.region.key);
window.regionArr = window.regionArr.reverse();
}
},
*door(action, {call}) {
const {data} = yield call(api.door, action);
if (data.code === 1) {
return data.data;
}
},
*wxdoor(action, {call}) {
const {data} = yield call(api.wxdoor, action);
if (data.code === 1) {
return data.data;
}
},
*scaleData(action, {put, call, select}) {
let {data} = yield call(api.scaleData);
if (data.code === 1 && data.data) {
let trigger = yield select(state => state.store.ai.trigger);
const dataTran = tranAIData(data.data, trigger);
yield put({type: 'setScaleData', data: dataTran});
return data.data;
}
},
*sendsms(action, {call}) {
const {data} = yield call(api.sendsms, action);
return data;
},
*verifysms(action, {call}) {
const {data} = yield call(api.verifysms, action);
return data;
},
*getAdvertising(action, {call}) {
return yield call(api.getAdvertising, action);
},
*getStore(action, {call}) {
return yield call(api.getStore, action);
},
*findModuleSetting(action, {call}) {
return yield call(api.findModuleSetting, action);
},
*noBuyGoGoGo(action, {call}) {
return yield call(api.noBuyGoGoGo, action);
},
},
};
const randomData = Math.random();
let tranAIData = (data, trigger) => {
let aiData = {
shock: 0,
trigger: {
text: 0,
data: 0,
},
offset: 0,
};
let max = 0;
let min = 500000;
let sum = 0;
data.weights.map(v => {
if (v > max) {
max = v;
}
if (v < min) {
min = v;
}
sum += v;
});
let ave = sum / 10;
if (max - min >= 600) {
aiData.shock = (100 + Math.random() * 80) * (ave / 75000);
} else {
aiData.shock = ((max - min) / 4) * (ave / 75000);
}
if (data.stableWeight && data.stableWeight > 0) {
aiData.trigger.data = 96;
aiData.trigger.text = data.stableWeight;
} else {
aiData.trigger.data = trigger.data + Math.random() * 30;
aiData.trigger.text = ave;
}
if (data.stableWeight && data.stableWeight > 0) {
aiData.offset = randomData * 30;
} else if (max - ave > 30 && ave - min > 30) {
aiData.offset = 30 + Math.random() * 30;
} else {
aiData.offset = max - ave > ave - min ? ave - min : max - ave;
}
if (
!data.weights ||
(Number(data.weights[0]) === 0 &&
Number(data.weights[data.weights.length - 1]) === 0)
) {
aiData = {
shock: 0,
trigger: {
text: 0,
data: 0,
},
offset: 0,
};
}
return {temperature: data.temperature, humidity: data.humidity, ...aiData};
};
......@@ -13,10 +13,17 @@ import Touch from '../components/Touch';
import counterText from '../assets/Vertical/counterText.png';
import img24h from '../assets/Vertical/24h.png';
import phone from '../assets/Vertical/phone.png';
import guide from '../assets/Vertical/guide.jpg';
import {login} from '../utils/config';
import {colors} from '../utils/common';
import WxFacepay from '../utils/WxFacepay';
import {width, setSpText, scaleSize, scaleHeight} from '../utils/screen';
import {
width,
setSpText,
scaleSize,
scaleHeight,
// height,
} from '../utils/screen';
import Speech from '../utils/Speech';
import delay from '../utils/delay';
import Printer from '../utils/Printer';
......@@ -354,6 +361,11 @@ class VerticalPage extends Component {
});
};
onNoBuy = async () => {
const {data} = await this.props.dispatch({type: 'store/noBuyGoGoGo'});
Speech.speak(data.msg);
};
closeHint = () => {
this.setState({
hintVisible: false,
......@@ -533,7 +545,14 @@ class VerticalPage extends Component {
imgArr,
adType,
} = this.props;
let {contact, hintVisible, logoVisible, logo, priceVisible} = this.state;
let {
contact,
hintVisible,
logoVisible,
logo,
priceVisible,
dtype,
} = this.state;
pageSize =
goods && goods.bags.length > 0
? goods && goods.bags.length > 3
......@@ -573,6 +592,25 @@ class VerticalPage extends Component {
this.state.faceType === 'wxpay' ? this.wxFacepay : this.smilepay;
return (
<View style={styles.main}>
{goodsArr.length === 0 && dtype === 'guard' ? (
<View style={styles.guardModal}>
<View style={styles.guardModal_image}>
<Image source={guide} />
</View>
<View style={styles.guardModal_button}>
<Touch onPress={() => this.onCall()}>
<View style={styles.guardModal_button_call}>
<Text style={styles.callText}>呼叫客服</Text>
</View>
</Touch>
<Touch onPress={() => this.onNoBuy()}>
<View style={styles.guardModal_button_nobuy}>
<Text style={styles.callText}>无购物出店</Text>
</View>
</Touch>
</View>
</View>
) : null}
<HintPhone
visible={hintVisible}
contact={contact}
......@@ -1093,6 +1131,7 @@ const styles = {
main: {
backgroundColor: '#F0F0F0',
height: '100%',
position: 'relative',
},
header: {
flexDirection: 'row',
......@@ -1551,6 +1590,58 @@ const styles = {
marginRight: '5%',
marginBottom: '2.5%',
},
guardModal: {
position: 'absolute',
top: 0,
left: 0,
zIndex: 999999999999999,
elevation: 6,
display: 'flex',
width: '100%',
height: '100%',
backgroundColor: '#000000',
},
guardModal_image: {
height: '70%',
width: '100%',
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
},
guardModal_button: {
height: '30%',
width: '100%',
display: 'flex',
flexDirection: 'row',
justifyContent: 'center',
alignItems: 'center',
},
guardModal_button_call: {
backgroundColor: '#fc4000',
borderRadius: 100,
color: '#ffffff',
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
width: scaleSize(350),
height: scaleSize(125),
fontSize: scaleSize(75),
marginRight: 50,
},
guardModal_button_nobuy: {
borderWidth: 5,
borderColor: '#ffffff',
borderRadius: 100,
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
width: scaleSize(350),
height: scaleSize(125),
},
callText: {
fontSize: scaleSize(45),
color: '#ffffff',
},
};
export default CounterMixins(VerticalPage);
import qs from 'qs';
import axios from 'axios';
import AsyncStorage from '@react-native-community/async-storage';
const pack = require('../../package.json');
export function token({host = '', key, secret, device}) {
return axios.post(`${host}/store/auth`, qs.stringify({key, secret, device}));
}
export async function refreshToken() {
const auth = await AsyncStorage.getItem('auth');
if (auth) {
try {
const {refresh_token} = JSON.parse(auth);
return await axios.get('/auth/refresh', {
headers: {Authorization: `Bearer ${refresh_token}`},
});
} catch (e) {
return {data: null};
}
}
return {data: null};
}
export function version() {
return axios.put('/store/version', qs.stringify({version: pack.version}));
}
export function region() {
return axios.get('/store/region');
}
export function door({userId}) {
return axios.post('/store/door', qs.stringify({userId}));
}
export function wxdoor({
userId,
openid,
wxtoken,
nickname,
alipayUid,
fToken,
phone,
sense,
orderId,
authCode,
}) {
return axios.post(
'/store/wxdoor',
qs.stringify({
userId,
openid,
wxtoken,
nickname,
alipayUid,
fToken,
phone,
sense,
orderId,
authCode,
}),
);
}
export function scaleData() {
return axios.get('/store/scaleData');
}
export function sendsms({phone, faceType}) {
return axios.post('/store/sendsms', qs.stringify({phone, faceType}));
}
export function verifysms({phone, code, userId, faceType}) {
return axios.post(
'/store/verifysms',
qs.stringify({phone, code, userId, faceType}),
);
}
export function getAdvertising(action) {
return axios.get(`/store/advertising?${qs.stringify(action)}`);
}
export function getStore({group}) {
return axios.get(`/store/setting/${group}`);
}
export function findModuleSetting({group}) {
return axios.get(`/store/module/setting/${group}`);
}
import qs from 'qs';
import axios from 'axios';
import AsyncStorage from '@react-native-community/async-storage';
const pack = require('../../package.json');
export function token({host = '', key, secret, device}) {
return axios.post(`${host}/store/auth`, qs.stringify({key, secret, device}));
}
export async function refreshToken() {
const auth = await AsyncStorage.getItem('auth');
if (auth) {
try {
const {refresh_token} = JSON.parse(auth);
return await axios.get('/auth/refresh', {
headers: {Authorization: `Bearer ${refresh_token}`},
});
} catch (e) {
return {data: null};
}
}
return {data: null};
}
export function version() {
return axios.put('/store/version', qs.stringify({version: pack.version}));
}
export function region() {
return axios.get('/store/region');
}
export function door({userId}) {
return axios.post('/store/door', qs.stringify({userId}));
}
export function wxdoor({
userId,
openid,
wxtoken,
nickname,
alipayUid,
fToken,
phone,
sense,
orderId,
authCode,
}) {
return axios.post(
'/store/wxdoor',
qs.stringify({
userId,
openid,
wxtoken,
nickname,
alipayUid,
fToken,
phone,
sense,
orderId,
authCode,
}),
);
}
export function scaleData() {
return axios.get('/store/scaleData');
}
export function sendsms({phone, faceType}) {
return axios.post('/store/sendsms', qs.stringify({phone, faceType}));
}
export function verifysms({phone, code, userId, faceType}) {
return axios.post(
'/store/verifysms',
qs.stringify({phone, code, userId, faceType}),
);
}
export function getAdvertising(action) {
return axios.get(`/store/advertising?${qs.stringify(action)}`);
}
export function getStore({group}) {
return axios.get(`/store/setting/${group}`);
}
export function findModuleSetting({group}) {
return axios.get(`/store/module/setting/${group}`);
}
export function noBuyGoGoGo() {
return axios.post('/store/counter/nobuy');
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment