@zuopngfei 2e178c78b7 ss
2025-07-23 16:41:26 +08:00

698 lines
19 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import request from '~/api/request';
import { getOcr } from '~/api/ocr';
Page({
/**
* 页面的初始数据
*/
// 凝血酶原时间(s)/国际标准化比/活化的部分凝血酶时间s
data: {
style: 'border: 2rpx solid #efefef;border-radius: 12rpx;',
form: {
follow_name: '',
liver_function_image: [],
b_mode_image: [],
blood_routine_image: [],
coagulation_function_image: [],
mdt_image: [],
nutritional_indicator_image: []
},
isName: true,
isTime: true,
isDoctor: true,
isHeight: true,
isWeight: true,
personInfo: {
name: '',
gender: 0,
birth: '',
address: [],
introduction: '',
yearType: 0,
// photos: [],
},
mode: '',
dateVisible: false,
dateText: '',
startTimePicker: String(new Date().getFullYear()),
filter(type, options) {
if (type === 'year') {
return options.sort((a, b) => b.value - a.value);
}
return options;
},
popupProps: {
usingCustomNavbar: true,
},
formatter(item, index) {
if (index === 1) {
const label = item.label.slice(0, -1);
return {
value: item.value,
label: calendarMonth[Number(label) - 1],
};
}
if (index === 2) {
const [dateValue, weekValue] = item.label.split(' ');
const dateSuffixes = {
1: 'st',
2: 'nd',
3: 'rd',
};
const weekMap = {
周一: 'Mon.',
周二: 'Tues.',
周三: 'Wed.',
周四: 'Thurs.',
周五: 'Fri.',
周六: 'Sat.',
周日: 'Sun.',
};
const label = dateValue.slice(0, -1);
return {
value: item.value,
label: `${label}${dateSuffixes[label] || 'th'} ${weekMap[weekValue]}`,
};
}
return {
value: item.value,
label: item.label.slice(0, -1),
};
},
originFiles: [
{
url: 'https://tdesign.gtimg.com/mobile/demos/example4.png',
name: 'uploaded1.png',
type: 'image',
removeBtn: true,
},
{
url: 'https://tdesign.gtimg.com/mobile/demos/example6.png',
name: 'uploaded2.png',
type: 'image',
removeBtn: true,
},
{
url: 'https://tdesign.gtimg.com/mobile/demos/example5.png',
name: 'uploaded3.png',
type: 'image',
removeBtn: true,
},
],
gridConfig: {
column: 4,
width: 160,
height: 160,
},
config: {
count: 1,
},
imageVisible: false,
imageList: [],
imageIndex: 1,
},
onInput(e) {
const { key, tips } = e.currentTarget.dataset;
if (e.detail.value) {
this.setData({
[tips]: true,
[`form.${key}`]: e.detail.value
});
} else {
this.setData({
[tips]: false,
[`form.${key}`]: e.detail.value
})
}
},
onInputTime(e) {
const { tips } = e.currentTarget.dataset;
if (e.detail.value) {
this.setData({
[tips]: true,
});
} else {
this.setData({
[tips]: false,
})
}
},
showPicker(e) {
const { mode } = e.currentTarget.dataset;
this.setData({
[`${mode}Visible`]: true,
});
},
onPickerChange(e) {
if (e.detail.value) {
this.setData({
isTime: true,
['form.follow_date']: e.detail.value
})
} else {
this.setData({
isTime: false,
['form.follow_date']: e.detail.value
})
}
},
handleSuccess(e) {
const { files } = e.detail;
this.setData({
originFiles: files,
});
},
handleRemove(e) {
const { index } = e.detail;
const { originFiles } = this.data;
originFiles.splice(index, 1);
this.setData({
originFiles,
});
},
handleClick(e) {
console.log(e.detail.file);
},
planId: '',
questionnaire_id: '',
async toQuestionnaire() {
let valid = true;
// 必填项校验
if (!this.data.form.follow_name) {
this.setData({ isName: false });
valid = false;
}
if (!this.data.form.follow_date) {
this.setData({ isTime: false });
valid = false;
}
if (!this.data.form.follow_hospital) {
this.setData({ isDoctor: false });
valid = false;
}
if (!this.data.form.height) {
this.setData({ isHeight: false });
valid = false;
}
if (!this.data.form.weight) {
this.setData({ isWeight: false });
valid = false;
}
if (!valid) return
const data = this.data.form
data.liver_function_image = data.liver_function_image.length > 0 ? data.liver_function_image.join(',') : ''
data.b_mode_image = data.b_mode_image.length > 0 ? data.b_mode_image.join(',') : '',
data.blood_routine_image = data.blood_routine_image.length > 0 ? data.blood_routine_image.join(',') : '',
data.coagulation_function_image = data.coagulation_function_image.length > 0 ? data.coagulation_function_image.join(',') : '',
data.mdt_image = data.mdt_image.length > 0 ? data.mdt_image.join(',') : '',
data.nutritional_indicator_image = data.nutritional_indicator_image.length > 0 ? data.nutritional_indicator_image.join(',') : ''
data.is_have_cyst = data.is_have_cyst ? Number(data.is_have_cyst) : 0
data.is_have_ascites = data.is_have_ascites ? Number(data.is_have_ascites) : 0
await request('patient/follow_questionnaire', 'post', { plan_id: Number(this.planId), questionnaire_id: Number(this.questionnaire_id), ...data })
wx.showToast({
title: '提交成功',
icon: 'success',
duration: 2000,
complete: () => {
wx.navigateBack({
delta: 1
})
}
})
},
handleChangeGroup(e) {
const { mode } = e.currentTarget.dataset
this.setData({
[`form.${mode}`]: e.detail.value
})
},
//上传文件方法
async uploadFileToOSS(file, callback) {
const policyData = await request('admin/policy_token', 'post')
const res = JSON.parse(policyData.token)
const fileName = file.tempFilePath.split('/').pop(); // hello.png
// const fileName = fileNameWithExt.split('.').slice(0, -1).join('.'); // hello
const formData = {
key: 'upload_file/' + fileName, //上传文件名称
policy: res.policy, //表单域
'x-oss-signature-version': res.x_oss_signature_version, //指定签名的版本和算法
'x-oss-credential': res.x_oss_credential, //指明派生密钥的参数集
'x-oss-date': res.x_oss_date, //请求的时间
'x-oss-signature': res.signature, //签名认证描述信息
'x-oss-security-token': res.security_token, //安全令牌
success_action_status: "200" //上传成功后响应状态码
};
// console.log(filePath)
// return
// 发送请求上传文件
wx.uploadFile({
url: 'https://image-fudan.oss-cn-beijing.aliyuncs.com/',
method: 'put',
filePath: file.tempFilePath,
name: 'file', //固定值为file
formData: formData,
success(res) {
console.log('上传响应:', res);
if (res.statusCode === 200) {
callback(null, 'https://image-fudan.oss-cn-beijing.aliyuncs.com/upload_file/' + fileName); // 上传成功
} else {
console.error('上传失败,状态码:', res.statusCode);
console.error('失败响应:', res);
callback(res); // 上传失败,返回响应
}
},
fail(err) {
console.error('上传失败:', err); // 输出错误信息
wx.showToast({ title: '上传失败,请重试!', icon: 'none' });
callback(err); // 调用回调处理错误
}
});
},
handleUpload(e) {
const { mode } = e.currentTarget.dataset;
if (this.data.form[mode].length >= 9) {
wx.showToast({ title: '最多上传9张图片!', icon: 'none' });
return
}
wx.chooseMedia({
count: 1, // 选择一个文件
mediaType: ['image'],
sourceType: ['album', 'camera'],
// type: 'all', // 支持所有类型的文件
success: (res) => {
wx.showToast({ title: '文件上传中,请稍等!', icon: 'none' });
console.log('选择的文件:', res.tempFiles); // 输出选择的文件信息
if (res.tempFiles.length > 0) {
const tempFilePath = res.tempFiles[0];
console.log('选择的文件路径:', tempFilePath); // 输出文件路径
this.uploadFileToOSS(tempFilePath, (error, data) => {
if (error) {
wx.showToast({ title: '上传失败!', icon: 'none' });
console.error('上传失败:', error); // 输出具体的错误信息
} else {
const { mode } = e.currentTarget.dataset;
let arr = this.data.form[mode]
arr.unshift(data)
this.setData({
[`form.${mode}`]: arr
})
if(mode != 'mdt_image'){
wx.showToast({ title: '上传成功,正在识别内容!', icon: 'none' });
getOcr(data).then(ocrRes => {
console.log(ocrRes)
wx.showToast({ title: '识别完成!', icon: 'none' })
this.setFormData(ocrRes, mode)
})
} else {
wx.showToast({ title: '上传成功!', icon: 'none' });
}
console.log('上传成功:', data); // 输出上传成功后的数据
}
});
} else {
wx.showToast({ title: '未选择文件!', icon: 'none' });
}
},
fail: (err) => {
wx.showToast({ title: '选择文件失败!', icon: 'none' });
console.error('选择文件失败:', err); // 输出选择文件的错误信息
}
});
},
imageKey: '',
handleImagePreview(e) {
const { mode, index } = e.currentTarget.dataset;
this.imageKey = mode
this.setData({
imageList: this.data.form[mode],
imageIndex: index,
imageVisible: true
})
},
onClose() {
this.setData({
imageVisible: false
})
},
handleDelete(e) {
const { mode, index } = e.currentTarget.dataset;
let arr = this.data.form[mode]
arr.splice(index, 1)
this.setData({
[`form.${mode}`]: arr
})
},
onDelete(e) {
let arr = this.data.form[this.imageKey]
arr.splice(e.detail.index, 1)
// let imageList = this.data.imageList
// imageList.splice(this.data.imageIndex, 1)
let imageIndex = e.detail.index
this.setData({
// imageIndex: imageIndex - 1,
[`form.${this.imageKey}`]: arr,
imageList: arr,
imageVisible: arr.length != 0
})
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
this.planId = options.planId
this.questionnaire_id = options.questionnaire_id
this.setData({
['form.follow_name']: options.name,
['form.follow_date']: options.time
})
if (options.questionnaire_id != 0) {
this.getDetail()
}
},
async getDetail() {
const res = await request('patient/questionnaire_info', 'post', { patient_id: 0, questionnaire_id: Number(this.questionnaire_id) })
const data = res
data.liver_function_image = data.liver_function_image ? data.liver_function_image.split(',') : []
data.b_mode_image = data.b_mode_image ? data.b_mode_image.split(',') : []
data.blood_routine_image = data.blood_routine_image ? data.blood_routine_image.split(',') : []
data.coagulation_function_image = data.coagulation_function_image ? data.coagulation_function_image.split(',') : []
data.mdt_image = data.mdt_image ? data.mdt_image.split(',') : []
data.nutritional_indicator_image = data.nutritional_indicator_image ? data.nutritional_indicator_image.split(',') : []
this.setData({
form: data
})
},
// 遍历识别结果,填充字段
setFormData(ocrs, mode) {
ocrs.forEach(ocr => {
// 血常规
if (mode == 'blood_routine_image') {
if (ocr.name == '血红蛋白' || ocr.name == '血红蛋白检查') {
this.setData({
[`form.hemoglobin`]: ocr.value
})
}
if (ocr.name == '血小板' || ocr.name == '血小板计数') {
this.setData({
[`form.platelets`]: ocr.value
})
}
if (ocr.name == '白细胞' || ocr.name == '白细胞计数') {
this.setData({
[`form.white_blood_cells`]: ocr.value
})
}
}
// 凝血功能
if (mode == 'coagulation_function_image') {
if (ocr.name == 'C-反应蛋白' || ocr.name == 'c-反应蛋白' || ocr.name == 'CRP') {
this.setData({
[`form.crp`]: ocr.value
})
}
if (ocr.name == 'DDR' || ocr.name == 'ddr') {
this.setData({
[`form.ddr`]: ocr.value
})
}
if (ocr.name == '凝血酶原时间' || ocr.name == 'Pt') {
this.setData({
[`form.pt`]: ocr.value
})
}
if (ocr.name == '凝血酶原活动度' || ocr.name == 'Pt-a' || ocr.name == 'PtA') {
this.setData({
[`form.pta`]: ocr.value
})
}
if (ocr.name == '国际标准化比值' || ocr.name == 'INR') {
this.setData({
[`form.inr`]: ocr.value
})
}
if (ocr.name == '活化部分凝血活酶时间' || ocr.name == 'APTT') {
this.setData({
[`form.aptt`]: ocr.value
})
}
if (ocr.name == '凝血酶时间' || ocr.name == 'TT') {
this.setData({
[`form.tt`]: ocr.value
})
}
if (ocr.name == '纤维蛋白原' || ocr.name == 'FIB') {
this.setData({
[`form.fib`]: ocr.value
})
}
if (ocr.name == 'NPDP' || ocr.name == 'npdp') {
this.setData({
[`form.npdp`]: ocr.value
})
}
if (ocr.name == 'MMP-7' || ocr.name == 'MMP7' || ocr.name == '基质金属蛋白酶-7') {
this.setData({
[`form.mmp_7`]: ocr.value
})
}
}
// 肝功能
if (mode == 'liver_function_image') {
if (ocr.name == '总胆红素') {
this.setData({
[`form.total_bilirubin`]: ocr.value
})
}
if (ocr.name == '直接胆红素') {
this.setData({
[`form.direct_bilirubin`]: ocr.value
})
}
if (ocr.name == '总胆汁酸') {
this.setData({
[`form.total_bile_acid`]: ocr.value
})
}
if (ocr.name == '白蛋白') {
this.setData({
[`form.albumin`]: ocr.value
})
}
if (ocr.name == '谷草' || ocr.name == '谷草转氨酶') {
this.setData({
[`form.grain_grass`]: ocr.value
})
}
if (ocr.name == '谷丙' || ocr.name == '谷丙转氨酶') {
this.setData({
[`form.gu_bing`]: ocr.value
})
}
if (ocr.name == 'γ-谷氨酰转肽酶' || ocr.name == '谷氨酰转肽酶') {
this.setData({
[`form.ggt`]: ocr.value
})
}
if (ocr.name == '碱性磷酸酶') {
this.setData({
[`form.alp`]: ocr.value
})
}
}
// 营养指数
if (mode == 'nutritional_indicator_image') {
if (ocr.name == '25-羟基维生素D3' || ocr.name == '25-OH-Vitamin D3' || ocr.name == '25(OH)D3') {
this.setData({
[`form.oh_d3`]: ocr.value
})
}
if (ocr.name == '25-羟基维生素D2' || ocr.name == '25-OH-Vitamin D2' || ocr.name == '25(OH)D2') {
this.setData({
[`form.oh_d2`]: ocr.value
})
}
if (ocr.name == '25-羟基维生素D' || ocr.name == '25-OH-Vitamin D' || ocr.name == '25(OH)D') {
this.setData({
[`form.oh_d`]: ocr.value
})
}
if (ocr.name == '维生素A' || ocr.name == '维生素a' || ocr.name == 'vitamin a' || ocr.name == 'vit A') {
this.setData({
[`form.vitamin_a`]: ocr.value
})
}
if (ocr.name == '维生素K' || ocr.name == '维生素k' || ocr.name == 'vitamin k' || ocr.name == 'vit K') {
this.setData({
[`form.vitamin_k`]: ocr.value
})
}
if (ocr.name == '维生素E' || ocr.name == '维生素e' || ocr.name == 'vitamin e' || ocr.name == 'vit E') {
this.setData({
[`form.vitamin_e`]: ocr.value
})
}
}
// B超
if (mode == 'b_mode_image') {
if(ocr.name == '肝肋下'){
this.setData({
[`form.under_the_liver_rib`]: ocr.value
})
}
if(ocr.name == '肝剑突下'){
this.setData({
[`form.under_the_xiphoid_liver`]: ocr.value
})
}
if(ocr.name == '脾肋下'){
this.setData({
[`form.spleen_rib_area`]: ocr.value
})
}
if(ocr.name == '门静脉主干内径'){
this.setData({
[`form.main_portal_vein`]: ocr.value
})
}
if(ocr.name == '肝回声'){
this.setData({
[`form.liver_echo`]: ocr.value
})
}
if(ocr.name == '胆囊大小'){
this.setData({
[`form.gallbladder_size`]: ocr.value
})
}
if(ocr.name == '胆总管'){
this.setData({
[`form.common_bile_duct`]: ocr.value
})
}
if(ocr.name == '纤维块大小'){
this.setData({
[`form.fiber_block_size`]: ocr.value
})
}
if(ocr.name == '门静脉流速' || ocr.name == 'PVV' || ocr.name == 'PVV流速' || ocr.name == 'pvv'){
this.setData({
[`form.pvv`]: ocr.value
})
}
if(ocr.name == '肝弹性值'){
this.setData({
[`form.liver_elasticity_value`]: ocr.value
})
}
if(ocr.name == '有无肝囊肿'){
this.setData({
[`form.is_have_cyst`]: ocr.value == '无' ? '2' : '1'
})
}
if(ocr.name == '有无腹水'){
this.setData({
[`form.is_have_ascites`]: ocr.value == '无' ? '2' : '1'
})
}
if(ocr.name == '弹性成像最小值'){
this.setData({
[`form.elastography_minimum`]: ocr.value
})
}
if(ocr.name == '弹性成像最大值'){
this.setData({
[`form.elastography_maximum`]: ocr.value
})
}
if(ocr.name == '弹性成像中位数'){
this.setData({
[`form.elastography_median`]: ocr.value
})
}
}
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})