From b496603f7ca0002e266cedad1128098253a2e106 Mon Sep 17 00:00:00 2001 From: zoujiandong <10130823232@qq.com> Date: Tue, 17 Jun 2025 17:58:29 +0800 Subject: [PATCH] 111 --- .gitignore | 12 + README.md | 1 + api/api.js | 118 ++ api/auth.js | 22 + app.js | 12 + app.json | 49 + app.wxss | 35 + case/pages/agreement/agreement.js | 154 +++ case/pages/agreement/agreement.json | 6 + case/pages/agreement/agreement.wxml | 33 + case/pages/agreement/agreement.wxss | 92 ++ case/pages/bankCard/bankCard.js | 322 +++++ case/pages/bankCard/bankCard.json | 16 + case/pages/bankCard/bankCard.wxml | 51 + case/pages/bankCard/bankCard.wxss | 143 +++ case/pages/createCase/createCase.js | 1237 +++++++++++++++++++ case/pages/createCase/createCase.json | 17 + case/pages/createCase/createCase.wxml | 454 +++++++ case/pages/createCase/createCase.wxss | 351 ++++++ case/pages/improveInfo/improveInfo.js | 520 ++++++++ case/pages/improveInfo/improveInfo.json | 17 + case/pages/improveInfo/improveInfo.wxml | 69 ++ case/pages/improveInfo/improveInfo.wxss | 84 ++ case/pages/login/login.js | 249 ++++ case/pages/login/login.json | 10 + case/pages/login/login.wxml | 70 ++ case/pages/login/login.wxss | 108 ++ case/pages/mobileLogin/mobileLogin.js | 404 ++++++ case/pages/mobileLogin/mobileLogin.json | 13 + case/pages/mobileLogin/mobileLogin.wxml | 80 ++ case/pages/mobileLogin/mobileLogin.wxss | 304 +++++ case/pages/paintCanvas/paintCanvas.js | 222 ++++ case/pages/paintCanvas/paintCanvas.json | 6 + case/pages/paintCanvas/paintCanvas.wxml | 31 + case/pages/paintCanvas/paintCanvas.wxss | 59 + case/pages/privacy/privacy.js | 72 ++ case/pages/privacy/privacy.json | 6 + case/pages/privacy/privacy.wxml | 10 + case/pages/privacy/privacy.wxss | 15 + case/pages/pwdLogin/pwdLogin.js | 255 ++++ case/pages/pwdLogin/pwdLogin.json | 10 + case/pages/pwdLogin/pwdLogin.wxml | 39 + case/pages/pwdLogin/pwdLogin.wxss | 120 ++ case/pages/register/register.js | 533 ++++++++ case/pages/register/register.json | 17 + case/pages/register/register.wxml | 102 ++ case/pages/register/register.wxss | 91 ++ case/pages/signcanvas/signcanvas.js | 169 +++ case/pages/signcanvas/signcanvas.json | 10 + case/pages/signcanvas/signcanvas.wxml | 11 + case/pages/signcanvas/signcanvas.wxss | 23 + case/utils/utils.js | 223 ++++ components/dialog/dialog.js | 91 ++ components/dialog/dialog.json | 6 + components/dialog/dialog.wxml | 22 + components/dialog/dialog.wxss | 77 ++ components/image-cropper/image-cropper.js | 1122 +++++++++++++++++ components/image-cropper/image-cropper.json | 3 + components/image-cropper/image-cropper.wxml | 24 + components/image-cropper/image-cropper.wxss | 143 +++ components/nav/nav.js | 48 + components/nav/nav.json | 4 + components/nav/nav.wxml | 11 + components/nav/nav.wxss | 61 + components/navBar/navBar.js | 44 + components/navBar/navBar.json | 6 + components/navBar/navBar.wxml | 5 + components/navBar/navBar.wxss | 36 + components/painter/lib/calc.js | 54 + components/painter/lib/downloader.js | 363 ++++++ components/painter/lib/gradient.js | 102 ++ components/painter/lib/pen.js | 903 ++++++++++++++ components/painter/lib/qrcode.js | 784 ++++++++++++ components/painter/lib/sha1.js | 97 ++ components/painter/lib/string-polyfill.js | 46 + components/painter/lib/util.js | 78 ++ components/painter/lib/wx-canvas.js | 619 ++++++++++ components/painter/painter.js | 876 +++++++++++++ components/painter/painter.json | 4 + components/painter/painter.wxml | 21 + components/painter/painter.wxss | 1 + components/tabBar/tabBar.js | 24 + components/tabBar/tabBar.json | 7 + components/tabBar/tabBar.wxml | 2 + components/tabBar/tabBar.wxss | 1 + custom-tab-bar/index.js | 166 +++ custom-tab-bar/index.json | 8 + custom-tab-bar/index.wxml | 25 + custom-tab-bar/index.wxss | 20 + filters/filter.wxs | 53 + package.json | 7 + pages/index/index.js | 426 +++++++ pages/index/index.json | 13 + pages/index/index.wxml | 102 ++ pages/index/index.wxss | 208 ++++ pages/personCenter/personCenter.js | 149 +++ pages/personCenter/personCenter.json | 7 + pages/personCenter/personCenter.wxml | 58 + pages/personCenter/personCenter.wxss | 116 ++ project.config.json | 36 + project.private.config.json | 9 + static/banner.png | Bin 0 -> 97603 bytes static/caozuo.png | Bin 0 -> 1056 bytes static/center.png | Bin 0 -> 728 bytes static/center_on.png | Bin 0 -> 1288 bytes static/create.png | Bin 0 -> 20035 bytes static/default_avatar.png | Bin 0 -> 13027 bytes static/gdxz.png | Bin 0 -> 254496 bytes static/list.png | Bin 0 -> 574 bytes static/list_on.png | Bin 0 -> 1173 bytes static/man.png | Bin 0 -> 4410 bytes static/navbg.png | Bin 0 -> 123550 bytes static/noCase.png | Bin 0 -> 11227 bytes static/title_bg.png | Bin 0 -> 3578 bytes static/upload.png | Bin 0 -> 571 bytes static/wechat.png | Bin 0 -> 2031 bytes static/woman.png | Bin 0 -> 4659 bytes static/xiangmu.png | Bin 0 -> 553 bytes static/xinlin.png | Bin 0 -> 796960 bytes store/store.js | 8 + utils/base64ToImg.js | 13 + utils/config.js | 33 + utils/dayjs.js | 120 ++ utils/fileutil.js | 91 ++ utils/formatParams.js | 26 + utils/getUrl.js | 23 + utils/request.js | 119 ++ utils/router.js | 28 + utils/util.js | 18 + 129 files changed, 14644 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 api/api.js create mode 100644 api/auth.js create mode 100644 app.js create mode 100644 app.json create mode 100644 app.wxss create mode 100644 case/pages/agreement/agreement.js create mode 100644 case/pages/agreement/agreement.json create mode 100644 case/pages/agreement/agreement.wxml create mode 100644 case/pages/agreement/agreement.wxss create mode 100644 case/pages/bankCard/bankCard.js create mode 100644 case/pages/bankCard/bankCard.json create mode 100644 case/pages/bankCard/bankCard.wxml create mode 100644 case/pages/bankCard/bankCard.wxss create mode 100644 case/pages/createCase/createCase.js create mode 100644 case/pages/createCase/createCase.json create mode 100644 case/pages/createCase/createCase.wxml create mode 100644 case/pages/createCase/createCase.wxss create mode 100644 case/pages/improveInfo/improveInfo.js create mode 100644 case/pages/improveInfo/improveInfo.json create mode 100644 case/pages/improveInfo/improveInfo.wxml create mode 100644 case/pages/improveInfo/improveInfo.wxss create mode 100644 case/pages/login/login.js create mode 100644 case/pages/login/login.json create mode 100644 case/pages/login/login.wxml create mode 100644 case/pages/login/login.wxss create mode 100644 case/pages/mobileLogin/mobileLogin.js create mode 100644 case/pages/mobileLogin/mobileLogin.json create mode 100644 case/pages/mobileLogin/mobileLogin.wxml create mode 100644 case/pages/mobileLogin/mobileLogin.wxss create mode 100644 case/pages/paintCanvas/paintCanvas.js create mode 100644 case/pages/paintCanvas/paintCanvas.json create mode 100644 case/pages/paintCanvas/paintCanvas.wxml create mode 100644 case/pages/paintCanvas/paintCanvas.wxss create mode 100644 case/pages/privacy/privacy.js create mode 100644 case/pages/privacy/privacy.json create mode 100644 case/pages/privacy/privacy.wxml create mode 100644 case/pages/privacy/privacy.wxss create mode 100644 case/pages/pwdLogin/pwdLogin.js create mode 100644 case/pages/pwdLogin/pwdLogin.json create mode 100644 case/pages/pwdLogin/pwdLogin.wxml create mode 100644 case/pages/pwdLogin/pwdLogin.wxss create mode 100644 case/pages/register/register.js create mode 100644 case/pages/register/register.json create mode 100644 case/pages/register/register.wxml create mode 100644 case/pages/register/register.wxss create mode 100644 case/pages/signcanvas/signcanvas.js create mode 100644 case/pages/signcanvas/signcanvas.json create mode 100644 case/pages/signcanvas/signcanvas.wxml create mode 100644 case/pages/signcanvas/signcanvas.wxss create mode 100644 case/utils/utils.js create mode 100644 components/dialog/dialog.js create mode 100644 components/dialog/dialog.json create mode 100644 components/dialog/dialog.wxml create mode 100644 components/dialog/dialog.wxss create mode 100644 components/image-cropper/image-cropper.js create mode 100644 components/image-cropper/image-cropper.json create mode 100644 components/image-cropper/image-cropper.wxml create mode 100644 components/image-cropper/image-cropper.wxss create mode 100644 components/nav/nav.js create mode 100644 components/nav/nav.json create mode 100644 components/nav/nav.wxml create mode 100644 components/nav/nav.wxss create mode 100644 components/navBar/navBar.js create mode 100644 components/navBar/navBar.json create mode 100644 components/navBar/navBar.wxml create mode 100644 components/navBar/navBar.wxss create mode 100644 components/painter/lib/calc.js create mode 100644 components/painter/lib/downloader.js create mode 100644 components/painter/lib/gradient.js create mode 100644 components/painter/lib/pen.js create mode 100644 components/painter/lib/qrcode.js create mode 100644 components/painter/lib/sha1.js create mode 100644 components/painter/lib/string-polyfill.js create mode 100644 components/painter/lib/util.js create mode 100644 components/painter/lib/wx-canvas.js create mode 100644 components/painter/painter.js create mode 100644 components/painter/painter.json create mode 100644 components/painter/painter.wxml create mode 100644 components/painter/painter.wxss create mode 100644 components/tabBar/tabBar.js create mode 100644 components/tabBar/tabBar.json create mode 100644 components/tabBar/tabBar.wxml create mode 100644 components/tabBar/tabBar.wxss create mode 100644 custom-tab-bar/index.js create mode 100644 custom-tab-bar/index.json create mode 100644 custom-tab-bar/index.wxml create mode 100644 custom-tab-bar/index.wxss create mode 100644 filters/filter.wxs create mode 100644 package.json create mode 100644 pages/index/index.js create mode 100644 pages/index/index.json create mode 100644 pages/index/index.wxml create mode 100644 pages/index/index.wxss create mode 100644 pages/personCenter/personCenter.js create mode 100644 pages/personCenter/personCenter.json create mode 100644 pages/personCenter/personCenter.wxml create mode 100644 pages/personCenter/personCenter.wxss create mode 100644 project.config.json create mode 100644 project.private.config.json create mode 100644 static/banner.png create mode 100644 static/caozuo.png create mode 100644 static/center.png create mode 100644 static/center_on.png create mode 100644 static/create.png create mode 100644 static/default_avatar.png create mode 100644 static/gdxz.png create mode 100644 static/list.png create mode 100644 static/list_on.png create mode 100644 static/man.png create mode 100644 static/navbg.png create mode 100644 static/noCase.png create mode 100644 static/title_bg.png create mode 100644 static/upload.png create mode 100644 static/wechat.png create mode 100644 static/woman.png create mode 100644 static/xiangmu.png create mode 100644 static/xinlin.png create mode 100644 store/store.js create mode 100644 utils/base64ToImg.js create mode 100644 utils/config.js create mode 100644 utils/dayjs.js create mode 100644 utils/fileutil.js create mode 100644 utils/formatParams.js create mode 100644 utils/getUrl.js create mode 100644 utils/request.js create mode 100644 utils/router.js create mode 100644 utils/util.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c11a8a6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +# Dependency directories +node_modules +*.log* +*.lock +.eslintrc.js +package-lock.json +.history +dist/ +h5/ +dist.zip +wxAppPatient.zip +miniprogram_npm diff --git a/README.md b/README.md new file mode 100644 index 0000000..541fdfb --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +人工肝病例登记系统-小程序 \ No newline at end of file diff --git a/api/api.js b/api/api.js new file mode 100644 index 0000000..d164d35 --- /dev/null +++ b/api/api.js @@ -0,0 +1,118 @@ +import {request} from '../utils/request.js' +function addCase(data){ //添加病例 + return request('/medicalRecord/add','POST',data,true) +}; +function caseDetail(id){ //病例详情 + return request('/medicalRecord/getDetail/'+id,'GET',{},true) +}; +function caseList(data){ //病例列表 + return request('/medicalRecord/getList','POST',data,true) +}; +function editCase(data){ //修改病例 + return request('/medicalRecord/update','POST',data,true) +}; +function getCaptcha(){ //获取图片验证码 + return request('/user/getCaptcha','GET') +}; + + +function getDeal(data){ //获取协议 + return request('/user/getDeal','GET',data) +}; +function getInfo(data){ //个人中心 + return request('/user/getInfo','GET',data) +}; +function getRubric(data){ //操作说明 + return request('/user/getRubric','GET',data) +}; +function sendSms(data){ //发送验证码 + return request('/user/sendSms','POST',data,true) +}; +function smsLogin(data){ //短信登录 + return request('/user/smsLogin','POST',data,true) +}; +function smsRegister(data){ //短信注册 + return request('/user/smsRegister','POST',data,true) +}; +function addBank(data){ //添加医生签名 + return request('/user/addBank','POST',data) +}; +function getSign(data){ //获取医生签名 + return request('/user/getSign','GET',data) +}; +function getOssSign(type){ //获取上传文件 Policy + return request('/file/getOSSPolicy/'+type,'GET') +}; +function getArea(data){//获取省市区 + return request('/user/areaList','GET',data) +} +function getHospital(id){//医院列表 + return request('/user/hospitalList/'+id,'GET') +} +function getOfficeList(data){//科室列表 + return request('/user/officeList','GET',data) +} +function getPosition(){//职称列表 + return request('/user/positionList','GET',{}) +} +function uploadImg(data){//上传图片 + return request('/user/uoloadImg','POST',data) +} +function phoneLogin(appid,data){//获取用户绑定手机号信息 + return request(`/wx/user/${appid}/phone`,'GET',data,true) +} +function logout(){ + return request(`/user/logOut`,'GET') +} +function needInfo(mobile){//获取用户绑定手机号信息 + return request(`/user/getDetail/${mobile}`,'GET',{},true) +} +function modifyInfo(data){//修改HCP资料 + return request(`/user/modify`,'POST',data,true) +} +function pwdLogin(data){ //密码登录 + return request('/user/login','POST',data,true) +}; +function getPrivacy(){//获取用户绑定手机号信息 + return request(`/user/getPrivacy`,'GET',{},true) +} +function getProjectStatus(){//获取项目项目状态 + return request(`/user/getProjectStatus`,'GET',{},true) +} + +// function getCaseNum(){//获取项目病例总数 +// return request(`/user/getCaseNum`,'GET',{},true) +// } +// function getCaseSwitch(){//项目病例开关 +// return request(`/user/getCaseSwitch`,'GET',{},true) +// } + + +module.exports={ + addCase, + caseDetail, + caseList, + editCase, + getCaptcha, + getDeal, + getInfo, + getRubric, + sendSms, + smsLogin, + smsRegister, + addBank, + getSign, + getOssSign, + getArea, + getHospital, + getOfficeList, + getPosition, + uploadImg, + phoneLogin, + logout, + needInfo, + modifyInfo, + pwdLogin, + getPrivacy, + getProjectStatus + } diff --git a/api/auth.js b/api/auth.js new file mode 100644 index 0000000..d8e53e8 --- /dev/null +++ b/api/auth.js @@ -0,0 +1,22 @@ +function auth(){ //鉴权 + return new Promise((resolve,reject)=>{ + wx.login({ + success(res){ + if(res.errMsg=="login:ok"){ + resolve(res.code) + }else{ + wx.showToast({ + title:res.errMsg, + icon:'error' + }) + } + }, + fail(err){ + reject(err) + } + }) + }) + } + module.exports = { + auth + } \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..f50758d --- /dev/null +++ b/app.js @@ -0,0 +1,12 @@ +// app.js +import { hostConfig} from "./utils/config" +import router from './utils/router.js' +App({ + onLaunch: function () { + }, + method: router, + hostConfig: hostConfig, + globalData: { + height: 0 + } +}); diff --git a/app.json b/app.json new file mode 100644 index 0000000..2f9094c --- /dev/null +++ b/app.json @@ -0,0 +1,49 @@ +{ + "pages": [ + "pages/index/index", + "pages/personCenter/personCenter" + ], + "subpackages": [ + { + "root": "case", + "pages": [ + "pages/mobileLogin/mobileLogin", + "pages/createCase/createCase", + "pages/register/register", + "pages/agreement/agreement", + "pages/signcanvas/signcanvas", + "pages/improveInfo/improveInfo", + "pages/pwdLogin/pwdLogin", + "pages/privacy/privacy", + "pages/bankCard/bankCard", + "pages/paintCanvas/paintCanvas" + ] + } + ], + "tabBar": { + "custom": true, + "color": "#000000", + "selectedColor": "#3881F7", + "backgroundColor": "#fff", + "list": [ + { + "pagePath": "pages/index/index", + "text": "病例列表" + }, + { + "pagePath": "pages/personCenter/personCenter", + "text": "个人中心" + } + ] + }, + "window": { + "backgroundColor": "#F6F6F6", + "backgroundTextStyle": "light", + "navigationBarBackgroundColor": "#F6F6F6", + "navigationBarTitleText": "人工肝病例登记系统", + "navigationBarTextStyle": "black" + }, + " __usePrivacyCheck__": true, + "sitemapLocation": "sitemap.json", + "lazyCodeLoading": "requiredComponents" +} \ No newline at end of file diff --git a/app.wxss b/app.wxss new file mode 100644 index 0000000..85ebc31 --- /dev/null +++ b/app.wxss @@ -0,0 +1,35 @@ + +page{ + width: 100%; + height:100vh; + display: flex; + flex-direction: column; + + font-family: PingFang SC; +} +.container { + display: flex; + flex-direction: column; + align-items: center; + box-sizing: border-box; +} + +button { + background: initial; +} + +button:focus{ + outline: 0; +} + +button::after{ + border: none; +} +.nonedata{ + min-height:350rpx; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + diff --git a/case/pages/agreement/agreement.js b/case/pages/agreement/agreement.js new file mode 100644 index 0000000..16f22f6 --- /dev/null +++ b/case/pages/agreement/agreement.js @@ -0,0 +1,154 @@ +// case/pages/agreement/agreement.js +import {getDeal,getRubric,getSign} from "../../../api/api" +import { throttle } from "../../../utils/util" +const dayjs = require("../../../utils/dayjs"); +const app = getApp() +Page({ + + /** + * 页面的初始数据 + */ + data: { + node:'', + type:'', + year:'', + month:'', + day:'', + signImg:'', + navName:'项目协议' + }, + handleGetDeal(name,mobile,bankName,bankCardNo,idCardNo){ + getDeal().then(res=>{ + let deal=res.replace(/\$\{name\}/g,name).replace(/\$\{mobile\}/g,mobile).replace(/\$\{bankName\}/g,bankName).replace(/\$\{bankCardNo\}/g,bankCardNo).replace(/\$\{idCardNo\}/g,idCardNo); + this.setData({ + node:deal + }) + }) + }, + handleFetRubric(){ + getRubric().then(res=>{ + this.setData({ + node:res + }) + }) + }, + goSign:throttle(function(){ + let tokenStr='' + const { envVersion } = wx.getAccountInfoSync().miniProgram; + if(envVersion=="develop" || envVersion=="trial"){ + tokenStr="DEV_CASE_TOKEN" + }else{ + tokenStr="PROD_CASE_TOKEN" + } + let token = wx.getStorageSync(tokenStr); + if(token){ + app.method.navigateTo({ + url: '/case/pages/bankCard/bankCard', + complete:function(err){ + console.log(err) + } + }) + }else{ + app.method.navigateTo({ + url: '/case/pages/mobileLogin/mobileLogin?redirectUrl='+encodeURIComponent('case/pages/agreement/agreement'), + complete:function(err){ + console.log(err) + } + }) + } + + }), + handleGetSign(){ + getSign().then(res=>{ + if(res && res.signImg){ + let {signImg,createTime,bankCardNo,bankName,idCardNo,mobile,name}=res; + this.handleGetDeal(name,mobile,bankName,bankCardNo,idCardNo); + this.setData({ + signImg:signImg, + year:dayjs(createTime).format("YYYY"), + month:dayjs(createTime).format("M"), + day:dayjs(createTime).format("D"), + }) + }else{ + this.handleGetDeal('','','','',''); + } + }).catch(error=>{ + + if(error.code==30007){ + app.method.navigateTo({ + url: '/case/pages/mobileLogin/mobileLogin?redirectUrl='+encodeURIComponent('case/pages/agreement/agreement'), + complete:function(err){ + console.log(err) + } + }) + + } + }) + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + if(options.type=="description"){ + this.handleFetRubric(); + this.setData({ + type:'description', + navName:'操作说明' + }) + }else{ + + this.handleGetSign(); + } + + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + // onShareAppMessage() { + + // } +}) \ No newline at end of file diff --git a/case/pages/agreement/agreement.json b/case/pages/agreement/agreement.json new file mode 100644 index 0000000..0c7e114 --- /dev/null +++ b/case/pages/agreement/agreement.json @@ -0,0 +1,6 @@ +{ + "usingComponents": { + "navBar":"../../../components/navBar/navBar" + }, + "navigationStyle":"custom" +} \ No newline at end of file diff --git a/case/pages/agreement/agreement.wxml b/case/pages/agreement/agreement.wxml new file mode 100644 index 0000000..042bb76 --- /dev/null +++ b/case/pages/agreement/agreement.wxml @@ -0,0 +1,33 @@ + + + + + + + + + + 甲方:北京欣欣相照健康科技有限公司 + 日期:{{year}}{{month}}{{day}} + + + + 乙方:北京杏苑爱医科技发展有限公司 + 日期:{{year}}{{month}}{{day}} + + + + 丙方: + 日期:{{year}}{{month}}{{day}} + + + + + + + + 同意签署 + + \ No newline at end of file diff --git a/case/pages/agreement/agreement.wxss b/case/pages/agreement/agreement.wxss new file mode 100644 index 0000000..b2ea1f5 --- /dev/null +++ b/case/pages/agreement/agreement.wxss @@ -0,0 +1,92 @@ +/* case/pages/agreement/agreement.wxss */ +.page{ + background: #F7F9F9; + flex:1; + display: flex; + position: relative; + flex-direction: column; + margin-top: 172rpx; +} +.con{ + flex:1; + padding:10rpx 32rpx 0; + margin-bottom: 20rpx; +} +.con.active{ + margin-bottom: 150rpx; +} +.btnbox{ + z-index:999; + padding:0 32rpx; + background-color: #fff; + position: fixed; + box-sizing: border-box; + bottom:0; + height: 130rpx; + width:100%; +} +.btnbox .btn{ + margin-top: 15rpx; + width:100%; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + font-weight: 500; + color: #FFFFFF; + height: 88rpx; + background: linear-gradient(90deg, #377FF7 0%, #51AAFF 100%); + border-radius: 8rpx; +} +.imgbox{ + margin:30rpx 32rpx 60rpx; + display: flex; + flex-direction: column; + align-items: stretch; + justify-content: space-between; +} +.company{ + z-index:99; + top:-55rpx; + position: absolute; + width:220rpx; + right:206rpx; + height:220rpx; +} +.signimg{ + top:-40rpx; + left:80rpx; + position: absolute; + width:160rpx; + height:120rpx; +} +.signbox{ + display: flex; + align-items: center; + justify-content: flex-start; +} +.jiafang{ + position: relative; + flex:1; + font-size:28rpx; + margin-bottom:50rpx; +} +.yifang{ + font-size:small; + flex:1; + font-size:28rpx; + display: flex; + justify-content: space-between; + align-items: flex-start; + flex-direction: column; + position: relative; +} +.signdate{ + margin-top: 40rpx; +} +.company2{ + top:-90rpx; + right:280rpx; + width:280rpx; + height:300rpx; +} \ No newline at end of file diff --git a/case/pages/bankCard/bankCard.js b/case/pages/bankCard/bankCard.js new file mode 100644 index 0000000..ce96e09 --- /dev/null +++ b/case/pages/bankCard/bankCard.js @@ -0,0 +1,322 @@ +// case/pages/improveInfo/improveInfo.js +// case/pages/register/register.js +import {throttle} from "../../../utils/util" +import {hostConfig} from "../../../utils/config" +import {getArea,addBank} from "../../../api/api" +const host=hostConfig().host; +const app=getApp(); +Page({ + /** + * 页面的初始数据 + */ + data: { + showSuccess:false, + img_host:app.hostConfig().imghost, + showArea:false, + cityName:'', + areaColumns:[ + { + values: [1,2], + className: 'column1', + }, + { + values: [3,4], + className: 'column2', + defaultIndex: 0 + }, + { + values: [3,4], + className: 'column3', + defaultIndex: 0 + }, + ], + showArea:false, + bankCardNo:'', + bankName:'', + cityId:'', + countyId:'', + provId:'', + name:'', + idCardNo:'', + signImg:'', + }, + opeArea(){ + this.setData({ + showArea:true + }) + }, + openOffice(){ + this.setData({ + showOffice:true, + }) + }, + openPosition(){ + this.setData({ + showPosition:true, + }) + }, + onChange(e){ + const {value} = e.detail; + + const {id}=e.currentTarget.dataset; + // console.log(value,id) + this.setData({ + [id]: value + }); + }, + onChangeArea(event){ + const { picker, value, index } = event.detail; + const provinceId=value[0].id; + const cityId=value[1].id; + if(index==0){ + this.handleGetArea(provinceId,2); + }else if(index==1){ + this.handleGetArea(cityId,3) + } + }, + confirmArea(event){ + const {value} = event.detail; + console.log(value); + let provId=value[0].id; + let cityId=value[1].id; + let countyId=value[2]?value[2].id:value[1].id; + let cityName=''; + for (let i = 0; i { + wx.showToast({ + title: '绑定成功', + icon:'none', + duration:2000, + success:function(){ + let timer=setTimeout(()=>{ + wx.switchTab({ + url: '/pages/index/index', + }) + clearTimeout(timer) + },1000) + } + }) + }) + }), + luhnCheck(cardNumber) { + var sum = 0; + var shouldDouble = false; + var digit; + + // 去除任何非数字字符 + cardNumber = cardNumber.replace(/\D/g, ''); + + // 从右向左遍历数字 + for (var i = cardNumber.length - 1; i >= 0; i--) { + digit = parseInt(cardNumber.charAt(i), 10); + + if (shouldDouble) { + if ((digit *= 2) > 9) digit -= 9; + } + + sum += digit; + shouldDouble = !shouldDouble; + } + + // 如果校验和能被10整除,则卡号有效 + return (sum % 10) === 0; + }, + goSign:throttle(function(){ + app.method.navigateTo({ + url:'/case/pages/signcanvas/signcanvas' + }) + }), + handleGetArea(id,type){ + getArea({ + parent:id + }).then(res=>{ + if(type==1){ + let obj='areaColumns[0].values'; + this.setData({ + [obj]:res + }) + this.handleGetArea(res[0].id,2) + }else if(type==2){ + let obj='areaColumns[1].values'; + this.setData({ + [obj]:res + }) + this.handleGetArea(res[0].id,3) + }else{ + let obj='areaColumns[2].values'; + this.setData({ + [obj]:res + }) + + } + + }).catch(error=>{ + console.log(error) + }) + }, + handleGetOffice(){ + getOfficeList({}).then(res=>{ + this.setData({ + officeColumns:res + }) + }).catch(error=>{ + console.log(error) + }) + }, + handleGetPosition(){ + getPosition().then(res=>{ + this.setData({ + positionColumns:res + }) + this.handleNeedInfo(); + }) + }, + + + + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + this.handleGetArea('',1); + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + // onShareAppMessage() { + + // } +}) \ No newline at end of file diff --git a/case/pages/bankCard/bankCard.json b/case/pages/bankCard/bankCard.json new file mode 100644 index 0000000..49976f1 --- /dev/null +++ b/case/pages/bankCard/bankCard.json @@ -0,0 +1,16 @@ +{ + "usingComponents": { + "navBar":"../../../components/navBar/navBar", + "dialog":"../../../components/dialog/dialog", + "van-popup": "@vant/weapp/popup/index", + "van-icon": "@vant/weapp/icon/index", + "van-picker": "@vant/weapp/picker/index", + "van-field": "@vant/weapp/field/index", + "van-cell": "@vant/weapp/cell/index", + "van-button": "@vant/weapp/button/index", + "van-image": "@vant/weapp/image/index", + "van-uploader": "@vant/weapp/uploader/index", + "van-cell-group": "@vant/weapp/cell-group/index" + }, + "navigationStyle":"custom" +} \ No newline at end of file diff --git a/case/pages/bankCard/bankCard.wxml b/case/pages/bankCard/bankCard.wxml new file mode 100644 index 0000000..8f5dcc4 --- /dev/null +++ b/case/pages/bankCard/bankCard.wxml @@ -0,0 +1,51 @@ + + + + + 请确定开户人姓名与真实姓名一致 + + + + + + + + + + + + + + + + + + + + 签名 + + + 添加签名 + + + + + + + + + + 提交 + + + + + \ No newline at end of file diff --git a/case/pages/bankCard/bankCard.wxss b/case/pages/bankCard/bankCard.wxss new file mode 100644 index 0000000..1902212 --- /dev/null +++ b/case/pages/bankCard/bankCard.wxss @@ -0,0 +1,143 @@ +/* case/pages/bankCard/bankCard.wxss *//* case/pages/improveInfo/improveInfo.wxss */ +/* case/pages/register/register.wxss */ +page{ + overflow: hidden; +} +.page{ + height:calc(100vh - 172rpx); + margin-top: 172rpx; + display: flex; + flex-direction: column; + background-color: #F4F4F4; +} +.content{ + flex:1; + overflow: scroll; + -webkit-overflow-scrolling: touch; +} +.tip{ + height:80rpx; + display: flex; + font-size: 28rpx; + align-items: center; + color:#fff; + padding:0 32rpx; + background: #3881F7; + border-bottom:1px solid #ccc; +} +.next{ + margin: 40rpx 20rpx!important; +} +.prev{ + margin:-20rpx 20rpx 0!important ; +} +.van-field__label{ + white-space: nowrap; +} +.custom-class .van-cell:last-child{ + background-color: red; +} +.van-cell__title{ + white-space: nowrap; + display: flex; + color: #646566; + align-items: center; +} +.van-image{ + margin-top: 10rpx; +} +.van-cell{ + display: flex; + align-items: center; +} +.van-field__label,.van-cell__title{ + position: relative; +} +.signname .name{ + width: auto; + position: relative; +} +.van-field__label::after,.cert .van-cell__title::after{ + content: "*"; + color:red; + position: absolute; + top:12rpx; + right:-14rpx; +} +.signname .name::after{ + content: "*"; + color:red; + position: absolute; + top:4rpx; + right:-14rpx; +} +.cert .van-cell__title::after{ + top:4rpx; +} +.myclass .van-field__label::after{ + content: ""; +} +.upload{ + opacity:0; + position: absolute; + z-index:99; +} +.cert .van-cell{ + overflow: hidden; +} +.van-button{ + border-radius: 10rpx!important; +} +.imgCode{ + width:200rpx; + height:75.6rpx; +} +.custom-class{ + min-height:43.5px !important; +} +.van-field__label{ + color:#333!important; + padding:12rpx 0; + font-size: 15px!important; +} +.van-cell__title{ + color:#333!important; + font-size: 15px!important; +} +.buttonbox{ + position: absolute; + z-index:99; + display: flex; + width:600rpx; + left:50%; + transform: translateX(-50%); + justify-content: space-between; + bottom:50rpx; + } + .van-button--primary{ + background: linear-gradient(90deg, #377FF7 0%, #51AAFF 100%)!important; + border-color:#377FF7!important + } + .signbox{ + border: 0.5px solid #ebedf0; + border-left: none; + border-right: none; + padding:10px 16px; + background-color: #fff; + } + .uploadbox{ + margin-top: 20rpx; + width:300rpx; + height:300rpx; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + font-size: 28rpx; + color:#666; + border-radius: 10rpx; + background-color: #f7f8fa; + } + .uploadbox .name{ + margin-top: 10rpx; + } \ No newline at end of file diff --git a/case/pages/createCase/createCase.js b/case/pages/createCase/createCase.js new file mode 100644 index 0000000..e7b1552 --- /dev/null +++ b/case/pages/createCase/createCase.js @@ -0,0 +1,1237 @@ +// case/pages/createCase/createCase.js +import {addCase,caseDetail,editCase,getOssSign} from "../../../api/api" +const dayjs = require("../../../utils/dayjs"); +import {throttle} from "../../../utils/util" +import { FileUtil } from '../../../utils/fileutil' +const app=getApp(); +Page({ + /** + * 页面的初始数据 + */ + data: { + active:0, + wordLength:0, + showSaveBtn:true, + delIndex:'', + navName:'创建病例', + showDraft:false, + showUseDraft:false, + isUseDraft:false, + medicalRecordId:'', + dealIndex:0, + showTime:false, + showType:false, + img_host:app.hostConfig().imghost, + showTip:false, + showDel:false, + showAttention:false, + fileList_basic:[], + fileList_abstract:[], + fileList_check:[], + dpmas_list:[{fileList:[],treatTime:''}], + disable_ziliao:false, + disable_record:false, + disable_check:false, + columns:[ + { text: '四次及以上疗程化', value: 1 }, + { text: '早前期(INR≤1.5)', value: 2 } + ], + typeName:'', + case:{ + name:'', + uid:'', + sex:null, + age:'', + admissionTime:'', + caseType:'', + baseImg:'', + abstractStr:'', + abstractImg:'', + dpmas:[{ + 'dpmasImg':'', + 'treatTime':'' + }], + headTime:'', + afterTime:'', + headTb:'', + afterTb:'', + headAlt:'', + afterAlt:'', + headAlb:'', + afterAlb:'', + headAst:'', + afterAst:'', + headInr:'', + afterInr:'', + headDb:'', + afterDb:'', + headIb:'', + afterIb:'', + headPta:'', + afterPta:'', + headIl6:'', + afterIl6:'', + headTnf:'', + afterTnf:'', + checkImg:'' + }, + time_type:'date', + time_str:"hospitalTime", + time_title:'选择入院时间', + minHeight:{minHeight: 100}, + currentDate: new Date().getTime(), + maxDate:new Date().getTime(),//new Date().getTime(), + minDate:new Date('2023-01-01').getTime(), + formatter(type, value) { + if (type === 'year') { + return `${value}年`; + } + if (type === 'month') { + return `${value}月`; + }; + if(type === 'day'){ + return `${value}日`; + } + if(type === 'hour'){ + return `${value}时`; + } + if(type === 'minute'){ + return `${value}分`; + } + return value; + }, + }, + save:throttle(function(){ + this.data.medicalRecordId?this.handleEditCase():this.handleAddCase(); + }), + saveBasic(){ + if(this.validateBasic(true)){ + this.setData({ + active:1 + }) + + } + + !this.data.medicalRecordId && this.saveDraft(); + }, + saveAbstract(){ + if(this.validateZiliao(true)){ + this.setData({ + active:2 + }) + } + !this.data.medicalRecordId && this.saveDraft(); + }, + saveRecord(){ + if(this.validateRecord(true)){ + this.setData({ + active:3 + }) + } + !this.data.medicalRecordId && this.saveDraft(); + }, + goBack:throttle(function(){ + let {medicalRecordId}=this.data; + if(!medicalRecordId && this.isHasValue()){ + this.setData({ + showDraft:true + }) + }else{ + wx.navigateBack() + } + + }), + isHasValue(){ + let {name,uid,sex,age,admissionTime,caseType,abstractStr,headTime,afterTime,headTb,afterTb,headAlt,afterAlt,headAlb,afterAlb,headAst,afterAst,headInr,afterInr,headDb,afterDb,headIb,afterIb,headPta,afterPta,headIl6,afterIl6,headTnf,afterTnf}=this.data.case; + let {fileList_basic,fileList_abstract,fileList_check,dpmas_list}=this.data; + let hasTime=dpmas_list.some(item=>{ return item.fileList.length>0}); + + let hasImg=dpmas_list.some(item=>{ return item.treatTime!=''}); + + if(name || uid || sex || age || admissionTime || caseType || abstractStr || headTime || afterTime || headTb || afterTb || headAlt || afterAlt || headAlb || afterAlb || headAst || afterAst || headInr || afterInr || headDb || afterDb || headIb || afterIb || headPta || afterPta || headIl6 || afterIl6 || headTnf || afterTnf || fileList_basic.length>0 || fileList_abstract.length>0 || fileList_check.length>0 || hasTime || hasImg){ + return true + }else{ + return false + } + }, + handleAddCase(){ + let {fileList_basic,fileList_abstract,fileList_check,dpmas_list}=this.data; + let baseImg=''; + let abstractImg=''; + let checkImg=''; + if(this.validateBasic(true) && this.validateZiliao(true) && this.validateRecord(true) && this.validateCheck(true)){ + fileList_basic.forEach(item=>{ + if(baseImg){ + baseImg+="," +item.url + }else{ + baseImg+=item.url; + } + }) + fileList_abstract.forEach(item=>{ + if(abstractImg){ + abstractImg+="," +item.url + }else{ + abstractImg+=item.url; + } + }) + fileList_check.forEach(item=>{ + if(checkImg){ + checkImg+="," +item.url + }else{ + checkImg+=item.url; + } + }); + dpmas_list.forEach((item,index)=>{ + let imgStr=''; + let itemArr=item.fileList; + itemArr.forEach((cell)=>{ + if(imgStr){ + imgStr+="," +cell.url + }else{ + imgStr+=cell.url; + } + }) + let cur='case.dpmas['+index+'].dpmasImg' + this.setData({ + [cur]:imgStr + }) + }) + this.setData({ + 'case.baseImg':baseImg, + 'case.abstractImg':abstractImg, + 'case.checkImg':checkImg + }) + let caseObj=this.data.case; + let {admissionTime,headTime,afterTime}=this.data.case; + Object.assign(caseObj,{ + admissionTime:dayjs(admissionTime).format('YYYY-MM-DD HH:mm:ss'), + headTime:dayjs(headTime).format('YYYY-MM-DD HH:mm:ss'), + afterTime:dayjs(afterTime).format('YYYY-MM-DD HH:mm:ss') + }) + + addCase({...caseObj}).then(res=>{ + wx.showToast({ + title: '病例创建成功', + icon:'none' + }) + // if(this.data.isUseDraft){ + wx.setStorageSync('caseDraft','') + // } + wx.navigateBack(); + }) + } + + }, + handleEditCase(){ + let {fileList_basic,fileList_abstract,fileList_check,dpmas_list,medicalRecordId}=this.data; + let baseImg=''; + let abstractImg=''; + let checkImg=''; + if(this.validateBasic(true) && this.validateZiliao(true) && this.validateRecord(true) && this.validateCheck(true)){ + fileList_basic.forEach(item=>{ + if(baseImg){ + baseImg+="," +item.url + }else{ + baseImg+=item.url; + } + }) + fileList_abstract.forEach(item=>{ + if(abstractImg){ + abstractImg+="," +item.url + }else{ + abstractImg+=item.url; + } + }) + fileList_check.forEach(item=>{ + if(checkImg){ + checkImg+="," +item.url + }else{ + checkImg+=item.url; + } + }); + dpmas_list.forEach((item,index)=>{ + let imgStr=''; + let itemArr=item.fileList; + itemArr.forEach((cell)=>{ + if(imgStr){ + imgStr+="," +cell.url + }else{ + imgStr+=cell.url; + } + }) + let cur='case.dpmas['+index+'].dpmasImg' + this.setData({ + [cur]:imgStr + }) + }) + this.setData({ + 'case.baseImg':baseImg, + 'case.abstractImg':abstractImg, + 'case.checkImg':checkImg + }) + let {admissionTime,headTime,afterTime}=this.data.case; + this.setData({ + 'case.id':medicalRecordId + }) + let caseObj=this.data.case; + + + Object.assign(caseObj,{ + admissionTime:dayjs(admissionTime).format('YYYY-MM-DD HH:mm:ss'), + headTime:dayjs(headTime).format('YYYY-MM-DD HH:mm:ss'), + afterTime:dayjs(afterTime).format('YYYY-MM-DD HH:mm:ss') + }) + editCase({...caseObj}).then(res=>{ + wx.showToast({ + title: '病例修改成功', + icon:'none' + }) + wx.navigateBack(); + }) + } + + }, + initAllvalue(res){ + let caseObj=this.data.case; + for (const key in caseObj) { + if(key=="admissionTime"){ + this.setData({ + ['case.'+key]:res[key]?dayjs(res[key]).format('YYYY-MM-DD'):'' + }) + }else if(key=='caseType'){ + let {columns}=this.data; + for (let i = 0; i < columns.length; i++) { + if(columns[i].value==res[key]){ + this.setData({ + ['case.'+key]:res[key], + 'typeName': columns[i].text + }) + break; + } + + } + }else if(key=='baseImg'){ + if(res[key]){ + let imgList=res[key].split(','); + this.setData({ + ['case.'+key]:res[key], + fileList_basic:imgList.map(item=>{ + return {url:item} + }) + }) + } + + }else if(key=='abstractImg'){ + if(res[key]){ + let imgList=res[key].split(','); + this.setData({ + ['case.'+key]:res[key], + fileList_abstract:imgList.map(item=>{ + return {url:item} + }) + }) + } + }else if(key=='checkImg'){ + if(res[key]){ + let imgList=res[key].split(','); + console.log(imgList) + this.setData({ + ['case.'+key]:res[key], + fileList_check:imgList.map(item=>{ + return {url:item} + }) + }) + } + + }else if(key=='dpmas'){ + let arr=res[key]; + this.setData({ + ['case.'+key]:arr + }) + arr.forEach((item,index)=>{ + if(item.dpmasImg){ + let imgList=item.dpmasImg.split(','); + + let objFile="dpmas_list["+index+"].fileList"; + let objTime="dpmas_list["+index+"].treatTime" + this.setData({ + [objFile]:imgList.map(item1=>{ + return {url:item1} + }), + [objTime]:item.treatTime?dayjs(item.treatTime).format('YYYY-MM-DD HH'):'' + }) + } + + }) + + }else if(key=='headTime' || key=='afterTime'){ + this.setData({ + ['case.'+key]:res[key]?dayjs(res[key]).format('YYYY-MM-DD HH'):'' + }) + }else if(key=='abstractStr'){ + this.setData({ + wordLength:res[key].length, + ['case.'+key]:res[key] + }) + + }else{ + this.setData({ + ['case.'+key]:res[key] + }) + } + + } + }, + handleCaseDetail(){ + let { medicalRecordId}=this.data; + caseDetail(medicalRecordId).then(res=>{ + this.initAllvalue(res) + }) + }, + onBeforeChange(event){ + let {index,callback}=event.detail; + if(index==0){ + this.setData({ + active:0 + }) + callback(true); + }else if(index==1){ + if(this.validateBasic()){ + callback(true); + this.setData({ + active:1 + }) + }else{ + this.setData({ + showAttention:true + }) + callback(false) + } + }else if(index==2){ + if(this.validateBasic(false) && this.validateZiliao(false)){ + callback(true); + this.setData({ + active:2 + }) + }else{ + this.setData({ + showAttention:true + }) + callback(false) + } + }else if(index==3){ + if(this.validateBasic(false) && this.validateZiliao(false) && this.validateRecord(false)){ + callback(true); + this.setData({ + active:3 + }) + }else{ + this.setData({ + showAttention:true + }) + callback(false) + } + } + }, + confirmDelRecord(event){ + let {index}=event.currentTarget.dataset; + this.setData({ + showDel:true, + delIndex:index + }) + }, + delRecord(){ + let {dpmas}=this.data.case; + let {dpmas_list}=this.data; + let index=this.data.delIndex; + dpmas.splice(index,1); + dpmas_list.splice(index,1); + this.setData({ + 'case.dpmas':dpmas, + dpmas_list:dpmas_list + }) + + }, + addRecord(){ + this.setData({ + 'case.dpmas':this.data.case.dpmas.concat([{ + 'dpmasImg':'', + 'treatTime':'' + }]), + 'dpmas_list':this.data.dpmas_list.concat({fileList:[]}) + + }) + }, + onClickDisabled(event){ + let {index}=event.detail; + if(index==1){ + this.validateBasic(false); + }else if(index==2){ + this.validateBasic(); + this.validateZiliao(); + }else if(index==3){ + this.validateBasic(); + this.validateZiliao(); + this.validateRecord(); + } + + }, + validateBasic(flag){ + let {name,uid,sex,age,admissionTime,caseType}=this.data.case; + let {fileList_basic}=this.data; + if(!name){ + flag && wx.showToast({ + title: '患者姓名不能为空', + icon:"none" + }) + return false + } + if(!uid){ + flag && wx.showToast({ + title: '患者ID号不能为空', + icon:"none" + }) + return false + } + if(!sex){ + console.log(flag) + flag && wx.showToast({ + title: '性别不能为空', + icon:"none" + }) + return false + } + if(!age){ + flag && wx.showToast({ + title: '年龄不能为空', + icon:"none" + }) + return false + } + if(!admissionTime){ + flag && wx.showToast({ + title: '入院时间不能为空', + icon:"none" + }) + return false + } + if(!caseType){ + flag && wx.showToast({ + title: '病例类型不能为空', + icon:"none" + }) + return false + } + if(fileList_basic.length==0){ + flag && wx.showToast({ + title: '请上传病案照片', + icon:"none" + }) + return false + } + return true + }, + validateZiliao(flag){ + let {abstractStr}=this.data.case; + let {fileList_abstract}=this.data; + if( !abstractStr && fileList_abstract.length==0){ + flag && wx.showToast({ + title: '病历摘要和病历图片至少要提交一项', + icon:"none" + }) + return false + } + return true + }, + validateRecord(flag){ + let {dpmas,admissionTime,caseType}=this.data.case; + let {dpmas_list}=this.data; + + if(caseType==1 && dpmas.length<4){ + flag && wx.showToast({ + title: 'DPMAS治疗不少于4次', + icon:'none' + }) + return false; + }; + if(caseType==2 && dpmas.length<1){ + flag && wx.showToast({ + title: 'DPMAS治疗不少于1次', + icon:'none' + }) + return false; + } + for (let i = 0; i < dpmas.length; i++) { + if(!dpmas[i].treatTime){ + flag && wx.showToast({ + title: '第'+(i+1)+'次治疗时间不能为空', + icon:'none' + }) + return false; + } + }; + let time1=dayjs(admissionTime).format('YYYY-MM-DD'); + let time2=dayjs(dpmas[0].treatTime).format('YYYY-MM-DD'); + + if(dayjs(time1).diff(dayjs(time2))>0){ + flag && wx.showToast({ + title: '患者基本信息入院时间应该早于第一次治疗时间', + icon:'none' + }) + return false; + } + for (let i = 0; i < dpmas.length-1; i++) { + if(dayjs(dpmas[i].treatTime).diff(dayjs(dpmas[i+1].treatTime))>0){ + flag && wx.showToast({ + title: '第'+(i+1)+'次治疗时间应该早于第'+(i+2)+'次治疗时间', + icon:'none' + }) + return false; + } + + } + for (let index = 0; index =0 && dayjs(headTime_new).diff(dayjs(firstTime))<=0)){ + flag && wx.showToast({ + title: '治疗前检测时间应该在入院时间与第一次治疗时间之间', + icon:"none" + }) + return false + } + if(dpmas.length<2){ + if(!(dayjs(afterTime_new).diff(dayjs(firstTime))>=0)){ + flag && wx.showToast({ + title: '治疗后检测时间应该在第一次之后', + icon:"none" + }) + return false + } + + }else{ + let secondTime=dayjs(dpmas[1].treatTime).format('YYYY-MM-DD') + if(!(dayjs(afterTime_new).diff(dayjs(firstTime))>=0 && dayjs(afterTime_new).diff(dayjs(secondTime))<=0)){ + flag && wx.showToast({ + title: '治疗后检测时间应该在第一次与第二次治疗时间之间', + icon:"none" + }) + return false + }; + } + + + }; + if(caseType==1){ + if(!(dayjs(headTime_new).diff(dayjs(admissionTime_new))>=0 && dayjs(headTime_new).diff(dayjs(firstTime))<=0)){ + flag && wx.showToast({ + title: '治疗前检测时间应该在入院时间与第一次治疗时间之间', + icon:"none" + }) + return false + } + if(!(dayjs(afterTime_new).diff(dayjs(lastTime)>=0))){ + flag && wx.showToast({ + title: '治疗后检测时间应该最后一次治疗时间之后', + icon:"none" + }) + return false + } + } + if(!headTb || !afterTb){ + flag && wx.showToast({ + title: '总胆红素未填写完整', + icon:"none" + }) + return false + }; + if(!headAlt || !afterAlt){ + flag && wx.showToast({ + title: '谷丙转氨酶未填写完整', + icon:"none" + }) + return false + }; + if(!headInr || !afterInr){ + flag && wx.showToast({ + title: '国际标准化比值未填写完整', + icon:"none" + }) + return false + } + // if(!headDb || !afterDb){ + // flag && wx.showToast({ + // title: '直接胆红素未填写完整', + // icon:"none" + // }) + // return false + // } + // if(!headIb || !afterIb){ + // flag && wx.showToast({ + // title: '间接胆红素未填写完整', + // icon:"none" + // }) + // return false + // } + // if(!headPta || !afterPta){ + // flag && wx.showToast({ + // title: '凝血酶原活动度未填写完整', + // icon:"none" + // }) + // return false + // } + // if(!headIl6 || !afterIl6){ + // flag && wx.showToast({ + // title: '白介素6未填写完整', + // icon:"none" + // }) + // return false + // } + // if(!headTnf || !afterTnf){ + // wx.showToast({ + // title: '肿瘤坏死因子', + // icon:"none" + // }) + // return false + // } + if(fileList_check.length==0){ + flag && wx.showToast({ + title: '请上传报告单', + icon:"none" + }) + return false + } + return true; + }, + onChangeAbstract(event){ + let {value}=event.detail + this.setData({ + wordLength:value.length>500?500:value.length, + 'case.abstractStr':value.length>500?value.substring(0,500):value + }) + }, + openType(){ + if(!this.data.showSaveBtn)return; + this.setData({ + showType:true, + }) + }, + onCancelType(){ + this.setData({ + showType:false, + }) + }, + onConfirmType(event){ + let {value,text}=event.detail.value; + this.setData({ + showType:false, + 'typeName':text, + 'case.caseType':value + }) + }, + saveDraft(){ + let {fileList_basic,fileList_abstract,fileList_check,dpmas_list}=this.data; + let baseImg=''; + let abstractImg=''; + let checkImg=''; + fileList_basic.forEach(item=>{ + if(baseImg){ + baseImg+="," +item.url + }else{ + baseImg+=item.url; + } + }) + fileList_abstract.forEach(item=>{ + if(abstractImg){ + abstractImg+="," +item.url + }else{ + abstractImg+=item.url; + } + }) + fileList_check.forEach(item=>{ + if(checkImg){ + checkImg+="," +item.url + }else{ + checkImg+=item.url; + } + }); + dpmas_list.forEach((item,index)=>{ + let imgStr=''; + let itemArr=item.fileList; + itemArr.forEach((cell)=>{ + if(imgStr){ + imgStr+="," +cell.url + }else{ + imgStr+=cell.url; + } + }) + let cur='case.dpmas['+index+'].dpmasImg' + this.setData({ + [cur]:imgStr + }) + }) + this.setData({ + 'case.baseImg':baseImg, + 'case.abstractImg':abstractImg, + 'case.checkImg':checkImg + }) + let caseObj=this.data.case; + let {admissionTime,headTime,afterTime}=this.data.case; + Object.assign(caseObj,{ + admissionTime:admissionTime?dayjs(admissionTime).format('YYYY-MM-DD HH:mm:ss'):'', + headTime:headTime?dayjs(headTime).format('YYYY-MM-DD HH:mm:ss'):'', + afterTime:afterTime?dayjs(afterTime).format('YYYY-MM-DD HH:mm:ss'):'' + }) + wx.setStorageSync("draftTime",dayjs(new Date().getTime()).format('YYYY-MM-DD')); + wx.setStorageSync('caseDraft',JSON.stringify({...caseObj})) + + }, + onConfirmUseDraft(){ + let caseDraft=wx.getStorageSync('caseDraft'); + if(caseDraft){ + this.initAllvalue(JSON.parse(caseDraft)) + } + this.setData({ + showUseDraft:false, + isUseDraft:true + }) + + }, + onCancelUseDraft(){ + this.setData({ + showUseDraft:false + }); + + }, + onConfirmDraft(){ + this.saveDraft() + this.setData({ + showDraft:false + }); + + wx.navigateBack() + }, + onCancelDraft(){ + this.setData({ + showDraft:false + }) + wx.navigateBack() + }, + onConfirmAttention(){ + this.setData({ + showAttention:false + }) + }, + onConfirmTip(){ + this.setData({ + showTip:false + }) + }, + onConfirmDel(){ + this.setData({ + showDel:false + }) + this.delRecord(); + }, + onCancelDel(){ + this.setData({ + showDel:false + }) + }, + cancelDate(){ + this.setData({ + showTime:false, + }); + }, + onInput(event) { + this.setData({ + currentDate: event.detail, + }); + }, + confirmDate(event) { + let {time_str,dealIndex}=this.data; + let key=''; + let time=''; + if(time_str=="hospitalTime"){ + key='admissionTime' + time=dayjs(event.detail).format('YYYY-MM-DD') + }else if(time_str=="dealTime"){ + key="dealTime" + let year=dayjs(event.detail).format('YYYY') + if(year!=2024){ + this.setData({ + showTip:true, + showTime:false + }) + return false + } + time=dayjs(event.detail).format('YYYY-MM-DD HH:mm'); + + }else if(time_str=="headTime"){ + key="headTime" + time=dayjs(event.detail).format('YYYY-MM-DD HH') + }else if(time_str=="afterTime"){ + key="afterTime"; + time=dayjs(event.detail).format('YYYY-MM-DD HH') + } + if(key=="dealTime"){ + const obj = "case.dpmas[" + dealIndex + "].treatTime" + const oterobj="dpmas_list[" + dealIndex + "].treatTime" + this.setData({ + showTime:false, + currentDate: event.detail, + [oterobj]:dayjs(time).format('YYYY-MM-DD HH'), + [obj]:time+ ":00" + }) + console.log(this.data.case.dpmas) + }else{ + this.setData({ + currentDate: event.detail, + showTime:false, + ['case.'+key]: time, + }); + } + + + }, + handleIpt(e){ + let key = e.target.dataset.id; + let type=e.target.dataset.type; + if(key=='name'){ + let value=e.detail.value; + let newVal=value.toUpperCase(); + this.setData({ + ['case.'+key]:newVal + }) + }else{ + let iptValue=''; + let tempValue=e.detail.value; + if( type=='number'){ + console.log(this.countDecimals(tempValue)); + iptValue=this.countDecimals(tempValue)>3?Number(tempValue).toFixed(3):tempValue + }else{ + iptValue=tempValue + } + this.setData({ + ['case.'+key]:key=="age"?Number(e.detail.value):iptValue + }) + } + + + }, + countDecimals(num) { + // 将数值转换为字符串 + const str = String(num); + // 匹配小数点及其后面的数字 + const match = str.match(/\.(\d+)/); + // 返回小数位数 + return match ? match[1].length : 0; + }, + openTime(){ + if(!this.data.showSaveBtn)return; + const caseInfo=this.data.case; + this.setData({ + showTime:true, + currentDate:caseInfo.admissionTime?new Date(caseInfo.admissionTime).getTime():new Date().getTime(), + time_type:'date', + time_str:"hospitalTime", + time_title:'选择入院时间', + }) + }, + openDealTime(event){ + if(!this.data.showSaveBtn)return; + const caseInfo=this.data.case; + let {index}=event.currentTarget.dataset; + console.log( caseInfo.dpmas ) + console.log(caseInfo.dpmas[index].treatTime) + this.setData({ + showTime:true, + currentDate:caseInfo.dpmas[index].treatTime?new Date(dayjs(caseInfo.dpmas[index].treatTime).format("YYYY-MM-DD HH:mm:ss")).getTime():new Date().getTime(), + dealIndex:index, + time_type:'datetime', + time_str:"dealTime", + time_title:'选择治疗时间', + }) + }, + openHeadTime(){ + if(!this.data.showSaveBtn)return; + const caseInfo=this.data.case; + this.setData({ + showTime:true, + currentDate:caseInfo.headTime?new Date(dayjs(caseInfo.headTime).format("YYYY-MM-DD HH:mm:ss")).getTime():new Date().getTime(), + time_type:'datetime', + time_str:"headTime", + time_title:'选择治疗前检测时间', + }) + }, + openAfterTime(){ + if(!this.data.showSaveBtn)return; + const caseInfo=this.data.case; + this.setData({ + showTime:true, + currentDate:caseInfo.afterTime?new Date(dayjs(caseInfo.afterTime).format("YYYY-MM-DD HH:mm:ss")).getTime():new Date().getTime(), + time_type:'datetime', + time_str:"afterTime", + time_title:'选择治疗后检测时间', + }) + }, + onChange(event) { + this.setData({ + 'case.sex':Number(event.detail), + }); + }, + + deleteImg(event){ + const { fileList_basic,fileList_abstract,fileList_check,dpmas_list} = this.data; + const {name,index} = event.detail; + + if(name=='basic'){ + fileList_basic.splice(index,1); + this.setData({ + fileList_basic:fileList_basic + }) + }else if(name=="abstract"){ + fileList_abstract.splice(index,1); + this.setData({ + fileList_abstract:fileList_abstract + }) + }else if(name=="check"){ + fileList_check.splice(index,1); + this.setData({ + fileList_check:fileList_check + }) + }else if(name.indexOf("record")!=-1){ + let recordIndex=Number(name.split("record")[1]); + dpmas_list[recordIndex].fileList.splice(index,1); + let obj="dpmas_list["+ recordIndex +"].fileList" + this.setData({ + [obj]:dpmas_list[recordIndex].fileList + }) + } + }, + uploadImg(file,name){ + let THIS = this; + return new Promise((resolve, reject) => { + getOssSign(1).then(resdata=>{ + let { accessid, dir,policy,signature,host} = resdata; + let imgUrl = file; + //let index = imgUrl.lastIndexOf("/"); + let filename = FileUtil.UUID()+'.'+imgUrl.match(/\.(\w+)$/)[1]; + + //imgUrl.substring(index + 1, imgUrl.length); + + wx.uploadFile({ + url: host, // 仅为示例,非真实的接口地址 + filePath: file, + name: 'file', + formData: { + OSSAccessKeyId: accessid, + policy, + key: dir + filename, + signature + }, + success(res) { + + if (res.statusCode === 204) { + resolve(true) + let url = host + '/' + dir + filename; + // 上传完成需要更新 fileList + console.log('11111111111111'); + console.log(url); + if(name=='basic'){ + const { fileList_basic} = THIS.data; + fileList_basic.push({ url: url }); + THIS.setData({ fileList_basic }); + }else if(name=='abstract'){ + const { fileList_abstract} = THIS.data; + fileList_abstract.push({ url: url }); + THIS.setData({ fileList_abstract }); + }else if(name=='check'){ + const { fileList_check} = THIS.data; + fileList_check.push({ url: url }); + THIS.setData({ fileList_check}); + }else if(name.indexOf("record")!=-1){ + let recordIndex=Number(name.split("record")[1]); + let obj="dpmas_list[" +recordIndex +"].fileList" + THIS.setData({ + [obj]:THIS.data.dpmas_list[recordIndex].fileList.concat([{ url: url }]) + }) + } + + }else{ + reject(false) + } + }, + fail: err => { + console.log(err); + } + }); + }) + + + }) + + }, + afterRead(event) { + + console.log( event.detail) + const { file,name} = event.detail; + console.log(file) + wx.showLoading({ + title: '图片上传中', + mask: true + }) + var promiseFun = []; + for (let i = 0; i < file.length; i++) { + var cur_file = file[i].url; + promiseFun.push( + this.uploadImg(cur_file,name) + ) + }; + Promise.all(promiseFun).then((res) => { + wx.showToast({ + title: '图片上传成功', + icon: "none" + }) + console.log(res.length+"张上传成功"); + wx.hideLoading(); + + }).catch(error=>{ + wx.showToast({ + title: '图片上传失败', + icon: "none" + }) + console.log(error) + wx.hideLoading(); + }); + + // 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式 + // wx.uploadFile({ + // url: 'https://example.weixin.qq.com/upload', // 仅为示例,非真实的接口地址 + // filePath: file.url, + // name: 'file', + // formData: { user: 'test' }, + // success(res) { + // // 上传完成需要更新 fileList + // const { fileList = [] } = this.data; + // fileList.push({ ...file, url: res.data }); + // this.setData({ fileList }); + // }, + // }); + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + if(options.medicalRecordId){ + if(options.status==0 || options.status==1){ + this.setData({ + medicalRecordId:options.medicalRecordId, + navName:'查看病例', + showSaveBtn:false, + }) + }else{ + this.setData({ + showSaveBtn:true, + medicalRecordId:options.medicalRecordId, + navName:'病例详情' + }) + } + this.handleCaseDetail(); + }else{ + let caseDraft=wx.getStorageSync('caseDraft'); + this.setData({ + showSaveBtn:true, + }) + if(caseDraft){ + this.setData({ + showUseDraft:true + }) + } + } + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + // onShareAppMessage() { + + // } +}) \ No newline at end of file diff --git a/case/pages/createCase/createCase.json b/case/pages/createCase/createCase.json new file mode 100644 index 0000000..1ad8a33 --- /dev/null +++ b/case/pages/createCase/createCase.json @@ -0,0 +1,17 @@ +{ + "usingComponents": { + "navBar":"../../../components/navBar/navBar", + "van-tab": "@vant/weapp/tab/index", + "van-tabs": "@vant/weapp/tabs/index", + "van-picker": "@vant/weapp/picker/index", + "van-icon": "@vant/weapp/icon/index", + "van-uploader": "@vant/weapp/uploader/index", + "van-popup": "@vant/weapp/popup/index", + "dialog":"../../../components/dialog/dialog", + "van-datetime-picker": "@vant/weapp/datetime-picker/index", + "van-radio": "@vant/weapp/radio/index", + "van-field": "@vant/weapp/field/index", + "van-radio-group": "@vant/weapp/radio-group/index" + }, + "navigationStyle":"custom" +} \ No newline at end of file diff --git a/case/pages/createCase/createCase.wxml b/case/pages/createCase/createCase.wxml new file mode 100644 index 0000000..fbf5b83 --- /dev/null +++ b/case/pages/createCase/createCase.wxml @@ -0,0 +1,454 @@ + + + + + {{navName}} + + + + + + + + + + 患者姓名(首字母大写)* + + + + + + + + 患者ID号* + + + + + + + + 性别* + + + + + + + + + + + 年龄* + + + + + + + + 入院时间* + + + + + + + + + 病例类型* + + + + + + + + + 病案照片(可上传1-6张)* + + + + + + + 注意:“病案首页”需包含患者住院号或姓名 + + 下一步 + + + + + + + + + + + 病历摘要 + +