You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

552 lines
16 KiB
TypeScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import classnames from "classnames";
import { Component, PropsWithChildren, useEffect, useState } from "react";
// import { InstrumentInfo } from "../../utils/Interface";
import Taro from "@tarojs/taro";
// 引入 Swiper, SwiperItem 组件
import {
Block,
View,
Text,
Image,
Input,
// Button,
Video,
ScrollView,
Canvas,
} from "@tarojs/components";
import { InstrumentInfo } from "../../utils/Interface";
import { go, back, loading, msg, showModal } from "../../utils/traoAPI";
import { isVideo } from "../../utils/util";
import utilHtml from "../../utils/utilhtml";
import { getImgInfo, contraction } from "../../utils/compressImage";
/* 自定义组件 */
import Navbar from "../../components/navbar/navbar";
import PopupAlert from "../../components/popup/popup-alert";
/* 组件 */
import "./instrument.less";
export default class Instrument extends Component<any, any> {
constructor(props) {
super(props);
this.state = {
name: "instrument",
isBindingError: false,
isBindingCheckError: false,
style: "font-size: 28rpx; color: #ccc;",
succeedShow: false,
tipShow: false,
loading: true,
channelList: [],
channelInfo: {
id: "",
image: "",
serial: "",
bind_intro_Video: "",
},
equipmentList: [
{
id: 1,
banner: "",
titile: "测试",
},
],
isVideo: false,
inputType: 1, //1.手写 2.扫码绑定
bindCode: "",
bindCodeInfo: null,
bindPopup: "",
userinfo: null,
showLoginPopup: "",
fromUrl: "",
};
}
async onLoad() {
this.unbindingInstrumentInfoList();
}
componentDidMount() {}
componentWillUnmount() {}
componentDidShow() {}
componentDidHide() {}
async initData() {}
onSerial = (event) => {
const { value } = event.detail;
let { channelInfo } = this.state;
channelInfo.serial = value;
this.setState({ channelInfo });
};
onScanCode() {
Taro.scanCode({
scanType: ["qrCode"],
success: (res) => {
let { channelInfo } = this.state;
channelInfo.serial = res.result;
this.setState({ channelInfo });
},
});
}
onTipShow = () => {
this.setState({ tipShow: true });
};
onTabTap = (type) => {
this.setState({
inputType: type,
});
};
onScanTap = () => {
/*
// 本地测试
const result = decodeURIComponent('https%3A%2F%2Fi.flossom.com%2Fa%3Ffr200test12');
const bindCode = result.split('?')[1];
that.setData({
bindCode
})
that.getBindCodeInfo();
return*/
Taro.scanCode({
scanType: ["barCode", "qrCode"],
success: (res) => {
const result = decodeURIComponent(res.result);
if (result.indexOf("?") > -1) {
const bindCode = result.split("?")[1];
console.log("bindCode", bindCode);
this.setState({
bindCode,
});
}
this.bindingInstrument();
// this.getBindCodeInfo();
},
fail(err) {},
complete(res) {},
});
};
// getBindCodeInfo = async () => {
// const { bindCode, instrumentList, channelInfo } = this.state;
// // // 1.查询资料
// // try {
// // const { data } = await InstrumentCodeCheck({
// // code: bindCode,
// // });
// // const bindCodeInfo = { ...data.data.bindCodeInfo };
// // // 2.判断是否是选中的仪器, 如果不是, 直接弹出scanErrorPopup
// // if (channelInfo.id != bindCodeInfo.instrument_id) {
// // this.setState({
// // bindPopup: "scanErrorPopup",
// // });
// // return;
// // }
// // const match = instrumentList.find((item) => {
// // if (item.id == bindCodeInfo.instrument_id && item.serial) {
// // // 找到同一个仪器
// // bindCodeInfo.hadBindSame = true;
// // if (item.serial == bindCodeInfo.antifakeCode) {
// // // 找到同一个序列号
// // bindCodeInfo.hadBindSameCode = true;
// // } else {
// // bindCodeInfo.hadBindSameCode = false;
// // }
// // return item;
// // }
// // if (item.id == bindCodeInfo.instrument_id) {
// // const { channelInfo } = this.state;
// // if (channelInfo.id === item.id) return;
// // this.setState({
// // channelInfo: item,
// // isVideo: isVideo(item.bind_intro_video),
// // });
// // }
// // });
// // if (match) {
// // bindCodeInfo.hadBind = true;
// // } else {
// // bindCodeInfo.hadBindSame = false;
// // }
// // this.setState({
// // bindCodeInfo,
// // });
// // this.judgeBindCode();
// // } catch (e) {
// // this.judgeBindCode();
// // }
// };
// judgeBindCode = () => {
// const { bindCode, bindCodeInfo } = this.state;
// const opts: any = {};
// if (bindCode && !bindCodeInfo) {
// // 有仪器码, 但是没有找到信息时
// opts.bindPopup = "noFoundPopup";
// } else if (bindCode && bindCodeInfo && bindCodeInfo.isLabelCode) {
// opts.bindPopup = "labelPopup";
// } else if (
// bindCode &&
// bindCodeInfo.hadBindSame &&
// bindCodeInfo.hadBindSameCode
// ) {
// // 有仪器码, 如果有登录, 判断是绑定了同样的仪器和仪器的序列号是一致 -- 不弹弹窗, 回到首页
// opts.bindCode = ""; // 重置bindCode
// opts.bindPopup = ""; // 隐藏bindPopup
// } else if (
// bindCode &&
// bindCodeInfo.hadBindSame &&
// !bindCodeInfo.hadBindSameCode
// ) {
// // 有仪器码, 如果有登录, 判断是绑定了同样的仪器, 但仪器的序列号不一致 -- 判断换绑
// opts.bindPopup = "switchBindCodePopup";
// } else if (bindCode && !bindCodeInfo.hadBindSame) {
// // 有仪器码, 如果有登录, 判断不是绑定了同样的仪器 -- 绑定
// opts.bindPopup = "toBindPopup";
// }
// if (Object.keys(opts).length) {
// this.setState(opts);
// }
// };
onCustomerTap = () => {
this.onCancelBind2Tap();
go("/pages/consultant/consultant");
};
onCancelBind2Tap = () => {
this.setState({
bindPopup: "",
bindCode: "",
});
};
onChangeImg = async () => {
Taro.chooseMedia({
count: 1,
mediaType: ["image"],
success: async (res) => {
const tempFilePath = res.tempFiles[0].tempFilePath;
let img = await getImgInfo(tempFilePath);
let compressImage = await contraction(img, "compressImage");
// 压缩后文件地址
let compressTempFilePath = compressImage.tempFilePath;
let { channelInfo } = this.state;
channelInfo.image = compressTempFilePath;
this.setState({ channelInfo });
},
});
};
onSubmit = () => {
const that = this;
const { serial, image, buy_id, id } = this.state.channelInfo;
if (!serial?.trim()) return msg("请输入设备序列号");
if (!image) return msg("请上传序列号照片");
// if (!buy_id) return msg('请选择购买渠道');
// loading("绑定中");
// InstrumentBindingAdd({ serial, image, buy_id, instrument_id: id })
// .then((res) => {
// this.setState({ succeedShow: true });
// })
// .catch((err) => {
// if (err.data.code != 400) {
// that.setState({
// errorMsg: err.data.msg,
// bindPopup: "errorMsg",
// });
// }
// });
};
onSelectChange(item) {
const { channelInfo } = this.state;
if (channelInfo.id === item.id) return;
this.setState({
channelInfo: item,
isVideo: isVideo(item.bind_intro_video),
});
}
public back = () => {
back();
};
closeDev = () => {
// go("/pages/user/user");
let isInstrumentJump = Taro.getStorageSync("isInstrumentJump");
if (isInstrumentJump === "true") {
Taro.reLaunch({
url: "/pages/user/user",
});
}
};
// 未绑定列表
unbindingInstrumentInfoList = async () => {
let { data } = await InstrumentInfo.unbindingInstrumentInfoList();
if (data.code === 200) {
console.log("data", data);
if (data.data.length) {
this.setState({ equipmentList: data.data, channelInfo: data.data[0] });
}
}
};
// 绑定仪器
bindingInstrument = async () => {
Taro.showLoading({
title: "请求中...",
mask: true,
});
let { instrumentInfo } = this.state;
let { data } = await InstrumentInfo.binding({
serial: instrumentInfo.serial,
});
console.log("bindingInstrument", data);
Taro.hideLoading();
if (data.code === 200) {
// this.setState({ isVisibleBinding: false });
msg("绑定成功");
} else {
this.setState({ isBindingError: true });
}
};
onBindErrorClose = () => {
this.setState({ isBindingError: false });
};
onBindErrorConfirm = () => {
this.onBindErrorClose();
go("/pages/consultant/consultant");
};
onBindCheckErrorClose = () => {
this.setState({ isBindingCheckError: false });
};
render() {
let {
isBindingError,
isBindingCheckError,
isVideo,
channelInfo,
inputType,
style,
equipmentList,
} = this.state;
return (
<Block>
<PopupAlert
isShow={true}
isClose={true}
title="提示"
content="页面正在开发中"
confirmButtonText="确定"
textAlgin="center"
close={this.closeDev}
confirm={this.closeDev}
/>
<Navbar titleSlot="仪器绑定" isBack={true} />
<PopupAlert
isShow={isBindingError}
title="提示"
content="序列号库仍在更新,请联系微信助手"
confirmButtonText="知道了"
textAlgin="center"
isClose={false}
close={this.onBindErrorClose}
confirm={this.onBindErrorClose}
></PopupAlert>
<PopupAlert
isShow={isBindingCheckError}
title="提示"
content="您选择的仪器有误,请重新选择确认"
confirmButtonText="知道了"
textAlgin="center"
isClose={false}
close={this.onBindCheckErrorClose}
confirm={this.onBindCheckErrorClose}
></PopupAlert>
<Canvas
style="height: 0"
id="compressImage"
canvasId="compressImage"
type="2d"
></Canvas>
<View></View>
<View className="main">
<View className="top">
<View className="top_title"></View>
<View className="top_tips">
</View>
<View className="top_tips"></View>
</View>
<View className="banner_list">
{isVideo && channelInfo.bind_intro_Video ? (
<Video
className="banner_item"
autoplay
objectFit="cover"
enablePlayGesture
showFullscreenBtn={false}
playBtnPosition="center"
src={utilHtml.getHttpsUrl(channelInfo.bind_intro_Video)}
/>
) : (
<Image
className="banner_item"
src={utilHtml.getHttpsUrl(channelInfo.bind_intro_Video)}
mode="aspectFill"
></Image>
)}
</View>
<View className="form">
<View className="form_item is-instrument">
<View className="label_box">
<View
className="label"
style="font-size: 32rpx; margin: 0 0 0rpx 2rpx"
>
</View>
</View>
<ScrollView
scrollX={true}
className="instrument_list"
style="width: 100%; white-space: nowrap;"
scrollIntoView={"scroll" + channelInfo.id}
>
{equipmentList.map((item, index) => {
return (
<View
className={classnames("cover", {
active_cover: channelInfo.id === item.id,
})}
id={"scroll" + item.id}
key={index}
onClick={this.onSelectChange.bind(this, item)}
>
<Image
className="instrument_img"
src={utilHtml.getHttpsUrl(item.banner)}
mode="aspectFill"
// mode="aspectFit"
></Image>
<View className="desc">{item.name}</View>
</View>
);
})}
</ScrollView>
</View>
<View className="form_item is-tab">
<View className="tab_list">
<View
className={classnames("tab_item", {
"is-active": inputType === 1,
})}
onClick={this.onTabTap.bind(this, 1)}
>
<Text></Text>
<View className="tab_active_line"></View>
</View>
<View
className={classnames("tab_item", {
"is-active": inputType === 2,
})}
onClick={this.onTabTap.bind(this, 2)}
>
<Text></Text>
<View className="tab_active_line"></View>
</View>
</View>
</View>
{inputType == 1 && (
<Block>
<View className="inputCode_box">
<View className="form_item is-inputCode">
<View className="label_box">
<View className="label"></View>
<View className="label_text" onClick={this.onTipShow}>
<Text className="label-tips"></Text>
<Image
className="right_icon"
src={require("../../img/index-right.png")}
mode="aspectFill"
/>
</View>
</View>
<View className="ipt_box">
<Input
maxlength={50}
className="ipt"
placeholder="例如FR10*********1"
placeholder-style={style}
onInput={this.onSerial}
value={channelInfo.serial}
></Input>
</View>
</View>
<View className="form_item">
<View className="label_box">
<View className="label"></View>
</View>
<View className="photo_box" onClick={this.onChangeImg}>
{channelInfo.image && (
<Image
src={channelInfo.image}
mode="aspectFill"
></Image>
)}
{!channelInfo.image && (
<Image
className="add"
src={require("../../img/welcome/add.png")}
mode="aspectFit"
></Image>
)}
</View>
</View>
</View>
</Block>
)}
</View>
</View>
<View className="footer">
{inputType == 1 && (
<View className="btn" onClick={this.onSubmit}>
</View>
)}
{inputType == 2 && (
<View className="btn footer-btn-scan" onClick={this.onScanTap}>
<Image
className="footer-btn-scan-img"
src={require("../../img/icon-scan.png")}
></Image>
</View>
)}
</View>
</Block>
);
}
}