Explorar o código

fix
互联网医院—医生主页模块

LINZHENYANG\林振洋 hai 3 semanas
pai
achega
274bffef64

+ 3 - 0
.cursorrules

@@ -24,6 +24,9 @@
    - **icon**:`import icon from '@/utils/icon'` (默认导入)。
    - **getAuthorize**:`util.getAuthorize` -> `common.getAuthorize`。
    - **Legacy Utils**: `getState.js`, `pagesPatientFn.js` -> `import { getState, pagesPatientFn } from '@/uni-app-base/utils'`.
+   - **生命周期钩子**:必须使用封装好的 `useOnLoad`,严禁直接使用 `@dcloudio/uni-app` 的 `onLoad`。
+     - 导入:`import { useOnLoad } from '@/hook'`
+     - 使用:`useOnLoad((options) => { ... })`
 
 3. **Vue 3 组件规范**:
    - **实例**:`<script setup>` 顶层 `const { proxy } = getCurrentInstance(); const app = getApp();`。

+ 8 - 2
WX_TO_UNIAPP_RULES.md

@@ -12,11 +12,17 @@
     *   **重要**:接口导入**必须**使用解构导入(Named Imports),严禁使用默认对象导入(`import service from ...`)。
     *   示例:`import { updateAccountAuthList as updateAccountAuthListApi, backstageDelUserMember_V3 } from '@/pagesPersonal/service/patientManagement';`
 2.  **接口返回**:**必须**遵循 `7.8 接口封装调用规范`。业务层调用 Service 方法时,**必须**使用解构获取返回值(如 `let { resp, resData } = await api()`)。严禁只解构 `{ resp }` 或假设接口直接返回数据对象。
-3.  **参数解码**:`onLoad` 解析参数时,`JSON.parse` **必须**包裹在 `try-catch` 中,防止因字符截断导致的白屏。
+3.  **接口导入规范**:
+    *   **导入路径**:严禁使用 `import { doctor } from '@/pagesNetHos/st1/service/doctor'`(默认导入对象)。
+    *   **正确写法**:必须从 `index.ts` 使用命名导入,如 `import { queryUserCollect, queryBDoctorList } from '@/pagesNetHos/st1/service/doctor/index'`。
+    *   **别名处理**:当导入的接口函数名与页面内的业务函数名冲突时,**必须**使用别名重命名(如 `queryAppraiseList as queryAppraiseListApi`)。
+    *   **调用方式**:严禁对象调用(`doctor.queryUserCollect()` ❌),必须直接调用函数(`queryUserCollect()` ✅)。
+4.  **参数解码**:`onLoad` 解析参数时,`JSON.parse` **必须**包裹在 `try-catch` 中,防止因字符截断导致的白屏。
 4.  **Dataset**:模板中保留 `data-xxx` 时,JS 中必须使用 `e.currentTarget?.dataset?.xxx` 安全访问,防止 `undefined` 报错。
 5.  **变量冲突**:接口方法名与本地变量冲突时,**必须**重命名本地变量(如 `acceptCredit` -> `targetStatus`)。
 6.  **样式单位**:严禁使用 `rpx`。**必须**全文批量替换为 `upx`。
-7.  **工具类替代**:
+7.  **样式导入**:导入 `.scss`/`.css` 文件时,**必须**写完整扩展名(如 `@import '@/xxx/common.scss'`)。严禁省略扩展名。
+8.  **工具类替代**:
     *   `publicFn.getMember` -> `await useGetMember()`
     *   `util.getAuthorize` -> `common.getAuthorize`
     *   `utils` 导入 -> `import { common } from '@/utils'` (Common) / `import icon from '@/utils/icon'` (Icon)

+ 31 - 16
config/menu.ts

@@ -107,22 +107,37 @@ export const menu = [
 				IsUse: '1',
 				Children: [
 					{
-						MenuName: '互联网+护理',
-						IsUse: '1',
-						IsShow: '1',
-						Icon: 'https://demo.kasitesoft.com/uploadFile/ui/image/menu/homePage_menuYygh.png',
-						Topic: '',
-						Url: '/pagesNetHos/st1/business/nurse/nurseDeptList/nurseDeptList',
-					},
-					{
-						MenuName: '门诊结算',
-						Topic: ['mzjs'],
-						OtherParam: '',
-						IsUse: '1',
-						IsShow: '1',
-						Icon: 'https://demo.kasitesoft.com/uploadFile/ui/image/menu/homePage_menuBgcx.png',
-						Url: '/pagesNetHos/st1/business/prescription/prescriptionList/prescriptionList',
-					},
+            "MenuName": "互联网+护理",
+            "IsUse": "1",
+            "IsShow": "1",
+            "Icon": "https://demo.kasitesoft.com/uploadFile/ui/image/menu/homePage_menuYygh.png",
+            "Topic": "",
+            "Url": "/pagesNetHos/st1/business/nurse/nurseDeptList/nurseDeptList"
+          }, {
+            "MenuName": "门诊结算",
+            "Topic": ["mzjs"],
+            "OtherParam": "",
+            "IsUse": "1",
+            "IsShow": "1",
+            "Icon": "https://demo.kasitesoft.com/uploadFile/ui/image/menu/homePage_menuBgcx.png",
+            "Url": "/pagesNetHos/st1/business/prescription/prescriptionList/prescriptionList"
+          }, {
+            "MenuName": "团队问诊",
+            "OtherParam": "",
+            "IsUse": "1",
+            "IsShow": "1",
+            "Icon": "https://demo.kasitesoft.com/uploadFile/ui/image/menu/homePage_menuYygh.png",
+            "Children": [],
+            "Url": "/pagesNetHos/st1/business/doctorGroup/groupDeptList/groupDeptList"
+          }, {
+            "MenuName": "即时问诊",
+            "OtherParam": "",
+            "IsUse": "1",
+            "IsShow": "1",
+            "Icon": "https://demo.kasitesoft.com/uploadFile/ui/image/menu/homePage_menuYygh.png",
+            "Children": [],
+            "Url": "/pagesNetHos/st1/business/quickConsulta/quickDeptList/quickDeptList"
+          }
 				],
 			},
 		],

+ 4 - 3
manifest.json

@@ -42,11 +42,12 @@
     },
     "quickapp" : {},
     "mp-weixin" : {
-        "appid" : "wxede0b125eed31b0d",
+        "appid" : "wx3cf937079d74124f",
         "setting" : {
             "urlCheck" : false,
-            "es6" : false,
-            "minified" : true
+            "es6" : true,
+            "minified" : true,
+            "postcss" : true
         },
         "usingComponents" : true,
         "optimization" : {

+ 53 - 1
pages.json

@@ -31,6 +31,13 @@
 			"style": {
 				"navigationBarTitleText": "更多"
 			}
+		},
+		{
+			"path": "pages/st1/business/tabbar/netHosIndex/netHosIndex",
+			"style": {
+				"navigationBarTitleText": "互联网医疗服务平台",
+				"navigationStyle": "custom"
+			}
 		},{
 			"path": "pages/st1/components/pageActive/st1/business/activeFlowIndex/activeFlowIndex",
 			"style": {
@@ -497,6 +504,44 @@
 				"navigationBarTitleText": "历史医生"
 			}
 		}]
+	}, {
+		"root": "pagesNetHos",
+		"pages": [
+      {
+			"path": "st1/business/doctor/doctorList/doctorList",
+			"style": {
+				"navigationBarTitleText": "找医生",
+				"usingComponents": {
+					"screen": "/pagesNetHos/st1/components/screen/screen",
+					"noData": "/pages/st1/components/noData/noData"
+				}
+			}
+		},{
+			"path": "st1/business/other/doctorLike/doctorLike",
+			"style": {
+				"navigationBarTitleText": "关注医生",
+				"usingComponents": {
+					"noData": "/pages/st1/components/noData/noData"
+				}
+			}
+    },{
+			"path": "st1/business/doctor/doctorInfo/doctorInfo",
+			"style": {
+				"navigationBarTitleText": "医生主页",
+				"navigationStyle": "custom",
+				"usingComponents": {
+					"noData": "/pages/st1/components/noData/noData"
+				}
+			}
+		},{
+			"path": "st1/business/doctor/supplement/supplement",
+			"style": {
+				"navigationBarTitleText": "咨询",
+				"usingComponents": {
+				}
+			}
+		}
+  ]
 	}],
 	"globalStyle": {
 		"navigationBarTextStyle": "black",
@@ -514,7 +559,14 @@
 			"iconPath": "static/images/tabbar/homePage.png",
 			"selectedIconPath": "static/images/tabbar/homePage_ac.png",
 			"text": "首页"
-		}, {
+		}, 
+		{
+			"pagePath": "pages/st1/business/tabbar/netHosIndex/netHosIndex",
+			"iconPath": "static/images/tabbar/netHosIndex.png",
+			"selectedIconPath": "static/images/tabbar/netHosIndex_ac.png",
+			"text": "互联网医院"
+		},
+    {
 			"pagePath": "pages/st1/business/tabbar/personalCenter/personalCenter",
 			"iconPath": "static/images/tabbar/personalCenter.png",
 			"selectedIconPath": "static/images/tabbar/personalCenter_ac.png",

+ 1418 - 0
pages/st1/business/tabbar/netHosIndex/netHosIndex.vue

@@ -0,0 +1,1418 @@
+<template>
+  <view class="tabbar" :style="`padding-top:${statusBarHeight}px`">
+    <view class="p_inner p_flexCenter">{{ pageTitle }}</view>
+    <image class="p_back_img" mode="widthFix" :src="iconUrl.home_back_n"></image>
+  </view>
+
+  <view class="p_container" v-if="showCon" :style="`padding-top:${44 + statusBarHeight}px`">
+    <view class="p_content" :class="{ 'p_bt200': !concerned }">
+      <image class="p_back_img" mode="widthFix" :src="iconUrl.home_back_n"></image>
+      <view class="home_con">
+        <view class="p_search_con p_flexCenter">
+          <input class="p_search_input" placeholder-class="p_placeholder" placeholder="搜索医生" type="text"
+            @confirm="inputConfirm" v-model="searchVal" />
+        </view>
+        <view class="banner">
+          <swiper class="swiper" @change="swiperChange" :autoplay="true" circular :interval="5000" :duration="1000">
+            <swiper-item class="swiper_item" v-for="(item, ind) in bannerList" :key="ind" @click="bannerClkHandle"
+              :data-item="item">
+              <image class="banner_img" :src="item.ImgUrl"></image>
+            </swiper-item>
+          </swiper>
+          <view class="dot_list p_flexCenter">
+            <template v-for="(item, ind) in bannerList" :key="ind">
+              <view class="dot_item" :class="{ 'dot_item_active': ind == bannerIndex }"></view>
+            </template>
+          </view>
+        </view>
+        <swiper v-if="false && msgList.length > 0" autoplay vertical circular :interval="6000" :duration="1000"
+          class="message">
+          <template>
+            <template v-if="msgList.length > 0">
+              <swiper-item class="p_flexCenter" v-for="(item, key) in msgList" :key="key">
+                <view class="swiper_item_inner p_flexCenter">
+                  <image class="msg_icon" :src="iconUrl.home_msg"></image>
+                  <view class="msg_val">{{ item.backlogTipDiy }}</view>
+                  <view class="msg_btn p_bgcolor p_flexCenter" @click="mesClick">去处理</view>
+                </view>
+              </swiper-item>
+            </template>
+            <swiper-item v-else class="swiper_item_inner p_flexCenter">
+              <image class="msg_icon" :src="iconUrl.home_msg"></image>
+              <view class="msg_val">暂无消息通知</view>
+            </swiper-item>
+          </template>
+        </swiper>
+        <view class="nav_line" @click="toDoctor" data-selected-type="xgzx" v-if="false">
+          <image class="item_back" :src="iconUrl.home_xgzx_n"></image>
+          <view class="item_tit" style="margin-bottom:25upx;">新冠在线咨询</view>
+          <view class="item_subtit_v2 mb10">在线免费图文咨询</view>
+          <view class="item_subtit_v2">权威医生在线解答</view>
+          <view class="item_btn">
+            点击咨询 <view class="right-arrow"></view>
+          </view>
+        </view>
+        <view class="nav_list p_flexBetween">
+          <view class="nav_item" @click="toDoctor" data-selected-type="twzx">
+            <image class="item_back" :src="iconUrl.home_twzx_n"></image>
+            <view class="item_tit_v2">图文咨询</view>
+            <view class="item_subtit">
+              <view>与医生本人</view>
+              <view>在线图文沟通</view>
+            </view>
+          </view>
+          <view class="nav_item nav_item_ask" @click="toDoctor" data-selected-type="spzx">
+            <image class="item_back" :src="iconUrl.home_spzx_n"></image>
+            <view class="item_tit">视频咨询</view>
+            <view class="item_subtit">通过视频交流,高效直接更清楚</view>
+          </view>
+        </view>
+      </view>
+      <!-- 互联网服务 -->
+      <view class="floot menuServices_box" v-if="menuObj?.Children?.[0]?.Children">
+        <view class="floot_top displayFlexBetween">
+          <view class="floot_title">
+            <view class="floot_titleName">互联网服务</view>
+          </view>
+        </view>
+        <view class="floot_lineFeed displayFlexBetween">
+          <template v-for="(item, index) in menuObj.Children[0].Children" :key="index">
+            <view class="floot_list menuList displayFlexCol" v-if="item.IsShow == '1'" :data-item="item"
+              @click="menuClickFn">
+              <image class="menuIcon" :src="item.Icon"></image>
+              <text class="menuText">{{ item.MenuName }}</text>
+            </view>
+          </template>
+        </view>
+      </view>
+      <view class="doctor_con" v-if="collectDocList.length > 0">
+        <view class="nav menu_fifth_title p_flexBetween">
+          <view class="displayFlexBetween">
+            <text v-for="(item, index) in doctorTabbar" :key="index"
+              :class="{ 'doctor_tabbar_active': doctorTabbarIndex == index }" :data-index="index"
+              @click="choiceTabbar">{{ item }}</text>
+          </view>
+          <view class="nav_tip p_color_9 p_flexCenter" @click="contentClick" data-type="collectDocListMore">
+            <text>更多</text>
+            <image class="nav_img" :src="iconUrl.home_right"></image>
+          </view>
+        </view>
+        <view class="doctor_swiper p_scroll">
+          <view class="doctor_item p_flexCenter" v-if="doctorTabbarIndex == 0" v-for="(item, ind) in collectDocList"
+            :key="ind" @click="toDoctorInfo" :data-item="item">
+            <view class="p_doctor_img_con">
+              <image class="p_doctor_img" :src="item.DoctorPhotourl"></image>
+            </view>
+            <view class="p_doctor_infocon">
+              <view class="p_doctor_tit p_flexBetween">
+                <view class="p_doctor_name p_lineClamp">{{ item.DoctorName }}</view>
+                <view class="p_doctor_tip p_flexCenter">
+                  <image class="p_doctor_star" :src="iconUrl.home_star"></image>
+                  <text class="p_doctor_starval">{{ item.scoreDiy }}</text>
+                </view>
+              </view>
+              <view class="p_doctor_info p_color_6 doctor_info">{{ item.LczcName }} {{ item.DeptName }}</view>
+            </view>
+          </view>
+          <view class="displayFlexBetween" v-if="doctorTabbarIndex == 1" style="width: 100%">
+            <template v-for="(item, index) in groupList" :key="index">
+              <view class="menu_fifth_doctor_group displayFlexCol" v-if="index < 2" :data-item="item"
+                @click="jumpGroupInfo">
+                <image class="group_photo" :src="item.GroupUrl" mode="" />
+                <view class="group_name displayFlexRow backgroundCustom">
+                  <text>{{ item.GroupName }}</text>
+                </view>
+              </view>
+            </template>
+          </view>
+        </view>
+      </view>
+      <view class="recommendDoc_con" v-if="doctorList.length > 0">
+        <view class="nav p_flexBetween">
+          <view class="nav_tit">名医推荐</view>
+        </view>
+        <view class="rec_inner">
+          <view class="p_doctor_item p_flexCenter" v-for="(item, ind) in doctorList" :key="ind" @click="toDoctorInfo"
+            :data-item="item">
+            <view class="p_doctor_img_con">
+              <image class="p_doctor_img" :src="item.DoctorPhotourl"></image>
+            </view>
+            <view class="p_doctor_item_con p_border_bottom">
+              <view class="p_flexBetween">
+                <view class="p_doctor_infocon">
+                  <view class="p_doctor_tit">
+                    <view class="p_doctor_name">{{ item.DoctorName }}</view>
+                    <view class="p_doctor_tip p_flexCenter">
+                      <image class="p_doctor_star" :src="iconUrl.home_star"></image>
+                      <text class="p_doctor_starval">{{ item.scoreDiy }}</text>
+                    </view>
+                  </view>
+                  <view class="p_doctor_info p_color_4d lineHeight">{{ item.TitleName }} {{ item.DeptName }}</view>
+                </view>
+                <view class="p_doctor_btn p_flexCenter">
+                  <view class="p_color" style="position: relative;z-index: 1;font-weight: bold;">快速问诊</view>
+                  <image class="p_doctor_btn_img" :src="iconUrl.home_tip_n"></image>
+                </view>
+              </view>
+              <view class="p_doctor_item_introduce p_color_8a p_lineClamp lineHeight">
+                擅长:{{ item.DoctorSkill }}
+              </view>
+              <view class="p_doctor_item_describe lineHeight">
+                接诊量
+                <text class="p_color font_bold">{{ item.ConsultAmount }}</text><text class="p_color_9"></text>
+                好评率
+                <text class="p_color font_bold">{{ item.percentage }}</text>
+              </view>
+            </view>
+          </view>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script lang="ts" setup>
+import { getCurrentInstance, ref } from 'vue';
+import { onShow } from '@dcloudio/uni-app';
+import { useOnLoad, useIsToAuthPage, useDomain } from '@/hook';
+import { common, menuClick } from '@/utils';
+import icon from '@/utils/icon';
+import { REQUEST_CONFIG } from '@/config';
+import {
+  queryConsultDeptList,
+  queryRcmdConsultDoctorList,
+  queryUserCollect,
+  queryBackLogMsg,
+  queryBDoctorList,
+  queryConsultWaterList,
+  queryArticleList,
+  queryConsultDoctorGroup,
+  saveConsultVisit
+} from '../../../service/base';
+
+const { proxy } = getCurrentInstance() as any;
+const app = getApp();
+
+// 响应式数据
+const iconUrl = ref(icon);
+const bannerList = ref<any[]>([]);
+const bannerIndex = ref(0);
+const doctorTabbar = ref(['关注的医生', '关注的团队']);
+const doctorTabbarIndex = ref(0);
+const groupList = ref<any[]>([]);
+const deptList = ref<any[]>([]);
+const doctorList = ref<any[]>([]);
+const collectDocList = ref<any[]>([]);
+const showCon = ref(false);
+const msgList = ref<any[]>([]);
+const searchVal = ref('');
+const statusBarHeight = ref(20);
+const pageTitle = ref('互联网医疗服务平台');
+const menuObj = ref<any>({});
+const concerned = ref(false);
+const options = ref<any>({});
+
+/** 页面初始加载 */
+useOnLoad(async (loadOptions) => {
+  options.value = loadOptions || {};
+  deptList.value = [];
+  if (useIsToAuthPage()) {
+    return;
+  }
+  siteFn();
+});
+
+/** 切换tabbar */
+const choiceTabbar = (e: any) => {
+  const index = e.currentTarget?.dataset?.index;
+  if (index == 1) {
+    // 查询咨询医生组
+    queryConsultDoctorGroupFn();
+  }
+  doctorTabbarIndex.value = index;
+};
+
+// 查询咨询医生组
+const queryConsultDoctorGroupFn = async () => {
+  const data = {
+    IsMemberCollect: 1
+  };
+  let { resp, resData } = await queryConsultDoctorGroup(data);
+  if (common.isNotEmpty(resp)) {
+    groupList.value = resp;
+  } else {
+    groupList.value = [];
+  }
+};
+
+onShow(() => {
+  statusBarHeight.value = app.globalData.statusBarHeight || 20;
+  showFn();
+});
+
+// 埋点
+const siteFn = async () => {
+  if (app.globalData.logSuccess) {
+    saveConsultVisitFn('26');
+  } else {
+    app.siteCallBack = saveConsultVisitFn.bind(null, '26');
+  }
+};
+
+const showFn = async () => {
+  /**H5回跳后重新登录 */
+  if (options.value.h5Login) {
+    await app.main();
+  }
+  if (app.globalData.logSuccess) {
+    main();
+  } else {
+    app.loginReadyCallBack = main;
+  }
+};
+
+const main = async () => {
+  // 深拷贝 否则影响morePage更多页面
+  let menuObjData: any = {};
+  const menuList = uni.getStorageSync('menuList');
+  if (!common.isEmpty(menuList)) {
+    menuObjData = common.deepCopy(menuList.filter((item: any) => item.MenuName == 'netHosPage')[0], {});
+  }
+  common.showLoading();
+  queryConsultWaterListFn();
+  let deptListData: any[] = [];
+  let doctorListData: any[] = [];
+  let collectDocListData: any[] = [];
+  let msgListData: any[] = [];
+  const requestOptions = {
+    showLoading: false
+  };
+  // 查询推荐科室
+  const deptListRequestData = {
+    HosId: app.globalData.districtId || app.globalData.hosId,
+    IsRcmd: '1'
+  };
+  const queryConsultDeptListPromise = queryConsultDeptList(deptListRequestData);
+  // 查询推荐医生
+  const queryRcmdConsultDoctorListPromise = queryRcmdConsultDoctorList(deptListRequestData);
+  // 查询关注医生
+  const collectData = {
+    resourceType: '1'
+  };
+  const queryUserCollectPromise = queryUserCollect(collectData);
+  const backLogData = {
+    OpenId: uni.getStorageSync('openid'),
+    BusinessId: '',
+    BacklogType: '', //1咨询申请2咨询消息3随访消息4医患申请5日程计划
+    ReadState: '1', //1未读 2已读
+    UserType: '1', //1.就诊人,2.医生
+    IsGroup: '1' //是否分组
+  };
+  const queryBackLogMsgPromise = queryBackLogMsg(backLogData);
+  const [
+    { resp: deptListResp },
+    { resp: doctorListResp },
+    { resp: collectListResp },
+    { resp: backLogMsgResp }
+  ] = await Promise.all([
+    queryConsultDeptListPromise,
+    queryRcmdConsultDoctorListPromise,
+    queryUserCollectPromise,
+    queryBackLogMsgPromise
+  ]);
+  getBannerImg();
+  deptListData = deptListResp || [];
+  doctorListData = doctorListResp || [];
+  if (!common.isEmpty(backLogMsgResp)) {
+    let filteredBackLog = backLogMsgResp.filter((item: any) => item.Status == '1');
+    if (!common.isEmpty(filteredBackLog)) {
+      filteredBackLog.map((item: any) => {
+        const { msgKeyList } = app.globalData;
+        if (msgKeyList) {
+          for (let i of msgKeyList) {
+            if (item.BacklogType == i.backlogType) {
+              item.backlogTitleDiy = i.title;
+              item.backlogTipDiy = i.content;
+            }
+          }
+        }
+      });
+      msgListData = filteredBackLog;
+    }
+  }
+  if (!common.isEmpty(collectListResp)) {
+    const arr: string[] = [];
+    for (let i = 0; i < collectListResp.length; i++) {
+      arr.push(collectListResp[i].ResourceId);
+    }
+    const queryBDoctorListData = {
+      DoctorUid: arr.join()
+    };
+    let { resp: collectDocListResp } = await queryBDoctorList(queryBDoctorListData);
+    common.hideLoading();
+    if (!common.isEmpty(collectDocListResp)) {
+      collectDocListData = collectDocListResp;
+    }
+  } else {
+    common.hideLoading();
+  }
+  menuObj.value = menuObjData;
+  deptList.value = deptListData;
+  doctorList.value = doctorListHandle(doctorListData);
+  collectDocList.value = doctorListHandle(collectDocListData);
+  showCon.value = true;
+  msgList.value = msgListData;
+  // 查询咨询医生组
+  queryConsultDoctorGroupFn();
+};
+
+const queryConsultWaterListFn = async () => {
+  const queryData = {
+    ConsultStartDate: common.getDate(),
+    ConsultEndDate: common.getDate(),
+    ConsultStatus: '16'
+  };
+  let { resp, resData } = await queryConsultWaterList(queryData);
+  if (!common.isEmpty(resp)) {
+    common.showModal(
+      `尊敬的患者,您已预约视频问诊,请点击该提示跳转到签到页面在就诊前30分钟完成在线签到`,
+      () => {
+        const item: any = {};
+        item.Url = `/pagesNetHos/st1/business/enquire/enquireList/enquireList?consultType=2&pageType=2`;
+        menuClick(item, proxy);
+      },
+      { cancelText: '取消', confirmText: '跳转' }
+    );
+  }
+};
+
+/**
+ * 查询文章列表,获取轮播图
+ */
+const getBannerImg = async () => {
+  /**首页轮播 */
+  const data = {
+    //0 新闻动态;1 通知公告;2 健康宣教;3 就诊指南;4 住院需知  62 首页banner
+    TypeClass: 62,
+    // 1已发布
+    Status: 1,
+    //1链接
+    Type: 1
+  };
+  let { resp, resData } = await queryArticleList(data);
+  let bannerListData: any[] = [];
+  if (common.isNotEmpty(resp)) {
+    const domain = useDomain();
+    resp.forEach((item: any) => {
+      if (item.ImgUrl && item.ImgUrl.indexOf('http') === -1) {
+        item.ImgUrl = `${domain}${item.ImgUrl.substring(1).replace(/\/\//g, '/')}`;
+      }
+      // 兼容原代码中的 BigImgUrl 字段
+      item.BigImgUrl = item.ImgUrl;
+    });
+    bannerListData = resp;
+  }
+  bannerList.value = bannerListData;
+};
+
+// 点击事件
+const contentClick = (e: any) => {
+  const { type } = e.currentTarget?.dataset || {};
+  console.log(type,'type')
+  let url: string | undefined;
+  if (type == 'collectDocListMore') {
+    // 点击更多关注医生
+    url = `/pagesNetHos/st1/business/other/doctorLike/doctorLike`;
+  }
+  if (url) {
+    const data = {
+      Url: url
+    };
+    menuClick(data, proxy);
+  }
+};
+
+// 前往医生列表
+const toDoctor = (e: any) => {
+  const { selectedType } = e.currentTarget?.dataset || {};
+  let data: any;
+  if (selectedType == 'zxxf') {
+    // 在线续方
+    data = { Url: `/pages/st1/business/continuation/continuationList/continuationList` };
+  } else if (selectedType == 'xgzx') {
+    // 新冠咨询
+  } else {
+    // twzx  spzx  图文咨询 视频咨询
+    data = {
+      Url: `/pagesNetHos/st1/business/doctor/doctorList/doctorList?selectedType=${selectedType}`
+    };
+  }
+  if (data) {
+    menuClick(data, proxy);
+  }
+};
+
+// 前往医生详情
+const toDoctorInfo = (e: any) => {
+  const queryBean = common.stringify(e.currentTarget?.dataset?.item);
+  const data = {
+    Url: `/pagesNetHos/st1/business/doctor/doctorInfo/doctorInfo?queryBean=${queryBean}`
+  };
+  console.log(data,'data')
+  menuClick(data, proxy);
+};
+
+// 搜索
+const inputConfirm = (e: any) => {
+  const value = e.detail.value;
+  if (value) {
+    const data = {
+      Url: `/pagesNetHos/st1/business/doctor/doctorList/doctorList?searchValue=${value}`
+    };
+    menuClick(data, proxy);
+    searchVal.value = '';
+  }
+};
+
+// 轮播图更改
+const swiperChange = (e: any) => {
+  if (e.detail.source == 'touch') {
+    bannerIndex.value = e.detail.current;
+  }
+};
+
+// banner图片点击
+const bannerClkHandle = async (e: any) => {
+  return;
+  /**需要判断就诊人 和公众号授权*/
+  if (useIsToAuthPage()) {
+    return;
+  }
+  const { item } = e.currentTarget?.dataset || {};
+  if (item?.LinkUrl) {
+    if (item.LinkUrl.indexOf('http') > -1) {
+      common.goToUrl('/pages/st1/blue/business/h5/h5/h5?url=' + item.LinkUrl);
+    } else {
+      // 处理其他链接逻辑
+      common.goToUrl(item.LinkUrl);
+    }
+  }
+};
+
+// 消息点击
+const mesClick = () => {
+  common.goToUrl(`/pages/st1/blue/business/tabbar/message/message`, {
+    skipWay: 'reLaunch'
+  });
+};
+
+// 添加埋点(互联网)
+// type 26:患者端     27:医生端     28:患者端添加就诊人
+const saveConsultVisitFn = (type: string) => {
+  const data = {
+    Type: type
+  };
+  saveConsultVisit(data);
+};
+
+// 处理医生返回值
+const doctorListHandle = (list: any[]) => {
+  if (common.isEmpty(list)) {
+    return list;
+  }
+  const domain = useDomain();
+  for (let i of list) {
+    if (i.DoctorPhotourl) {
+      if (i.DoctorPhotourl.indexOf('http') === -1) {
+        i.DoctorPhotourl = `${domain}${i.DoctorPhotourl.replace(/\\/g, '/')}`;
+      }
+    } else {
+      i.DoctorPhotourl = icon.equire_doctor;
+    }
+    // 计算价格
+    i.phoneFeeDiy = i.PhoneFee ? common.centToYuan(i.PhoneFee).toFixed(2) : 0;
+    i.videoFeeDiy = i.VideoFee ? common.centToYuan(i.VideoFee).toFixed(2) : 0;
+    i.consultFeeDiy = i.ConsultFee ? common.centToYuan(i.ConsultFee).toFixed(2) : 0;
+
+    let AvgAppraiseScore = '-';
+    // 用于做排序判断
+    let AvgAppraiseScoreTag = 0;
+    if (i.AppraiseCount > 0 && i.AppraiseScore > 0) {
+      AvgAppraiseScore = ((i.AppraiseScore / i.AppraiseCount / 5) * 100).toFixed(0) + '%';
+      AvgAppraiseScoreTag = ((i.AppraiseScore / i.AppraiseCount / 5) * 100).toFixed(0);
+    }
+    i.AvgAppraiseScore = AvgAppraiseScore;
+    i.AvgAppraiseScoreTag = AvgAppraiseScoreTag;
+
+    // 计算好评率
+    if (true) {
+      const highCount =
+        app.globalData.config.net_pageConfiguration_patient.currency_config.iniHighAppraiseCount +
+        i.HighAppraiseCountCons;
+      const totalCount =
+        app.globalData.config.net_pageConfiguration_patient.currency_config.iniHighAppraiseCount +
+        (i.AppraiseCount !== undefined ? i.AppraiseCount : i.AppraiseCountCons);
+      const percentage = (highCount / totalCount) * 100;
+      if (Number.isNaN(percentage)) {
+        i.percentage = '100%';
+      } else {
+        i.percentage = Math.ceil(percentage) + '%';
+      }
+    }
+    i.scoreDiy = '5.0';
+    if (
+      (i.AppraiseCount !== undefined ? i.AppraiseCount : i.AppraiseCountCons) &&
+      (i.AppraiseScore !== undefined ? i.AppraiseScore : i.AppraiseScoreCons)
+    ) {
+      // 评分
+      i.scoreDiy = (
+        (i.AppraiseScore !== undefined ? i.AppraiseScore : i.AppraiseScoreCons) /
+        (i.AppraiseCount !== undefined ? i.AppraiseCount : i.AppraiseCountCons)
+      ).toFixed(1);
+    }
+    if (i.AppraiseRule) {
+      try {
+        i.AppraiseRule = JSON.parse(i.AppraiseRule);
+      } catch (err) {
+        console.log('i.AppraiseRule格式化失败');
+      }
+    }
+    try {
+      i.DoctorName = i.DoctorName.split('-')[0];
+    } catch (err) {}
+  }
+  return list;
+};
+
+/** 跳转团队主页 */
+const jumpGroupInfo = (e: any) => {
+  const item = e.currentTarget?.dataset?.item;
+  const url = `/pagesNetHos/st1/business/doctorGroup/doctorGroupInfo/doctorGroupInfo?groupId=${item.GroupId}`;
+  common.goToUrl(url);
+};
+
+/**
+ * 菜单点击
+ */
+const menuClickFn = (e: any) => {
+  console.log(e);
+  menuClick(e, proxy);
+};
+</script>
+
+<style lang="scss" scoped>
+.p_content {
+  padding: 20upx 30upx 30upx;
+}
+
+.home_con {
+  padding: 20upx 0 1px;
+  margin-bottom: 30upx;
+  overflow: hidden;
+}
+
+.banner {
+  width: 100%;
+  height: 240upx;
+  position: relative;
+  margin: 30upx 0;
+}
+
+.swiper {
+  width: 100%;
+  height: 100%;
+}
+
+.dot_list {
+  position: absolute;
+  left: 50%;
+  bottom: 12upx;
+  transform: translateX(-50%);
+}
+
+.dot_item {
+  width: 6upx;
+  height: 6upx;
+  background: #ffffff;
+  opacity: 0.8;
+  margin-right: 8upx;
+  border-radius: 50px;
+}
+
+.dot_item_active {
+  width: 12upx;
+}
+
+.message {
+  width: 100%;
+  height: 110upx;
+  background: rgba(242, 248, 255, 1);
+  border-radius: 10upx;
+  padding: 0 33upx;
+  margin: 20upx 0;
+  box-sizing: border-box;
+}
+
+.swiper_item_inner {
+  width: 100%;
+}
+
+.banner_img {
+  border-radius: 26upx;
+}
+
+.msg_icon {
+  width: 44upx;
+  height: 44upx;
+  margin-right: 28upx;
+  flex-shrink: 0;
+}
+
+.msg_val {
+  width: 100%;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  word-break: break-word;
+}
+
+.msg_btn {
+  font-size: 26upx;
+  width: 108upx;
+  height: 52upx;
+  border-radius: 8px;
+  margin-left: 24upx;
+  flex-shrink: 0;
+}
+
+.nav_list {
+  margin: 20upx 0 0;
+  flex-wrap: wrap;
+}
+
+.nav_item {
+  width: 335upx;
+  height: 192upx;
+  padding: 30upx 32upx;
+  position: relative;
+  border-radius: 20upx;
+}
+.nav_item_n {
+  margin-top: 20upx;
+}
+.nav_line {
+  width: 100%;
+  height: 360upx;
+  padding: 30upx 32upx;
+  position: relative;
+  border-radius: 20upx;
+}
+
+.item_btn {
+  padding: 8upx 16upx 8upx 21upx;
+  border-radius: 50px;
+  color: #fff;
+  font-size: 32upx;
+  position: absolute;
+  bottom: 40upx;
+  left: 32upx;
+  border: 1px solid rgba(255, 255, 255, 0.6);
+}
+.right-arrow {
+  width: 7px;
+  height: 7px;
+  border-top: 2px solid #fff;
+  border-right: 2px solid #fff;
+  transform: rotate(45deg) translateY(0upx) translateX(-7upx);
+  display: inline-block;
+  align-items: center;
+}
+
+.item_back {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+
+.nav_item_ask {
+  background: #31cf94;
+}
+
+.item_tit {
+  font-size: 44upx;
+  font-weight: 500;
+  color: #ffffff;
+  line-height: 1em;
+  margin-bottom: 18upx;
+  position: relative;
+}
+
+.item_tit_v2 {
+  font-size: 40upx;
+  font-weight: 500;
+  color: #ffffff;
+  line-height: 1em;
+  margin-bottom: 18upx;
+  position: relative;
+}
+
+.item_subtit {
+  font-size: 28upx;
+  font-family: PingFang SC;
+  color: #ffffff;
+  line-height: 36upx;
+  opacity: 0.6;
+  position: relative;
+}
+
+.item_subtit_v2 {
+  font-size: 30upx;
+  font-family: PingFang SC;
+  color: #ffffff;
+  line-height: 36upx;
+  opacity: 0.6;
+  position: relative;
+}
+
+.item_btn_ask {
+  box-shadow: 0px 4upx 10upx 0px rgba(50, 207, 148, 0.8);
+}
+
+.btn_val {
+  font-size: 24upx;
+  font-weight: 500;
+  color: #ffffff;
+  margin-right: 8upx;
+}
+
+.btn_right {
+  width: 12upx;
+  height: 12upx;
+}
+
+.item_img {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  width: 140upx;
+  height: 132upx;
+}
+
+.doctor_con {
+  margin-top: 20upx;
+  background-color: #fff;
+  overflow: hidden;
+  border-radius: 24upx;
+}
+
+.doctor_con .nav {
+  padding-bottom: 20upx;
+}
+
+.nav {
+  padding: 34upx 30upx 40upx;
+  line-height: 1em;
+}
+
+.nav_tit {
+  font-size: 40upx;
+  font-weight: 500;
+}
+
+.nav_img {
+  width: 20upx;
+  height: 20upx;
+  margin-left: 8upx;
+}
+
+.menu_fifth_title {
+  width: 100%;
+}
+
+.menu_fifth_title view:nth-child(1) {
+  width: 50%;
+  font-size: 30upx;
+}
+
+.menu_fifth_title view:nth-child(1) text {
+  color: #666;
+}
+
+.menu_fifth_title view:nth-child(2) {
+  font-size: 26upx;
+}
+
+.menu_fifth_title view:nth-child(2) text {
+  margin-right: 10upx;
+}
+
+.doctor_tabbar_active {
+  font-weight: bold;
+  color: #333 !important;
+}
+
+.menu_fifth_doctor_group {
+  width: 49%;
+  border-radius: 20upx;
+  overflow: hidden;
+}
+
+.group_photo {
+  width: 100%;
+  height: 130upx;
+  background: #f0f0f0;
+}
+
+.group_name {
+  width: 100%;
+  padding: 10upx 0;
+}
+
+.doctor_swiper {
+  white-space: nowrap;
+  padding: 20upx 30upx 40upx;
+}
+
+.doctor_item {
+  width: 380upx;
+  height: 160upx;
+  display: inline-flex;
+  background: #ffffff;
+  box-shadow: 0px 0px 30upx 0upx rgba(0, 0, 0, 0.06);
+  border-radius: 10upx;
+  margin-right: 20upx;
+  padding: 0 24upx;
+}
+
+.doctor_item:nth-last-child(1) {
+  margin-right: 0;
+}
+
+.special_con {
+  margin-top: 20upx;
+  background-color: #fff;
+  overflow: hidden;
+}
+
+.special_inner {
+  padding: 0 30upx 40upx;
+  white-space: nowrap;
+}
+
+.special_item {
+  width: 280upx;
+  height: 200upx;
+  background: #95adff;
+  border-radius: 10px;
+  padding: 24upx;
+  display: inline-block;
+  margin-right: 20upx;
+}
+
+.special_item:nth-last-child(1) {
+  margin-right: 0;
+}
+
+.special_item_tit {
+  font-size: 32upx;
+  font-family: Source Han Sans CN;
+  font-weight: 500;
+  color: #ffffff;
+}
+
+.special_item_subtit {
+  font-size: 24upx;
+  font-family: Source Han Sans CN;
+  font-weight: 400;
+  color: #ffffff;
+}
+
+.dept_con {
+  margin-top: 20upx;
+  background-color: #fff;
+  overflow: hidden;
+}
+
+.dept_inner {
+  padding: 0 30upx 40upx;
+  white-space: nowrap;
+}
+
+.dept_item {
+  display: inline-flex;
+  margin-right: 92upx;
+}
+
+.dept_item:nth-last-child(1) {
+  margin-right: 0;
+}
+
+.dept_item_img {
+  width: 56upx;
+  height: 56upx;
+  margin-bottom: 16upx;
+}
+
+.dept_item_tit {
+  font-size: 28upx;
+  line-height: 1em;
+}
+
+.pharmacy_con {
+  margin-top: 20upx;
+  background-color: #fff;
+  overflow: hidden;
+  border-radius: 24upx;
+  margin-bottom: 30upx;
+}
+
+.pharmacy_inner {
+  padding: 0 30upx 40upx;
+  white-space: nowrap;
+}
+
+.pharmacy_item {
+  width: 20%;
+}
+
+.pharmacy_item:nth-last-child(1) {
+  margin-right: 0;
+}
+
+.pharmacy_item_img {
+  width: 88upx;
+  height: 88upx;
+  margin-bottom: 16upx;
+}
+
+.pharmacy_item_tit {
+  font-size: 24upx;
+  line-height: 2em;
+}
+.recommendDoc_con {
+  background-color: #fff;
+  overflow: hidden;
+  margin-top: 20upx;
+  border-radius: 24upx;
+}
+
+.recommendDoc_con .nav {
+  padding-bottom: 0;
+}
+
+.health_con {
+  margin-top: 20upx;
+  background-color: #fff;
+  overflow: hidden;
+}
+
+.health_con .nav {
+  padding-bottom: 0;
+}
+
+.health_inner {
+  padding: 0 30upx;
+}
+
+.health_inner:nth-last-child(1) .health_inner_border::before {
+  border-bottom: 0;
+}
+
+.health_val {
+  width: 100%;
+}
+
+.health_val {
+  margin-right: 30upx;
+}
+
+.health_val_tit {
+  font-size: 32upx;
+}
+
+.health_val_time {
+  font-size: 24upx;
+  margin-top: 20upx;
+}
+
+.health_img {
+  width: 210upx;
+  height: 140upx;
+  border-radius: 12upx;
+  flex-shrink: 0;
+  margin: 32upx 0;
+}
+
+.doctor_info {
+  width: 210upx;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  word-break: break-word;
+}
+
+.home_help {
+  position: fixed;
+  width: 150upx;
+  height: 162upx;
+  bottom: 177upx;
+  right: 0;
+}
+
+.p_doctor_name {
+  max-width: 4em;
+  -webkit-line-clamp: 1;
+  font-weight: bold;
+}
+
+.back_tit {
+  width: 671upx;
+  height: 62upx;
+  position: relative;
+  z-index: 1;
+  margin: 0 0 0 6px;
+}
+
+.p_doctor_item {
+  margin: 0;
+  padding: 50upx 40upx 0 30upx;
+  align-items: flex-start !important;
+  background-color: #fff;
+  border-radius: 24upx;
+}
+
+.p_doctor_item:nth-child(1) {
+  margin: 0;
+  padding: 40upx 40upx 0 30upx;
+}
+
+.p_doctor_item_con {
+  padding-bottom: 50upx;
+  width: 100%;
+}
+.font_bold {
+  font-weight: bold;
+}
+.mb10 {
+  margin-bottom: 10upx;
+}
+
+.p_inner {
+  width: 100%;
+  height: 100%;
+  position: relative;
+  z-index: 1;
+}
+
+/* 背景图 */
+.p_back_img {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+}
+.p_container {
+  height: 100% !important;
+  background-color: #f0f1f6;
+  color: #333333;
+  font-family: Source Han Sans CN;
+  font-size: 0;
+}
+.p_content {
+  display: inline-block;
+  width: 100%;
+  font-size: 30upx;
+  background-color: #f0f1f6;
+}
+/* 搜索框 */
+.p_search_con {
+  width: 100%;
+  height: 76upx;
+  background: #f0f1f6;
+  border-radius: 38upx;
+  margin-bottom: 20upx;
+  position: relative;
+}
+.p_flexCenter,
+.displayFlexRow {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.p_search_input {
+  width: 100%;
+  text-align: center;
+}
+.p_placeholder {
+  font-size: 30upx;
+  font-family: Source Han Sans CN;
+  font-weight: 400;
+  color: #999999;
+}
+/* 背景色 */
+.p_bgcolor,
+.backgroundCustom {
+  background-color: #02c28a !important;
+  color: #fff !important;
+}
+.p_flexBetween,
+.displayFlexBetween {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+/* 滚动 */
+.p_scroll {
+  display: flex;
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+}
+.p_doctor_img_con {
+  width: 88upx;
+  height: 88upx;
+  border-radius: 50upx;
+  position: relative;
+  margin-right: 20upx;
+  flex-shrink: 0;
+  margin-top: 4px;
+}
+.p_doctor_img {
+  border-radius: 50%;
+}
+.p_doctor_infocon {
+  width: 100%;
+}
+.p_doctor_tit {
+  display: flex;
+  align-items: center;
+}
+.p_lineClamp {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  display: -webkit-box;
+  -webkit-line-clamp: 2;
+  -webkit-box-orient: vertical;
+}
+.p_doctor_tip {
+  height: 32upx;
+  background: #fff0e1;
+  padding: 0 12upx;
+  margin-left: 16upx;
+  border-radius: 50px;
+}
+
+.p_doctor_star {
+  width: 24upx;
+  height: 24upx;
+}
+
+.p_doctor_starval {
+  font-size: 26upx;
+  font-family: DINPro;
+  font-weight: 500;
+  color: #ff9d35;
+  margin-left: 9upx;
+}
+.p_doctor_info {
+  font-size: 28upx;
+  margin-top: 8upx;
+}
+.p_flexCenterCol,
+.displayFlexCol {
+  display: flex;
+  align-items: center;
+  flex-direction: column;
+  justify-content: center;
+}
+.p_doctor_btn {
+  min-width: 144upx;
+  height: 52upx;
+  border-radius: 8px;
+  font-size: 28upx;
+  color: #ffffff;
+  padding: 0 17upx;
+  position: relative;
+  margin-bottom: 10upx;
+  margin-right: -5upx;
+}
+/* 快速问诊按钮 */
+.p_doctor_btn_img {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  border-radius: 26upx;
+  top: 0;
+  left: 0;
+}
+.p_doctor_item_introduce {
+  font-size: 24upx;
+  margin: 10upx 0;
+}
+.p_color_8a {
+  color: #8a8a99 !important;
+}
+
+.p_doctor_item_describe {
+  font-size: 28upx;
+  color: #333333;
+}
+
+/* tabbar */
+.tabbar {
+  height: 44px;
+  line-height: 44px;
+  text-align: center;
+  color: #222;
+  box-sizing: content-box;
+  font-size: 32upx;
+  font-weight: 500;
+  background: #f0f1f6;
+  width: 100%;
+  position: fixed;
+  z-index: 10;
+  top: 0;
+  left: 0;
+  overflow: hidden;
+}
+
+.iconCon {
+  width: 87upx;
+  height: 40px;
+  position: absolute;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  margin: auto 0;
+  z-index: 1;
+}
+
+.iconLeft {
+  width: 12px;
+  height: 12px;
+  border-top: 2px solid;
+  border-left: 2px solid;
+  color: #222;
+  transform: rotateZ(-45deg);
+  position: absolute;
+  top: 2px;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  margin: auto;
+}
+
+.p_search_con {
+  background-color: #fff;
+}
+.p_color_9 {
+  color: #999999 !important;
+}
+/* 字体颜色 */
+.p_color,
+.colorCustom {
+  color: #02c28a !important;
+}
+.nav {
+  padding: 34upx 30upx 40upx;
+  line-height: 1em;
+}
+.p_border_bottom,
+.border_bottom {
+  position: relative;
+}
+.p_border_bottom::before,
+.border_bottom::before {
+  content: ' ';
+  position: absolute;
+  left: 0;
+  bottom: 0;
+  width: 100%;
+  height: 1px;
+  border-bottom: 1px solid #e6e6e6;
+  -webkit-transform-origin: 0 0;
+  transform-origin: 0 0;
+  -webkit-transform: scaleY(0.5);
+  transform: scaleY(0.5);
+}
+.p_color_4d {
+  color: #4d4d54 !important;
+}
+.lineHeight {
+  line-height: 1.4em;
+}
+
+.floot {
+  background-color: #fff;
+  border-radius: 24upx;
+}
+
+.floot_top {
+  padding: 37upx 30upx 0 34upx;
+}
+
+.floot_title {
+  position: relative;
+  font-size: 32upx;
+  font-family: PingFang SC;
+  font-weight: 800;
+  color: #222326;
+}
+.floot_title::after {
+  content: '';
+  position: absolute;
+  left: -10upx;
+  top: 0;
+  width: 38upx;
+  height: 38upx;
+  background: linear-gradient(229deg, #ffffff 0%, #74b72f 100%);
+  opacity: 0.6;
+  border-radius: 50%;
+}
+.floot_titleName {
+  position: relative;
+  z-index: 1;
+}
+.floot_tip {
+  font-size: 28upx;
+  font-family: PingFang SC;
+  font-weight: 500;
+  color: #8a8a99;
+}
+.floot_tip text {
+  line-height: initial;
+}
+.icon_right {
+  width: 11upx;
+  height: 19upx;
+  margin-left: 10upx;
+}
+.flootNoTip {
+  text-align: center;
+  width: 100%;
+  font-size: 30upx;
+  margin: 30upx 0;
+  color: #43434a;
+}
+.menuServices_box .menuList {
+  width: 25%;
+  margin: 40upx 0 36upx;
+}
+.menuIcon {
+  width: 78upx;
+  height: 84upx;
+  margin-bottom: 20upx;
+}
+
+.menuText {
+  font-size: 26upx;
+  font-family: PingFang SC;
+  color: #222326;
+}
+
+.p_bt200 {
+  padding-bottom: 200upx;
+}
+</style>

+ 139 - 0
pages/st1/service/base/index.ts

@@ -153,3 +153,142 @@ export const queryAuthUserMemberList = async (queryData: any) => {
 	);
 	return handle.catchPromiseNew(resp, () => resp);
 };
+
+// ======================================= 互联网医院 ==========================================
+/**
+ * 查询推荐科室
+ * @param HosId String 机构ID
+ * @param IsRcmd String 是否推荐 1:是
+ */
+export const queryConsultDeptList = async (queryData: any) => {
+	let resp = handle.promistHandleNew(
+		await request.doPost(
+			`${REQUEST_CONFIG.BASE_URL}wsgw/cons/ConsultDoc/QueryConsultDeptList/callApiJSON.do`,
+			queryData
+		)
+	);
+	return handle.catchPromiseNew(resp, () => resp);
+};
+
+/**
+ * 查询推荐医生
+ * @param HosId String 机构ID
+ * @param IsRcmd String 是否推荐 1:是
+ */
+export const queryRcmdConsultDoctorList = async (queryData: any) => {
+	let resp = handle.promistHandleNew(
+		await request.doPost(
+			`${REQUEST_CONFIG.BASE_URL}wsgw/cons/ConsultDoc/QueryRcmdConsultDoctorList/callApiJSON.do`,
+			queryData
+		)
+	);
+	return handle.catchPromiseNew(resp, () => resp);
+};
+
+/**
+ * 查询关注医生
+ * @param resourceType String 资源类型 1:医生
+ */
+export const queryUserCollect = async (queryData: any) => {
+	let resp = handle.promistHandleNew(
+		await request.doPost(
+			`${REQUEST_CONFIG.BASE_URL}wsgw/user/collect/QueryUserCollect/callApiJSON.do`,
+			queryData
+		)
+	);
+	return handle.catchPromiseNew(resp, () => resp);
+};
+
+/**
+ * 查询代办消息
+ * @param OpenId String 用户OpenId
+ * @param BusinessId String 业务ID
+ * @param BacklogType String 代办类型 1咨询申请2咨询消息3随访消息4医患申请5日程计划
+ * @param ReadState String 阅读状态 1未读 2已读
+ * @param UserType String 用户类型 1.就诊人,2.医生
+ * @param IsGroup String 是否分组 1:是
+ */
+export const queryBackLogMsg = async (queryData: any) => {
+	let resp = handle.promistHandleNew(
+		await request.doPost(
+			`${REQUEST_CONFIG.BASE_URL}wsgw/msg/BackLog/QueryBackLogMsg/callApiJSON.do`,
+			queryData
+		)
+	);
+	return handle.catchPromiseNew(resp, () => resp);
+};
+
+/**
+ * 获取专家介绍列表 (根据doctorUid查询对应医生)
+ * @param DoctorUid String 医生UID,多个用逗号分隔
+ */
+export const queryBDoctorList = async (queryData: any) => {
+	let resp = handle.promistHandleNew(
+		await request.doPost(
+			`${REQUEST_CONFIG.BASE_URL}wsgw/basic/DoctorApi/QueryBDoctorList/callApiJSON.do`,
+			queryData
+		)
+	);
+	return handle.catchPromiseNew(resp, () => resp);
+};
+
+/**
+ * 获取咨询记录
+ * @param ConsultStartDate String 咨询开始日期
+ * @param ConsultEndDate String 咨询结束日期
+ * @param ConsultStatus String 咨询状态 16:已预约视频问诊
+ */
+export const queryConsultWaterList = async (queryData: any) => {
+	let resp = handle.promistHandleNew(
+		await request.doPost(
+			`${REQUEST_CONFIG.BASE_URL}wsgw/cons/Consult/QueryConsultWaterList/callApiJSON.do`,
+			queryData
+		)
+	);
+	return handle.catchPromiseNew(resp, () => resp);
+};
+
+/**
+ * 获取文章列表
+ * @param TypeClass Number 类型 0 新闻动态;1 通知公告;2 健康宣教;3 就诊指南;4 住院需知 62 首页banner
+ * @param Status Number 状态 1已发布
+ * @param Type Number 类型 1链接
+ */
+export const queryArticleList = async (queryData: any) => {
+	let resp = handle.promistHandleNew(
+		await request.doPost(
+			`${REQUEST_CONFIG.BASE_URL}wsgw/basic/BasicApi/QueryArticleList/callApiJSON.do`,
+			queryData
+		)
+	);
+	return handle.catchPromiseNew(resp, () => resp);
+};
+
+/**
+ * 查询咨询医生组
+ * @param IsMemberCollect Number 是否会员关注 1:是
+ */
+export const queryConsultDoctorGroup = async (queryData: any) => {
+	let resp = handle.promistHandleNew(
+		await request.doPost(
+			`${REQUEST_CONFIG.BASE_URL}wsgw/cons/ConsultDoctorGroup/QueryConsultDoctorGroup/callApiJSON.do`,
+			queryData
+		)
+	);
+	return handle.catchPromiseNew(resp, () => resp);
+};
+
+/**
+ * 数据埋点(互联网)
+ * @param Type Number 类型 26:患者端 27:医生端 28:患者端添加就诊人
+ */
+export const saveConsultVisit = async (queryData: any) => {
+	let resp = handle.promistHandleNew(
+		await request.doPost(
+			`${REQUEST_CONFIG.BASE_URL}wsgw/cons/ConsultStatsNew/SaveConsultVisit/callApiJSON.do`,
+			queryData
+		)
+	);
+	return handle.catchPromiseNew(resp, () => resp);
+};
+// ======================================= 互联网医院 ==========================================

+ 1275 - 0
pagesNetHos/st1/business/doctor/doctorInfo/doctorInfo.vue

@@ -0,0 +1,1275 @@
+<template>
+  <view class="page">
+    <!-- 顶部导航栏 -->
+    <view class="tabbar" :style="{ paddingTop: statusBarHeight + 'px' }">
+      <view class="p_inner p_flexCenter">{{ pageTitle }}</view>
+      <image class="p_back_img" mode="widthFix" :src="iconUrl.doctor_back_n"></image>
+      <view class="iconCon" :style="{ top: statusBarHeight + 'px' }" @click="toBack">
+        <view class="iconLeft"></view>
+      </view>
+    </view>
+
+    <view class="container" v-if="showCon" :style="{ paddingTop: 44 + statusBarHeight + 'px' }">
+      <view class="content">
+        <image class="p_back_img" mode="widthFix" :src="iconUrl.doctor_back_n"></image>
+        <view class="doc_con_outer">
+          <view class="doc_con">
+            <view class="doc_his p_flexCenter">
+              <view class="p_doctor_img_con">
+                <image class="p_doctor_img" :src="doctorInfo.DoctorPhotourl"></image>
+              </view>
+              <view class="doc_his_con">
+                <view class="doc_name p_flexStart">
+                  {{ doctorInfo.DoctorName }}
+                  <image class="doc_his_code_img" :src="iconUrl.doctor_code_n" @click="codeClick"></image>
+                </view>
+                <view class="doc_dept p_color_6">{{ doctorInfo.DeptName }} {{ doctorInfo.TitleName }}</view>
+                <view class="doc_tip_list p_flexCenter">
+                  <view class="doc_tip_item" v-if="doctorInfo.DoctorServiceCons != '1' && doctorInfo.DoctorServiceTelcons != '1' && doctorInfo.DoctorVideocons != '1'">暂停接单</view>
+                  <view class="doc_tip_item" v-if="doctorInfo.DoctorService1004 == '0'">不能开处方</view>
+                </view>
+              </view>
+
+              <view class="doc_his_btn_list p_flexCenter">
+                <view class="doc_his_btn_like p_flexCenter" :class="{ 'doc_his_btn_liked': like }">
+                  <image class="doc_his_btn_img" :src="like ? iconUrl.doctor_gz_ac : iconUrl.doctor_gz"></image>
+                  <view class="doc_his_btn_val" @click="likeFn">{{ like ? '已关注' : '关注' }}</view>
+                </view>
+              </view>
+            </view>
+            <view class="doc_info p_format">
+              <view class="doc_info_item">
+                <image class="doc_info_img" :src="iconUrl.doctor_sc_n"></image>
+                <view class="doc_info_val" :class="{ 'p_lineClamp': !showAllInfo }" @click="showAllFn">
+                  擅长:{{ doctorInfo.DoctorSkill }} 简介:{{ doctorInfo.DoctorIntro }}
+                </view>
+              </view>
+            </view>
+          </view>
+          <view class="doc_his_val p_flexCenter p_color_6">
+            <view class="p_flexCenterCol">
+              <text class="doc_his_val_num p_color_3" v-if="doctorInfo.ConsultAmount >= 10">{{ doctorInfo.ConsultAmount }}</text>
+              <text class="doc_his_val_num p_color_3" v-else>{{ '<' }}10</text>咨询量
+            </view>
+            <view class="p_flexCenterCol">
+              <text class="doc_his_val_num p_color_3">{{ doctorInfo.percentage }}</text>好评率
+            </view>
+            <view class="p_flexCenterCol">
+              <text class="doc_his_val_num p_color_3" v-if="doctorBdInfo.CollectCount >= 10">{{ doctorBdInfo.CollectCount }}</text>
+              <text class="doc_his_val_num p_color_3" v-else>{{ '<' }}10</text>粉丝量
+            </view>
+          </view>
+        </view>
+
+        <view class="consulting_con">
+          <view class="consulting_detail p_format">
+            <view class="consulting_option_list p_flexBetween">
+              <view
+                class="consulting_option p_flexCenterCol"
+                :class="{ 'consulting_option_ac': selectedType == 'twzx' }"
+                @click="setVal('selectedType', 'twzx')"
+              >
+                <image class="doctor_selected" :src="iconUrl.doctor_selected" v-if="selectedType == 'twzx'"></image>
+                <image class="consulting_option_img" :src="doctorInfo.DoctorServiceCons == '1' ? iconUrl.doctor_twzx_ac : iconUrl.doctor_twzx"></image>
+                <view class="consulting_option_tit">图文咨询</view>
+                <view class="consulting_option_subtit p_color_6">¥{{ doctorInfo.consultFeeDiy }}/次</view>
+              </view>
+              <view
+                class="consulting_option p_flexCenterCol"
+                :class="{ 'consulting_option_ac': selectedType == 'spzx' }"
+                @click="setVal('selectedType', 'spzx')"
+              >
+                <image class="doctor_selected" :src="iconUrl.doctor_selected_spzx" v-if="selectedType == 'spzx'"></image>
+                <image class="consulting_option_img" :src="doctorInfo.DoctorVideocons == '1' ? iconUrl.doctor_spzx_ac : iconUrl.doctor_spzx"></image>
+                <view class="consulting_option_tit">视频咨询</view>
+                <view class="consulting_option_subtit p_color_6">¥{{ doctorInfo.videoFeeDiy }}/次</view>
+              </view>
+            </view>
+            <view v-for="item in typeInfoList" :key="item.key">
+              <view v-if="item.key == selectedType">
+                <view class="consulting_detail_tips">
+                  <view class="consulting_detail_tip_tit">{{ item.tip.title }}</view>
+                  <view class="consulting_detail_tip_val p_color_6" v-for="(tip, idx) in item.tip.tipList" :key="idx">
+                    {{ tip }}
+                  </view>
+                </view>
+                <view class="consulting_detail_tip">
+                  <view class="consulting_detail_tip_tit">{{ item.pic.title }}</view>
+                  <view class="consulting_detail_imgtip p_flexBetween">
+                    <view class="consulting_detail_imgtip_inner p_flexBetween" v-for="(pic, picIdx) in item.pic.picList" :key="picIdx">
+                      <image class="consulting_detail_right" :src="iconUrl.home_right" v-if="picIdx != 0"></image>
+                      <view class="consulting_detail_imgtip_item p_flexCenterCol">
+                        <image class="consulting_detail_img" :src="pic.icon"></image>
+                        <view class="consulting_detail_val p_color_6">{{ pic.text }}</view>
+                      </view>
+                    </view>
+                  </view>
+                </view>
+              </view>
+            </view>
+          </view>
+
+          <view class="consulting_comment p_format" v-if="doctorInfo.AppraiseRule && doctorInfo.AppraiseRule.TYPE_1.isCheck == '1'">
+            <view class="consulting_detail_tip_tit p_flexCenter">
+              患者评价
+            </view>
+            <!-- 评价统计标签 -->
+            <view class="statistics_item_outer" v-if="evaluateList.length > 0">
+              <view class="statistics_item_box" v-for="(item, index) in evaluateList" :key="index">
+                <view class="p_flexStart">
+                  <image class="statistics_item_icon" :src="item.DictRemark" mode="scaleToFill"></image>
+                  <view class="statistics_item_text">
+                    <text class="color333" v-for="(txt, idx) in item.evalua" :key="idx">{{ txt }}</text>
+                  </view>
+                </view>
+                <text class="p_color_FB9630">x{{ item.Num }}次</text>
+              </view>
+            </view>
+            <!-- 评价列表 -->
+            <view class="consulting_comment_list" v-if="!showNoData">
+              <view class="consulting_comment_item p_format p_border_bottom" v-for="(item, index) in list" :key="index">
+                <view class="consulting_comment_user p_flexBetween">
+                  <view class="p_flexStart">
+                    <image class="consulting_comment_user_phtot" src="https://weixin.fyyy.com/cdn/st1/darkGreen/static/images/icon/small_patient_icon.png"></image>
+                    <view class="consulting_comment_user_name p_color_6">评价人:{{ item.Remark ? item.Remark.memberName : '' }}</view>
+                  </view>
+                  <text class="consulting_comment_user_time p_color_6">评价时间:{{ item.AppraiseDate }}</text>
+                </view>
+                <view class="consulting_comment_val">{{ item.Content != '' ? item.Content : item.DictName }}</view>
+              </view>
+              <view class="p_load_more p_color_9">{{ stopReachBottom ? '已加载全部' : '上拉加载更多' }}</view>
+            </view>
+            <noData v-else :value="noDataValue"></noData>
+          </view>
+        </view>
+
+        <view class="p_btn_con">
+          <view class="p_btn p_flexCenter p_bgcolor" @click="toSupplement">
+            提交咨询({{ selectedType == 'twzx' ? doctorInfo.consultFeeDiy : selectedType == 'dhzx' ? doctorInfo.phoneFeeDiy : selectedType == 'spzx' ? doctorInfo.videoFeeDiy : 0 }}元)
+          </view>
+        </view>
+      </view>
+
+      <!-- 电子名片 -->
+      <view class="p_mask p_flexCenter mask_bottom" v-if="showDocDetial" @click="codeClick">
+        <view class="p_dialog" @click.stop="doNothing">
+          <image class="doctor_picback1" :src="iconUrl.doctor_picback1"></image>
+          <image class="doctor_picback2" :src="iconUrl.doctor_picback2"></image>
+          <view class="p_dialog_tit p_flexCenter">
+            <view class="p_dialog_tit_val">电子名片</view>
+            <image class="p_dialog_cha" :src="iconUrl.doctor_cha" @click.stop="codeClick"></image>
+          </view>
+          <view class="p_dialog_inner p_format p_scroll dialog_inner_bottom">
+            <view class="doc_detial_pic">
+              <image class="doc_detial_pic_img" :src="iconUrl.doctor_picback"></image>
+              <view class="doc_detial_pic_inner p_flexBetween">
+                <view class="pic_con p_format">
+                  <view class="pic_tit">
+                    {{ hosName }}
+                    <view class="pic_tit_line p_bgcolor"></view>
+                  </view>
+                  <view class="pic_name">{{ doctorInfo.DoctorName }}</view>
+                  <view class="pic_subtit p_color_6">{{ doctorInfo.DeptName }} {{ doctorInfo.TitleName }}</view>
+                </view>
+                <view class="pic_img_con">
+                  <image class="doc_imgback" :src="iconUrl.doctor_docback"></image>
+                  <image class="doc_img" :src="doctorInfo.DoctorPhotourl"></image>
+                </view>
+              </view>
+            </view>
+
+            <view class="doc_detail_code_con p_flexCenter">
+              <image class="doc_detail_code" :src="codeInfo.Url"></image>
+            </view>
+          </view>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
+import { useOnLoad } from '@/hook'
+import icon from '@/utils/icon'
+import { REQUEST_CONFIG } from '@/config';
+import { common } from '@/uni-app-base/utils';
+import {
+  queryConsultDoctorList,
+  QueryBDoctorInfo,
+  queryAppraiseList as queryAppraiseListApi,
+  getUserCollectByDoctorUid as getUserCollectByDoctorUidApi,
+  userCollect,
+  unUserCollect,
+  queryQrCode,
+  addOrUpdateConsultDoctorReport,
+  countConsultAppraise,
+  queryConsultAppraiseList
+} from '@/pagesNetHos/st1/service/doctor'
+import { useGetMember } from '@/hook'
+import { doctorListHandle } from '/pagesNetHos/st1/static/js/pagesNetHosFn';
+import noData from '@/pages/st1/components/noData/noData.vue';
+
+// 获取全局应用实例
+const app = getApp()
+const { proxy } = getCurrentInstance()
+
+// 图片icon
+const iconUrl = ref(icon);
+const baseUrl = ref(`${REQUEST_CONFIG.BASE_URL}`);
+// 页面状态
+const showCon = ref(false)
+const like = ref(false)
+const showDocDetial = ref(false)
+const queryBean = reactive<any>({})
+const showAllInfo = ref(false)
+const list = ref<any[]>([])
+const pIndex = ref(0)
+const selectedType = ref('twzx')
+const serviceType = ref('')
+const showNoData = ref(false)
+const noDataValue = ref('暂无评价')
+const doctorInfo = reactive<any>({})
+const doctorBdInfo = reactive<any>({})
+const stopReachBottom = ref(false)
+const evaluateList = ref<any[]>([])
+const queryData = reactive({
+  PassiveUid: '',
+  StarType: 0,
+  Page: {
+    PSize: 10,
+    PIndex: 0
+  }
+})
+const codeInfo = reactive<any>({})
+const statusBarHeight = ref(20)
+const pageTitle = ref('医生主页')
+const hosName = ref('')
+
+// 咨询方式详情
+const typeInfoList = ref([
+  {
+    key: 'twzx',
+    tip: {
+      title: '图文咨询',
+      tipList: [
+        '与医生本人在线图文交流,一一对应充分沟通;',
+        '医生给出明确建议,如用药指导、康复方法等;',
+        '医生接受申请后的24小时内,图文对话上限为10次;'
+      ]
+    },
+    pic: {
+      title: '图文咨询服务流程',
+      picList: [
+        { icon: icon.doctor_ghzf, text: '挂号支付' },
+        { icon: icon.doctor_bqms, text: '病情描述' },
+        { icon: icon.doctor_yshf, text: '医生回复' },
+        { icon: icon.doctor_wzjs, text: '问诊结束' }
+      ]
+    }
+  },
+  {
+    key: 'spzx',
+    tip: {
+      title: '视频咨询',
+      tipList: [
+        '通过视频交流,高效直接更清楚;',
+        '与医生本人在线视频交流,一一对应充分沟通;',
+        '医生给出明确建议,如用药指导、康复方法等;',
+        '视频咨询需预约医生号源,并提前20分钟签到候诊;'
+      ]
+    },
+    pic: {
+      title: '视频咨询服务流程',
+      picList: [
+        { icon: icon.doctor_ghzf, text: '挂号支付' },
+        { icon: icon.doctor_bqms, text: '病情描述' },
+        { icon: icon.doctor_yshz, text: '医生候诊' },
+        { icon: icon.doctor_yshj, text: '医生呼叫' },
+        { icon: icon.doctor_wzjs, text: '问诊结束' }
+      ]
+    }
+  }
+])
+
+// 页面加载
+useOnLoad((options: any) => {
+  if (options.queryBean) {
+    Object.assign(queryBean, common.parse(options.queryBean))
+  }
+  if (options.serviceType) {
+    serviceType.value = options.serviceType
+  }
+
+  // 获取用户信息
+  const memberInfo = useGetMember()
+  hosName.value = memberInfo.hospitalInfo?.HospitalAlias || ''
+
+  queryData.PassiveUid = queryBean.DoctorUid
+  statusBarHeight.value = (app as any).globalData.statusBarHeight || 20
+
+  main()
+})
+
+// 主逻辑
+async function main() {
+  let selectedTypeVal = ''
+
+  common.showLoading()
+  await queryBDoctorInfo()
+  await getUserCollectByDoctorUid()
+
+  let { resp: consultList } = await queryConsultDoctorList({
+    DoctorUid: queryBean.DoctorUid,
+    DeptId: queryBean.DeptId
+  })
+
+  await AddOrUpdateConsultDoctorReport()
+  common.hideLoading()
+
+  if (!common.isEmpty(consultList)) {
+    const handledDoctorInfo = doctorListHandle(consultList)[0]
+    Object.assign(doctorInfo, handledDoctorInfo)
+
+    if (handledDoctorInfo.DoctorServiceCons == '1') {
+      selectedTypeVal = 'twzx'
+    } else if (handledDoctorInfo.DoctorServiceTelcons == '1') {
+      selectedTypeVal = 'dhzx'
+    } else if (handledDoctorInfo.DoctorVideocons == '1') {
+      selectedTypeVal = 'spzx'
+    }
+  }
+
+  showCon.value = true
+  selectedType.value = selectedTypeVal
+  // 调用统计评价API
+  await CountConsultAppraise()
+  // 调用查询评价列表API
+  await queryAppraiseList()
+}
+
+// 查询医生信息
+async function queryBDoctorInfo() {
+  let data = {
+    DoctorId: '',
+    DeptCode: queryBean.DeptCode || '',
+    DeptId: queryBean.DeptId || '',
+    DoctorCode: queryBean.DoctorCode,
+    DoctorUid: queryBean.DoctorUid,
+  }
+
+  let { resp } = await QueryBDoctorInfo(data)
+  if (!common.isEmpty(resp)) {
+    Object.assign(doctorBdInfo, resp[0])
+  }
+}
+
+// 查询评价列表
+async function queryAppraiseList(reachBottom = false) {
+  if (!reachBottom) {
+    queryData.Page.PIndex = 1
+  }
+
+  let { resp } = await queryConsultAppraiseList(queryData)
+  console.log(resp, 'queryConsultAppraiseList resp')
+
+  // 处理评价数据
+  if (!common.isEmpty(resp)) {
+    const baseUrlVal = baseUrl.value || ''
+    let url = baseUrlVal
+    if (url.indexOf('KasiteWeb') > -1) {
+      url = url.split('KasiteWeb/')[0]
+    }
+
+    resp.forEach((item: any) => {
+      item.DictRemark = url + item.DictRemark
+      item.DictName = item.DictName ? (item.DictName.substring(0, 4) + '-' + item.DictName.substring(4)) : ''
+      item.evalua = item.DictName ? item.DictName.split('-') : []
+      if (item.Remark) {
+        try {
+          item.Remark = JSON.parse(item.Remark)
+          // 脱敏处理
+          item.Remark.memberName = item.Remark.memberName ? item.Remark.memberName.substring(0, 1) + '**' : ''
+        } catch (e) {
+          item.Remark = { memberName: '' }
+        }
+      }
+    })
+  }
+
+  console.log(resp, 'queryAppraiseListApiresp2')
+  const stopReach = (resp || []).length < queryData.Page.PSize
+
+  if (!common.isEmpty(resp)) {
+    if (reachBottom) {
+      list.value.push(...resp)
+    } else {
+      list.value = resp
+    }
+  } else {
+    if (!reachBottom) {
+      list.value = []
+    }
+  }
+  console.log(list.value, 'list.value')
+  showNoData.value = list.value.length > 0 ? false : true
+  stopReachBottom.value = stopReach
+}
+
+// 统计咨询评价
+async function CountConsultAppraise() {
+  let data = {
+    DoctorUid: queryBean.DoctorUid
+  }
+
+  let { resp } = await countConsultAppraise(data)
+  if (common.isNotEmpty(resp)) {
+    const baseUrlVal = baseUrl.value || ''
+    let url = baseUrlVal
+    if (url.indexOf('KasiteWeb') > -1) {
+      url = url.split('KasiteWeb/')[0]
+    }
+
+    resp.forEach((item: any) => {
+      item.DictRemark = url + item.DictRemark
+      item.DictName = item.DictName ? (item.DictName.substring(0, 4) + '-' + item.DictName.substring(4)) : ''
+      item.evalua = item.DictName ? item.DictName.split('-') : []
+    })
+
+    evaluateList.value = resp
+  }
+}
+
+// 获取用户是否关注
+async function getUserCollectByDoctorUid() {
+  let data = {
+    resourceId: queryBean.DoctorUid,
+    resourceType: 1
+  }
+
+  let { resp } = await getUserCollectByDoctorUidApi(data)
+  like.value = !common.isEmpty(resp)
+}
+
+// 关注/取消关注
+async function likeFn() {
+  let data = {
+    resourceId: queryBean.DoctorUid,
+    resourceType: 1
+  }
+
+  common.showLoading()
+
+  if (like.value) {
+    // 取消关注
+    let { resData } = await unUserCollect(data)
+    if (resData?.RespCode == '10000') {
+      await getUserCollectByDoctorUid()
+    }
+  } else {
+    // 关注
+    let { resData } = await userCollect(data)
+    if (resData?.RespCode == '10000') {
+      await getUserCollectByDoctorUid()
+    }
+  }
+
+  await queryBDoctorInfo()
+  common.hideLoading()
+}
+
+// 前往病情补充
+async function toSupplement() {
+  if (!selectedType.value) {
+    common.showToast('当前医生未开通咨询')
+    return
+  }
+
+  let queryStr = common.stringify(doctorInfo)
+  let url = `/pagesNetHos/st1/business/doctor/supplement/supplement?queryBean=${queryStr}&selectedType=${selectedType.value}&serviceType=${serviceType.value}`
+
+  // #ifdef H5
+  window.location.href = url
+  // #endif
+  // #ifndef H5
+  uni.navigateTo({ url })
+  // #endif
+}
+
+// 展示所有医生信息
+function showAllFn() {
+  showAllInfo.value = !showAllInfo.value
+}
+
+// 设置选中值
+function setVal(key: string, value: string) {
+  if (doctorInfo.DoctorServiceCons != '1' && value == 'twzx') {
+    common.showToast('图文咨询暂未开通')
+    return
+  }
+  if (doctorInfo.DoctorServiceTelcons != '1' && value == 'dhzx') {
+    common.showToast('电话咨询暂未开通')
+    return
+  }
+  if (doctorInfo.DoctorVideocons != '1' && value == 'spzx') {
+    common.showToast('视频咨询暂未开通')
+    return
+  }
+
+  if (value == 'dhzx') {
+    // 电话咨询逻辑(可扩展)
+  }
+
+  selectedType.value = value
+}
+
+// 医生二维码点击
+async function codeClick() {
+  let { resp } = await queryQrCode({ SceneStr: queryBean.DoctorUid })
+
+  if (!common.isEmpty(resp)) {
+    Object.assign(codeInfo, resp[0])
+    // 处理二维码URL(需要根据实际API根地址)
+    codeInfo.Url = `${baseUrl.value || ''}api/340/340/createQrCode.do?content=${codeInfo.Url}`
+  }
+
+  showDocDetial.value = !showDocDetial.value
+}
+
+// 上拉加载
+function onReachBottom() {
+  if (stopReachBottom.value) {
+    return
+  }
+
+  queryData.Page.PIndex += 1
+  queryAppraiseList(true)
+}
+
+// 分享
+function onShareAppMessage() {
+  let queryStr = common.stringify(queryBean)
+  let url = encodeURIComponent(`/pages/st1/business/doctor/doctorInfo/doctorInfo?queryBean=${queryStr}`)
+
+  return {
+    path: `/pages/st1/business/tabbar/transferPage/transferPage?url=${url}`
+  }
+}
+
+// 返回
+function toBack() {
+  const pages = getCurrentPages()
+  const currentPage = pages[pages.length - 1]
+
+  if (typeof (currentPage as any).backFn == 'function') {
+    (proxy as any).$emit('backFn')
+  } else {
+    common.navigateBack(1)
+  }
+}
+
+// 上报医生报告
+async function AddOrUpdateConsultDoctorReport() {
+  let data = {
+    dataType: '1',
+    doctorId: doctorBdInfo.DoctorId
+  }
+  addOrUpdateConsultDoctorReport(data)
+}
+
+// 空操作(用于阻止事件冒泡)
+function doNothing() {
+  // 空函数,用于catchtap
+}
+
+// 生命周期钩子注册
+onMounted(() => {
+})
+
+// 暴露给父组件
+defineExpose({
+  backFn: toBack
+})
+</script>
+
+<style lang="scss">
+@import "@/pagesNetHos/st1/static/css/common.scss";
+@import "@/pagesNetHos/st1/static/css/dialog.scss";
+
+.page {
+  min-height: 100vh;
+  background: #F0F1F6;
+}
+
+.p_content {
+  padding-bottom: 150upx;
+}
+
+.doc_con_outer {
+  position: relative;
+  padding: 30upx 30upx 30upx;
+}
+
+.doc_con_back {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+}
+
+.doc_con {
+  position: relative;
+  z-index: 1;
+}
+
+.p_doctor_img_con {
+  width: 120upx;
+  height: 120upx;
+  position: relative;
+  margin-right: 20upx;
+  flex-shrink: 0;
+}
+
+.p_doctor_img {
+  border-radius: 50%;
+}
+
+.p_doctor_state {
+  width: 80upx;
+  height: 33upx;
+  background: linear-gradient(120deg, #31D59E, #13C287);
+  border: 2px solid #FFFFFF;
+  border-radius: 16upx;
+  font-size: 20upx;
+  color: #FFFFFF;
+  position: absolute;
+  left: 50%;
+  bottom: 0;
+  transform: translateX(-50%);
+}
+
+.doc_his_con {
+  width: 100%;
+}
+
+.doc_name {
+  font-size: 34upx;
+  font-weight: 500;
+}
+
+.name_tip {
+  font-size: 24upx;
+  color: #481A00;
+  padding: 0 14upx;
+  line-height: 34upx;
+  margin-left: 10upx;
+  background: linear-gradient(90deg, #EDCD94 0%, #E9B677 100%);
+  border-radius: 20upx;
+  line-height: 34upx;
+}
+
+.doc_dept {
+  font-size: 26upx;
+  margin-top: 7upx;
+}
+
+.doc_tip_list {
+  justify-content: flex-start;
+  margin-top: 13upx;
+}
+
+.doc_tip_item {
+  padding: 0 12upx;
+  height: 36upx;
+  line-height: 36upx;
+  margin-right: 10upx;
+  background: #B8BCC3;
+  border-radius: 6upx;
+  font-size: 22upx;
+  color: #fff;
+}
+
+.doc_his_val {
+  justify-content: space-around;
+  margin-top: 30upx;
+  white-space: nowrap;
+  position: relative;
+  z-index: 1;
+  font-size: 24upx;
+  font-family: PingFang SC;
+  font-weight: 500;
+  color: rgba(98, 98, 109, 0.6);
+  line-height: 48upx;
+}
+
+.doc_his_val_num {
+  font-size: 36upx;
+  font-family: JDZhengHT-EN;
+  font-weight: bold;
+  color: #222326;
+}
+
+.doc_his_val_tip {
+  color: rgb(216, 221, 223);
+  margin: 0 20upx;
+}
+
+.doc_his_btn_list {
+  position: absolute;
+  right: 0;
+  top: 40upx;
+}
+
+.doc_his_btn {
+  width: 54upx;
+  height: 54upx;
+  background: linear-gradient(120deg, #FFB363, #FF9D35);
+  margin-right: 20upx;
+  border-radius: 50%;
+}
+
+.doc_his_code_img {
+  width: 54upx;
+  height: 48upx;
+  margin-left: 11upx;
+}
+
+.doc_his_btn_img {
+  width: 32upx;
+  height: 32upx;
+}
+
+.doc_his_btn_like {
+  padding: 0 18upx;
+  height: 54upx;
+  background: linear-gradient(120deg, #FFB363, #FF9D35);
+  border-radius: 27upx;
+  font-size: 26upx;
+  font-weight: 500;
+  color: #fff;
+}
+
+.doc_his_btn_val {
+  margin-left: 8upx;
+}
+
+.doc_his_btn_liked {
+  background: #fff;
+  color: #FF9D35;
+}
+
+.doc_info {
+  margin: 18upx 0 10upx;
+}
+
+.doc_info_item {
+  margin-top: 8upx;
+  position: relative;
+}
+
+.doc_info_img {
+  width: 107upx;
+  height: 25upx;
+  margin-top: 5upx;
+  position: absolute;
+}
+
+.doc_info_val {
+  font-size: 26upx;
+  font-family: PingFang SC;
+  color: #62626D;
+  line-height: 36upx;
+  text-indent: 127upx;
+  position: relative;
+}
+
+.show_more {
+  font-size: 26upx;
+  font-family: PingFang SC;
+  font-weight: bold;
+  color: #0CC081;
+  line-height: 40upx;
+  text-align: right;
+  float: right;
+}
+
+.doc_tip {
+  display: block;
+  width: 90upx;
+  height: 36upx;
+  margin: 10upx auto 0;
+}
+
+.doc_tip_top {
+  transform: rotateZ(180deg);
+}
+
+.consulting_con {
+  box-shadow: 0px 2upx 40upx 0px rgba(43, 46, 55, 0.04);
+  position: relative;
+  width: 690upx;
+  margin-left: 30upx;
+  margin-bottom: 30upx;
+}
+
+.consulting_detail {
+  padding: 40upx 30upx 0;
+  border-radius: 24upx;
+  background-color: #fff;
+}
+
+.consulting_comment {
+  margin: 30upx 0 220upx;
+  border-radius: 24upx;
+  background-color: #fff;
+}
+
+.consulting_option {
+  width: 303upx;
+  height: 210upx;
+  background: #fff;
+  box-shadow: 0px 2upx 40upx 0px rgba(43, 46, 55, 0.1);
+  border-radius: 16upx;
+  position: relative;
+}
+
+.consulting_option_ac {
+  background: #F5FFFA;
+  border: 1px solid #0CC181;
+  box-shadow: 0px 2upx 40upx 0px rgba(43, 46, 55, 0.1);
+}
+
+.consulting_option_img {
+  width: 80upx;
+  height: 80upx;
+  margin-bottom: 20upx;
+}
+
+.doctor_selected {
+  position: absolute;
+  width: 52upx;
+  height: 52upx;
+  bottom: 0;
+  right: 0;
+}
+
+.consulting_option_tit {
+  font-size: 32upx;
+  font-family: PingFang SC;
+  font-weight: bold;
+  color: #222326;
+  line-height: 36upx;
+}
+
+.consulting_option_subtit {
+  font-size: 24upx;
+  font-family: PingFang SC;
+  color: #8A8A99;
+  line-height: 36upx;
+  margin-top: 7upx;
+}
+
+.consulting_detail_tip_tit {
+  font-size: 34upx;
+  font-family: PingFang SC;
+  font-weight: 800;
+  color: #222326;
+  line-height: 36upx;
+  padding: 0 30upx;
+}
+
+.consulting_detail .consulting_detail_tip_tit {
+  padding-left: 0;
+}
+
+.consulting_detail_imgtip_inner {
+  width: 100%;
+  justify-content: space-around;
+}
+
+.consulting_detail_tip_val {
+  font-size: 28upx;
+  font-family: PingFang SC;
+  color: #43434A;
+  line-height: 44upx;
+  margin: 5upx 0;
+  position: relative;
+  padding-left: 35upx;
+}
+
+.consulting_detail_tip_val::after {
+  position: absolute;
+  display: block;
+  content: "";
+  width: 12upx;
+  height: 12upx;
+  background-color: #02C28A;
+  border-radius: 50%;
+  left: 7upx;
+  top: 14upx;
+}
+
+.consulting_detail_imgtip_item {
+  margin-bottom: 40upx;
+}
+
+.consulting_detail_img {
+  width: 48upx;
+  height: 48upx;
+}
+
+.consulting_detail_val {
+  font-size: 26upx;
+  margin-top: 13upx;
+}
+
+.consulting_detail_right {
+  width: 19upx;
+  height: 19upx;
+  margin-top: -48upx;
+}
+
+.consulting_detail_tip_tit {
+  justify-content: flex-start;
+  padding: 40upx 30upx 28upx;
+}
+
+.consulting_detail_tip_img {
+  width: 48upx;
+  height: 48upx;
+  margin-right: 19upx;
+}
+
+.consulting_comment_item {
+  margin-top: 25upx;
+  padding: 0 30upx;
+}
+
+.consulting_comment_item:nth-last-child(1)::before {
+  border-bottom: 0;
+}
+
+.consulting_comment_user_name {
+  font-size: 28upx;
+  font-family: PingFang SC;
+  color: #8A8A99;
+}
+
+.consulting_comment_star_img {
+  width: 24upx;
+  height: 24upx;
+  margin-right: 9upx;
+}
+
+.consulting_comment_star_img:nth-last-child(1) {
+  margin-right: 0;
+}
+
+.consulting_comment_val {
+  font-size: 30upx;
+  margin: 20upx 0 12upx;
+}
+
+/* 评价统计标签容器 */
+.statistics_item_outer {
+  display: flex;
+  flex-wrap: wrap;
+  margin-bottom: 16upx;
+}
+
+/* 评价统计标签 */
+.statistics_item_box {
+  padding: 20upx;
+  box-sizing: border-box;
+  background: #FDF6EB;
+  border-radius: 12upx;
+  margin: 16upx;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  min-width: 40%;
+  flex: 1 1 auto;
+}
+
+.statistics_item_box text {
+  font-size: 28upx;
+  white-space: nowrap;
+}
+
+.statistics_item_icon {
+  width: 66upx;
+  height: 66upx;
+  margin-right: 16upx;
+  flex-shrink: 0;
+}
+
+.statistics_item_text {
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+}
+
+.statistics_item_text text {
+  margin-right: 8upx;
+}
+
+.statistics_item_text text:last-child {
+  margin-right: 0;
+}
+
+.consulting_comment_user_phtot {
+  width: 36upx;
+  height: 36upx;
+  margin-right: 15upx;
+}
+
+.consulting_comment_user_time {
+  font-size: 26upx;
+}
+
+.color333 {
+  color: #333;
+}
+
+.consulting_comment_tips {
+  justify-content: flex-start;
+  margin: 13upx 0 32upx;
+}
+
+.consulting_comment_tip_item {
+  height: 40upx;
+  line-height: 40upx;
+  text-align: center;
+  font-size: 22upx;
+  padding: 0 12upx;
+  margin-right: 10upx;
+  background: #F6F7F8;
+  border-radius: 6px;
+}
+
+.consulting_comment_tip_item:nth-last-child(1) {
+  margin-right: 0;
+}
+
+/* 电子名片 */
+.mask_bottom {
+  align-items: flex-end;
+}
+
+.p_dialog {
+  position: relative;
+}
+
+.dialog_inner_bottom {
+  max-height: inherit;
+  padding: 0 30upx;
+}
+
+.doctor_picback1 {
+  width: 135upx;
+  height: 420upx;
+  position: absolute;
+  left: 0;
+  top: 64upx;
+}
+
+.doctor_picback2 {
+  width: 208upx;
+  height: 517upx;
+  position: absolute;
+  top: 306upx;
+  right: 0;
+}
+
+.doc_detial_pic {
+  position: relative;
+  width: 100%;
+  height: 347upx;
+  border-radius: 30upxp;
+  overflow: hidden;
+  padding: 0 50upx;
+}
+
+.doc_detial_pic_img {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  border-radius: 24upx;
+}
+
+.doc_detial_pic_inner {
+  position: relative;
+  width: 100%;
+  height: 100%;
+}
+
+.pic_con {
+  width: 100%;
+}
+
+.pic_tit {
+  font-size: 34upx;
+  font-weight: 500;
+  position: relative;
+}
+
+.pic_tit_line {
+  width: 57upx;
+  height: 3upx;
+  position: absolute;
+  left: 0;
+  bottom: -12upx;
+}
+
+.pic_name {
+  font-size: 44upx;
+  font-weight: 500;
+  margin: 46upx 0 15upx;
+}
+
+.pic_subtit {
+  font-size: 28upx;
+  margin-bottom: 50upx;
+}
+
+.pic_img_con {
+  flex-shrink: 0;
+  width: 210upx;
+  height: 210upx;
+  position: relative;
+}
+
+.doc_imgback {
+  width: 100%;
+  height: 100%;
+}
+
+.doc_img {
+  position: absolute;
+  width: 143upx;
+  height: 143upx;
+  left: 28upx;
+  top: 41upx;
+  border-radius: 50%;
+}
+
+.doc_detail_code_con {
+  width: 320upx;
+  height: 320upx;
+  background: #FFFFFF;
+  border-radius: 20upx;
+  box-shadow: 0 0 30upx 0 #eee;
+  margin: 48upx 0 41upx;
+}
+
+.doc_detail_inp_con {
+  height: 90px;
+  background: #FFFFFF;
+  border: 1px solid #CCCCCC;
+  border-radius: 12upx;
+  height: 90upx;
+  line-height: 90upx;
+  padding: 0 32upx;
+  font-size: 26upx;
+  margin-bottom: 10upx;
+}
+
+/* 暂无评价 */
+.nodata_con {
+  padding: 100upx 0 !important;
+}
+
+.dialog_inner {
+  width: 650upx;
+  background-color: #fff;
+  border-radius: 16upx;
+  padding: 30upx;
+}
+
+.dialog_tit {
+  font-size: 32upx;
+  font-weight: 500;
+  color: #000000;
+  padding-bottom: 20upx;
+}
+
+.dialog_cha {
+  width: 24upx;
+  height: 24upx;
+}
+
+.dialog_row {
+  padding: 30upx 0;
+}
+
+.row_tit {
+  font-size: 28upx;
+  font-weight: 400;
+  color: #000000;
+  line-height: 40upx;
+}
+
+.row_subtit {
+  font-size: 24upx;
+  font-weight: 400;
+  color: #666666;
+  line-height: 34upx;
+}
+
+.dialog_tip {
+  font-size: 28upx;
+  color: #68BB8D;
+}
+
+.dialog_suc {
+  width: 28upx;
+  height: 28upx;
+  margin-right: 12upx;
+}
+
+.tabbar {
+  height: 44px;
+  line-height: 44px;
+  text-align: center;
+  color: #222;
+  box-sizing: content-box;
+  font-size: 32upx;
+  font-weight: 500;
+  background: #F0F1F6;
+  width: 100%;
+  position: fixed;
+  z-index: 99;
+  top: 0;
+  left: 0;
+  overflow: hidden;
+}
+
+.iconCon {
+  width: 87upx;
+  height: 40px;
+  position: absolute;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  margin: auto 0;
+  z-index: 1;
+}
+
+.iconLeft {
+  width: 12px;
+  height: 12px;
+  border-top: 2px solid;
+  border-left: 2px solid;
+  color: #222;
+  transform: rotateZ(-45deg);
+  position: absolute;
+  top: 2px;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  margin: auto;
+}
+</style>

+ 917 - 0
pagesNetHos/st1/business/doctor/doctorList/doctorList.vue

@@ -0,0 +1,917 @@
+<template>
+	<view class="container" v-if="showCon">
+		<view class="content">
+			<view class="doctor_nav" :class="{ doctor_nav_shadow: optionType }">
+				<view class="p_search_con p_flexCenter search_con">
+					<input class="p_search_input" :focus="showSearchInput" placeholder-class="p_placeholder" placeholder="输入医生姓名"
+						@confirm="getDoctorList" @input="searchInput" v-model="searchValue" />
+				</view>
+				<view class="p_flexBetween">
+					<view class="option_outer">
+						<view class="option_item p_flexCenter" @click="optionClick" data-type="sort" data-dialog="sortDialogShow">
+							<view class="option_item_name p_lineClamp" :class="{ p_color_3: optionType == 'sort' }">{{ sortSelected.key }}</view>
+							<image class="option_item_icon" :class="{ option_item_icon_top: optionType == 'sort' }"
+								:src="iconUrl.doctor_todown"></image>
+						</view>
+					</view>
+					<view class="option_outer">
+						<view class="option_item p_flexCenter p_border_left" @click="optionClick" data-type="dept"
+							data-dialog="deptDialogShow">
+							<view class="option_item_name" :class="{ p_color_3: optionType == 'dept' }">
+								{{ deptSeletSec.Name || deptSeletSec.DeptName || '全部科室' }}
+							</view>
+							<image class="option_item_icon" :class="{ option_item_icon_top: optionType == 'dept' }"
+								:src="iconUrl.doctor_todown"></image>
+						</view>
+					</view>
+					<view class="option_outer">
+						<view class="option_item p_flexCenter p_border_left" @click="optionClick" data-type="screen"
+							data-dialog="screenDialogShow">
+							<view class="option_item_name" :class="{ p_color_3: optionType == 'screen' }">筛选</view>
+							<image class="option_item_icon" :class="{ option_item_icon_top: optionType == 'screen' }"
+								:src="iconUrl.doctor_todown"></image>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="doctor_list">
+				<view class="doctor_list_inner" v-if="!showNoData">
+					<view class="doctor_list_con p_format">
+						<view class="p_doctor_item p_flexCenter" v-for="(item, ind) in doctorList" :key="ind">
+							<view class="p_doctor_img_con">
+								<image class="p_doctor_img" :src="item.DoctorPhotourl"></image>
+							</view>
+							<view class="p_doctor_item_con" @click="toDoctorInfo" :data-item="item">
+								<view class="p_flexBetween">
+									<view class="p_doctor_infocon">
+										<view class="p_doctor_tit">
+											<view class="p_doctor_name">{{ item.DoctorName }}</view>
+											<view class="p_doctor_tip p_flexCenter" v-if="item.DoctorService1004 == '1'">
+												<text class="p_doctor_rescription">可开方</text>
+											</view>
+										</view>
+										<view class="p_doctor_info p_color_6">{{ item.TitleName }} {{ item.DeptName }}</view>
+									</view>
+									<view class="p_doctor_btn p_flexCenter">
+										<view class="p_color" style="position: relative;z-index: 1;">快速问诊</view>
+										<image class="p_doctor_btn_img" :src="iconUrl.home_tip_n"></image>
+									</view>
+								</view>
+								<view class="p_doctor_item_introduce p_color_9 p_lineClamp">
+									擅长:{{ item.DoctorSkill }}
+								</view>
+								<view class="p_doctor_item_describe">咨询量<text class="p_color">{{ item.ConsultAmount }}</text><text
+										class="p_color_9">/</text>好评率<text class="p_color">{{ item.percentage }}</text>
+								</view>
+								<view class="p_doctor_work_type displayFlexLeft">
+									<view class="p_doctor_type_item p_flexCenter">
+										<text class="p_doctor_type_item_tit">图文&nbsp;</text>
+										<view class="p_doctor_type_item_val" v-if="item.DoctorServiceCons == '1'">
+											¥{{ item.consultFeeDiy }}
+										</view>
+										<view class="p_doctor_type_item_err" v-else>未开通</view>
+									</view>
+									<view class="p_doctor_type_item p_flexCenter">
+										<text class="p_doctor_type_item_tit">视频&nbsp;</text>
+										<view class="p_doctor_type_item_val" v-if="item.DoctorVideocons == '1'">
+											¥{{ item.videoFeeDiy }}
+										</view>
+										<view class="p_doctor_type_item_err" v-else>未开通</view>
+									</view>
+								</view>
+							</view>
+						</view>
+					</view>
+					<view class="p_load_more p_color_9">{{ stopReachBottom ? "已加载全部" : "上拉加载更多" }}</view>
+				</view>
+			</view>
+			<view v-if="doctorList.length == 0" class="noData">
+				<noData :value="showNoDataValue"></noData>
+			</view>
+		</view>
+		<!-- 科室列表 -->
+		<view class="p_mask dept_dialog_mask" v-if="deptDialogShow" @click="hideOrShowMask" data-key="deptDialogShow">
+			<scroll-view scroll-y scroll-with-animation :scroll-into-view="scrollCode" class="dept_dialog_list dept_dialog_list_dept"
+				v-if="deptSecondary">
+				<view v-for="(item, ind) in deptListFir" :key="ind">
+					<view class="dept_dialog_item dept_dialog_item_sort_tit dept_dialog_item_fir p_flexBetween p_color"
+						:id="item.letters">{{ item.letters }}</view>
+					<view class="dept_dialog_item dept_dialog_item_fir p_flexBetween"
+						:class="{ dept_dialog_item_selected: item.Id == deptSeletFir.Id }" v-for="(deptItem, deptInd) in item.data"
+						:key="deptInd" @click.stop="allDeptClick" :data-item="deptItem" data-dialog="deptDialogShow"
+						data-type="fir">
+						<view class="dept_dialog_item_tit p_flexBetween">
+							<view class="dept_dialog_item_name">{{ deptItem.Name }}</view>
+						</view>
+					</view>
+				</view>
+			</scroll-view>
+			<!-- 二级科室 -->
+			<view class="dept_dialog_list_sec p_scroll" :class="{ dept_dialog_list_short: deptSecondary }">
+				<view class="dept_dialog_item p_border_bottom p_flexBetween" v-for="(item, ind) in deptListSec" :key="ind"
+					@click.stop="allDeptClick" data-type="sec" :data-item="item" data-dialog="deptDialogShow">
+					<view class="dept_dialog_item_tit p_flexBetween">
+						<view class="dept_dialog_item_name"
+							:class="{ dept_dialog_item_name_selected: item.Id == deptSeletSec.Id, p_color: item.Id == deptSeletSec.Id }">
+							{{ item.Name }}
+						</view>
+						<view class="dept_dialog_item_tip" v-if="item.Visitmarks == '1'">可复诊</view>
+					</view>
+					<view class="dept_dialog_item_select" v-if="item.Id == deptSeletSec.Id"></view>
+				</view>
+			</view>
+			<view class="code_list p_flexCenterCol">
+				<view class="code_item" :class="{ code_item_active: item == scrollCode }" v-for="(item, ind) in codeList"
+					:key="ind" @click="codeClk" :data-item="item">{{ item }}</view>
+			</view>
+		</view>
+		<!-- 排序 -->
+		<view class="p_mask dept_dialog_mask" v-if="sortDialogShow" @click="hideOrShowMask" data-key="sortDialogShow">
+			<view class="dept_dialog_list dept_dialog_list_sort p_scroll" @click.stop="doNothing">
+				<view class="dept_dialog_item p_border_bottom p_flexBetween"
+					:class="{ dept_dialog_item_selected: item.key == sortSelected.key, p_color: item.key == sortSelected.key }"
+					v-for="(item, ind) in sortList" :key="ind" @click="sortClick" :data-value="item" data-key="sortSelected"
+					data-dialog="sortDialogShow">
+					<view class="dept_dialog_item_tit p_flexBetween">
+						<view class="dept_dialog_item_name">{{ item.key }}</view>
+					</view>
+					<view class="dept_dialog_item_select" v-if="item.key == sortSelected.key"></view>
+				</view>
+			</view>
+		</view>
+		<view class="show_tip" @click="showHideModal" v-if="showModalTip">科室介绍</view>
+
+		<!-- 筛选 -->
+		<screen :pMask="false" :screenDialogShow="screenDialogShow" :screenList="screenList" :queryData="queryData"
+			:showDoctorTitle="true" @screenConfirmClk="screenConfirmClk" @showScreenMask="showScreenMask"></screen>
+
+		<richTextModal :modalData="modalData" v-if="modalData.showModal" @cancel="modalCancel" @confirm="modalConfirm"></richTextModal>
+	</view>
+</template>
+
+<script lang="ts" setup>
+import { ref, reactive, getCurrentInstance } from 'vue';
+import { useOnLoad } from '@/hook';
+import { onReachBottom } from '@dcloudio/uni-app';
+import { common } from '@/uni-app-base/utils';
+import icon from '@/utils/icon';
+import { menuClick } from '@/utils';
+import noData from '@/pages/st1/components/noData/noData.vue';
+import screen from '/pagesNetHos/st1/components/screen/screen.vue';
+import richTextModal from '@/pages/st1/components/richTextModal/richTextModal.vue';
+
+import { queryDeptList, queryConsultDeptList, queryConsultDoctorList, queryNetConsultDoctorList } from '/pagesNetHos/st1/service/doctor/index';
+import { getFirst, doctorListHandle } from '/pagesNetHos/st1/static/js/pagesNetHosFn';
+import { copy as netHosCopy, deepCopy } from '/pagesNetHos/st1/static/js/netHosCommon';
+
+const { proxy } = getCurrentInstance() as any;
+const app = getApp();
+
+// 响应式数据
+const deptList = ref<any[]>([]);
+const showCon = ref(false);
+const showNoData = ref(false);
+const showNoDataValue = ref("暂无医生排班");
+const iconUrl = ref(icon);
+const optionType = ref("");
+const sortDialogShow = ref(false);
+const screenDialogShow = ref(false);
+const deptDialogShow = ref(false);
+const deptListFir = ref<any[]>([]);
+const deptListSec = ref<any[]>([]);
+const deptSecondary = ref(true);
+const deptSeletFir = ref<any>({});
+const deptSeletSec = ref<any>({});
+const sortList = ref([
+	{ key: "综合排序", value: "0" },
+	{ key: "好评率", value: "6" },
+	{ key: "咨询量", value: "5" },
+	{ key: "价格从低到高", value: "4" },
+	{ key: "价格从高到低", value: "3" }
+]);
+const sortSelected = ref({ key: "咨询量", value: "5" });
+const searchValue = ref("");
+const screenList = ref<any[]>([]);
+const queryData = reactive({
+	DoctorTitleCode: "",
+	IsOnline: "",
+	ConsultType: "",
+	DoctorName: "",
+	DeptId: "",
+	DoctorService1004: "",
+	SortBy: "",
+	SourceType: "",
+	LczcCode: "",
+	Page: {
+		PSize: 10,
+		PIndex: 1
+	}
+});
+const stopReachBottom = ref(false);
+const doctorList = ref<any[]>([]);
+const selectedType = ref("");
+const serviceType = ref("");
+const deptShowTip = ref([
+	{ deptId: "27", deptName: "神经内科", articleId: "a24532d9ac48499c970ccfa9b4808db7" },
+	{ deptId: "469", deptName: "精神科", articleId: "ed413f04d9d042d1a1bcc3be1f5b68b7" },
+	{ deptId: "25", deptName: "心内科", articleId: "704859de51fa42c9ba398a597915427f" },
+	{ deptId: "205", deptName: "高血压科", articleId: "0f962099d9aa4c51ad55e833490a85b9" },
+	{ deptId: "249", deptName: "内分泌科", articleId: "4645252b991d48e6b004722667eb183c" }
+]);
+const modalData = reactive({
+	showModal: false,
+	title: '温馨提示',
+	styleType: 'bottom',
+	articleId: '',
+	showCancel: false,
+	cancelText: '取消',
+	cancelColor: 'red',
+	confirmText: '确定',
+	showCancelBtn: true,
+});
+const showModalTip = ref(false);
+const codeList = ref<string[]>([]);
+const scrollCode = ref("");
+const showSearchInput = ref(false);
+
+// 返回上一级页面时执行的当前页面函数
+const refresh = () => {
+	// 刷新逻辑(如需要)
+};
+
+// 主函数
+const main = async () => {
+	// 查询医生列表
+	common.showLoading();
+	let deptListData: any[] = [];
+	let deptListFirData: any[] = [];
+	let deptListSecData: any[] = [];
+	let deptSeletFirData: any = {};
+	let options = {
+		showLoading: false
+	};
+
+	// 查询全部科室
+	const queryDeptListPromise = queryDeptList({ DoctorServiceCons: "1" }, options);
+	// 查询推荐科室
+	const queryConsultDeptListPromise = queryConsultDeptList({
+		IsRcmd: "1",
+		Page: { PIndex: 1, PSize: 150 }
+	}, options);
+	const [{ resp: allDeptListResp }, { resp: deptListResp }] = await Promise.all([queryDeptListPromise, queryConsultDeptListPromise]);
+  console.log(allDeptListResp, "allDeptListResp");
+
+	common.hideLoading();
+	await getDoctorList();
+
+	// 处理科室数据逻辑
+	if (!common.isEmpty(allDeptListResp)) {
+		allDeptListResp[0].Children.sort(function (a: any, b: any) {
+			return a.Name.localeCompare(b.Name);
+		});
+		
+		// 处理新冠咨询科室过滤
+		if (selectedType.value == "xgzx") {
+			const XGShowDeptList = (app.globalData as any).config?.XGShowDeptList || [];
+			allDeptListResp[0].Children.forEach((item: any) => {
+				if (item.Children && item.Children.length > 0) {
+					item.Children = item.Children.filter((child: any) => XGShowDeptList.indexOf(Number(child.Id)) != '-1');
+				}
+			});
+			allDeptListResp[0].Children = allDeptListResp[0].Children.filter((item: any) => XGShowDeptList.indexOf(Number(item.Id)) != '-1');
+		}
+
+		if (deptSecondary.value) {
+			// 如果有二级科室
+			deptListFirData = allDeptListResp[0].Children;
+			deptSeletFirData = deptListFirData[0];
+			deptListSecData = deptListFirData[0].Children || [];
+		} else {
+			for (var i = 0; i < allDeptListResp[0].Children.length; i++) {
+				for (var j = 0; j < allDeptListResp[0].Children[i].Children.length; j++) {
+					// 赋值deptId
+					allDeptListResp[0].Children[i].Children[j].DeptId = allDeptListResp[0].Children[i].Children[j].Id;
+					deptListSecData.push(allDeptListResp[0].Children[i].Children[j]);
+				}
+			}
+		}
+	}
+
+	deptListData = deptListResp || [];
+	deptListData.map((item: any) => item.Id = item.DeptId);
+	// 推荐科室添加全部科室
+	deptListData.unshift({
+		DeptName: "全部科室",
+		DeptPicture: iconUrl.value.doctor_dept
+	});
+
+	let deptListFirCopy: any[] = [];
+	let has: boolean;
+	let codeListData: string[] = [];
+	for (let i of deptListFirData) {
+		has = false;
+		if (deptListFirCopy.length == 0) {
+			deptListFirCopy.push({
+				letters: getFirst(i.Name),
+				data: [i]
+			});
+		} else {
+			for (let j in deptListFirCopy) {
+				if (deptListFirCopy[j].letters == getFirst(i.Name)) {
+					deptListFirCopy[j].data.push(i);
+					has = true;
+					break;
+				}
+			}
+			if (!has) {
+				deptListFirCopy.push({
+					letters: getFirst(i.Name),
+					data: [i]
+				});
+				has = true;
+			}
+		}
+	}
+	deptListFirCopy.sort(function (a: any, b: any) {
+		return a.letters.charCodeAt(0) - b.letters.charCodeAt(0);
+	});
+	deptListFirCopy.map((item: any) => {
+		codeListData.push(item.letters);
+	});
+
+	deptList.value = deptListData;
+	deptListFir.value = deptListFirCopy;
+  console.log(deptListFirCopy, "deptListFirCopy");
+	deptSeletFir.value = deptSeletFirData;
+	codeList.value = codeListData;
+	deptListSec.value = deptListSecData;
+	showCon.value = true;
+	deptDialogShow.value = common.isEmpty(searchValue.value) && common.isEmpty(deptSeletSec.value);
+	optionType.value = common.isEmpty(searchValue.value) && common.isEmpty(deptSeletSec.value) ? 'dept' : '';
+
+	if (!common.isEmpty(deptSeletSec.value)) {
+		let selectFir = null;
+		deptListFir.value.forEach((cell: any) => {
+			(cell.data || []).forEach((obj: any) => {
+				// 检查当前对象或其子对象是否匹配
+				if (obj.Id == (deptSeletSec.value.DeptId || deptSeletSec.value.Id)) {
+					selectFir = obj;
+				} else if (obj.Children && obj.Children.length > 0) {
+					obj.Children.forEach((child: any) => {
+						if (child.Id == (deptSeletSec.value.DeptId || deptSeletSec.value.Id)) {
+							selectFir = obj;
+						}
+					});
+				}
+			});
+		});
+		// 过滤当前点击的所有科室item
+		deptSeletFirData = selectFir || deptSeletFir.value;
+		if (deptSecondary.value) {
+			// 如果有二级科室  更新二级科室菜单
+			deptSeletFir.value = deptSeletFirData;
+			deptListSec.value = deptSeletFirData.Children || [];
+		}
+	}
+};
+
+// 前往医生详情
+const toDoctorInfo = (e: any) => {
+	const { item } = e.currentTarget?.dataset || {};
+	if (!item) return;
+
+	if (selectedType.value) {
+		if (selectedType.value == 'twzx' && item.DoctorServiceCons != '1') {
+			common.showToast('当前医生未开通图文咨询');
+			return;
+		} else if (selectedType.value == 'spzx' && item.DoctorVideocons != '1') {
+			common.showToast('当前医生未开通视频咨询');
+			return;
+		}
+		const queryBean = common.stringify(item);
+		const url = `/pagesNetHos/st1/business/doctor/supplement/supplement?queryBean=${queryBean}&selectedType=${selectedType.value}&serviceType=${serviceType.value}`;
+		const data = { Url: url };
+		menuClick(data, proxy);
+	} else {
+		const queryBean = common.stringify(item);
+		const url = `/pagesNetHos/st1/business/doctor/doctorInfo/doctorInfo?queryBean=${queryBean}`;
+		const data = { Url: url };
+		menuClick(data, proxy);
+	}
+};
+
+// 筛选,排序,科室点击
+const optionClick = (e: any) => {
+	const { type, dialog } = e.currentTarget?.dataset || {};
+	if (!type || !dialog) return;
+
+	screenDialogShow.value = dialog == 'screenDialogShow' ? !screenDialogShow.value : false;
+	deptDialogShow.value = dialog == 'deptDialogShow' ? !deptDialogShow.value : false;
+	sortDialogShow.value = dialog == 'sortDialogShow' ? !sortDialogShow.value : false;
+	optionType.value = optionType.value == type ? '' : type;
+};
+
+// 排序item点击
+const sortClick = (e: any) => {
+	const { value, key, dialog } = e.currentTarget?.dataset || {};
+	if (!value || !key) return;
+
+	// @ts-ignore
+	sortSelected.value = value;
+	optionType.value = "";
+	getDoctorList();
+};
+
+// 全部科室列表点击
+const allDeptClick = (e: any) => {
+	const { item, dialog, type } = e.currentTarget?.dataset || {};
+	if (!item) return;
+
+	let deptSeletFirData: any = {};
+	let deptSeletSecData: any = {};
+
+	if (type == 'fir') {
+		if (common.isEmpty(item.Children)) {
+			deptSeletSecData = item;
+			deptSeletFirData = item;
+		} else {
+			// 点击一级科室
+			deptSeletFir.value = item;
+			deptListSec.value = item.Children || [];
+			return;
+		}
+	} else if (type == 'sec') {
+		// 点击二级科室
+		deptSeletSecData = item;
+		deptSeletFirData = deptSeletFir.value;
+	} else {
+		// 点击推荐科室
+		deptSeletSecData = item;
+		let selectFir = null;
+		deptListFir.value.forEach((cell: any) => {
+			(cell.data || []).forEach((obj: any) => {
+				if (obj.Id == item.Id) {
+					selectFir = cell;
+				}
+			});
+		});
+		deptSeletFirData = selectFir || deptSeletFir.value;
+		if (deptSecondary.value) {
+			deptListSec.value = deptSeletFirData.data?.[0]?.Children || deptSeletFirData.Children || [];
+		}
+	}
+
+	deptSeletFir.value = deptSeletFirData;
+	deptSeletSec.value = deptSeletSecData;
+	optionType.value = "";
+	getDoctorList();
+};
+
+// 弹窗显影
+const hideOrShowMask = (e: any) => {
+	const { key } = e.currentTarget?.dataset || {};
+	if (!key) return;
+
+	// @ts-ignore
+	if (key === 'deptDialogShow') {
+		deptDialogShow.value = !deptDialogShow.value;
+	} else if (key === 'sortDialogShow') {
+		sortDialogShow.value = !sortDialogShow.value;
+	} else if (key === 'screenDialogShow') {
+		screenDialogShow.value = !screenDialogShow.value;
+	}
+};
+
+const doNothing = () => {
+	// 阻止事件冒泡
+};
+
+// 输入医生
+const searchInput = (e: any) => {
+	searchValue.value = e.detail.value;
+};
+
+// 获取医生列表
+const getDoctorList = async (reachBottom?: boolean) => {
+	showHideModalBtn();
+	reachBottom = typeof reachBottom === 'boolean' ? reachBottom : false;
+
+	if (!reachBottom) {
+		queryData.Page.PIndex = 1;
+	}
+
+	// 医生名字
+	queryData.DoctorName = searchValue.value || "";
+	// 科室
+	queryData.DeptId = deptSeletSec.value.Id || "";
+	// 排序
+	queryData.SortBy = sortSelected.value.value;
+
+	queryData.LczcCode = queryData.DoctorTitleCode;
+
+	let res;
+	if (selectedType.value == 'spzx') {
+		queryData.SourceType = '006';
+		res = await queryNetConsultDoctorList(queryData);
+	} else {
+		res = await queryConsultDoctorList(queryData);
+	}
+	const { resp } = res;
+	let stopReachBottomValue = resp.length < queryData.Page.PSize;
+	if (!common.isEmpty(resp)) {
+		let handledResp = doctorListHandle(resp);
+		if (reachBottom) {
+			doctorList.value.push(...handledResp);
+		} else {
+			doctorList.value = handledResp;
+		}
+	} else {
+		if (!reachBottom) {
+			doctorList.value = [];
+		}
+	}
+
+	showNoData.value = common.isEmpty(doctorList.value);
+	stopReachBottom.value = selectedType.value == 'spzx' ? false : stopReachBottomValue;
+	deptDialogShow.value = false;
+	sortDialogShow.value = false;
+	optionType.value = "";
+};
+
+// 筛选弹窗显影
+const showScreenMask = () => {
+	screenDialogShow.value = !screenDialogShow.value;
+};
+
+// 筛选确定点击
+const screenConfirmClk = (e: any) => {
+	const data = netHosCopy(e.detail, queryData);
+	Object.assign(queryData, data);
+	getDoctorList();
+};
+
+// 滚动锚点点击
+const codeClk = (e: any) => {
+	const { item } = e.currentTarget?.dataset || {};
+	if (item) {
+		scrollCode.value = item;
+	}
+};
+
+// 上拉加载
+onReachBottom(() => {
+	if (stopReachBottom.value) {
+		return;
+	}
+	queryData.Page.PIndex += 1;
+	getDoctorList(true);
+});
+
+const modalCancel = () => {
+	showHideModal();
+};
+
+const modalConfirm = () => {
+	showHideModal();
+};
+
+const showHideModal = () => {
+	modalData.showModal = !modalData.showModal;
+};
+
+const showHideModalBtn = () => {
+	let showModalTipValue = false;
+	deptShowTip.value.forEach((i: any) => {
+		if (i.deptId == deptSeletFir.value.Id) {
+			modalData.articleId = i.articleId;
+			showModalTipValue = true;
+		}
+	});
+	showModalTip.value = showModalTipValue;
+};
+
+// 页面加载
+useOnLoad(async (options: any) => {
+	try {
+		const config = (app.globalData as any).config;
+		const screenListData = deepCopy(config?.net_pageConfiguration_patient?.doctorList_screening?.value || [], []);
+		let searchValueData: string | undefined;
+		if (options.searchValue) {
+			searchValueData = options.searchValue;
+		}
+
+		let deptInfo: any = {};
+		if (options.deptInfo) {
+			try {
+				deptInfo = JSON.parse(options.deptInfo);
+			} catch (e) {
+				console.error('解析 deptInfo 失败:', e);
+			}
+		}
+
+		if (deptInfo.DeptId) {
+			deptInfo.Id = deptInfo.DeptId;
+		}
+
+		screenList.value = screenListData;
+		searchValue.value = searchValueData || "";
+		queryData.DeptId = deptInfo.DeptId || "";
+		deptSeletSec.value = deptInfo;
+		selectedType.value = options.selectedType || '';
+		serviceType.value = options.serviceType || 'zxfz';
+		queryData.ConsultType = options.selectedType == 'twzx' ? '1' : options.selectedType == 'spzx' ? '2' : "";
+
+		await main();
+		showHideModalBtn();
+	} catch (error) {
+		console.error('页面加载失败:', error);
+	}
+});
+</script>
+
+<style lang="scss">
+@import "@/pagesNetHos/st1/static/css/common.scss";
+@import "@/pagesNetHos/st1/static/css/doctorInfo.scss";
+@import "@/pagesNetHos/st1/static/css/dialog.scss";
+
+.p_content {}
+
+.doctor_nav {
+	background-color: #ffffff;
+	padding: 20upx 30upx 0;
+	position: fixed;
+	z-index: 2;
+	width: 100%;
+	height: 215upx;
+}
+
+.doctor_nav_shadow {
+	box-shadow: 0px 0px 12upx 0px rgba(0, 0, 0, 0.04);
+}
+
+.search_con {
+	margin-bottom: 0;
+	padding: 0 30upx;
+}
+
+.dept_list {
+	white-space: nowrap;
+	padding-top: 20upx;
+}
+
+.dept_item {
+	display: inline-flex;
+	min-width: 130upx;
+	padding: 0 20upx;
+	height: 140upx;
+	background: #EEF3FF;
+	border-radius: 12upx;
+	border: 1px solid transparent;
+	margin-right: 10upx;
+	position: relative;
+}
+
+.dept_item:nth-last-child(1) {
+	margin-right: 0;
+}
+
+.dept_item_ac::after,
+.dept_item_ac::before {
+	border-color: #01BF8E;
+	border-radius: 12upx;
+}
+
+.dept_item_img {
+	width: 56upx;
+	height: 56upx;
+	margin-bottom: 12upx;
+}
+
+.dept_item_name {
+	font-size: 24upx;
+}
+
+.dept_item_tip {
+	position: absolute;
+	width: 68upx;
+	height: 28upx;
+	line-height: 28upx;
+	background: linear-gradient(120deg, #FFB363, #FF9D35);
+	border-radius: 4upx 12upx 4upx 12upx;
+	top: -10upx;
+	right: 0;
+	color: #FFFFFF;
+	font-size: 18upx;
+	text-align: center;
+}
+
+.option_outer {
+	padding: 46upx 0 37upx;
+}
+
+.option_item {
+	width: 230upx;
+}
+
+.option_item_name {
+	color: #666666;
+	font-size: 28upx;
+	-webkit-line-clamp: 1;
+}
+
+.option_item_icon {
+	width: 14upx;
+	height: 14upx;
+	margin-left: 9upx;
+}
+
+.option_item_icon_top {
+	transform: rotateZ(180deg);
+}
+
+.doctor_list {
+	padding-top: 215upx;
+}
+
+.doctor_list_inner {
+	margin: 0 30upx;
+	height: 100%;
+	border-radius: 24upx;
+}
+
+.doctor_list_con {
+	padding: 1px 0;
+}
+
+.dept_dialog_mask {
+	top: 215upx;
+	bottom: 0;
+	height: initial;
+}
+
+.code_list {
+	position: absolute;
+	width: 20upx;
+	top: 40%;
+	right: 20upx;
+	transform: translateY(-50%);
+	background-color: #F2F2F7;
+	border-radius: 50px;
+	padding: 14upx 20upx;
+}
+
+.code_item {
+	font-size: 28upx;
+	padding: 10upx 0;
+}
+
+.dept_dialog_list {
+	width: 300upx;
+	height: 100%;
+	padding: 0 30upx;
+	border-radius: 0px 0px 0px 28upx;
+	background-color: #F2F2F7;
+}
+
+.dept_dialog_list_sort {
+	width: 100%;
+	background-color: #fff;
+}
+
+.dept_dialog_item {
+	width: 100%;
+	height: 100upx;
+	font-size: 28upx;
+}
+
+.dept_dialog_item_sort_tit {
+	font-weight: bold;
+}
+
+.dept_dialog_item_fir {
+	padding: 0 30upx;
+}
+
+.dept_dialog_item:nth-last-child(1)::before {
+	border-bottom: 0;
+}
+
+.dept_dialog_item_selected {
+	background-color: #fff !important;
+	font-weight: 500;
+	position: relative;
+}
+
+.dept_dialog_item_selected:after {
+	content: "";
+	display: block;
+}
+
+.dept_dialog_item_selected::before {}
+
+.dept_dialog_list_dept {
+	padding: 0 !important;
+}
+
+.dept_dialog_item_last {
+	border-radius: 0px 0px 28upx 0;
+}
+
+.dept_dialog_item_next {
+	border-radius: 0px 28upx 0 0;
+}
+
+.dept_dialog_item_tit {
+	justify-content: flex-start;
+}
+
+.dept_dialog_item_name_selected {
+	font-weight: 500;
+}
+
+.dept_dialog_item_tip {
+	color: #FFFFFF;
+	font-size: 18upx;
+	min-width: 72upx;
+	margin-left: 11upx;
+	height: 28upx;
+	padding: 0 10upx;
+	line-height: 28upx;
+	text-align: center;
+	background: linear-gradient(120deg, #FFB363, #FF9D35);
+	border-radius: 14upx;
+}
+
+.dept_dialog_item_select {
+	width: 26upx;
+	height: 16upx;
+	position: relative;
+	border-width: 0 0 6upx 6upx;
+	border-color: #01BF8E;
+	border-style: solid;
+	border-radius: 0 0 0 3upx;
+	transform: rotateZ(-45deg);
+}
+
+.dept_dialog_list_sec {
+	width: 100%;
+	height: 100%;
+	padding: 0 30upx;
+	border-radius: 0 0 28upx 0;
+	background-color: #fff;
+}
+
+.dept_dialog_list_short {
+	width: 450upx;
+	padding: 0 30upx;
+}
+
+.p_mask {
+	display: flex;
+}
+
+.nodata_con {
+	padding-top: 200upx !important;
+}
+
+/* 筛选组件样式 */
+.screen_dialog_mask {
+	top: 215upx !important;
+}
+
+.screen_inner {
+	max-height: 600upx !important;
+}
+
+.show_tip {
+	position: fixed;
+	background-color: #01BF8E;
+	color: #fff;
+	border-radius: 10upx;
+	padding: 6upx 10upx;
+	right: 0;
+	top: 280upx;
+	font-size: 28upx;
+	height: 170upx;
+	width: 60upx;
+	z-index: 2;
+	text-align: center;
+}
+
+.code_item_active {
+	color: #01BF8E;
+	font-weight: bold;
+}
+
+.p_placeholder {
+	color: #A1A3B3;
+}
+
+.noData {
+	padding-top: 150upx;
+}
+
+.p_doctor_work_type .p_doctor_type_item:not(:first-child) {
+	margin-left: 80upx;
+}
+</style>

+ 2044 - 0
pagesNetHos/st1/business/doctor/supplement/supplement.vue

@@ -0,0 +1,2044 @@
+<template>
+  <view class="container" v-if="showCon">
+    <view class="content pb150">
+      <!-- 医生信息 -->
+      <view class="user p_flexCenter" v-if="serviceType !== 'tdwz'">
+        <image class="user_img" :src="queryBean.DoctorPhotourl"></image>
+        <view class="user_box p_flexBetween">
+          <view class="user_con p_flexCenter">
+            <view class="user_name">{{ queryBean.DoctorName }}</view>
+            <view class="user_tip">{{ queryBean.DeptName }} {{ queryBean.TitleName }}</view>
+          </view>
+        </view>
+      </view>
+
+      <!-- 团队问诊 -->
+      <view v-if="serviceType == 'tdwz'" class="group_box displayFlexCol">
+        <text class="group_title">{{ queryBean.GroupName }}</text>
+        <view class="group_introduce">
+          <text>擅长:</text>
+          <text>{{ queryBean.GroupSkill }}</text>
+        </view>
+      </view>
+
+      <!-- 就诊人信息 -->
+      <view class="block">
+        <view class="member p_flexBetween">
+          <view class="member_con">
+            <view class="member_info_con p_flexCenter">
+              <view class="member_name">{{ currentUser.MemberName || currentUser.memberName }}</view>
+              <view class="member_info">{{ currentUser.Sex == 1 || currentUser.sex == 1 ? '男' : '女' }} {{ currentUser.Age || currentUser.age }}岁</view>
+            </view>
+            <view class="member_id p_color_6">身份证号:{{ currentUser.CertNum || currentUser.certNum }}</view>
+          </view>
+          <view class="member_btn p_bgcolor p_flexCenter" @click="selectMember">换个就诊人</view>
+        </view>
+
+        <!-- 是否初诊 -->
+        <view class="info p_format">
+          <view class="info_box p_flexBetween p_border_top">
+            <view class="info_tit">是否初诊</view>
+            <view class="radios p_flexCenter">
+              <view
+                class="radio_item p_flexCenter"
+                :class="followUp ? 'p_color_6' : 'p_color_9'"
+                @click="diagnosisClick('other')"
+              >
+                <image class="radio_item_img" :src="diagnosisType == 'other' && !isFirstVisit ? iconUrl.circle_active : iconUrl.circle"></image>
+                复诊
+              </view>
+            </view>
+          </view>
+        </view>
+
+        <!-- 问诊目的 -->
+        <view class="info">
+          <view class="info_box p_border_top p_flexBetween" @click="purSelect">
+            <view class="info_tit">本次问诊目的</view>
+            <view class="info_val_con p_flexBetween">
+              <view class="info_val p_color_9">{{ purSelected.tit || '选择本次问诊目的' }}</view>
+              <image class="info_right" :src="iconUrl.home_right"></image>
+            </view>
+          </view>
+
+          <!-- 处方信息 -->
+          <view class="info_box p_border_top" v-if="diagnosisType == 'other' && (purSelected.key == 'yyzx' || purSelected.key == 'fzxf')">
+            <view class="info_box_inner p_flexBetween" @click="prescSelect">
+              <view class="info_tit">处方信息<text class="info_subtit p_color_9">(可选项)</text></view>
+              <view class="info_val_con p_flexBetween">
+                <view class="info_val p_color_9">选择处方记录</view>
+                <image class="info_right" :src="iconUrl.home_right"></image>
+              </view>
+            </view>
+            <view class="info_pres" v-if="recSelected.HisOrderId">
+              <view class="info_pres_con p_flexBetween">
+                <view class="info_pres_inner p_flexCenter">
+                  <view class="info_pres_time p_color_9">{{ recSelected.Registerdate }}</view>
+                  <view class="info_pres_tit">{{ recSelected.DeptName }} {{ recSelected.DoctorName }}</view>
+                  <view class="info_pres_subtit p_color_6"><text class="report_item_val_titval">诊断:</text>{{ recSelected.Diagnosis }}</view>
+                </view>
+                <view class="info_pres_detailbtn p_bgcolor p_flexCenter" @click="setVal('showPrescDetailDialog', true)">查看详情
+                  <image class="info_doctor_arrow" :src="iconUrl.doctor_arrow_bottomf"></image>
+                </view>
+              </view>
+              <view class="info_pres_btns p_flexCenter p_border_top">
+                <view class="info_pres_btn p_flexCenter p_border p_color" @click="prescSelect">重新选择</view>
+                <view class="info_pres_btn p_flexCenter p_border p_color" @click="clearPur">清空处方</view>
+              </view>
+            </view>
+          </view>
+
+          <!-- 咨询时间 -->
+          <view class="info_box p_flexBetween p_border_top" @click="consultSelect">
+            <view class="info_tit">咨询时间<text class="info_subtit p_color_9">(必选项)</text></view>
+            <view class="info_val_con p_flexBetween">
+              <view class="info_val p_color" v-if="!consultDate.Data_1">{{ earlyTime }}</view>
+              <view class="info_val p_color" v-else>
+                {{ consultDate.Data_1[consultDateIndSelected]?.RegDate }}
+                {{ consultTimeList[consultTimeIndSelected]?.CommendTime }}
+              </view>
+              <image class="info_right" :src="iconUrl.home_right"></image>
+            </view>
+          </view>
+        </view>
+      </view>
+
+      <!-- 病情采集 -->
+      <view class="block">
+        <view class="info">
+          <view class="info_box p_border_bottom">
+            <view class="info_box_inner p_flexBetween">
+              <view class="info_tit">病情采集<text class="info_subtit p_color_9">(必选项)</text></view>
+            </view>
+          </view>
+          <view class="info_box" style="padding-top: 30upx;" v-if="!illness.MedicalInfo">
+            <textarea
+              class="info_box_textarea"
+              :disabled="disabledArea"
+              placeholder-class="placeholder"
+              auto-height
+              maxlength="200"
+              placeholder="请详细描述您的症状、疾病、身体状况等,越详细越好,便于医生更准确得为您分析解答..."
+              @input="inputVal"
+              :data-key="'illnessInfo'"
+              :value="illnessInfo"
+            ></textarea>
+            <view class="text_tip_box p_flexBetween">
+              <view class="text_tip p_border p_flexCenter p_color" @click="setVal('showExampleDialog', true)">查看示例</view>
+              <view class="text_num p_color_9"><text class="p_color_3">{{ illnessInfo?.length || 0 }}</text>/200</view>
+            </view>
+          </view>
+        </view>
+      </view>
+
+      <!-- 添加图片 -->
+      <view class="block">
+        <view class="info">
+          <view class="info_box">
+            <view class="info_tit">添加图片<text class="info_subtit p_color_9">(可选项,图片不超过8张)</text></view>
+            <view class="coll_con">
+              <view class="coll_img_con p_flexBetween" v-if="imgList.length > 0">
+                <view
+                  class="coll_con_img_box"
+                  v-for="(item, index) in imgList"
+                  :key="index"
+                  @click="showImg(index)"
+                >
+                  <image class="coll_con_img" :src="item" mode="aspectFit"></image>
+                  <image class="doctor_cha" :src="iconUrl.doctor_cha" @click.stop="delImg(index)"></image>
+                </view>
+              </view>
+            </view>
+            <view class="coll_con p_flexBetween">
+              <view class="coll_img_box p_flexCenter" @click="addImg('imgList')">
+                <image class="coll_img" :src="iconUrl.doctor_jia"></image>
+              </view>
+              <view class="coll_tip p_color_9">
+                为了提升医患双方的沟通效率,系统将通过AI预问诊的形式详细采集您的主诉、现病史、既往史、过敏史等病情相关信息,敬请理解与配合!(点击左侧+按钮开始采集)
+              </view>
+            </view>
+          </view>
+        </view>
+      </view>
+
+      <!-- 希望得到的帮助 -->
+      <view class="block">
+        <view class="info">
+          <view class="info_box">
+            <view class="info_tit">希望得到的帮助<text class="info_subtit p_color_9">(可选项)</text></view>
+            <textarea
+              class="info_box_textarea info_box_help"
+              :disabled="disabledArea"
+              auto-height
+              placeholder-class="placeholder"
+              maxlength="200"
+              placeholder="请详细描述您的症状、疾病、身体状况等,越详细越好,便于医生更准确得为您分析解答..."
+              :value="helpInfo"
+              @input="inputVal"
+              :data-key="'helpInfo'"
+            ></textarea>
+            <view class="text_tip_box p_flexBetween">
+              <view></view>
+              <view class="text_num p_color_9"><text class="text_num_now p_color_3">{{ helpInfo?.length || 0 }}</text>/200</view>
+            </view>
+          </view>
+        </view>
+      </view>
+
+      <!-- 提交按钮 -->
+      <view class="p_btn_con">
+        <view class="p_form p_btn" @click="submitFnClick">
+          <button
+            class="p_form_btn p_flexCenter p_bgcolor"
+            :class="{ 'btnBgcolor': !getNext }"
+            v-if="!isFirstVisit"
+          >
+            提交咨询({{ selectedType == 'twzx' ? queryBean.consultFeeDiy : selectedType == 'dhzx' ? queryBean.phoneFeeDiy : selectedType == 'spzx' ? queryBean.videoFeeDiy : 0 }}元)
+          </button>
+          <button
+            v-if="isFirstVisit || options.serviceType == 'hzzx'"
+            class="p_form_btn p_flexCenter"
+            :class="[(selectedType == 'spzx' || selectedType == 'twzx') && consultDate.Data_1?.length > 0 || onlyCons ? 'backgroundCustom' : 'backgroundCustom_D9', { 'btnBgcolor': !getNext }]"
+          >
+            提交咨询(免费)
+          </button>
+        </view>
+      </view>
+
+      <!-- 问诊目的弹窗 -->
+      <view class="p_mask p_flexCenter p_mask_bottom" v-if="showPurDialog">
+        <view class="p_dialog">
+          <view class="p_dialog_tit p_flexCenter">
+            <view class="p_dialog_tit_val">请选择问诊目的</view>
+            <image class="p_dialog_cha" :src="iconUrl.doctor_cha" @click="setValAndClose('purClick', purSelected)"></image>
+          </view>
+          <view class="p_dialog_inner p_format p_scroll">
+            <view class="pur_list">
+              <view
+                class="pur_item p_border_bottom p_flexCenter"
+                v-for="(item, index) in filteredPurList"
+                :key="index"
+                @click="setVal('purClick', item)"
+              >
+                <image class="pur_icon" :src="item.key == purClick.key ? iconUrl.circle_active : iconUrl.circle"></image>
+                <view class="pur_con">
+                  <view class="pur_tit">{{ item.tit }}</view>
+                  <view class="pur_subtit p_color_9">{{ item.subtit }}</view>
+                </view>
+              </view>
+            </view>
+          </view>
+          <view class="p_dialog_btn_list p_flexBetween">
+            <view class="p_dialog_btn p_border p_flexCenter" @click="setValAndClose('purClick', purSelected)">取消</view>
+            <view class="p_dialog_btn p_flexCenter p_bgcolor" @click="purConfirm">确定</view>
+          </view>
+        </view>
+      </view>
+
+      <!-- 示例弹窗 -->
+      <view class="p_mask p_flexCenter" v-if="showExampleDialog">
+        <view class="p_dialog p_dialog_center">
+          <view class="p_dialog_tit p_flexCenter">
+            <view class="p_dialog_tit_val">示例</view>
+          </view>
+          <view class="p_dialog_inner p_format p_scroll">
+            <view class="example_con">
+              <view class="example_val p_color_6">
+                3天前崴了脚,当时感觉有点疼,但是还可以走路,所以冰敷了10分钟。昨天疼的有点厉害就涂了点红花油,今天发现有点肿了,我需要去医院拍片子看一下吗?
+              </view>
+              <image class="example_img" :src="iconUrl.doctor_back"></image>
+            </view>
+          </view>
+          <view class="p_dialog_longbtn p_flexCenter p_color p_border_top" @click="closeDialog">我已知晓</view>
+        </view>
+      </view>
+
+      <!-- 选择咨询时间弹窗 -->
+      <view class="p_mask p_flexCenter p_mask_bottom" v-if="showConsultDialog">
+        <view class="p_dialog">
+          <view class="p_dialog_tit p_flexCenter">
+            <view class="p_dialog_tit_val">选择咨询时间</view>
+            <image class="p_dialog_cha" :src="iconUrl.doctor_cha" @click="closeDialog"></image>
+          </view>
+          <view class="p_dialog_inner p_format">
+            <view class="date_list p_scroll">
+              <view
+                class="date_item p_border_right p_color"
+                :class="[
+                  index == consultDateIndClick ? 'date_item_ac' : '',
+                  item.IsHalt == '7' || item.IsHalt == '2' ? 'p_color_9' : 'p_color_6'
+                ]"
+                v-for="(item, index) in consultDate.Data_1 || []"
+                :key="index"
+                @click="consultDateClick(index)"
+              >
+                <image class="date_item_icon" :src="iconUrl.doctor_stop" v-if="item.IsHalt == '7' || item.IsHalt == '2'"></image>
+                {{ formatDate(item.RegDate) }} {{ item.WeekName }} {{ item.TimeSliceStr }}
+              </view>
+            </view>
+            <view class="num_con p_format p_scroll">
+              <view class="num_tit">
+                咨询费用:
+                <text class="num_tit_price">{{ queryBean.videoFeeDiy || 0 }}元</text>
+              </view>
+              <view class="num_list p_flexCenter">
+                <view
+                  class="num_item p_flexCenter"
+                  :class="[
+                    index == consultTimeIndClick ? 'p_border num_item_ac' : ''
+                  ]"
+                  v-for="(item, index) in consultTimeList"
+                  :key="index"
+                  @click="setVal('consultTimeIndClick', index)"
+                >
+                  <image class="num_item_img" :src="iconUrl.doctor_selected" v-if="index == consultTimeIndClick"></image>
+                  <view class="num_item_ind" :class="index == consultTimeIndClick ? 'p_color' : 'p_color_6'">
+                    {{ item.SqNo }}号
+                  </view>
+                  <view class="num_item_time" :class="index == consultTimeIndClick ? 'p_color' : 'p_color_9'">
+                    {{ item.CommendTime }}
+                  </view>
+                </view>
+              </view>
+            </view>
+          </view>
+          <view class="p_dialog_btn_list p_flexBetween">
+            <view class="p_dialog_btn p_border p_flexCenter" @click="cinsultCancel">取消</view>
+            <view class="p_dialog_btn p_flexCenter p_bgcolor" @click="cinsultConfirm">确定</view>
+          </view>
+        </view>
+      </view>
+    </view>
+
+    <!-- 三个月内无就诊记录弹窗 -->
+    <view class="mask displayFlexRow" v-if="!isHistory">
+      <view class="non_record_box displayFlexCol">
+        <text class="non_record_title">复诊须知</text>
+        <view class="non_record_main displayFlexCol">
+          <text>1、您暂无本院的就诊记录,建议您的健康需求均先选择我院进行线下就诊,未来移步至互联网医院进行线上复诊时将更好的享受医保待遇;</text>
+          <text>2、若您有其他医院的病历、处方单、报告单,选择【我要上传】,上传提供给医生确认;</text>
+          <text>3、若您无法提供就诊病历信息,建议选择【线下预约】,到院就诊,感谢您的支持!</text>
+        </view>
+        <view class="non_record_btn displayFlexCol">
+          <text
+            class="backgroundCustom_4aa7fe"
+            v-if="serviceType == 'tdwz' && queryBean.EnableFirstApply == 1"
+            @click="firstVisit"
+          >
+            初诊咨询(免费,不可开单)
+          </text>
+          <text class="backgroundCustom" @click="outerHos">我要上传</text>
+          <text class="backgroundCustom_D9" @click="toHome">返回</text>
+        </view>
+      </view>
+    </view>
+
+    <!-- 隐藏的 canvas 用于图片压缩 -->
+    <canvas canvas-id="pressCanvas" class="press-canvas" :style="'width: ' + windowWidth + 'px; height: ' + windowHeight + 'px;'"></canvas>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, getCurrentInstance, computed } from 'vue'
+import { useOnLoad } from '@/hook'
+import { onShow } from '@dcloudio/uni-app'
+import icon from '@/utils/icon'
+import { common } from '@/uni-app-base/utils'
+import {
+  queryConsultWaterList,
+  queryConsultRoomList,
+  queryClinicDoctorSchedule,
+  queryNumbers,
+  lockOrder,
+  unlock,
+  applyImgTxtConsult,
+  applyVideoConsult,
+  applyDoctorGroupConsult,
+  QueryOutpatientVisitList
+} from '@/pagesNetHos/st1/service/doctor'
+import { queryArticleList } from '@/pagesNetHos/st1/service/news'
+import { queryCardBalance_V3 } from '@/pagesNetHos/st1/service/order'
+import { REQUEST_CONFIG } from '@/config'
+
+const { proxy } = getCurrentInstance()
+const app = getApp() as any
+
+// 页面数据
+const showCon = ref(true)
+const iconUrl = ref(icon)
+const like = ref(false)
+const showPurDialog = ref(false)
+const currentUser = ref<any>({})
+const showRecDialog = ref(false)
+const showExampleDialog = ref(false)
+const showMemberDialog = ref(false)
+const showConsultDialog = ref(false)
+const consultDate = ref<any>({})
+const consultTimeList = ref<any[]>([])
+const consultDateIndClick = ref(0)
+const consultDateIndSelected = ref(0)
+const consultTimeIndClick = ref(0)
+const consultTimeIndSelected = ref(0)
+
+const purClick = ref<any>({})
+const purSelected = ref<any>({})
+const selectedType = ref('')
+const diagnosisType = ref("other")
+const imgList = ref<any[]>([])
+const imgListSave = ref<any[]>([])
+const imgPrescList = ref<any[]>([])
+const imgPrescListSave = ref<any[]>([])
+// 就诊记录
+const recQueryData = reactive({
+  BeginDate: '',
+  EndDate: '',
+  ClinicCard: "",
+  MemberId: "",
+})
+const recDateIndex = ref(3)
+const recList = ref<any[]>([])
+const recClick = ref<any>({})
+const recSelected = ref<any>({})
+const showPrescDetailDialog = ref(false)
+
+//// 创建 字符串key -> ref变量 的映射表
+const refMap = {
+  showPrescDetailDialog,
+  showExampleDialog,
+  purClick,
+  consultTimeIndClick,
+};
+
+// 问诊目的列表
+const purList = ref([
+  {
+    id: "2",
+    tit: "在线复诊",
+    subtit: "针对复诊患者病情情况给出诊疗建议(可开处方或检验检查的医嘱)。",
+    type: "other",
+    key: "zxfz",
+    isShow: "1",
+    value: ""
+  }
+])
+
+// 过滤后的问诊目的列表(解决 v-for 与 v-if 混用问题)
+const filteredPurList = computed(() => {
+  return purList.value.filter((item: any) => item.type == diagnosisType.value && item.isShow == '1')
+})
+
+// 报告单
+const reportQueryData = reactive({
+  CardType: "",
+  CardNo: "",
+  MemberId: "",
+  PatientName: "",
+  StartDate: "",
+  EndDate: "",
+  ReportType: '0',
+  Data_1: {
+    queryType: "1",
+  },
+  Page: {
+    PIndex: 1,
+    PSize: 10
+  }
+})
+const reportList = ref<any[]>([])
+const showReportListDialog = ref(false)
+
+// 其他数据
+const followUp = ref(false)
+const article = ref("")
+const illness = ref<any>({})
+const illnessInfo = ref("")
+const helpInfo = ref("")
+const earlyTime = ref("")
+const loadFirst = ref(true)
+const getNext = ref(false)
+const disabledArea = ref(false)
+const hasRecord = ref(false)
+
+// 窗口尺寸
+const windowWidth = ref(375)
+const windowHeight = ref(667)
+
+// 页面参数
+const options = ref<any>({})
+const queryBean = ref<any>({})
+const serviceType = ref("")
+const isHistory = ref(true)
+const isFirstVisit = ref(false)
+const isOuterHos = ref(false)
+const onlyCons = ref(false)
+const netHospageConfig = ref<any>({})
+
+let timeIndex = 0
+let submitFnClickIs = true
+
+// 格式化日期
+const formatDate = (dateStr: string) => {
+  if (!dateStr) return ''
+  const date = new Date(dateStr)
+  const year = date.getFullYear()
+  const month = String(date.getMonth() + 1).padStart(2, '0')
+  const day = String(date.getDate()).padStart(2, '0')
+  return `${year}-${month}-${day}`
+}
+
+// 生命周期
+useOnLoad((optionsData: any) => {
+  // 初始化参数
+  const queryBeanStr = optionsData.queryBean ? common.parse(optionsData.queryBean) : {}
+  queryBean.value = queryBeanStr
+  options.value = optionsData
+  selectedType.value = optionsData.selectedType
+  serviceType.value = optionsData.serviceType
+
+  // 获取屏幕尺寸
+  const systemInfo = uni.getSystemInfoSync()
+  windowWidth.value = systemInfo.windowWidth
+  windowHeight.value = systemInfo.windowHeight
+  netHospageConfig.value = common.deepCopy(app.globalData.config.net_pageConfiguration_patient.netHos_orderPayment_config)
+
+  // 初始化日期
+  initDateQuery()
+})
+
+// 初始化日期查询参数
+const initDateQuery = () => {
+  const now = new Date()
+  const sixMonthsAgo = new Date(now.getTime() - 180 * 24 * 60 * 60 * 1000)
+  recQueryData.BeginDate = common.dateFormat(sixMonthsAgo).formatDay
+  recQueryData.EndDate = common.dateFormat(now).formatDay
+  reportQueryData.StartDate = common.dateFormat(now).formatDay
+  reportQueryData.EndDate = common.dateFormat(now).formatDay
+}
+
+// 页面显示
+onShow(() => {
+  closeDialog()
+  initPurList()
+  getTimeEarly()
+  main()
+})
+
+// 初始化问诊目的列表
+const initPurList = () => {
+  let list = purList.value
+  const qb = queryBean.value
+  const st = serviceType.value
+
+  list.forEach((item: any) => {
+    // 用药咨询只在图文咨询中展示
+    if (item.key == "yyzx") {
+      item.isShow = options.value.selectedType == "twzx" ? "1" : "0"
+    }
+    // 新冠入口只保留新冠咨询
+    if (options.value.selectedType == "xgzx") {
+      item.isShow = item.key == "xgzx" ? "1" : "0"
+    }
+    // 即时问诊开启后执行
+    if (qb.doctorService1005 == 1) {
+      item.isShow = "0"
+    }
+    // 团队问诊执行
+    if (st == "tdwz") {
+      item.isShow = item.key == "tdwz" ? "1" : "0"
+    }
+  })
+
+  // 即时问诊
+  if (qb.doctorService1005 == 1) {
+    const obj = {
+      id: "10",
+      tit: "即时问诊",
+      subtit: "",
+      type: "other",
+      key: "jswz",
+      isShow: "1",
+      value: ""
+    }
+    list = [obj]
+  } else if (serviceType.value == "tdwz") {
+    const obj = {
+      id: "11",
+      tit: "团队问诊",
+      subtit: "",
+      type: "other",
+      key: "tdwz",
+      isShow: "1",
+      value: ""
+    }
+    list = [obj]
+  }
+
+  purList.value = list
+
+  // 设置当前就诊人
+  currentUser.value = app.globalData.currentUser || {}
+
+  // 根据 serviceType 设置选中项
+  if (common.isNotEmpty(serviceType.value)) {
+    purList.value.forEach((item: any) => {
+      if (item.key == serviceType.value) {
+        purSelected.value = item
+      }
+    })
+  }
+}
+
+// 主逻辑
+const main = async () => {
+  submitFnClickIs = true
+  getNext.value = true
+
+  const user = currentUser.value
+
+  // 检查就诊人
+  if (common.isEmpty(user)) {
+    return
+  }
+
+  if (!user || !user.cardNo) {
+    common.showModal('当前就诊人暂无就诊卡,请选择其他就诊人进行咨询')
+    getNext.value = false
+    return
+  }
+
+  // 是否有待支付订单
+  if (await queryConsultStatus('0')) {
+  }
+  // 是否有正在咨询的订单
+  if (options.value.serviceType !== "tdwz" && await queryConsultStatus('2')) {
+  }
+
+  let followUpStatus = false
+
+  // 获取互联网复诊协议
+  const tipsRespData = {
+    Status: 1,
+    HosId: app.globalData.hosId,
+    TypeClass: '99'
+  }
+
+  const { resp: queryArticleListResp } = await queryArticleList(tipsRespData)
+  if (!common.isEmpty(queryArticleListResp)) {
+    article.value = unescape(queryArticleListResp[0].Contents).replace(/ style=".*?"/g, '')
+  }
+
+  queryOutpatientVisitList(serviceType.value == 'tdwz' ? 'history' : '')
+
+  followUpStatus = true
+  followUp.value = followUpStatus
+  loadFirst.value = false
+  hasRecord.value = false
+  isFirstVisit.value = false
+}
+
+// 查询咨询记录状态
+const queryConsultStatus = async (consultStatus: string) => {
+  const user = currentUser.value
+  const qb = queryBean.value
+
+  const data = {
+    ConsultStatus: consultStatus,
+    DoctorUid: qb.DoctorUid,
+    MemberId: user.memberId,
+    IsHistory: '1'
+  }
+
+  let { resp } = await queryConsultWaterList(data)
+
+  if (!common.isEmpty(resp)) {
+    if (consultStatus == '0') {
+      let url = `/pagesNetHos/st1/business/enquire/enquireList/enquireList`
+      if (resp[0].ConsultType == '2') {
+        url += `?consultType=2&pageType=2`
+      }
+      common.showModal(`就诊人【${user.memberName}】与【${qb.DoctorName}】医生之间已经存在了一条待支付订单,是否马上去支付?`, () => {
+        common.goToUrl(url)
+      }, { confirmText: "去支付" })
+      return true
+    }
+    if (resp[0].ConsultType == '2') {
+      common.showModal(`就诊人【${user.memberName}】与【${qb.DoctorName}】医生之间已经存在了一条视频咨询订单,请等待医生唤起视频`, () => {
+        getNext.value = false
+      }, { confirmText: "确定" })
+      return true
+    }
+    common.showModal(`就诊人【${user.memberName}】与【${qb.DoctorName}】医生之间已经存在了一条咨询中订单,快去和医生沟通吧!`, async () => {
+      const roomData = {
+        MemberIds: user.memberId,
+        DoctorUid: qb.DoctorUid
+      }
+      let { resp: roomList } = await queryConsultRoomList(roomData)
+      if (!common.isEmpty(roomList)) {
+        roomList[0].ConsId = resp[0].ConsId
+        let url = `/pagesNetHos/st1/business/consult/consultChat/consultChat`
+        let dataStr = "?conItem=" + common.stringify(roomList[0]) + "&goBottom=1&consultType=" + roomList[0].ConsultType
+        common.goToUrl(url, { data: dataStr })
+      }
+    }, { cancelText: "取消", confirmText: "去沟通" })
+  }
+  return !common.isEmpty(resp)
+}
+
+// 选择就诊人
+const selectMember = () => {
+  const url = `/pagesPersonal/st1/business/patientManagement/selecteCardOrHos/selecteCardOrHos?fromComponent=true&type=card`
+  common.goToUrl(url)
+}
+
+// 复诊初诊点击
+const diagnosisClick = (value: string) => {
+  if (!followUp.value && value == 'other') {
+    return
+  }
+  diagnosisType.value = value
+  purSelected.value = {}
+  purClick.value = {}
+  imgPrescList.value = []
+  imgPrescListSave.value = []
+  imgList.value = []
+  imgListSave.value = []
+}
+
+// 选择问诊目的
+const purSelect = () => {
+  if (common.isEmpty(purClick.value)) {
+    const found = purList.value.find((item: any) => item.isShow == '1' && item.type == diagnosisType.value)
+    if (found) {
+      purClick.value = found
+    }
+  }
+  showPurDialog.value = true
+}
+
+// 问诊目的确认
+const purConfirm = () => {
+  if (purSelected.value.id !== purClick.value.id) {
+    recList.value = []
+    recClick.value = {}
+    recSelected.value = {}
+  }
+  purSelected.value = purClick.value
+  closeDialog()
+}
+
+// 选择复诊信息
+const subSelect = () => {
+  recDateIndex.value = 3
+  const now = new Date()
+  const sixMonthsAgo = new Date(now.getTime() - 180 * 24 * 60 * 60 * 1000)
+  recQueryData.BeginDate = common.dateFormat(sixMonthsAgo).formatDay
+  recQueryData.EndDate = common.dateFormat(now).formatDay
+}
+
+// 选择处方
+const prescSelect = () => {
+  showRecDialog.value = true
+}
+
+// 清空处方
+const clearPur = () => {
+  recSelected.value = {}
+}
+
+// 处方详情弹窗显示
+const prescDetailDialogShow = () => {
+  showPrescDetailDialog.value = true
+}
+
+// 添加图片
+const addImg = (key: string) => {
+  const imgDataList = imgList.value
+  if (imgDataList.length >= 8) {
+    common.showToast("图片最多不超过8张")
+    return
+  }
+  const count = 8 - imgDataList.length
+  uni.chooseImage({
+    count: count,
+    sizeType: ['original', 'compressed'],
+    sourceType: ['album', 'camera'],
+    success: async (res) => {
+      const tempFilePaths = res.tempFilePaths
+      common.showLoading()
+      for (let i = 0; i < tempFilePaths.length; i++) {
+        const uploadRes = await uploadZxFile(tempFilePaths[i])
+        if (uploadRes.RespCode == '10000') {
+          let url = uploadRes.url.indexOf('http') == -1
+            ? REQUEST_CONFIG.BASE_URL + uploadRes.url.replace(/\\/g, "/")
+            : uploadRes.url.replace(/\\/g, "/")
+            console.log(url,'urlurlurl')
+          imgList.value.push(url)
+          imgListSave.value.push(url)
+        } else {
+          common.showModal(uploadRes.RespMessage)
+        }
+      }
+      common.hideLoading()
+    }
+  })
+}
+
+// 上传图片
+const uploadZxFile = (url: string) => {
+  return new Promise((resolve) => {
+    uni.uploadFile({
+      url: REQUEST_CONFIG.BASE_URL + '/upload/uploadZxFile.do',
+      filePath: url,
+      name: 'newsFile',
+      formData: {
+        user: 'test'
+      },
+      header: {
+        token: uni.getStorageSync('token')
+      },
+      success(res) {
+        resolve(JSON.parse(res.data))
+      }
+    })
+  })
+}
+
+// 获取最早可约时间
+const getTimeEarly = async () => {
+  const qb = queryBean.value
+  const user = currentUser.value
+  const st = selectedType.value
+  const opt = options.value
+
+  const dateListData = {
+    HosId: app.globalData.hosId,
+    DeptCode: qb.DeptCode,
+    DoctorCode: qb.DoctorCode,
+    DoctorTitleCode: "",
+    SourceType: opt.serviceType == "jswz" ? "fast" : st == "twzx" ? "019" : "006",
+    ServiceId: '0',
+    WeekType: '1',
+    Store: {
+      cardEncryptionStore: user.encryptionStore || '',
+      baseMemberEncryptionStore: user.baseMemberEncryptionStore
+    },
+  }
+
+  // 团队问诊入参
+  if (opt.serviceType == "tdwz") {
+    dateListData.DoctorCode = `group${qb.GroupId}`
+    dateListData.SourceType = `group`
+  }
+
+  let { resp: dateListResp, resData: resData } = await queryClinicDoctorSchedule(dateListData)
+
+  if (!common.isEmpty(dateListResp)) {
+    consultDate.value = dateListResp[0]
+    for (let i = 0; i < consultDate.value.Data_1.length; i++) {
+      if (consultDate.value.Data_1[i].IsHalt !== '7' && consultDate.value.Data_1[i].IsHalt !== '2') {
+        timeIndex = i
+        break
+      }
+    }
+  } else {
+    common.showModal(`未查询到排班(${resData.RespCode})`)
+    return
+  }
+  getNextTime()
+}
+
+const getNextTime = async () => {
+  const dateInfo = consultDate.value.Data_1[timeIndex]
+  if (!dateInfo) return
+
+  const qb = queryBean.value
+  const st = selectedType.value
+  const opt = options.value
+
+  const numberListData = {
+    HosId: app.globalData.hosId,
+    DeptCode: consultDate.value.DeptCode,
+    DoctorCode: consultDate.value.DoctorCode,
+    ScheduleId: dateInfo.ScheduleId,
+    RegDate: dateInfo.RegDate,
+    TimeSlice: dateInfo.TimeSlice,
+    SourceType: st == "twzx" ? "019" : "006"
+  }
+
+  if (opt.serviceType == "jswz") {
+    numberListData.SourceType = "fast"
+  } else if (opt.serviceType == "tdwz") {
+    numberListData.SourceType = "group"
+  }
+
+  let { resp: timeListResp } = await queryNumbers(numberListData)
+
+  if (!common.isEmpty(timeListResp)) {
+    let date = dateInfo.RegDate
+    if (dateInfo.RegDate == common.dateFormat(new Date()).formatYear) {
+      date = "今天"
+    } else if (dateInfo.RegDate == common.dateFormat(new Date(Date.now() + 24 * 60 * 60 * 1000)).formatYear) {
+      date = "明天"
+    } else {
+      date = common.dateFormat(new Date(date)).formatMon_C
+    }
+    const earlyTimeStr = `最早 ${date} ${timeListResp[0].StartTime} 可约`
+    earlyTime.value = earlyTimeStr
+    consultDateIndClick.value = timeIndex
+  } else {
+    timeIndex += 1
+    if (timeIndex == consultDate.value.Data_1.length) {
+      timeIndex = 0
+      return
+    }
+    getNextTime()
+  }
+}
+
+// 选择咨询时间
+const consultSelect = async () => {
+  const user = currentUser.value
+  const qb = queryBean.value
+  const st = selectedType.value
+  const opt = options.value
+  let consultTimeListData: any[] = []
+
+  // 没有日期列表 请求列表
+  if (common.isEmpty(consultDate.value)) {
+    const dateListData = {
+      HosId: app.globalData.hosId,
+      DeptCode: qb.DeptCode,
+      DoctorCode: qb.DoctorCode,
+      DoctorTitleCode: "",
+      SourceType: opt.serviceType == "jswz" ? "fast" : st == "twzx" ? "019" : "006",
+      ServiceId: '0',
+      WeekType: '1',
+      Store: {
+        cardEncryptionStore: user.encryptionStore || '',
+        baseMemberEncryptionStore: user.baseMemberEncryptionStore
+      },
+    }
+    if (opt.serviceType == "tdwz") {
+      dateListData.DoctorCode = `group${qb.GroupId}`
+      dateListData.SourceType = `group`
+    }
+
+    let { resp: dateListResp, resData: resData } = await queryClinicDoctorSchedule(dateListData)
+
+    if (!common.isEmpty(dateListResp)) {
+      consultDate.value = dateListResp[0]
+      consultDateIndSelected.value = timeIndex
+    } else {
+      common.showModal(`未查询到排班(${resData.RespCode})`)
+      return
+    }
+  }
+
+  const dateInfo = consultDate.value.Data_1[consultDateIndClick.value]
+  if (!dateInfo) return
+
+  const numberListData = {
+    HosId: app.globalData.hosId,
+    DeptCode: consultDate.value.DeptCode,
+    DoctorCode: consultDate.value.DoctorCode,
+    ScheduleId: dateInfo.ScheduleId,
+    RegDate: dateInfo.RegDate,
+    TimeSlice: dateInfo.TimeSlice,
+    SourceType: selectedType.value == "twzx" ? "019" : "006"
+  }
+
+  if (opt.serviceType == "jswz") {
+    numberListData.SourceType = "fast"
+  } else if (opt.serviceType == "tdwz") {
+    numberListData.SourceType = "group"
+  }
+
+  let { resp: timeListResp } = await queryNumbers(numberListData)
+
+  if (!common.isEmpty(timeListResp)) {
+    consultTimeListData = timeListResp
+  }
+
+  consultTimeList.value = consultTimeListData
+  consultTimeIndClick.value = 0
+  consultTimeIndSelected.value = 0
+  showConsultDialog.value = true
+}
+
+// 咨询日期点击
+const consultDateClick = (index: number) => {
+  consultDateIndClick.value = index
+  consultSelect()
+}
+
+// 咨询时间取消
+const cinsultCancel = () => {
+  consultTimeIndClick.value = consultTimeIndSelected.value
+  consultDateIndClick.value = consultDateIndSelected.value
+  closeDialog()
+}
+
+// 咨询时间确定
+const cinsultConfirm = () => {
+  consultTimeIndSelected.value = consultTimeIndClick.value
+  consultDateIndSelected.value = consultDateIndClick.value
+  closeDialog()
+}
+
+// 赋值
+const setVal = (key: string, value: any) => {
+  if (key.indexOf('Dialog') !== -1 && !value) {
+    disabledArea.value = true
+  };
+  const targetRef = refMap[key];
+  if (targetRef) { // 增加安全校验,避免key不存在时报错
+    targetRef.value = value;
+  } else {
+    console.warn(`未找到名为 ${key} 的ref变量`);
+  }
+}
+
+// 赋值并关闭弹窗
+const setValAndClose = (key: string, value: any) => {
+  const targetRef = refMap[key];
+  if (targetRef) { // 增加安全校验,避免key不存在时报错
+    targetRef.value = value;
+  } else {
+    console.warn(`未找到名为 ${key} 的ref变量`);
+  }
+  closeDialog()
+}
+
+// 关闭弹窗
+const closeDialog = () => {
+  showConsultDialog.value = false
+  showPurDialog.value = false
+  showExampleDialog.value = false
+  showRecDialog.value = false
+  showPrescDetailDialog.value = false
+  showReportListDialog.value = false
+  disabledArea.value = false
+}
+
+// 输入框赋值
+const inputVal = (e: any) => {
+  const key = e.currentTarget?.dataset?.key
+  const value = e.detail.value
+  if (key == 'illnessInfo') {
+    illnessInfo.value = value
+  } else if (key == 'helpInfo') {
+    helpInfo.value = value
+  }
+}
+
+// 点击提交咨询
+const submitFnClick = async () => {
+  if (!getNext.value) {
+    return
+  }
+
+  if (common.isEmpty(purSelected.value)) {
+    common.showToast("请选择本次问诊目的")
+    return
+  }
+
+  if (common.isEmpty(recList.value) && purSelected.value.key == 'bgdjd') {
+    common.showToast("请选择报告单")
+    return
+  }
+
+  if (common.isEmpty(recList.value) && purSelected.value.key == 'yyzx') {
+    common.showToast("请选择就诊记录")
+    return
+  }
+
+  if (common.isEmpty(consultTimeList.value[consultTimeIndSelected.value])) {
+    common.showToast("请选择咨询时间")
+    return
+  }
+
+  if (common.isEmpty(illness.value) && common.isEmpty(illnessInfo.value)) {
+    common.showToast("请先选择病情报告或填写症状描述")
+    return
+  }
+
+  const reg = /[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF][\u200D|\uFE0F]|[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF]|[0-9|*|#]\uFE0F\u20E3|[0-9|#]\u20E3|[\u203C-\u3299]\uFE0F\u200D|[\u203C-\u3299]\uFE0F|[\u2122-\u2B55]|\u303D|[\A9|\AE]\u3030|\uA9|\uAE|\u3030/ig
+
+  if (illnessInfo.value?.match(reg) || helpInfo.value?.match(reg)) {
+    common.showToast('无法提交表情,请删除后重试')
+    return
+  }
+
+  if (serviceType.value !== 'tdwz' && isOuterHos.value && imgListSave.value.length == 0) {
+    common.showToast("请上传外院病例")
+    return
+  }
+
+  illnessInfo.value = illnessInfo.value?.replace(/\?/g, "?") || ""
+  helpInfo.value = helpInfo.value?.replace(/\?/g, "?") || ""
+
+  if (submitFnClickIs) {
+    submitFnClickIs = false
+
+    const diyFee = selectedType.value == 'twzx'
+      ? queryBean.value.consultFeeDiy
+      : selectedType.value == 'dhzx'
+        ? queryBean.value.phoneFeeDiy
+        : selectedType.value == 'spzx'
+          ? queryBean.value.videoFeeDiy
+          : 0
+    //前端控制缴费模式
+    if(netHospageConfig.value.netHos_orderPaymentMode == 1){
+      checkCardBalance(diyFee).then(() => {
+        LockOrder()
+      })
+    }else if(netHospageConfig.value.netHos_orderPaymentMode == 2){
+        LockOrder()
+    }
+  }
+}
+
+// 检查就诊卡余额是否充足
+const checkCardBalance = (Fee: number) => {
+  return new Promise((resolve) => {
+    if (common.sub(Fee, 0) > 0) {
+      getCardBalance().then((res: any) => {
+        const balance = common.centToYuan(res[0]?.balance) || 0
+        if ((Number(balance) < Number(Fee)) && purSelected.value.id !== "12" && !isFirstVisit.value) {
+          uni.showModal({
+            title: '温馨提示',
+            content: '您的就诊卡余额不足(当前余额' + Number(balance) + '元),请先充值,谢谢!',
+            confirmText: '去充值',
+            success(res) {
+              if (res.confirm) {
+                common.goToUrl(`/pagesPatient/st1/business/recharge/rechargeMoney/rechargeMoney`)
+              } else {
+                return
+              }
+            },
+          })
+        } else {
+          resolve(true)
+        }
+      })
+    } else {
+      resolve(true)
+    }
+  })
+}
+
+// 获取卡余额
+const getCardBalance = async () => {
+  const user = currentUser.value
+  const data = {
+    cardType: user.cardType,
+    cardNo: user.cardNo,
+    Store: {
+      cardEncryptionStore: user.encryptionStore || '',
+      baseMemberEncryptionStore: user.baseMemberEncryptionStore
+    }
+  }
+  let { resp } = await queryCardBalance_V3(data)
+  if (common.isNotEmpty(resp)) {
+    return resp
+  } else {
+    return []
+  }
+}
+
+// 锁号
+const LockOrder = async () => {
+  const user = currentUser.value
+  const dateSelected = consultDate.value.Data_1[consultDateIndSelected.value]
+  const timeSelected = consultTimeList.value[consultTimeIndSelected.value]
+
+  const serviceId = dateSelected.RegDate == common.dateFormat(new Date()).formatDay ? '027' : '024'
+
+  const queryData = {
+    HosId: app.globalData.districtId || app.globalData.hosId,
+    ScheduleId: dateSelected.ScheduleId,
+    CardType: user.cardType,
+    CardNo: user.cardNo,
+    MemberId: user.MemberId || user.memberId,
+    DeptCode: consultDate.value.DeptCode,
+    DoctorCode: consultDate.value.DoctorCode,
+    RegType: '1',
+    RegDate: dateSelected.RegDate,
+    TimeSlice: dateSelected.TimeSlice,
+    SqNo: timeSelected.SqNo,
+    CommendTime: timeSelected.EndTime ? `${timeSelected.StartTime}-${timeSelected.EndTime}` : timeSelected.StartTime,
+    SourceCode: timeSelected.SourceCode,
+    SourceType: selectedType.value == "twzx" ? "019" : "006",
+    ServiceId: serviceId,
+    AutoSignIn: selectedType.value == "twzx" ? 1 : 0,
+    MemberStore: {
+      "cardEncryptionStore": user.encryptionStore || '',
+      "baseMemberEncryptionStore": user.baseMemberEncryptionStore
+    },
+    BookMode: "1",
+  }
+
+  if (timeSelected.CommendTime?.indexOf(":") == -1) {
+    const nowTime = common.accessTimeInAnHour(3600000).time
+    queryData.CommendTime = nowTime
+  }
+
+  // 团队问诊入参
+  if (options.value.serviceType == "tdwz") {
+    queryData.SourceType = `group`
+  }
+
+  let { resp: lockResp, resData: lockResData } = await lockOrder(queryData)
+
+  if (lockResData.RespCode == '10000') {
+    if (common.isNotEmpty(lockResp)) {
+      // 订阅消息
+      if (selectedType.value == 'twzx') {
+        picSubmit(lockResp, serviceId)
+      } else if (selectedType.value == 'spzx') {
+        viaSubmit(lockResp, serviceId)
+      }
+    } else {
+      submitFnClickIs = true
+    }
+  } else {
+    submitFnClickIs = true
+    common.showModal(lockResData.RespMessage)
+  }
+}
+
+// 释号
+const unlockOrder = async (lockResp: any) => {
+  const data = {
+    OrderId: lockResp[0].OrderId,
+    SourceType: selectedType.value == "twzx" ? "019" : "006",
+  }
+  await unlock(data)
+}
+
+// 图文咨询提交
+const picSubmit = async (lockResp: any, serviceId: string) => {
+  const user = currentUser.value
+  const dateSelected = consultDate.value.Data_1[consultDateIndSelected.value]
+  const timeSelected = consultTimeList.value[consultTimeIndSelected.value]
+  const qb = queryBean.value
+  const Store = {
+    cardEncryptionStore: user.encryptionStore || '',
+    baseMemberEncryptionStore: user.baseMemberEncryptionStore
+  }
+  const purposeType = purSelected.value.id
+
+  const tempData = JSON.stringify([
+    { key: "initial", value: diagnosisType.value == 'first' ? '1' : '0' },
+    { key: "consult", value: purSelected.value },
+    { key: "visit_record", value: recSelected.value },
+    {
+      key: "yy_time",
+      value: {
+        SqNo: timeSelected.SqNo,
+        StartTime: options.value.serviceType == "jswz" ? timeSelected.StartTime : timeSelected.CommendTime,
+      }
+    },
+    { key: "desc", value: helpInfo.value },
+    { key: "pics", value: imgListSave.value },
+    { key: "chief_complaint", value: common.isEmpty(illness.value) ? "" : illness.value.MedicalInfo?.chief_complaint },
+    { key: "illness_info", value: illnessInfo.value },
+    { key: "pics_presc", value: imgPrescListSave.value },
+    { key: "has_record", value: hasRecord.value },
+    { key: "cancel_cause", value: '' },
+    { key: "cardAndMember", value: Store },
+    { key: "member_info", value: currentUser.value },
+    { key: 'external_cases', value: isOuterHos.value },
+    { key: 'first_visit_free', value: isFirstVisit.value },
+    { key: 'transfer', value: "" }
+  ])
+
+  const data = {
+    HosId: app.globalData.districtId || app.globalData.hosId || "",
+    MemberId: user.memberId,
+    CardType: user.cardType,
+    CardNo: user.cardNo,
+    DeptId: qb.DeptId,
+    DeptName: qb.DeptName,
+    DoctorName: qb.DoctorName,
+    DoctorUid: qb.DoctorUid,
+    DcotorTitleCode: qb.TitleCode,
+    IllnessDesc: tempData,
+    PreDiagnosisId: illness.value.Id || "",
+    ConsultType: "1",
+    PurposeType: purposeType,
+    BookMode: "1",
+    OrderId: lockResp[0].OrderId,
+    AutoSignIn: 1,
+    Fee: qb.ConsultFee,
+    BookParam: {
+      OperatorName: user.memberName,
+      SourceType: "019",
+      Store: Store,
+      Data_1: {
+        DoctorName: consultDate.value.DoctorName,
+        DeptCode: consultDate.value.DeptCode,
+        DoctorCode: consultDate.value.DoctorCode,
+        DeptName: consultDate.value.DeptName,
+        TimeSlice: dateSelected.TimeSlice,
+        CommendTime: timeSelected.CommendTime,
+        RegDate: dateSelected.RegDate,
+        FeeInfo: "",
+      },
+      OperatorId: uni.getStorageSync('openid'),
+      OrderId: lockResp[0].OrderId,
+      ChannelId: "smallpro",
+      HosId: app.globalData.hosId,
+      PriceName: '图文咨询',
+      ServiceId: serviceId,
+      EqptType: 1,
+      MemberName: user.memberName,
+      MemberId: user.memberId,
+      CardNo: user.cardNo,
+      CardType: user.cardType,
+      PrescNo: "",
+      IsOnlinePay: lockResp[0].IsOnlinePay,
+      ConsultType: "1",
+      PayMoney: lockResp[0].Fee,
+      TotalMoney: lockResp[0].Fee,
+    },
+    Store: Store,
+  }
+
+  // 即时问诊入参
+  if (options.value.serviceType == "jswz") {
+    data.BookParam.SourceType = "fast"
+  }
+  // 团队问诊入参
+  else if (options.value.serviceType == "tdwz") {
+    data.IsNew = 1
+    data.GroupId = qb.GroupId
+    data.GroupName = qb.GroupName
+    data.DoctorName = qb.GroupName
+    data.BookParam.DoctorName = qb.GroupName
+    data.BookParam.SourceType = "group"
+    data.TimeSlot = consultDate.value.Data_1[consultDateIndClick.value].TimeSlice
+  }
+
+  submitFnClickIs = true
+
+  let { resp, resData } = options.value.serviceType == "tdwz"
+    ? await applyDoctorGroupConsult(data, { showModal: false })
+    : await applyImgTxtConsult(data, { showModal: false })
+
+  if (resData.RespCode == '10000') {
+    if (!common.isEmpty(resp)) {
+      // 后端控制是否线上支付
+      const consultIsOnlinePay = resp[0].IsOnlinePay
+      if (consultIsOnlinePay == '1') {
+        common.goToUrl(`/pagesNetHos/st1/business/pay/payment/payment?orderId=${resp[0].OrderId}`)
+      } else {
+        common.goToUrl(`/pagesNetHos/st1/business/pay/payState/payState`)
+      }
+    }
+  } else {
+    common.showModal(resData.RespMessage)
+    unlockOrder(lockResp)
+  }
+}
+
+// 视频咨询提交
+const viaSubmit = async (lockResp: any, serviceId: string) => {
+  common.showLoading()
+
+  const user = currentUser.value
+  const dateSelected = consultDate.value.Data_1[consultDateIndSelected.value]
+  const timeSelected = consultTimeList.value[consultTimeIndSelected.value]
+  const qb = queryBean.value
+
+  submitFnClickIs = true
+
+  const Store = {
+    cardEncryptionStore: user.encryptionStore || '',
+    baseMemberEncryptionStore: user.baseMemberEncryptionStore
+  }
+
+  const tempData = JSON.stringify([
+    { key: "initial", value: diagnosisType.value == 'first' ? '1' : '0' },
+    { key: "consult", value: purSelected.value },
+    { key: "visit_record", value: recSelected.value },
+    {
+      key: "yy_time",
+      value: {
+        SqNo: timeSelected.SqNo,
+        RegDate: dateSelected.RegDate,
+        CommendTime: timeSelected.CommendTime,
+        TimeSlice: dateSelected.TimeSlice
+      }
+    },
+    { key: "desc", value: helpInfo.value },
+    { key: "pics", value: imgListSave.value },
+    { key: "chief_complaint", value: common.isEmpty(illness.value) ? "" : illness.value.MedicalInfo?.chief_complaint },
+    { key: "illness_info", value: illnessInfo.value },
+    { key: "pics_presc", value: imgPrescListSave.value },
+    { key: "has_record", value: hasRecord.value },
+    { key: "cancel_cause", value: '' },
+    { key: "cardAndMember", value: Store },
+    { key: "member_info", value: currentUser.value },
+    { key: 'external_cases', value: isOuterHos.value }
+  ])
+
+  const data = {
+    HosId: app.globalData.hosId || "",
+    DeptId: qb.DeptId,
+    DeptName: qb.DeptName,
+    DoctorUid: qb.DoctorUid,
+    DoctorName: qb.DoctorName,
+    DcotorTitleCode: qb.TitleCode,
+    OpenId: uni.getStorageSync('openid'),
+    IllnessDesc: tempData,
+    PreDiagnosisId: illness.value.Id || "",
+    RegDate: dateSelected.RegDate,
+    BookMode: "1",
+    MemberId: user.memberId,
+    CardType: user.cardType,
+    CardNo: user.cardNo,
+    PurposeType: purClick.value.id,
+    OrderId: lockResp[0].OrderId,
+    BookParam: {
+      HosId: app.globalData.hosId,
+      OrderId: lockResp[0].OrderId,
+      MemberId: user.memberId,
+      PrescNo: "",
+      PayMoney: lockResp[0].Fee,
+      TotalMoney: lockResp[0].Fee,
+      PriceName: '视频咨询',
+      CardType: user.cardType,
+      CardNo: user.cardNo,
+      OperatorId: uni.getStorageSync('openid'),
+      OperatorName: user.memberName,
+      ServiceId: serviceId,
+      IsOnlinePay: lockResp[0].IsOnlinePay,
+      EqptType: 1,
+      HisMemberId: user.hisMemberId,
+      ChannelId: app.globalData.channelId,
+      MemberName: user.memberName,
+      SourceType: "006",
+      Data_1: {
+        DeptCode: consultDate.value.DeptCode,
+        DeptName: consultDate.value.DeptName,
+        DoctorCode: consultDate.value.DoctorCode,
+        DoctorName: consultDate.value.DoctorName,
+        FeeInfo: "",
+        RegDate: dateSelected.RegDate,
+        CommendTime: timeSelected.CommendTime,
+        TimeSlice: dateSelected.TimeSlice
+      },
+      Store: Store,
+      ConsultType: "2"
+    },
+    Store: Store,
+    ConsultType: "2"
+  }
+
+  let { resp, resData } = await applyVideoConsult(data, { showLoading: false })
+
+  common.hideLoading()
+
+  if (!common.isEmpty(resp)) {
+    if (resp[0].IsOnlinePay == '1') {
+      common.goToUrl(`/pagesNetHos/st1/business/pay/payment/payment?orderId=${resp[0].OrderId}`)
+    } else {
+      common.goToUrl(`/pagesNetHos/st1/business/pay/payState/payState`)
+    }
+  } else {
+    common.showModal(resData.RespMessage)
+    unlockOrder(lockResp)
+  }
+}
+
+// 展示图片详情
+const showImg = (ind: number) => {
+  const newImgList = imgList.value.map((url: string) => {
+    if (url && url.includes('_scale')) {
+      return url.replace('_scale', '')
+    }
+    return url
+  })
+  uni.previewImage({
+    current: newImgList[ind],
+    urls: newImgList
+  })
+}
+
+// 删除图片
+const delImg = (index: number) => {
+  imgList.value.splice(index, 1)
+  imgListSave.value.splice(index, 1)
+}
+
+// 查询就诊记录
+const queryOutpatientVisitList = async (tag: string) => {
+  const user = currentUser.value
+  const params = {
+    CardNo: user.cardNo,
+    CardType: "1",
+    MemberId: user.memberId,
+    OpenId: uni.getStorageSync("openid"),
+    StartDate: common.dateFormat(new Date(Date.now() - (90 * 24 * 60 * 60 * 1000))).formatYear,
+    EndDate: common.dateFormat(new Date(Date.now() + (1 * 24 * 60 * 60 * 1000))).formatYear,
+    Store: {
+      cardEncryptionStore: user.encryptionStore || '',
+      baseMemberEncryptionStore: user.baseMemberEncryptionStore
+    }
+  }
+
+  let { resp, resData } = await QueryOutpatientVisitList(params, { showModal: false })
+
+  if (common.isEmpty(resp)) {
+    isOuterHos.value = false
+  } else {
+    isOuterHos.value = true
+    if (tag == "history" && imgList.value.length == 0) {
+      isHistory.value = false
+    }
+  }
+}
+
+// 初诊咨询
+const firstVisit = () => {
+  isFirstVisit.value = true
+  isHistory.value = true
+}
+
+// 外院病例
+const outerHos = () => {
+  isOuterHos.value = true
+  isHistory.value = true
+}
+
+// 返回首页
+const toHome = () => {
+  common.goToUrl(`/pages/st1/business/tabbar/netHosIndex/netHosIndex`, {
+    skipWay: 'switchTab'
+  })
+}
+</script>
+
+<style lang="scss" scoped>
+@import "@/pagesNetHos/st1/static/css/common.scss";
+@import "@/pagesNetHos/st1/static/css/dialog.scss";
+
+.backgroundCustom_4aa7fe {
+  background-color: #4aa7fe !important;
+  color: #fff !important;
+}
+
+.p_content {
+  padding-bottom: 150upx;
+}
+
+.user {
+  padding: 30upx;
+  justify-content: flex-start;
+  background-color: #fff;
+}
+
+.user_img {
+  width: 88upx;
+  height: 88upx;
+  border-radius: 50%;
+  margin-right: 23upx;
+  flex-shrink: 0;
+}
+
+.user_box {
+  width: 100%;
+}
+
+.user_con {
+  width: 100%;
+  flex-direction: column;
+  align-items: flex-start;
+}
+
+.user_name {
+  font-size: 34upx;
+  font-weight: 500;
+}
+
+.user_tip {
+  font-size: 28upx;
+  margin-top: 6upx;
+}
+
+.group_box {
+  padding: 30upx;
+  box-sizing: border-box;
+  align-items: flex-start;
+  background: white;
+  margin-top: 20upx;
+}
+
+.group_title {
+  font-weight: bold;
+  margin-bottom: 14upx;
+}
+
+.group_box text {
+  font-size: 30upx;
+}
+
+.group_introduce {
+  width: 100%;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  flex-wrap: wrap;
+  display: -webkit-box;
+  -webkit-line-clamp: 2;
+  -webkit-box-orient: vertical;
+  position: relative;
+}
+
+.group_introduce text {
+  color: #666;
+}
+
+.block {
+  width: 690upx;
+  margin: 30upx;
+  border-radius: 24upx;
+  background-color: #fff;
+}
+
+.member {
+  padding: 40upx 30upx;
+}
+
+.member_con {
+  width: 100%;
+}
+
+.member_info_con {
+  align-items: flex-start;
+  justify-content: flex-start;
+}
+
+.member_name {
+  font-size: 34upx;
+  font-weight: 500;
+  line-height: 1em;
+}
+
+.member_info {
+  font-size: 28upx;
+  margin-left: 19upx;
+}
+
+.member_id {
+  font-size: 28upx;
+  margin-top: 15upx;
+}
+
+.member_btn {
+  padding: 0 30upx;
+  height: 64upx;
+  background: #01BF8E;
+  border-radius: 32px;
+  flex-shrink: 0;
+  font-size: 28upx;
+  font-weight: 800;
+  color: #FFFFFF;
+}
+
+.info {
+  padding-left: 30upx;
+}
+
+.info_box {
+  padding: 40upx 30upx 40upx 0;
+}
+
+.info_tit {
+  font-size: 32upx;
+}
+
+.info_subtit {
+  font-size: 26upx;
+}
+
+.radio_item {
+  margin-right: 57upx;
+  font-size: 32upx;
+}
+
+.radio_item:nth-last-child(1) {
+  margin-right: 0;
+}
+
+.radio_item_img {
+  width: 36upx;
+  height: 36upx;
+  margin-right: 15upx;
+}
+
+.info_right {
+  width: 22upx;
+  height: 22upx;
+  margin-left: 16upx;
+}
+
+.info_pres {
+  margin: 22upx 0 10upx;
+  background-color: rgb(235, 241, 255);
+  border-radius: 20upx;
+}
+
+.info_pres_con {
+  padding: 30upx 30upx 26upx;
+}
+
+.info_pres_inner {
+  width: 100%;
+  align-items: flex-start;
+  flex-direction: column;
+}
+
+.info_pres_time {
+  font-size: 26upx;
+}
+
+.info_pres_tit {
+  margin: 5upx 0 3upx;
+}
+
+.info_pres_subtit {
+  display: flex;
+}
+
+.report_item_val_titval {
+  flex-shrink: 0;
+}
+
+.info_pres_detailbtn {
+  flex-shrink: 0;
+  height: 55upx;
+  padding: 0 16upx;
+  border-radius: 8px;
+}
+
+.info_doctor_arrow {
+  width: 24upx;
+  height: 24upx;
+  margin-left: 5upx;
+}
+
+.info_pres_btns {
+  justify-content: flex-end;
+  height: 90upx;
+  padding-right: 20upx;
+}
+
+.info_pres_btn {
+  height: 55upx;
+  padding: 0 19upx;
+  font-size: 26upx;
+  border-radius: 8px;
+  margin-right: 10upx;
+}
+
+.coll_con {
+  margin-top: 23upx;
+}
+
+.coll_img_con {
+  justify-content: flex-start;
+  flex-wrap: wrap;
+}
+
+.coll_con_img_box {
+  width: 160upx;
+  height: 160upx;
+  margin-right: 16upx;
+  margin-bottom: 16upx;
+  position: relative;
+}
+
+.coll_con_img_box:nth-child(4n) {
+  margin-right: 0;
+}
+
+.coll_con_img {
+  border-radius: 10upx;
+}
+
+.doctor_cha {
+  position: absolute;
+  right: 0;
+  top: 0;
+  z-index: 1;
+  width: 40upx;
+  height: 40upx;
+  width: 30upx;
+  height: 30upx;
+  background: #fff;
+  border-radius: 50%;
+}
+
+.coll_img_box {
+  width: 161upx;
+  height: 161upx;
+  background: #F6F7F8;
+  border: 1px solid #CCCCCC;
+  border-radius: 12upx;
+  flex-shrink: 0;
+  margin-right: 29upx;
+}
+
+.coll_img {
+  width: 62upx;
+  height: 62upx;
+}
+
+.coll_tip {
+  width: 100%;
+  font-size: 26upx;
+  line-height: 38upx;
+}
+
+.info_box_textarea {
+  width: 100%;
+  min-height: 107upx;
+  line-height: 40upx;
+  font-size: 30upx;
+  margin-bottom: 47upx;
+}
+
+.placeholder {
+  color: #CCCCCC;
+  font-size: 30upx;
+  line-height: 40upx;
+}
+
+.text_tip {
+  padding: 0 14upx;
+  height: 45upx;
+  background: #FFFFFF;
+  border-radius: 6px;
+  font-size: 26upx;
+}
+
+.text_num {
+  font-size: 26upx;
+}
+
+.info_box_help {
+  margin-top: 30upx;
+}
+
+/* 问诊目的 */
+.pur_list {
+  padding-left: 30upx;
+}
+
+.pur_item {
+  padding: 40upx 30upx;
+}
+
+.pur_icon {
+  width: 38upx;
+  height: 38upx;
+  margin-right: 27upx;
+  flex-shrink: 0;
+}
+
+.pur_con {
+  width: 100%;
+}
+
+.pur_tit {
+  font-size: 32upx;
+  font-weight: 500;
+}
+
+.pur_subtit {
+  font-size: 28upx;
+  color: #8A8A99;
+  line-height: 38upx;
+  margin-top: 6upx;
+}
+
+/* 咨询时间弹窗 */
+.date_list {
+  white-space: nowrap;
+}
+
+.date_item {
+  display: inline-block;
+  height: 80upx;
+  line-height: 80upx !important;
+  text-align: center;
+  width: 252upx;
+  background-color: #F6F7F8;
+}
+
+.date_item_ac::after {
+  border-color: #e6e6e6;
+}
+
+.date_item:last-child::after {
+  border-right: 0;
+}
+
+.date_item_ac {
+  position: relative;
+}
+
+.date_item_ac::before {
+  content: "";
+  display: block;
+  width: 32upx;
+  height: 6upx;
+  background-color: #01BF8E;
+  position: absolute;
+  left: 50%;
+  right: 0;
+  bottom: 0;
+  transform: translateX(-50%);
+  border-radius: 3px;
+}
+
+.date_item_icon {
+  width: 48upx;
+  height: 48upx;
+  position: absolute;
+  right: 4upx;
+  top: 0;
+}
+
+/* 选择咨询时间弹窗 */
+.num_con {
+  padding: 0 30upx;
+  height: 504upx;
+}
+
+.num_tit {
+  font-size: 28upx;
+  margin: 27upx 0 24upx;
+}
+
+.num_tit_price {
+  color: #EE5253;
+}
+
+.num_list {
+  flex-wrap: wrap;
+  justify-content: flex-start;
+}
+
+.num_item {
+  width: 160upx;
+  height: 111upx;
+  background: #f6f7f8;
+  border-radius: 20upx;
+  margin: 0 16upx 16upx 0;
+  flex-direction: column;
+}
+
+.num_item:nth-child(4n) {
+  margin: 0 0 16upx 0;
+}
+
+.num_item_ac {
+  background-color: #F5FFFA;
+}
+
+.num_item_img {
+  width: 52upx;
+  height: 50upx;
+  position: absolute;
+  right: 0;
+  bottom: 0;
+}
+
+.num_item_time {
+  font-size: 26upx;
+}
+
+.btnBgcolor {
+  background-color: #ddd !important;
+}
+
+.p_mask,
+.p_btn_con {
+  z-index: 100;
+}
+
+.press-canvas {
+  position: absolute;
+  top: -1000px;
+  background-color: gray;
+}
+
+.pb150 {
+  padding-bottom: 150upx;
+}
+
+.mask {
+  z-index: 999;
+}
+
+.non_record_box {
+  width: 80%;
+  background: white;
+  border-radius: 20upx;
+  padding: 30upx;
+  box-sizing: border-box;
+}
+
+.non_record_title {
+  font-size: 32upx;
+  font-weight: bold;
+  color: #333;
+}
+
+.non_record_main {
+  width: 100%;
+  margin: 30upx 0;
+}
+
+.non_record_main text {
+  line-height: 44upx;
+  font-size: 30upx;
+  color: #666;
+  margin-bottom: 15upx;
+}
+
+.non_record_btn {
+  width: 100%;
+}
+
+.non_record_btn text {
+  width: 100%;
+  line-height: 70upx;
+  text-align: center;
+  border-radius: 10upx;
+  margin-top: 20upx;
+}
+
+.example_val {
+  padding: 30upx;
+  box-sizing: border-box;
+  border: 1px solid #f5f5f5;
+  background: #f9f9f9;
+  margin-bottom: 30upx;
+}
+
+/* 示例 */
+.example_con {
+  padding: 0 30upx;
+  line-height: 0;
+}
+
+.example_img {
+  height: 160upx;
+  width: 160upx;
+  border-radius: 10upx;
+  margin: 22upx 30upx 28upx 0;
+}
+</style>

+ 370 - 0
pagesNetHos/st1/business/other/doctorLike/doctorLike.vue

@@ -0,0 +1,370 @@
+<template>
+	<view class="container">
+		<view class="content">
+			<view class="doc_tab p_flexCenter">
+				<view
+					class="doc_tab_item p_flexCenter"
+					:class="[tabInd == 0 ? 'doc_tab_item_ac p_color' : 'p_color_6']"
+					@click="tabClick(0)">
+					关注医生
+				</view>
+				<view
+					class="doc_tab_item p_flexCenter"
+					:class="[tabInd == 1 ? 'doc_tab_item_ac p_color' : 'p_color_6']"
+					@click="tabClick(1)">
+					最近咨询
+				</view>
+				<view
+					class="doc_tab_item p_flexCenter"
+					:class="[tabInd == 2 ? 'doc_tab_item_ac p_color' : 'p_color_6']"
+					@click="tabClick(2)">
+					关注团队
+				</view>
+			</view>
+			<view class="doctor_list_con p_format" v-if="!showNoData">
+				<!-- 医生列表 -->
+				<template v-if="tabInd != 2">
+					<view class="p_doctor_item p_flexCenter"
+						v-for="(item, index) in (tabInd == 0 ? collectDoctorList : hisDoctorList)" :key="index"
+						@click="toDocInfo(item)">
+						<view class="p_doctor_img_con">
+							<image class="p_doctor_img" :src="item.DoctorPhotourl"></image>
+						</view>
+						<view class="p_doctor_item_con">
+							<view class="doctor_item_con p_flexBetween">
+								<view class="p_doctor_infocon">
+									<view class="p_doctor_tit">
+										<view class="p_doctor_name">{{ item.DoctorName }}</view>
+									</view>
+									<view class="p_doctor_info p_color_6">{{ item.LczcName }} {{ item.DeptName }}</view>
+								</view>
+								<view class="p_doctor_btn doc_his_btn_like p_flexCenter" :class="{ doc_his_btn_liked: item.like }">
+									<image class="doc_his_btn_img" :src="iconUrl.doctor_like_n" v-if="!item.like"></image>
+									<view class="doc_his_btn_val" @click.stop="likeFn(item)">
+										{{ item.like ? '已关注' : '关注' }}
+									</view>
+								</view>
+							</view>
+							<view class="p_doctor_item_introduce p_color_9 p_lineClamp">
+								擅长:{{ item.DoctorSkill }}
+							</view>
+							<view class="p_doctor_item_introduce p_color_3" v-if="tabInd == 1">
+								咨询时间:{{ item.ConsultStartTime }}
+							</view>
+						</view>
+					</view>
+				</template>
+				<!-- 团队列表 -->
+				<template v-if="tabInd == 2">
+					<view class="group_item displayFlexCol" v-for="(item, index) in groupList" :key="index"
+						@click="jumpGroupInfo(item)">
+						<image class="group_photo" :src="item.GroupUrl" mode="aspectFill" />
+						<text class="group_name">{{ item.GroupName }}</text>
+						<view class="group_introduce">
+							<text class="skill_label">简介:</text>
+							<text class="group_introduce_text p_color_6">{{ item.GroupIntro }}</text>
+						</view>
+					</view>
+				</template>
+			</view>
+			<view class="noData" v-else>
+				<noData :value="noDataValue"></noData>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script lang="ts" setup>
+import { ref, getCurrentInstance } from 'vue';
+import { useOnLoad } from '@/hook';
+import { queryConsultDoctorGroup, queryUserCollect, queryBDoctorList, queryHistoryConsultDoctor, userCollect, unUserCollect } from '/pagesNetHos/st1/service/doctor/index';
+import icon from '@/utils/icon';
+import { common } from '@/utils';
+import { doctorListHandle } from '/pagesNetHos/st1/static/js/pagesNetHosFn';
+import noData from '@/pages/st1/components/noData/noData.vue';
+
+const { proxy } = getCurrentInstance();
+const app = getApp();
+
+// 图片icon
+const iconUrl = ref(icon);
+// 0关注医生 1最近咨询
+const tabInd = ref(0);
+// 关注医生列表
+const collectDoctorList = ref<any[]>([]);
+// 历史医生列表
+const hisDoctorList = ref<any[]>([]);
+// 是否展示暂无数据
+const showNoData = ref(false);
+// 暂无数据
+const noDataValue = ref('暂无数据');
+const groupList = ref<any[]>([]);
+
+// 返回上一级页面时执行的当前页面函数
+const refresh = () => {
+
+};
+
+// 页面加载
+useOnLoad(() => {
+	main();
+});
+
+// 查询关注医生
+const queryCollectDoctor = async () => {
+	const collectData = { resourceType: '1' };
+	const { resp: respCollect } = await queryUserCollect(collectData);
+	let collectDocList: any[] = [];
+	if (!common.isEmpty(respCollect)) {
+		const arr: string[] = [];
+		for (let i = 0; i < respCollect.length; i++) {
+			arr.push(respCollect[i].ResourceId);
+		}
+		const queryBDoctorListData = {
+			DoctorUid: arr.join()
+		};
+		const { resp: collectDocListResp } = await queryBDoctorList(queryBDoctorListData);
+		if (!common.isEmpty(collectDocListResp)) {
+			// 添加关注状态
+			collectDocListResp.map((item: any) => item.like = true);
+			collectDocList = doctorListHandle(collectDocListResp);
+		}
+	}
+	collectDoctorList.value = collectDocList;
+};
+
+// 查询最近咨询
+const queryHisDoctor = async () => {
+	const data = { ConsultType: '' };
+	const { resp: respHis } = await queryHistoryConsultDoctor(data);
+	let hisDocList: any[] = [];
+	if (!common.isEmpty(respHis)) {
+		// 获取已关注的医生ID
+		const likedDoctorIds = collectDoctorList.value.filter(item => item.like).map(item => item.DoctorUid);
+		for (let i of respHis) {
+			// 判断是否已关注
+			if (likedDoctorIds.includes(i.DoctorUid)) {
+				i.like = true;
+			}
+		}
+		hisDocList = doctorListHandle(respHis);
+	}
+	hisDoctorList.value = hisDocList;
+};
+
+// 查询咨询医生组
+const queryConsultDoctorGroupFn = async () => {
+	const data = {
+		IsMemberCollect: 1
+	};
+
+	const { resp } = await queryConsultDoctorGroup(data);
+	if (common.isNotEmpty(resp)) {
+		groupList.value = resp;
+	}
+};
+
+// 更新暂无数据显示
+const updateShowNoData = () => {
+	const currentTabInd = tabInd.value;
+	if (currentTabInd == 0) {
+		showNoData.value = common.isEmpty(collectDoctorList.value);
+	} else if (currentTabInd == 1) {
+		showNoData.value = common.isEmpty(hisDoctorList.value);
+	} else {
+		showNoData.value = common.isEmpty(groupList.value);
+	}
+  console.log(showNoData.value,'v')
+};
+
+const main = async () => {
+	const currentTabInd = tabInd.value;
+	// 根据 tabInd 请求对应接口
+	if (currentTabInd == 0) {
+		// 关注医生
+		await queryCollectDoctor();
+	} else if (currentTabInd == 1) {
+		// 最近咨询
+		await queryHisDoctor();
+	} else if (currentTabInd == 2) {
+		// 关注团队
+		await queryConsultDoctorGroupFn();
+	}
+	// 更新暂无数据显示
+	updateShowNoData();
+};
+
+const tabClick = (ind: number) => {
+	if (ind == tabInd.value) {
+		return;
+	}
+	tabInd.value = ind;
+	main();
+};
+
+const likeFn = async (item: any) => {
+	const data = {
+		resourceId: item.DoctorUid,
+		resourceType: 1
+	};
+	let res;
+	if (item.like) {
+		// 取消关注
+		({ resData: res } = await unUserCollect(data));
+	} else {
+		// 关注
+		({ resData: res } = await userCollect(data));
+	}
+	if (res.RespCode == '10000') {
+		collectDoctorList.value.map(cell => {
+			if (cell.DoctorUid == item.DoctorUid) {
+				cell.like = !cell.like;
+			}
+		});
+		hisDoctorList.value.map(cell => {
+			if (cell.DoctorUid == item.DoctorUid) {
+				cell.like = !cell.like;
+			}
+		});
+	}
+};
+
+const toDocInfo = (item: any) => {
+	const queryBean = common.stringify(item);
+	const url = `/pagesNetHos/st1/business/doctor/doctorInfo/doctorInfo?queryBean=${queryBean}`;
+	common.menuClick({ Url: url }, proxy);
+};
+
+/** 跳转团队主页 */
+const jumpGroupInfo = (item: any) => {
+	const url = `/pagesNetHos/st1/business/doctorGroup/doctorGroupInfo/doctorGroupInfo?groupId=${item.GroupId}`;
+	common.goToUrl(url);
+};
+
+// 暴露方法供父组件调用
+defineExpose({
+	refresh
+});
+</script>
+
+<style lang="scss" scoped>
+@import "/pagesNetHos/st1/static/css/common";
+@import "/pagesNetHos/st1/static/css/doctorInfo";
+
+.doc_tab_item {
+	width: 50%;
+	position: relative;
+	height: 100upx;
+	font-size: 30upx;
+	background-color: #fff;
+}
+
+.doc_tab_item_ac {
+	font-size: 36upx;
+	font-weight: 500;
+}
+
+.doc_tab_item_ac:after {
+	content: "";
+	display: block;
+	height: 6upx;
+	width: 48upx;
+	background: #01BF8E;
+	border-radius: 3upx;
+	position: absolute;
+	bottom: 0;
+	left: 50%;
+	transform: translateX(-50%);
+}
+
+.p_doctor_item {
+	margin: 20upx 30upx;
+	padding: 30upx 24upx 15upx;
+	background-color: #fff;
+	border-radius: 20upx;
+}
+
+.p_doctor_item_con {
+	padding-bottom: 0;
+}
+
+.doc_his_btn_like {
+	padding: 0 18upx;
+	height: 54upx;
+	background: linear-gradient(90deg, rgba(177, 236, 195, 0.2) 0%, rgba(6, 186, 132, 0.2) 100%);
+	font-size: 26upx;
+	font-weight: 500;
+	color: #01BF8E;
+	border-radius: 50px;
+	border: 1px solid rgba(6, 186, 132, 0.2);
+}
+
+.doc_his_btn_liked {
+	background: linear-gradient(90deg, rgba(232, 233, 240, 0.2) 0%, rgba(170, 173, 189, 0.2) 100%);
+	color: #AAADBD;
+	border-radius: 50px;
+	border: 1px solid rgba(170, 173, 189, 0.2);
+}
+
+.doc_his_btn_img {
+	width: 32upx;
+	height: 32upx;
+}
+
+.doc_his_btn_val {
+	margin-left: 8upx;
+}
+
+.doctor_item_con {
+	align-items: flex-start !important;
+}
+
+/* 团队 */
+.group_item {
+	padding: 30upx;
+	box-sizing: border-box;
+	background: white;
+	border-radius: 20upx;
+	margin-bottom: 20upx;
+	margin: 20upx 30upx;
+}
+
+.group_item text {
+	font-size: 30upx;
+}
+
+.group_photo {
+	width: 100%;
+	height: 160upx;
+	background: #f9f9f9;
+	border-radius: 10upx;
+}
+
+.group_name {
+	width: 100%;
+	text-align: left;
+	margin-top: 30upx;
+}
+
+.group_introduce {
+	width: 100%;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	flex-wrap: wrap;
+	display: -webkit-box;
+	/* 几行后显示省略号 */
+	-webkit-line-clamp: 2;
+	-webkit-box-orient: vertical;
+	position: relative;
+}
+
+.group_introduce text:nth-child(1) {
+	font-weight: bold;
+}
+
+.group_introduce_text {
+	font-size: 30upx;
+	font-family: PingFang SC;
+	line-height: 40upx;
+}
+</style>

+ 462 - 0
pagesNetHos/st1/components/screen/screen.vue

@@ -0,0 +1,462 @@
+<template>
+  <view class="p_mask screen_dialog_mask" :class="{ fixed: !pMask }" v-if="screenDialogShow" @click="showScreenMask">
+    <view class="screen_inner p_flexCenterCol" @click.stop="doNothing">
+      <view class="screen_box p_format p_scroll">
+        <!-- 时间 -->
+        <view class="screen_item" v-if="showDatePicker">
+          <view class="item_tit p_flexBetween">
+            <view class="item_tit_val">咨询时间</view>
+          </view>
+          <view class="item_time_box p_flexBetween">
+            <picker mode="date"
+              :value="queryDataCopy.ConsultStartDate || queryDataCopy.BeginDate || queryDataCopy.StartTime"
+              :start="start"
+              :end="queryDataCopy.ConsultEndDate || queryDataCopy.EndDate || queryDataCopy.EndTime"
+              @change="dateChange"
+              :data-key="queryDataCopy.ConsultStartDate ? 'queryDataCopy.ConsultStartDate' : queryDataCopy.BeginDate ? 'queryDataCopy.BeginDate' : 'queryDataCopy.StartTime'">
+              <view class="time_con p_flexCenter">
+                {{ queryDataCopy.ConsultStartDate || queryDataCopy.BeginDate || queryDataCopy.StartTime }}
+              </view>
+            </picker>
+            <view class="time_tip">至</view>
+            <picker mode="date" :value="queryDataCopy.ConsultEndDate || queryDataCopy.EndDate || queryDataCopy.EndTime"
+              :start="queryDataCopy.ConsultStartDate || queryDataCopy.BeginDate || queryDataCopy.StartTime"
+              @change="dateChange"
+              :data-key="queryDataCopy.ConsultEndDate ? 'queryDataCopy.ConsultEndDate' : queryDataCopy.EndDate ? 'queryDataCopy.EndDate' : 'queryDataCopy.EndTime'">
+              <view class="time_con p_flexCenter">
+                {{ queryDataCopy.ConsultEndDate || queryDataCopy.EndDate || queryDataCopy.EndTime }}
+              </view>
+            </picker>
+          </view>
+        </view>
+        <!-- 单选多选 -->
+        <view class="screen_item" v-for="(itemParent, indexParent) in screenListCopy" :key="indexParent">
+          <view class="item_tit p_flexBetween">
+            <view class="item_tit_val">{{ itemParent.title }}<text class="item_tit_subval p_color_9">({{ itemParent.type === '0' ? '单选' : itemParent.type === '1' ? '多选' : '' }})</text></view>
+          </view>
+          <view class="item_list">
+            <view
+              class="item_val p_flexCenter"
+              :class="{ 'p_color p_border item_val_ac': isHas(index, itemParent.selectedInd) }"
+              v-for="(item, index) in itemParent.list" :key="index" @click="itemClick"
+              :data-index-parent="indexParent"
+              :data-index="index" :data-item="item">{{ item.name }}</view>
+          </view>
+        </view>
+        <!-- 医生职称 -->
+        <view class="screen_item" v-if="showDoctorTitle">
+          <view class="item_tit p_flexBetween">
+            <view class="item_tit_val">医生职称</view>
+          </view>
+          <view class="item_list">
+            <view
+              class="item_val p_flexCenter"
+              :class="{ 'p_color p_border item_val_ac': isHas(item.DoctorTitleCode, titleSelectedList) }"
+              v-for="(item, index) in titleList" :key="index" @click="titleListClick" :data-item="item">{{ item.DoctorTitle }}
+            </view>
+          </view>
+        </view>
+        <!-- 就诊人 -->
+        <view class="screen_item" v-if="showMember && memberList.length > 0">
+          <view class="item_tit p_flexBetween">
+            <view class="item_tit_val">选择就诊人</view>
+          </view>
+          <view class="item_list">
+            <view
+              class="item_val p_flexCenter"
+              :class="{ 'p_color p_border item_val_ac': item.memberId == (queryDataCopy.memberId || queryDataCopy.MemberId) }"
+              v-for="(item, index) in memberList" :key="index" @click="memberClick" :data-item="item">{{ item.memberName }}</view>
+          </view>
+        </view>
+
+      </view>
+      <!-- 按钮 -->
+      <view class="btn_list p_flexCenter">
+        <view class="btn_item btn_item_reset p_border p_color p_flexCenter" @click="btnClick" data-type="reset">重置</view>
+        <view class="btn_item btn_item_confirm p_bgcolor p_flexCenter" @click="btnClick" data-type="confirm">确定</view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, watch, onMounted, getCurrentInstance, defineExpose } from 'vue';
+import { common } from '@/uni-app-base/utils';
+import icon from '@/utils/icon';
+import { deepCopy, copy as netHosCopy } from '/pagesNetHos/st1/static/js/netHosCommon';
+import { isHas } from '/pagesNetHos/st1/static/js/common';
+import { queryTitleInfoNew, queryBaseMemberList_V3 } from '/pagesNetHos/st1/service/doctor/index';
+
+const { proxy } = getCurrentInstance() as any;
+const app = getApp();
+
+const props = withDefaults(defineProps<{
+  // 遮罩层定位方式
+  pMask?: boolean;
+  // 是否展示筛选组件
+  screenDialogShow?: boolean;
+  // 是否展示就诊人
+  showMember?: boolean;
+  // 是否展示全部就诊人按钮
+  showAllMember?: boolean;
+  // 是否展示医生筛选
+  showDoctorTitle?: boolean;
+  // 筛选值
+  screenList?: any[];
+  // 入参
+  queryData?: any;
+  // 是否展示日期
+  showDatePicker?: boolean;
+  // 开始日期
+  start?: string;
+}>(), {
+  pMask: true,
+  screenDialogShow: false,
+  showMember: false,
+  showAllMember: true,
+  showDoctorTitle: false,
+  screenList: () => [],
+  queryData: () => ({}),
+  showDatePicker: false,
+  start: ''
+});
+
+const emit = defineEmits(['screenConfirmClk', 'showScreenMask']);
+
+// 当前选中的list
+const selectedList = ref<any[]>([]);
+// list副本
+const screenListCopy = ref<any[]>([]);
+// 入参副本
+const queryDataCopy = reactive<any>({});
+// 就诊人列表
+const memberList = ref<any[]>([]);
+// 当前选中的就诊人
+const memberSelected = ref<any>({});
+// 医生职称列表
+const titleList = ref<any[]>([]);
+// 当前选择医生职称
+const titleSelectedList = ref<string[]>(['']);
+
+// 监听 queryData 变化
+watch(() => props.queryData, (val) => {
+  console.log(val, "val");
+  Object.assign(queryDataCopy, deepCopy(val));
+}, { immediate: true, deep: true });
+
+// 监听 screenList 变化
+watch(() => props.screenList, (val) => {
+  if (val && val.length > 0) {
+    screenListCopy.value = deepCopy(val);
+  }
+}, { immediate: true, deep: true });
+
+// 监听 screenDialogShow 变化,显示时调用 main
+watch(() => props.screenDialogShow, (val) => {
+  if (val) {
+    main();
+  }
+});
+
+onMounted(() => {
+  if (props.screenDialogShow) {
+    main();
+  }
+});
+
+// 页面显示时调用
+// 注意:UniApp 组件没有 pageLifetimes,需要在父组件中处理
+const main = () => {
+  screenListCopy.value = deepCopy(props.screenList);
+  if (props.showMember) {
+    getCardList();
+  }
+  if (props.showDoctorTitle) {
+    getDoctorTitle();
+  }
+};
+
+// 暴露方法供父组件调用
+defineExpose({
+  main
+});
+
+// 获取医生职称
+const getDoctorTitle = async () => {
+  let data = {
+    HosId: (app.globalData as any).hosId,
+    DeptCode: "",
+    IsUsed: true
+  };
+  let titleListData: any[] = [];
+  let { resp } = await queryTitleInfoNew(data);
+  if (!common.isEmpty(resp)) {
+    resp.unshift({
+      DoctorTitle: '全部',
+      DoctorTitleCode: ''
+    });
+    titleListData = resp;
+  }
+  titleList.value = titleListData;
+};
+
+// 点击状态选项  区分单选多选
+const itemClick = (e: any) => {
+  let indexParent = e.currentTarget?.dataset?.indexParent;
+  let itemParent = screenListCopy.value[indexParent];
+  let item = e.currentTarget?.dataset?.item;
+  let index = e.currentTarget?.dataset?.index;
+  
+  if (itemParent.type === '0' || item.name.indexOf('全部') !== -1) {
+    // 单选 或 点击了全部
+    itemParent.selectedInd = [index];
+  } else if (itemParent.type === '1') {
+    // 多选
+    if (itemParent.selectedInd.includes(index)) {
+      // 多选时 不能取消最后一个选择
+      if (itemParent.selectedInd.length === 1) {
+        return;
+      }
+      let ind = itemParent.selectedInd.findIndex((ind: number) => ind === index);
+      itemParent.selectedInd.splice(ind, 1);
+    } else {
+      itemParent.selectedInd.push(index);
+    }
+    // 过滤含有 全部 的字段
+    let allIndex = itemParent.list.findIndex((item: any) => item.name.indexOf('全部') !== -1);
+    itemParent.selectedInd = itemParent.selectedInd.filter((item: number) => item !== allIndex);
+  }
+};
+
+// 就诊人点击
+const memberClick = (e: any) => {
+  let item = e.currentTarget?.dataset?.item;
+  queryDataCopy.MemberId = item.memberId || item.MemberId || "";
+  queryDataCopy.MemberIds = item.memberId || item.MemberId || "";
+};
+
+// 医生职称点击
+const titleListClick = (e: any) => {
+  let item = e.currentTarget?.dataset?.item;
+  let titleSelected = [...titleSelectedList.value];
+  
+  if (item.DoctorTitle === '全部') {
+    titleSelected = [''];
+  } else {
+    if (titleSelected.includes(item.DoctorTitleCode)) {
+      // 多选时不能清空所有字段
+      if (titleSelected.length === 1) {
+        return;
+      }
+      titleSelected = titleSelected.filter((cell: string) => cell !== item.DoctorTitleCode);
+    } else {
+      titleSelected.push(item.DoctorTitleCode);
+    }
+    // 过滤全部选项
+    titleSelected = titleSelected.filter((item: string) => item !== '');
+  }
+  console.log(titleSelected);
+  queryDataCopy.DoctorTitleCode = titleSelected.join(',');
+  titleSelectedList.value = titleSelected;
+};
+
+// 获取就诊人列表
+const getCardList = async () => {
+  let queryData = {
+    HosId: (app.globalData as any).hosId,
+    isEncrypt: true,
+  };
+  let { resp } = await queryBaseMemberList_V3(queryData);
+  let list: any[] = [];
+  if (!common.isEmpty(resp)) {
+    if (props.showAllMember) {
+      resp.unshift({
+        memberName: '全部',
+        memberId: '',
+      });
+    }
+    list = resp;
+  }
+  memberList.value = list;
+};
+
+// 日期更改
+const dateChange = (e: any) => {
+  let key = e.currentTarget?.dataset?.key;
+  if (key) {
+    const keys = key.split('.');
+    if (keys.length === 2) {
+      (queryDataCopy as any)[keys[1]] = e.detail.value;
+    } else {
+      queryDataCopy[key] = e.detail.value;
+    }
+  }
+};
+
+// 按钮点击
+const btnClick = (e: any) => {
+  let type = e.currentTarget?.dataset?.type;
+  
+  if (type === 'confirm') {
+    // 确定
+    let data: any = {};
+    let queryDataCopyNew = deepCopy(queryDataCopy);
+    
+    for (let item of screenListCopy.value) {
+      for (let i of item.selectedInd) {
+        data = copy(item.list[i].options, data);
+      }
+    }
+    netHosCopy(data, queryDataCopyNew);
+    
+    // memberId 和 MemberIds 只传一个
+    if (queryDataCopyNew.MemberIds == '') {
+      let arr: string[] = [];
+      memberList.value.map((item: any) => {
+        arr.push(item.memberId);
+      });
+      queryDataCopyNew.MemberIds = arr.join(',');
+    }
+    emit('screenConfirmClk', queryDataCopyNew);
+    showScreenMask();
+  } else if (type === 'reset') {
+    // 重置
+    screenListCopy.value = deepCopy(props.screenList);
+    Object.assign(queryDataCopy, deepCopy(props.queryData));
+    queryDataCopy.DoctorTitleCode = '';
+    queryDataCopy.MemberId = "";
+    queryDataCopy.MemberIds = "";
+    titleSelectedList.value = [''];
+  }
+};
+
+// 展示筛选弹窗
+const showScreenMask = () => {
+  emit('showScreenMask');
+};
+
+const doNothing = () => {
+  // 阻止事件冒泡
+};
+
+// 如果对象key相同  将值push至复制对象中
+const copy = (obj: any, c: any = {}) => {
+  for (var i in obj) {
+    if (Object.keys(c).includes(i)) {
+      let arr = c[i].split(',');
+      arr.push(obj[i]);
+      c[i] = arr.join(',');
+    } else {
+      c[i] = obj[i];
+    }
+  }
+  return c;
+};
+</script>
+
+<style lang="scss" scoped>
+@import "@/pagesNetHos/st1/static/css/common.scss";
+
+.p_mask {
+  height: 100vh;
+  position: absolute;
+}
+
+.screen_inner {
+  background-color: #fff;
+  padding: 10upx 30upx 0;
+  border-radius: 0px 0px 36upx 36upx;
+  max-height: 800upx;
+}
+
+.screen_box {
+  width: 100%;
+}
+
+.item_tit {
+  margin: 30upx 0 10upx;
+}
+
+.item_tit_val {
+  font-size: 32upx;
+  font-weight: 500;
+}
+
+.item_tit_subval {
+  font-size: 28upx;
+}
+
+.item_tit_img {
+  width: 20upx;
+  height: 20upx;
+}
+
+.item_list {
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+}
+
+.item_val {
+  padding: 0 20upx;
+  width: 216upx;
+  height: 68upx;
+  background: #F7F7F7;
+  border-radius: 34upx;
+  font-size: 26upx;
+  margin: 20upx 20upx 0 0;
+}
+
+.item_val:nth-child(3n) {
+  margin-right: 0;
+}
+
+.item_val_ac {
+  background-color: #E7F7F3;
+}
+
+.item_val_ac::after,
+.item_val_ac::before {
+  border-color: #01BF8E;
+  border-radius: 34px;
+}
+
+.time_con {
+  width: 312upx;
+  height: 68upx;
+  background: #F7F7F7;
+  border-radius: 8px;
+  margin: 20upx 0;
+  font-size: 26upx;
+}
+
+.time_tip {
+  font-size: 26upx;
+}
+
+.btn_list {
+  margin: 30upx 0;
+}
+
+.btn_item {
+  width: 345upx;
+  height: 92upx;
+  background-color: #fff;
+  border-radius: 46upx 0 0 46upx;
+  font-size: 34upx;
+}
+
+.btn_item_reset::after,
+.btn_item_reset::before {
+  border-color: #01BF8E;
+  border-radius: 46px 0 0 46px;
+}
+
+.btn_item_confirm {
+  border-radius: 0px 46upx 46upx 0px;
+}
+
+.fixed {
+  position: fixed;
+}
+</style>

+ 330 - 0
pagesNetHos/st1/service/doctor/index.ts

@@ -0,0 +1,330 @@
+import { REQUEST_CONFIG } from '@/config';
+import { request, handle } from '@kasite/uni-app-base';
+
+/**
+ * 获取咨询记录
+ */
+export const queryConsultWaterList = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/cons/Consult/QueryConsultWaterList/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询房间列表信息
+ */
+export const queryConsultRoomList = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/cons/ConsultRoom/QueryConsultRoomList/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 获取报告单列表
+ */
+export const getReportList = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/report/ReportWs/GetReportList/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询处方明细
+ */
+export const queryNetOrderSettlement = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/net/businessOrder/QueryNetOrderSettlement/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 咨询查询门诊排班列表
+ */
+export const queryClinicDoctorSchedule = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/yy/yygh/QueryClinicDoctorSchedule/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 获取预约时间段
+ */
+export const queryNumbers = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/yy/yygh/QueryNumbers/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 申请图文咨询
+ */
+export const applyImgTxtConsult = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/cons/Consult/ApplyImgTxtConsult/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 锁号
+ */
+export const lockOrder = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/yy/yygh/LockOrder/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 释号
+ */
+export const unlock = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/yy/yygh/Unlock/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 视频咨询申请
+ */
+export const applyVideoConsult = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/cons/Consult/ApplyVideoConsult/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 搜索医生
+ */
+export const queryConsultDoctorList = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/cons/ConsultDoc/QueryConsultDoctorList/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 获取科室列表
+ */
+export const queryDeptList = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/basic/DeptApi/QueryDeptList/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询推荐科室
+ */
+export const queryConsultDeptList = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/cons/ConsultDoc/QueryConsultDeptList/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询医生(互联网)
+ */
+export const queryNetConsultDoctorList = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/cons/ConsultDoc/QueryNetConsultDoctorList/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 判断医生是否被关注
+ */
+export const getUserCollectByDoctorUid = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/user/collect/GetUserCollectByDoctorUid/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询评价列表
+ */
+export const queryAppraiseList = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/orderAppr/appraise/Query/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 关注医生
+ */
+export const userCollect = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/user/collect/UserCollect/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 取消关注医生
+ */
+export const unUserCollect = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/user/collect/UnUserCollect/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询医生二维码
+ */
+export const queryQrCode = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/qr/QrCode/QueryQrCode/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询就诊人信息
+ */
+export const queryBaseMemberList_V3 = async (queryData: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/accountMember/api/QueryBaseMemberList_V3/callApiJSON.do`, queryData));
+  return handle.catchPromiseNew(resp, () => resp);
+};
+
+/**
+ * 查询医生职称
+ */
+export const queryTitleInfoNew = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/basic/DoctorApi/QueryTitleInfoNew/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 获取专家介绍列表(根据doctorUid查询对应医生)
+ */
+export const queryBDoctorList = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/basic/DoctorApi/QueryBDoctorList/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询关注医生
+ */
+export const queryUserCollect = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/user/collect/QueryUserCollect/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询历史咨询医生
+ */
+export const queryHistoryConsultDoctor = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/cons/ConsultDoc/QueryHistoryConsultDoctor/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 取消咨询
+ */
+export const cancelConsultWater = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/cons/Consult/CancelConsultWater/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询排队队列信息
+ */
+export const queryNetQueueList = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/net/QueueWs/QueryNetQueueList/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询库存
+ */
+export const QueryPrescriptionInformationList = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/net/businessOrder/QueryPrescriptionInformationList/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 在线续方
+ */
+export const ApplyPrescriptionConsult = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/cons/Consult/ApplyPrescriptionConsult/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询当前医生信息
+ */
+export const QueryBDoctorInfo = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/basic/DoctorApi/QueryBDoctorInfo/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询医生专家组列表
+ */
+export const GroupList = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/base/docGroupApi/GroupList/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 添加医生主页访问数据
+ */
+export const addOrUpdateConsultDoctorReport = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/cons/ConsultDocReport/AddOrUpdateConsultDoctorReport/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询门诊就诊记录
+ */
+export const QueryOutpatientVisitList = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/member/memberApi/QueryOutpatientVisitList/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 获取科室列表-个性化
+ */
+export const queryConsultDept = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/cons/ConsultDept/QueryConsultDept/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询咨询医生组
+ */
+export const queryConsultDoctorGroup = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/cons/ConsultDoctorGroup/QueryConsultDoctorGroup/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 获取咨询配置
+ */
+export const getConsultAgreement = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/cons/Consult/GetConsultAgreement/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询咨询医生组医生
+ */
+export const queryConsultDoctorGroupDoctor = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/cons/ConsultDoctorGroup/QueryConsultDoctorGroupDoctor/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询医生组排班
+ */
+export const queryGroupSchedule = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/cons/GroupSchedule/QueryGroupSchedule/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 统计咨询评价
+ */
+export const countConsultAppraise = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/cons/ConsultAppraise/CountConsultAppraise/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询咨询评价列表
+ */
+export const queryConsultAppraiseList = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/cons/ConsultAppraise/QueryConsultAppraiseList/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 申请图文咨询-团队
+ */
+export const applyDoctorGroupConsult = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/cons/ConsultDoctorGroup/ApplyDoctorGroupConsult/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 医生信息
+ */
+export const queryUserCollectBDoctorInfo = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/basic/DoctorApi/QueryUserCollectBDoctorInfo/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};

+ 10 - 0
pagesNetHos/st1/service/news/index.ts

@@ -0,0 +1,10 @@
+import { REQUEST_CONFIG } from '@/config';
+import { request, handle } from '@kasite/uni-app-base';
+
+/**
+ * 查询文章列表
+ */
+export const queryArticleList = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/basic/BasicApi/QueryArticleList/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};

+ 163 - 0
pagesNetHos/st1/service/order/index.ts

@@ -0,0 +1,163 @@
+import { REQUEST_CONFIG } from '@/config';
+import { request, handle } from '@kasite/uni-app-base';
+
+/**
+ * 处方合并结算
+ */
+export const mergeSettledPayReceipt = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/order/businessOrder/MergeSettledPayReceipt/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 处方单笔结算
+ */
+export const addOrderPrescription = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/order/businessOrder/AddOrderPrescription/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询未结算处方列表/查询发药的列表
+ */
+export const queryOrderSettlementList = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/order/businessOrder/QueryOrderSettlementList/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询未结算处方列表
+ */
+export const queryCardBalance_V3 = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/accountMember/api/QueryCardBalance_V3/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 预交金模式处方结算
+ */
+export const settleOrderSettlement = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/order/businessOrder/SettleOrderSettlement/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 查询收件人地址列表
+ */
+export const queryUserAddressList = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/user/addressApi/QueryUserAddressList/callApi.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, false);
+};
+
+/**
+ * 查询发药的列表
+ */
+export const querySendMedical = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/order/businessOrder/QueryOrderSettlementList/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, false);
+};
+
+/**
+ * 物流下单
+ */
+export const netLogistic = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/net/businessOrder/NetLogistic/callApi.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, false);
+};
+
+/**
+ * 查询物流流水
+ */
+export const queryNetLogisticWater = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/net/businessOrder/QueryNetLogisticWater/callApi.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, false);
+};
+
+/**
+ * 获取医保授权信息
+ */
+export const getMedicalInsUserInfo = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/medicalIns/medicalInsApi/GetMedicalInsUserInfo/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 获取用户医保授权地址
+ */
+export const getMedicalInsAuthUrl = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/medicalIns/medicalInsApi/GetMedicalInsAuthUrl/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 医保下单
+ */
+export const addMedicalInsSettleOrder = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/medicalIns/medicalInsApi/AddMedicalInsSettleOrder/callApiJSON.do`, queryData, {
+    showLoading: false,
+    ...options
+  }));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 医保预结算
+ */
+export const medicalInsOrderPreSettle = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/medicalIns/medicalInsApi/MedicalInsOrderPreSettle/callApiJSON.do`, queryData, {
+    showLoading: false,
+    ...options
+  }));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 获取结算地址
+ */
+export const medicalInsOrderSettle = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/medicalIns/medicalInsApi/MedicalInsOrderSettle/callApiJSON.do`, queryData, {
+    showLoading: false,
+    ...options
+  }));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 结算成功后通知HIS医保结算
+ */
+export const notifyMedicalInsSettle = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/medicalIns/medicalInsApi/NotifyMedicalInsSettle/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 生成订单
+ */
+export const addOrderLocal = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandle(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/order/orderApi/AddOrderLocal/callApiJSON.do`, queryData, options));
+  return handle.catchPromise(resp, () => resp);
+};
+
+/**
+ * 获取入院登记记录
+ */
+export const queryInHospitalList = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/presc/net/QueryInHospitalList/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 取消入院登记记录
+ */
+export const cancelInHospital = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/presc/net/CancelInHospital/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, options);
+};
+
+/**
+ * 物流轨迹接口
+ */
+export const getFengQiaoLogistics = async (queryData: any, options?: any) => {
+  let resp = handle.promistHandleNew(await request.doPost(`${REQUEST_CONFIG.BASE_URL}wsgw/net/businessOrder/GetFengQiaoLogistics/callApiJSON.do`, queryData, options));
+  return handle.catchPromiseNew(resp, () => resp, false);
+};

+ 99 - 0
pagesNetHos/st1/static/css/box.scss

@@ -0,0 +1,99 @@
+/* 盒子和头部标题 */
+
+.mr10 {
+	margin-right: 10upx;
+}
+
+.public_con {
+	background-color: #fff;
+	box-shadow: 0px 0px 40upx 0px rgba(0, 0, 0, 0.06);
+	border-radius: 24upx;
+	margin-bottom: 30upx;
+	overflow: hidden;
+}
+
+.public_con_nav {
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	font-size: 36upx;
+	font-weight: 500;
+	position: relative;
+	padding: 0 30upx;
+	height: 110upx;
+}
+
+.public_con_nav_name {
+	font-size: 32upx;
+	font-weight: 400;
+	color: rgba(0, 0, 0, 1);
+	flex-shrink: 0;
+	line-height: 1.4em;
+}
+
+.public_con_nav_tit {
+	display: flex;
+	align-items: center;
+	line-height: 1.4em;
+}
+
+.public_line {
+	width: 6upx;
+	height: 32upx;
+	position: absolute;
+	top: 0;
+	bottom: 0;
+	left: 0;
+	margin: auto 0;
+}
+
+.public_info_list {
+	padding: 0 30upx;
+	display: inline-block;
+	width: 100%;
+	position: relative;
+	background-color: #fff;
+}
+
+.public_info_item {
+	display: flex;
+	margin: 34upx 0;
+}
+
+.public_info_tit {
+	width: 220upx;
+	font-size: 28upx;
+	font-family: Source Han Sans CN;
+	font-weight: 400;
+	color: rgba(85, 85, 85, 1);
+	line-height: 40upx;
+	flex-shrink: 0;
+}
+
+.public_info_val {
+	font-size: 28upx;
+	font-family: Source Han Sans CN;
+	font-weight: 400;
+	color: rgba(0, 0, 0, 1);
+	max-width: 400upx;
+	align-items: flex-start;
+	line-height: 40upx;
+	word-break: break-all;
+}
+
+.public_info_foot {
+	height: 110upx;
+	display: flex;
+	align-items: center;
+	justify-content: space-around;
+}
+
+.public_icon {
+	width: 50upx;
+	height: 50upx;
+	position: absolute;
+	top: 0upx;
+	bottom: 0;
+	left: 24upx;
+	margin: auto 0;
+}

+ 374 - 0
pagesNetHos/st1/static/css/common.scss

@@ -0,0 +1,374 @@
+.fw {
+	width: 100%;
+}
+
+/* 通用css */
+.p_container {
+	height: 100% !important;
+	background-color: #F0F1F6;
+	color: #333333;
+	font-family: Source Han Sans CN;
+	font-size: 0;
+}
+.p_content {
+	display: inline-block;
+	width: 100%;
+	font-size: 30upx;
+	background-color: #F0F1F6;
+}
+
+.backgroundCustom_FF7 {
+	background-color: #ff7800 !important;
+	color: #fff !important;
+}
+
+.backgroundCustom_2CC0A9 {
+	background-color: #2CC0A9 !important;
+	color: #fff !important;
+}
+
+/* 背景色 */
+
+/* 字体颜色 */
+.p_colorF {
+	color: #ffffff !important;
+}
+.p_color_3 {
+	color: #333333 !important;
+}
+
+.p_color_6 {
+	color: #666666 !important;
+}
+
+.p_color_9 {
+	color: #999999 !important;
+}
+
+.p_color_4d {
+	color: #4d4d54 !important;
+}
+.p_color_8a {
+	color: #8a8a99 !important;
+}
+
+/* 字体颜色 */
+.p_color_8A8A99 {
+	color: #8A8A99 !important;
+}
+.p_color_2 {
+	color: #222222 !important;
+}
+.p_color_992 {
+	color: #99242C !important;
+}
+.p_color_722 {
+	color: #722d00 !important;
+}
+.p_color_00A8A8 {
+	color: #00A8A8 !important;
+}
+.p_color_D18E09 {
+	color: #D18E09;
+}
+.p_color_red {
+	color: red !important;
+}
+.p_color_E6825E {
+	color: #E6825E !important;
+}
+.p_color_2CC0A9 {
+	color: #2CC0A9 !important;
+}
+.p_color_FB9630 {
+	color: #FB9630 !important;
+}
+.p_color_82D98A {
+	color: #82D98A !important;
+}
+.p_color_40A6EB {
+	color: #40A6EB !important;
+}
+.colorC9595b {
+	color: #c9595b !important;
+}
+/* 搜索框 */
+.p_search_con {
+	width: 100%;
+	height: 76upx;
+	background: #F0F1F6;
+	border-radius: 38upx;
+	margin-bottom: 20upx;
+	position: relative;
+}
+
+.p_search_img {
+	width: 32upx;
+	height: 32upx;
+	position: absolute;
+	left: 30upx;
+	top: 0;
+	bottom: 0;
+	margin: auto 0;
+}
+
+.p_search_input {
+	width: 100%;
+	text-align: center;
+}
+
+/* 加载更多 */
+.p_load_more {
+	padding: 39upx 0 40upx;
+	font-size: 26upx;
+	text-align: center;
+}
+
+/* 按钮 */
+.p_btn_con {
+	width: 100%;
+	padding: 0 30upx;
+	overflow: hidden;
+	background-color: #fff;
+	position: fixed;
+	left: 0;
+	bottom: 0;
+	z-index: 2;
+}
+.p_btn_con_rela {
+	position: relative;
+}
+.p_btn {
+	width: 100%;
+	height: 90upx;
+	margin: 30upx 0;
+	border-radius: 50px;
+	font-size: 34upx;
+	font-weight: 500;
+}
+.p_form {
+	display: block;
+}
+.p_form_btn {
+	height: 100%;
+	width: 100%;
+	border-radius: 8upx;
+	font-size: 34upx;
+	font-weight: 500;
+}
+/* 边框 */
+
+.p_border_top,
+.border_top {
+	position: relative;
+}
+
+.p_border_top::before,
+.border_top::before {
+	content: " ";
+	position: absolute;
+	left: 0;
+	top: 0;
+	width: 100%;
+	height: 1px;
+	border-top: 1px solid #e6e6e6;
+	-webkit-transform-origin: 0 0;
+	transform-origin: 0 0;
+	-webkit-transform: scaleY(0.5);
+	transform: scaleY(0.5);
+}
+
+.p_border_bottom,
+.border_bottom {
+	position: relative;
+}
+
+.p_border_bottom::before,
+.border_bottom::before {
+	content: " ";
+	position: absolute;
+	left: 0;
+	bottom: 0;
+	width: 100%;
+	height: 1px;
+	border-bottom: 1px solid #e6e6e6;
+	-webkit-transform-origin: 0 0;
+	transform-origin: 0 0;
+	-webkit-transform: scaleY(0.5);
+	transform: scaleY(0.5);
+}
+
+.p_border_left,
+.border_left {
+	position: relative;
+}
+
+.p_border_left::after,
+.border_left::after {
+	content: " ";
+	position: absolute;
+	left: 0;
+	bottom: 0;
+	width: 1px;
+	height: 100%;
+	border-left: 1px solid #e6e6e6;
+	-webkit-transform-origin: 0 0;
+	transform-origin: 0 0;
+	-webkit-transform: scaleX(0.5);
+	transform: scaleX(0.5);
+}
+
+.p_border_right,
+.border_right {
+	position: relative;
+}
+
+.p_border_right::after,
+.border_right::after {
+	content: " ";
+	position: absolute;
+	right: 0;
+	bottom: 0;
+	width: 1px;
+	height: 100%;
+	border-right: 1px solid #e6e6e6;
+	-webkit-transform-origin: 0 0;
+	transform-origin: 0 0;
+	-webkit-transform: scaleX(0.5);
+	transform: scaleX(0.5);
+}
+
+.p_border,
+.border {
+	position: relative;
+}
+
+.p_border::before,
+.border::before {
+	content: "";
+	position: absolute;
+	border: 1px solid #e6e6e6;
+	top: -50%;
+	left: -50%;
+	width: 200%;
+	height: 200%;
+	border-radius: 50px;
+	transform: scale(0.5);
+	box-sizing: border-box;
+}
+/* 提示 */
+.p_tip {
+	padding: 36upx 30upx;
+	font-size: 26upx;
+	line-height: 40upx;
+}
+/* 滑块 */
+.p_switch {
+	transform: scale(0.7);
+	margin-right: -20upx;
+}
+
+.p_bt200 {
+	padding-bottom: 200upx;
+}
+.p_concerned {
+	width: 100%;
+	position: fixed;
+	bottom: 0;
+	left: 0;
+	z-index: 10;
+}
+/* 二期右箭头 */
+.p_right {
+	width: 20upx;
+	height: 20upx;
+	border: 1px;
+	border-style: solid;
+	border-color: #666 #666 transparent transparent;
+	transform: rotateZ(45deg);
+}
+/* 背景图 */
+.p_back_img {
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 100%;
+}
+/* 快速问诊按钮 */
+.p_doctor_btn_img {
+	position: absolute;
+	width: 100%;
+	height: 100%;
+	border-radius: 26upx;
+	top: 0;
+	left: 0;
+	/* box-shadow: 2px 2px 3px -1px #02C28A; */
+}
+
+/* 新css  全局样式无 */
+/* 滚动 */
+.p_scroll {
+	overflow: auto;
+	-webkit-overflow-scrolling: touch;
+}
+.p_mask {
+	width: 100%;
+	height: 100%;
+	background: rgba(0, 0, 0, 0.6);
+	position: fixed;
+	top: 0;
+	left: 0;
+	z-index: 20;
+}
+.content view,
+.content image,
+.content text,
+.content navigator,
+.content form {
+	box-sizing: border-box;
+	line-height: 1.4em;
+}
+.p_content view,
+.p_content image,
+.p_content text,
+.p_content navigator,
+.p_content form {
+	box-sizing: border-box;
+	line-height: 1.4em;
+}
+.p_lineClamp {
+	overflow: hidden;
+	text-overflow: ellipsis;
+	display: -webkit-box;
+	-webkit-line-clamp: 2;
+	-webkit-box-orient: vertical;
+}
+.p_flexStart {
+	display: flex;
+	align-items: center;
+	justify-content: flex-start;
+}
+.p_inner {
+	width: 100%;
+	height: 100%;
+	position: relative;
+	z-index: 1;
+}
+.backgroundCustom_F6 {
+	background: #F6F6F6;
+}
+.p_format {
+	/* width: 100%;
+  display: inline-block; */
+	border-top: 1px solid transparent;
+	border-bottom: 1px solid transparent;
+}
+.p_content {
+	display: inline-block;
+	width: 100%;
+	font-size: 30upx;
+	background-color: #F0F1F6;
+}
+.p_color_red {
+	color: red !important;
+}

+ 76 - 0
pagesNetHos/st1/static/css/dialog.scss

@@ -0,0 +1,76 @@
+/* 弹窗 */
+
+.p_mask_bottom {
+	align-items: flex-end;
+}
+
+.p_dialog {
+	background: #FFFFFF;
+	border-radius: 24upx 24upx 0px 0px;
+	width: 100%;
+}
+
+.p_dialog_center {
+	width: 600upx;
+	border-radius: 24upx;
+}
+
+.p_dialog_tit {
+	position: relative;
+	padding: 40upx 30upx 30upx;
+}
+
+.p_dialog_tit_val {
+	font-size: 36upx;
+	font-weight: 500;
+	color: #000000;
+}
+
+.p_dialog_cha {
+	width: 26upx;
+	height: 26upx;
+	position: absolute;
+	top: 0;
+	bottom: 0;
+	right: 30upx;
+	margin: auto 0;
+}
+
+.p_dialog_inner {
+	max-height: 800upx;
+	min-height: 100upx;
+}
+
+.p_dialog_center .p_dialog_inner {
+	max-height: 500upx;
+}
+
+.p_dialog_btn_list {
+	padding: 20upx 30upx 20upx;
+}
+
+.p_dialog_btn {
+	width: 100%;
+	height: 90upx;
+	background: #FFFFFF;
+	border-radius: 50px;
+	font-size: 34upx;
+}
+.p_dialog_btn:last-child:not(:first-child) {
+	margin-left: 20upx;
+}
+.p_dialog_btn::after,
+.p_dialog_btn::before {
+	border-color: #ccc;
+	border-radius: 12upx;
+}
+
+.p_dialog_longbtn {
+	height: 90upx;
+	font-size: 34upx;
+}
+
+.p_border::after,
+.p_border::before {
+	border-radius: 50px;
+}

+ 145 - 0
pagesNetHos/st1/static/css/doctorInfo.scss

@@ -0,0 +1,145 @@
+.p_doctor_item {
+	padding: 30upx;
+	align-items: flex-start;
+	margin: 30upx 0;
+	background-color: #fff;
+	border-radius: 24upx;
+}
+
+.p_doctor_item:nth-last-child(1) {
+	margin-bottom: 0;
+}
+
+.p_doctor_img_con {
+	width: 88upx;
+	height: 88upx;
+	border-radius: 50upx;
+	position: relative;
+	margin-right: 20upx;
+	flex-shrink: 0;
+	margin-top: 4px;
+}
+.p_doctor_img {
+	border-radius: 50%;
+}
+
+.p_doctor_state {
+	width: 68upx;
+	font-size: 18upx;
+	height: 28upx;
+	color: #fff;
+	background: #13C287;
+	border: 2upx solid #FFFFFF;
+	border-radius: 14upx;
+	text-align: center;
+	position: absolute;
+	left: 50%;
+	bottom: 0;
+	transform: translateX(-50%);
+}
+
+.p_doctor_item_con {
+	width: 100%;
+}
+
+.p_doctor_item:nth-last-child(1) .p_doctor_item_con::before {
+	border-bottom: 0;
+}
+
+.p_doctor_infocon {
+	width: 100%;
+}
+
+.p_doctor_tit {
+	display: flex;
+	align-items: center;
+}
+
+.p_doctor_name {
+	font-size: 34upx;
+	font-weight: 500;
+}
+
+.p_doctor_tip {
+	height: 32upx;
+	background: #FFF0E1;
+	padding: 0 12upx;
+	margin-left: 16upx;
+	border-radius: 50px;
+}
+
+.p_doctor_star {
+	width: 24upx;
+	height: 24upx;
+}
+
+.p_doctor_starval {
+	font-size: 26upx;
+	font-family: DINPro;
+	font-weight: 500;
+	color: #FF9D35;
+	margin-left: 9upx;
+}
+
+.p_doctor_rescription {
+	font-size: 22upx;
+	font-weight: 500;
+	color: #FF9D35;
+}
+
+.p_doctor_info {
+	font-size: 28upx;
+	margin-top: 8upx;
+}
+
+.p_doctor_btn {
+	min-width: 144upx;
+	height: 52upx;
+	border-radius: 8px;
+	font-size: 28upx;
+	color: #FFFFFF;
+	padding: 0 17upx;
+	position: relative;
+	margin-bottom: 10upx;
+	margin-right: -5upx;
+}
+
+.p_doctor_item_introduce {
+	font-size: 24upx;
+	margin: 10upx 0;
+}
+
+.p_doctor_item_describe {
+	font-size: 28upx;
+	color: #333333;
+}
+
+.p_doctor_item_describe .p_color_9 {
+	margin: 0 10upx;
+}
+
+.p_doctor_work_type {
+	margin-top: 30upx;
+}
+
+.p_doctor_type_item_img {
+	width: 38upx;
+	height: 38upx;
+	margin-right: 10upx;
+	flex-shrink: 0;
+}
+
+.p_doctor_type_item_val {
+	font-size: 28upx;
+	font-family: PingFang-SC-Medium;
+	color: #FF921F;
+}
+.p_doctor_type_item_tit {
+	font-size: 28upx;
+}
+.p_doctor_type_item_err {
+	font-size: 28upx;
+	font-family: Source Han Sans CN;
+	font-weight: 500;
+	color: #AAADBD;
+}

+ 81 - 0
pagesNetHos/st1/static/css/qrcode.scss

@@ -0,0 +1,81 @@
+/* 二维码弹窗 */
+.public_dialog {
+	background-color: rgba(1, 1, 1, 0.6);
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	z-index: 2;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+
+.code_inner {
+	width: 600upx;
+	border-radius: 24upx;
+	position: relative;
+	background-color: #fff;
+	padding: 60upx 0 50upx;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+}
+
+.code_img_out {
+	width: 44upx;
+	height: 44upx;
+	position: absolute;
+	right: 10upx;
+	top: 10upx;
+	z-index: 1;
+	padding: 10upx;
+}
+
+.code_img {
+	width: 100%;
+	height: 200upx;
+	position: absolute;
+	top: 0;
+	left: 0;
+}
+
+.code_tit {
+	font-size: 40upx;
+	font-weight: 500;
+	position: relative;
+	color: #fff;
+}
+
+.code_card {
+	font-size: 28upx;
+	font-family: Arial;
+	font-weight: 400;
+	color: rgba(255, 255, 255, 1);
+	margin: 23upx 0 107upx;
+	position: relative;
+}
+
+.code_subtit {
+	font-size: 28upx;
+}
+
+.code_con {
+	margin: 30upx 0;
+	width: 340upx;
+	height: 340upx;
+}
+
+.code_tip {
+	font-size: 26upx;
+	color: #a6a6a6;
+}
+
+.qr_code {
+	box-sizing: content-box;
+	width: 340upx;
+	height: 340upx;
+	padding: 10upx 0;
+}

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
pagesNetHos/st1/static/js/code.ts


+ 108 - 0
pagesNetHos/st1/static/js/common.ts

@@ -0,0 +1,108 @@
+/**
+ * 工具函数(从 common.wxs 转换而来)
+ */
+
+/**
+ * 只展示月和日
+ */
+export const lengthFormat = function (str: string): string | undefined {
+	if (str) {
+		return str.substring(5);
+	}
+};
+
+/**
+ * 转中字
+ */
+export const numToCn = function (num: number): string | undefined {
+	var str: string | undefined;
+	switch (num) {
+		case 1:
+			str = "一";
+			break;
+		case 2:
+			str = "二";
+			break;
+		case 3:
+			str = "三";
+			break;
+		case 4:
+			str = "四";
+			break;
+		case 5:
+			str = "五";
+			break;
+		case 6:
+			str = "六";
+			break;
+		case 7:
+			str = "七";
+			break;
+		case 8:
+			str = "八";
+			break;
+		case 9:
+			str = "九";
+			break;
+		case 10:
+			str = "十";
+			break;
+	}
+	return str;
+};
+
+/**
+ * 日期格式化 日 月
+ */
+export const dateFormat = function (str: string): string {
+	if (!str) {
+		return "";
+	}
+	return str.substring(5, 7) + "." + str.substring(8, 10);
+};
+
+/**
+ * 是否含有
+ */
+export const isHas = function (val: any, arr: any[]): boolean {
+	if (!arr) {
+		return false;
+	}
+	for (var i = 0; i < arr.length; i++) {
+		if (arr[i] == val) {
+			return true;
+		}
+	}
+	return false;
+};
+
+/**
+ * 消息是否选中
+ */
+export const msgSelected = function (item: any, list: any[]): boolean {
+	for (var i = 0; i < list.length; i++) {
+		if (item.Ids == list[i].Ids) {
+			return true;
+		}
+	}
+	return false;
+};
+
+/**
+ * 处方是否选中
+ */
+export const presSelected = function (item: any, list: any[]): boolean {
+	for (var i = 0; i < list.length; i++) {
+		if (item.PrescNo == list[i].PrescNo) {
+			return true;
+		}
+	}
+	return false;
+};
+
+/**
+ * 是否包含字段
+ */
+export const isIndexOf = function (str: string, val: string): boolean {
+	return str.indexOf(val) != -1;
+};

+ 369 - 0
pagesNetHos/st1/static/js/constant.ts

@@ -0,0 +1,369 @@
+/**
+ * 常用常量
+ */
+export const constant = {
+	/**
+	 * 渠道ID smallpro
+	 */
+	channelId: 'smallpro',
+	/**
+	 * 证件类型
+	 */
+	certType: [
+		{
+			label: '身份证',
+			value: '01'
+		},
+		{
+			label: '台胞证',
+			value: '21'
+		},
+		{
+			label: '港澳证',
+			value: '11'
+		},
+		{
+			label: '军官证',
+			value: '04'
+		},
+		{
+			label: '护照',
+			value: '03'
+		},
+		{
+			label: '其他',
+			value: '99'
+		},
+	],
+	/**
+	 * 获取证件类型名称
+	 */
+	getCertTypeName(certType: string): string | undefined {
+		for (var i = 0; i < this.certType.length; i++) {
+			if (this.certType[i].value == certType) {
+				return this.certType[i].label;
+			}
+		}
+	},
+	/**
+	 * 订单业务类型
+	 */
+	serviceId: {
+		/**挂号订单 */
+		ORDERTYPE_0: '0',
+		/**西药 */
+		ORDERTYPE_001: '001',
+		/**中成药 */
+		ORDERTYPE_002: '002',
+		/**草药 */
+		ORDERTYPE_003: '003',
+		/**非药品类型列表(检查) */
+		ORDERTYPE_004: '004',
+		/**就诊卡充值 */
+		ORDERTYPE_005: '005',
+		/**门诊充值 */
+		ORDERTYPE_006: '006',
+		/**住院充值 */
+		ORDERTYPE_007: '007',
+		/**诊间数据 */
+		ORDERTYPE_008: '008',
+		/**当日挂号 */
+		ORDERTYPE_009: '009',
+		/**病历复印 */
+		ORDERTYPE_010: '010',
+		/**诊间订单合并 */
+		ORDERTYPE_011: '011',
+		/**医技预约 */
+		ORDERTYPE_012: '012',
+		/**其它订单 */
+		ORDERTYPE_013: '013',
+		/**体检收费/结算 */
+		ORDERTYPE_014: '014',
+		/**停车缴费 */
+		ORDERTYPE_015: '015',
+		/**医保结算**/
+		ORDERTYPE_033: '033',
+		/**所有订单 */
+		ORDERTYPE_999: '999'
+	},
+
+	/**
+	 * 卡类型
+	 * 1 就诊卡
+	 * 14 住院号
+	 */
+	cardType: {
+		/**就诊卡 */
+		CARDTYPE_1: 1,
+		/**住院号 */
+		CARDTYPE_14: 14
+	},
+	//互联网医院标志
+	SOURCETYPE_006: "006",
+
+	// 服务类型,用于前端公共页面,不同业务进行逻辑判断,
+	serviceType: {
+		zxqd: 'zxqd', // 在线签到
+		bgcx: 'bgcx', // 报告查询
+		blcx: 'blcx', // 病历查询
+		yjyy: 'yjyy', // 医技预约
+		mzqd: 'mzqd', // 门诊清单
+		zyqd: 'zyqd', // 住院清单
+		cydy: 'cydy', // 出院带药
+		mzjl: 'mzjl', // 门诊记录
+		zyjl: 'zyjl', // 门诊记录
+		frmz: 'frmz', // 发热门诊
+		xgkf: 'xgkf', // 发热门诊
+		hsjc: 'hsjc', // 核酸检测
+		djtk: 'djtk', // 单据退款
+		add: 'add', // 个人中心进入添加流程
+		fwrxwssl: 'fwrxwssl', // 服务热线网上受理
+		smrz: 'smrz', // 实名认证
+		mzbl: 'mzbl'
+	},
+
+	// 互联网医生出诊状态
+	NetDoctorIsHalt: {
+		1: '出诊',
+		2: '停诊',
+		3: '替诊',
+		4: '可约',
+		5: '可挂',
+		6: '申请', //(默认为空,如果为其中一种状态,则该医生下所有排班为此状态)
+		7: '已约满',
+		8: '已过期',
+		9: '未开放',
+		10: '接诊中' //(仅复诊预约有效)
+	},
+
+	// 互联网预约状态
+	NetState: {
+		1: '待签到',
+		2: '候诊中',
+		3: '进行中',
+		4: '待处方',
+		5: '待结算',
+		6: '已结算',
+		7: '待取药',
+		8: '待配送',
+		9: '配送中',
+		10: '待评价',
+		11: '待查看'
+	},
+
+	NetTimeSliceName: {
+		0: "全天",
+		1: "上午",
+		2: "下午",
+		3: "晚上"
+	},
+
+	// 在线咨询
+
+	consultType: [
+		{
+			"type": 1,
+			"name": "图文咨询",
+			"isShow": 0
+		}, {
+			"type": 2,
+			"name": "视频咨询",
+			"isShow": 0
+		}, {
+			"type": 3,
+			"name": "电话咨询",
+			"isShow": 0
+		}],
+	consultStatus: [
+		{
+			status: 0,
+			name: "未支付",
+			isShow: 0
+		}, {
+			status: 1,
+			name: "待接受咨询",
+			isShow: 0
+		}, {
+			status: 2,
+			name: "进行中",
+			isShow: 0
+		},
+		{
+			status: 3,
+			name: "已结束",
+			isShow: 0
+		}, {
+			status: 4,
+			name: "超时未支付",
+			isShow: 0
+		}, {
+			status: 5,
+			name: "已评价",
+			isShow: 0
+		},
+		{
+			status: 6,
+			name: "仲裁中",
+			isShow: 0
+		}, {
+			status: 7,
+			name: "仲裁被驳回",
+			isShow: 0
+		}, {
+			status: 8,
+			name: "仲裁成功",
+			isShow: 0
+		},
+		{
+			status: 9,
+			name: "超时未接单",
+			isShow: 0
+		}, {
+			status: 10,
+			name: "已退费",
+			isShow: 0
+		}
+	],
+	consultMsgType: [
+		{
+			type: 1,
+			name: "纯文本"
+		}, {
+			type: 2,
+			name: "语音"
+		}, {
+			type: 3,
+			name: "视频"
+		}, {
+			type: 4,
+			name: "问诊表单"
+		},
+		{
+			type: 5,
+			name: "咨询前问诊表单"
+		}, {
+			type: 6,
+			name: "图片"
+		}, {
+			type: 7,
+			name: "排班卡片"
+		},
+		{
+			type: 8,
+			name: "患教资料卡片"
+		}, {
+			type: 9,
+			name: "撤回"
+		}, {
+			type: 10,
+			name: "咨询结束卡片"
+		},
+		{
+			type: 11,
+			name: "订单评价卡片"
+		},
+		{
+			type: 12,
+			name: "接单卡片"
+		},
+		{
+			type: 13,
+			name: "延迟服务"
+		},
+		{
+			type: 14,
+			name: "引用回复"
+		},
+		{
+			type: 15,
+			name: "客服消息"
+		},
+		{
+			type: 16,
+			name: "开方卡片"
+		},
+		{
+			type: 17,
+			name: "系统业务提示"
+		},
+		{
+			type: 18,
+			name: "复诊提醒"
+		},
+		{
+			type: 19,
+			name: "咨询记录授权卡片"
+		},
+		{
+			type: 20,
+			name: "初诊转复诊"
+		},
+		{
+			type: 21,
+			name: "图文转视频"
+		},
+		{
+			type: 22,
+			name: "患者就诊记录卡片"
+		},
+		{
+			type: 23,
+			name: "催促医生回复"
+		},
+		{
+			type: 24,
+			name: "开具检查检验单卡片"
+		},
+		{
+			type: 25,
+			name: "处方续方卡片"
+		},
+		{
+			type: 26,
+			name: "报告单解读卡片"
+		},
+		{
+			type: 27,
+			name: "问诊目的卡片"
+		},
+		{
+			type: 28,
+			name: "入院登记"
+		},
+		{
+			type: 29,
+			name: "入院取消"
+		},
+		{
+			type: 30,
+			name: "知情同意书"
+		}
+	],
+	roomUserType: [
+		{
+			"type": 1,
+			"name": "用户"
+		}, {
+			"type": 2,
+			"name": "医生"
+		}],
+	emojiReg: /[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF][\u200D|\uFE0F]|[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF]|[0-9|*|#]\uFE0F\u20E3|[0-9|#]\u20E3|[\u203C-\u3299]\uFE0F\u200D|[\u203C-\u3299]\uFE0F|[\u2122-\u2B55]|\u303D|[\u00A9|\u00AE]\u3030|\u00A9|\u00AE|\u3030/ig,
+	getConsultTypeName(type: number): string {
+		let name = "未知";
+		this.consultType.forEach(element => {
+			if (element.type == type) {
+				name = element.name;
+			}
+		});
+		return name;
+	},
+	getStatusName(state: number): string {
+		let name = "未知";
+		this.consultStatus.forEach(element => {
+			if (element.status == state) {
+				name = element.name;
+			}
+		});
+		return name;
+	},
+};

+ 93 - 0
pagesNetHos/st1/static/js/getState.ts

@@ -0,0 +1,93 @@
+/**
+ * 获取订单状态
+ */
+export const getOrderPayStateName = function (
+	IsOnlinePay: string | number,
+	PayState: string | number,
+	BizState: string | number,
+	OverState: string | number
+): string {
+	var state_1 = "异常订单";
+	var state_2 = "已完成";
+	var state_3 = "已取消";
+	var state_4 = "未支付";
+	var state_5 = "已支付";
+	var state_6 = "支付完成(待处理)";
+	var state_7 = "支付中";
+	var state_8 = "退费中";
+	var state_9 = "已退费";
+	var state_10 = "已取消";
+	var state_11 = "已撤销";
+	var state_other = "其它";
+
+	//是否线上支付
+	if (IsOnlinePay == 2) {
+		//不是订单模式的 然后又没有订单的 这种如果存在者返回:其它
+		//一般是不存在这种业务
+		if (BizState == 0) return state_1;
+		//订单业务已完成
+		if (BizState == 1) return state_2;
+		//订单业务已完成
+		if (BizState == 2) return state_3;
+	} else if (IsOnlinePay == 1) {
+		//待支付 业务未执行 未取消  未撤销
+		if (PayState == 0 && BizState == 0 && OverState == 0) return state_4;
+		//已支付 业务已经执行完成 未取消  未撤销
+		if (PayState == 2 && BizState == 1 && OverState == 0) return state_5;
+		//支付中
+		if (PayState == 1) return state_7;
+		//退费中
+		if (PayState == 3) return state_8;
+		//已退费
+		if (PayState == 4) return state_9;
+		//未支付 取消
+		if (PayState == 0 && OverState == 5) return state_10;
+		//未支付 已撤销
+		if (PayState == 0 && OverState == 6) return state_11;
+		//退费中
+		if (PayState == 2) return state_5;
+	}
+	return state_other;
+};
+
+/**
+ * 前端订单状态的显示 文本
+ * @param serviceId 业务类型:
+ * @param isOnlinePay 是否在线支付:2 否 1是
+ * @param payState 支付状态
+ * @param bizState 业务执行状态
+ * @param overState 订单最终状态 5 已取消 6 已撤销
+ *
+ * @author daiyanshui
+ */
+export const getOrderStateName = function (
+	ServiceId: string,
+	IsOnlinePay: string | number,
+	PayState: string | number,
+	BizState: string | number,
+	OverState: string | number
+): string {
+	var stateName = getOrderPayStateName(IsOnlinePay, PayState, BizState, OverState);
+	//预约挂号业务 并且有在线支付的订单
+	if ((ServiceId == '0' || ServiceId == '009') && (IsOnlinePay == 1)) {
+		if (PayState == 3 || PayState == 4) {
+			//退费中/退费完成   BizState 0:未执行业务  1:订单业务完成  2:订单业务取消
+			if (BizState == 0) return stateName + "已取消";
+			if (BizState == 1) return stateName + "正在退号";
+			if (BizState == 2) return stateName + "已退号";
+		} else if (PayState == 0) {
+			//待支付
+			if (BizState == 0) return stateName;
+		} else if (PayState == 1 || PayState == 2) {
+			if (BizState == 0) return stateName + "挂号中";
+			if (BizState == 1) return stateName + "已挂号";
+			if (BizState == 2) return stateName + "已退号";
+		}
+		//无线上支付 挂号订单
+	} else if ((ServiceId == '0' || ServiceId == '009') && IsOnlinePay == 2) {
+		if (BizState == 0) return "已锁号";
+		if (BizState == 1) return "已挂号";
+		if (BizState == 2) return "已退号";
+	}
+	return stateName;
+};

+ 99 - 0
pagesNetHos/st1/static/js/imgCompress.ts

@@ -0,0 +1,99 @@
+/**
+ *
+ *
+ *      图片压缩
+ *
+ *
+ */
+
+/**
+ * 给的文件资源是否小于LimitSize (M), 小于走lessCallBack, 大于走moreCallBack
+ */
+export function imageSizeIsLessLimitSize(
+	imagePath: string,
+	limitSize: number,
+	lessCallBack: () => void,
+	moreCallBack: () => void
+): void {
+	uni.getFileInfo({
+		filePath: imagePath,
+		success(res) {
+			console.log("压缩前图片大小:", res.size / 1024, 'kb');
+			if (res.size > 1024 * 1024 * limitSize) {
+				moreCallBack();
+			} else {
+				lessCallBack();
+			}
+		}
+	});
+}
+
+// 主调用方法
+
+/**
+ * 获取小于限制大小的Image, limitSize默认为1M,递归调用。
+ */
+export function getLessLimitSizeImage(
+	canvasId: string,
+	imagePath: string,
+	limitSize: number = 1,
+	drawWidth: number,
+	callBack: (path: string) => void
+): void {
+	imageSizeIsLessLimitSize(imagePath, limitSize,
+		() => {
+			callBack(imagePath);
+		},
+		() => {
+			uni.getImageInfo({
+				src: imagePath,
+				success: function (imageInfo) {
+					var maxSide = Math.max(imageInfo.width, imageInfo.height);
+					//画板的宽高默认是windowWidth
+					var windowW = drawWidth;
+					var scale = 1;
+					if (maxSide > windowW) {
+						scale = windowW / maxSide;
+					}
+					var imageW = Math.floor(imageInfo.width * scale);
+					var imageH = Math.floor(imageInfo.height * scale);
+					console.log('调用压缩', imageW, imageH);
+					getCanvasImage(canvasId, imagePath, imageW, imageH,
+						(pressImgPath: string) => {
+							getLessLimitSizeImage(canvasId, pressImgPath, limitSize, drawWidth * 0.7, callBack);
+						}
+					);
+				}
+			});
+		}
+	);
+}
+
+/**
+ * 获取画布图片
+ */
+function getCanvasImage(
+	canvasId: string,
+	imagePath: string,
+	imageW: number,
+	imageH: number,
+	getImgsuccess: (path: string) => void
+): void {
+	// TODO: UniApp 中 canvas 的使用方式与微信小程序不同,需要根据实际情况调整
+	// const ctx = uni.createCanvasContext(canvasId);
+	// ctx.drawImage(imagePath, 0, 0, imageW, imageH);
+	// ctx.draw(false, () => {
+	//   uni.canvasToTempFilePath({
+	//     canvasId: canvasId,
+	//     x: 0,
+	//     y: 0,
+	//     width: imageW,
+	//     height: imageH,
+	//     quality: 1,
+	//     success(res) {
+	//       getImgsuccess(res.tempFilePath);
+	//     }
+	//   });
+	// });
+	console.warn('getCanvasImage 需要根据 UniApp 的 canvas API 进行调整');
+}

+ 89 - 0
pagesNetHos/st1/static/js/netHosCommon.ts

@@ -0,0 +1,89 @@
+/**
+ * 常用公共函数封装
+ */
+
+/**
+ * 深拷贝
+ */
+export const deepCopy = function (obj: any, c?: any): any {
+	if (!c) {
+		c = obj.constructor === Array ? [] : {};
+	}
+	for (var i in obj) {
+		if (typeof obj[i] === 'object' && obj[i]) {
+			c[i] = obj[i].constructor === Array ? [] : {};
+			deepCopy(obj[i], c[i]);
+		} else {
+			c[i] = obj[i];
+		}
+	}
+	return c;
+};
+
+/**
+ * 如果c有obj的key,将obj的值 拷贝给c
+ */
+export const copy = function (obj: any, c: any): any {
+	for (var i in obj) {
+		if (Object.keys(c).includes(i)) {
+			if (typeof obj[i] === 'object' && obj[i]) {
+				c[i] = obj[i].constructor === Array ? [] : {};
+				deepCopy(obj[i], c[i]);
+			} else {
+				c[i] = obj[i];
+			}
+		}
+	}
+	return c;
+};
+
+/**
+ * 获取订单失效时间
+ * 传入endDate
+ */
+export const getexpirationTime = function (endDate: string): string {
+	/**ios下转换时间 */
+	endDate = endDate.replace(/\-/g, "/");
+	let seconds = Math.floor((new Date(endDate).getTime() - Date.now()) / 1000);
+	if (seconds > 0) {
+		let hour: number;
+		let min: number;
+		let sec: number;
+		min = Math.floor(seconds / 60); //分钟
+		sec = seconds % 60; //秒
+		hour = Math.floor(min / 60);
+		min = min % 60;
+		let hourStr = formatNumber(hour);
+		let minStr = formatNumber(min);
+		let secStr = formatNumber(sec);
+		return `${hourStr}:${minStr}:${secStr}`;
+	} else {
+		return "00:00:00";
+	}
+};
+
+/**
+ * 日期补足两位
+ */
+export const formatNumber = function (n: number | string): string {
+	n = n.toString();
+	return n[1] ? n : '0' + n;
+};
+
+/**
+ * 脱敏 num1 前面位数 num2后面位数
+ */
+export const desensitization = function (str: string, num1: number = 1, num2: number = 1): string {
+	num1 = Number(num1);
+	num2 = Number(num2);
+	if (str.length <= (num1 + num2)) {
+		return str;
+	}
+	let num = str.length - num1 - num2;
+	let strDes = '';
+	let strDesArr = new Array(num);
+	for (let i of strDesArr) {
+		strDes += "*";
+	}
+	return str.substring(0, num1) + strDes + str.substring(num1 + strDesArr.length);
+};

+ 363 - 0
pagesNetHos/st1/static/js/pagesNetHosFn.ts

@@ -0,0 +1,363 @@
+import { common } from '@/uni-app-base/utils';
+import icon from '@/utils/icon';
+// TODO: 需要创建 pagesNetHos 相关的 API 服务
+// import { cancelConsultWater } from '@/pagesNetHos/service/doctor';
+// import { HisYyWaterList_V2, regSign } from '@/pagesNetHos/service/enquire';
+// import { GetSysConfigEntity, orderCancel, orderListLocal } from '@/pagesNetHos/service/record';
+import { getOrderStateName } from './getState';
+import { strChineseFirstPY } from './code';
+
+/**
+ * 页面公用逻辑函数
+ */
+const app = getApp();
+
+/**
+ * 获取首字母
+ */
+export const getFirst = function (str: string): string {
+	if (typeof (str) != "string") {
+		return '';
+	}
+	var word = str.charAt(0);
+	return checkUnicode(word);
+};
+
+/**
+ * 转换字符
+ */
+export const checkUnicode = function (word: string): string {
+	var code = word.charCodeAt(0);
+	if (code > 40869 || 40869 < 19968) {
+		return '';
+	}
+	return strChineseFirstPY.charAt(code - 19968);
+};
+
+/**
+ * 处理医生返回值
+ */
+export const doctorListHandle = function (list: any[]): any[] {
+	if (common.isEmpty(list)) {
+		return list;
+	}
+	for (let i of list) {
+		if (i.DoctorPhotourl) {
+			if (i.DoctorPhotourl.indexOf("http") == -1) {
+				// TODO: 需要获取 API 根路径
+				// i.DoctorPhotourl = api.ApiRootUrl + i.DoctorPhotourl.replace(/\\/g, "/");
+			}
+		} else {
+			i.DoctorPhotourl = icon.equire_doctor;
+		}
+		// 计算价格
+		i.phoneFeeDiy = i.PhoneFee ? common.centToYuan(i.PhoneFee).toFixed(2) : 0;
+		i.videoFeeDiy = i.VideoFee ? common.centToYuan(i.VideoFee).toFixed(2) : 0;
+		i.consultFeeDiy = i.ConsultFee ? common.centToYuan(i.ConsultFee).toFixed(2) : 0;
+
+		let AvgAppraiseScore = '-';
+		// 用于做排序判断
+		let AvgAppraiseScoreTag = 0;
+		if (i.AppraiseCount > 0 && i.AppraiseScore > 0) {
+			AvgAppraiseScore = (i.AppraiseScore / i.AppraiseCount / 5 * 100).toFixed(0) + "%";
+			AvgAppraiseScoreTag = Number((i.AppraiseScore / i.AppraiseCount / 5 * 100).toFixed(0));
+		}
+		i.AvgAppraiseScore = AvgAppraiseScore;
+		i.AvgAppraiseScoreTag = AvgAppraiseScoreTag;
+
+		// 计算好评率
+		if (true) {
+			// TODO: 需要从 app.globalData.config 获取配置
+			const config = (app.globalData as any).config;
+			if (config?.net_pageConfiguration_patient?.currency_config) {
+				let highCount = config.net_pageConfiguration_patient.currency_config.iniHighAppraiseCount + (i.HighAppraiseCountCons || 0);
+				let totalCount = config.net_pageConfiguration_patient.currency_config.iniHighAppraiseCount + (i.AppraiseCount !== undefined ? i.AppraiseCount : i.AppraiseCountCons || 0);
+				let percentage = (highCount / totalCount) * 100;
+				if (Number.isNaN(percentage)) {
+					i.percentage = '100%';
+				} else {
+					i.percentage = Math.ceil(percentage) + "%";
+				}
+			}
+		}
+		i.scoreDiy = "5.0";
+		if ((i.AppraiseCount !== undefined ? i.AppraiseCount : i.AppraiseCountCons) && (i.AppraiseScore !== undefined ? i.AppraiseScore : i.AppraiseScoreCons)) {
+			// 评分
+			i.scoreDiy = Math.ceil((i.AppraiseScore !== undefined ? i.AppraiseScore : i.AppraiseScoreCons) / (i.AppraiseCount !== undefined ? i.AppraiseCount : i.AppraiseCountCons)).toFixed(1);
+		}
+		if (i.AppraiseRule) {
+			try {
+				i.AppraiseRule = JSON.parse(i.AppraiseRule);
+			} catch (err) {
+				console.log('i.AppraiseRule格式化失败');
+			}
+		}
+		try {
+			i.DoctorName = i.DoctorName.split('-')[0];
+		} catch (err) { }
+	}
+	return list;
+};
+
+/**
+ * 咨询记录返回值处理
+ */
+export const consultListHandle = function (list: any[]): any[] {
+	let arr = [
+		{ status: 0, name: "未支付", isShow: 0 },
+		{ status: 1, name: "待接单", isShow: 0 },
+		{ status: 2, name: "进行中", isShow: 0 },
+		{ status: 3, name: "已结束", isShow: 0 },
+		{ status: 4, name: "超时未支付", isShow: 0 },
+		{ status: 5, name: "已评价", isShow: 0 },
+		{ status: 6, name: "仲裁中", isShow: 0 },
+		{ status: 7, name: "仲裁被驳回", isShow: 0 },
+		{ status: 8, name: "仲裁成功", isShow: 0 },
+		{ status: 9, name: "超时未接单", isShow: 0 },
+		{ status: 10, name: "已退费", isShow: 0 },
+		{ status: 11, name: "接单驳回", isShow: 0 },
+		{ status: 12, name: "视频未接通", isShow: 0 },
+		{ status: 13, name: "视频已中断", isShow: 0 },
+		{ status: 14, name: "已终结", isShow: 0 },
+		{ status: 15, name: "医生团队待接单", isShow: 0 },
+		{ status: 16, name: "待签到", isShow: 0 },
+		{ status: 17, name: "已取消", isShow: 0 },
+		{ status: 18, name: "超时未签到", isShow: 0 }
+	];
+	for (let item of list) {
+		item.FirstMsgContent = item.FirstMsgContent ? JSON.parse(item.FirstMsgContent) : [];
+		item.MedicalInfo = item.MedicalInfo ? JSON.parse(item.MedicalInfo) : {};
+		item.Yuan = common.centToYuan(item.ConsultFee);
+
+		let firstMsgContentDiy: any = {};
+		for (let msgItem of item.FirstMsgContent) {
+			firstMsgContentDiy[msgItem.key] = msgItem.value;
+		}
+		item.firstMsgContentDiy = firstMsgContentDiy;
+		if (item.DoctorPhotourl) {
+			if (item.DoctorPhotourl.indexOf("http") == -1) {
+				// TODO: 需要获取 API 根路径
+				// item.DoctorPhotourl = api.ApiRootUrl + item.DoctorPhotourl.replace(/\\/g, "/");
+			}
+		} else {
+			item.DoctorPhotourl = icon.equire_doctor;
+		}
+
+		if (item.ConsultType == 1) {
+			item.consultNameDiy = '图文咨询';
+		} else if (item.ConsultType == 2) {
+			item.consultNameDiy = '视频咨询';
+		} else if (item.ConsultType == 3) {
+			item.consultNameDiy = '电话咨询';
+		}
+		item.consultFeeDiy = item.ConsultFee ? common.centToYuan(item.ConsultFee).toFixed(2) : 0;
+		for (let i of arr) {
+			if (i.status == item.Status) {
+				item.statusDiy = i.name;
+				break;
+			}
+		}
+	}
+	return list;
+};
+
+/**
+ * 取消咨询订单
+ */
+export const cancelConsultOrder = async function (data: any, callBack?: () => void, type?: string): Promise<void> {
+	console.log(data, 'data');
+	let tip = '您正在进行退号操作,为了避免误操作带来的不必要损失,系统需要您再次确认,谢谢!';
+	if (type == 'qxzx') {
+		tip = '您正在进行取消操作,为了避免误操作带来的不必要损失,系统需要您再次确认,谢谢!';
+	}
+	common.showModal(tip, async () => {
+		// TODO: 需要实现 API 调用
+		// const { resData } = await cancelConsultWater(data);
+		// if (resData.RespCode == '10000') {
+		//   if (callBack instanceof Function) {
+		//     callBack();
+		//   }
+		// }
+	}, {
+		cancelText: "取消"
+	});
+};
+
+/**
+ * 签到
+ */
+export const signOrCancel = async function (e: any, context?: any): Promise<void> {
+	// 列表为item 详情为orderInfo
+	let item = e.currentTarget?.dataset?.item || (context?.data?.orderInfo) || (context?.data?.conItem);
+	let { currentUser } = app.globalData as any;
+	let waterData = {
+		OrderId: item.YyWaterId,
+		MemberId: item.MemberId,
+		sourceType: '006',
+		cardEncryptionStore: currentUser?.encryptionStore || '',
+		memberEncryptionStore: currentUser?.baseMemberEncryptionStore || '',
+		hosId: (app.globalData as any).hosId
+	};
+	// TODO: 需要实现 API 调用
+	// const { resp: waterResp } = await HisYyWaterList_V2(waterData, { showLoading: false });
+	// if (!common.isEmpty(waterResp)) {
+	//   let data = {
+	//     HosId: (app.globalData as any).hosId,
+	//     OrderId: item.YyWaterId || waterResp[0].orderId,
+	//     MemberId: waterResp[0].MemberId || item.MemberId,
+	//     CardNo: waterResp[0].CardNo || waterResp[0].cardNo,
+	//     CardType: waterResp[0].CType || waterResp[0].cardType || "1",
+	//     HisOrderId: waterResp[0].HisOrderId || waterResp[0].hisOrderId,
+	//     SourceType: waterResp[0].sourceType || "006",
+	//     ChannelId: (app.globalData as any).channelId,
+	//     DeptCode: waterResp[0].DeptCode || waterResp[0].deptCode,
+	//     DoctorCode: waterResp[0].DoctorCode || waterResp[0].doctorCode,
+	//     DeptName: waterResp[0].DeptName || waterResp[0].deptName,
+	//     RegisterDate: waterResp[0].Registerdate || common.getDate(),
+	//     QueueNo: item.sqNo || waterResp[0].sqNo,
+	//     Store: {
+	//       cardEncryptionStore: currentUser?.encryptionStore || '',
+	//       baseMemberEncryptionStore: currentUser?.baseMemberEncryptionStore || ''
+	//     }
+	//   };
+	//   const { resp, resData } = await regSign(data, { showLoading: false });
+	//   if (!common.isEmpty(resp)) {
+	//     (app as any).connectWebsocket(true);
+	//     common.goToUrl(`/pagesNetHos/st1/business/doctor/waiting/waiting`);
+	//   } else {
+	//     common.showToast(resData.RespMessage);
+	//   }
+	// }
+};
+
+/**
+ * 查询配置
+ */
+export const getSysConfigEntity = function (): Promise<any> {
+	let data = { ParamKey: "PRESC_CONFIG_KEY" };
+	return new Promise(async resolve => {
+		// TODO: 需要实现 API 调用
+		// const { resData } = await GetSysConfigEntity(data);
+		// if (resData.RespCode == '10000') {
+		//   if (common.isNotEmpty(resData.Data)) {
+		//     resData.Data[0].ParamValue = JSON.parse(resData.Data[0].ParamValue);
+		//   }
+		//   resolve(resData.Data[0].ParamValue);
+		// } else {
+		//   common.showToast(resData.RespMessage);
+		//   resolve(undefined);
+		// }
+		resolve(undefined);
+	});
+};
+
+/**
+ * 取消订单
+ */
+export const cancelOrder = function (item: any, callback?: () => void): void {
+	/**取消订单 */
+	common.showModal('是否确定取消该订单?', async () => {
+		let orderCancelData = {
+			OperatorName: item.OperatorName,
+			OperatorId: item.OperatorId,
+			OrderId: item.OrderId
+		};
+		// TODO: 需要实现 API 调用
+		// const { resData } = await orderCancel(orderCancelData, item.ServiceId);
+		// if (resData.RespCode === '10000') {
+		//   /**取消成功 */
+		//   common.showModal('订单已取消', callback, {
+		//     confirmText: '好的'
+		//   });
+		// } else {
+		//   common.showToast(resData.RespMessage);
+		// }
+	}, {
+		cancelText: '取消',
+		confirmText: '确定'
+	});
+};
+
+/**
+ * 获取订单列表
+ * serviceId
+ * pIndex 默认查询第0页
+ */
+export const orderListLocal = async function (queryData: any): Promise<{ list: any[]; showNoData: boolean }> {
+	// TODO: 需要实现 API 调用
+	// const { resp: listResp } = await orderListLocal(queryData);
+	let listResp: any[] = [];
+	let showNoData = true;
+	let list: any[] = [];
+	if (!common.isEmpty(listResp)) {
+		listResp.map(item => {
+			item.StateTxt = getOrderStateName(item.ServiceId, item.IsOnlinePay, item.PayState, item.BizState, item.OverState);
+			if (!common.isEmpty(item.OrderMemo)) {
+				item.OrderMemo = JSON.parse(item.OrderMemo);
+				item.OrderMemo.formatWeek = common.dateFormat(new Date(item.OrderMemo.RegDate)).week;
+			}
+		});
+	}
+	// 预约记录过滤已锁号
+	listResp = listResp.filter(item => item && item.StateTxt != '已锁号');
+	if (!common.isEmpty(listResp)) {
+		list = listResp;
+		showNoData = false;
+	}
+	return {
+		list,
+		showNoData
+	};
+};
+
+/**
+ * 判断是否有待支付订单
+ */
+export const hasOrderToBePaid = async function (serviceId: string, memberId?: string): Promise<boolean> {
+	let queryData = {
+		BeginDate: common.dateFormat(new Date(Date.now() - (30 * 24 * 60 * 60 * 1000))).formatYear, //开始时间
+		EndDate: common.dateFormat(new Date(Date.now() + (24 * 60 * 60 * 1000))).formatYear, //结束时间加一天
+		MemberId: memberId || ((app.globalData as any).currentUser && (app.globalData as any).currentUser.MemberId),
+		BizState: '0',
+		OverState: '0',
+		PayState: '0',
+		ServiceId: serviceId,
+		OpenId: uni.getStorageSync('openid'),
+		CardNo: '',
+		CardType: '',
+		Page: {
+			PIndex: 0,
+			PSize: 10
+		}
+	};
+	// TODO: 需要实现 API 调用
+	// const { resp: listResp } = await orderListLocal(queryData);
+	let listResp: any[] = [];
+	listResp = listResp.filter(item => item.IsOnlinePay == '1');
+	if (!common.isEmpty(listResp)) {
+		/**默认跳转预约挂号  预约挂号查询时传入0和009  与case判断不符  默认为预约记录路径*/
+		let url = `/pagesNetHos/st1/business/record/appointmentRecord/appointmentRecord`;
+		switch (serviceId) {
+			/**门诊住院充值 */
+			case '006':
+			case '007':
+				url = `/pagesNetHos/st1/business/record/topUpRecord/topUpRecord?serviceId=${serviceId}`;
+				break;
+			/**门诊结算 */
+			case '011':
+			case '008':
+			/**图文,视频咨询 */
+			case '019,024':
+			case '040':
+				url = `/pagesNetHos/st1/business/record/paymentRecord/paymentRecord`;
+				break;
+		}
+		common.showModal(`您当前存在待支付订单,请前往订单管理中进行处理,谢谢您的合作!`, () => {
+			common.goToUrl(url);
+		}, {
+			cancelText: '取消'
+		});
+		return true;
+	}
+	return false;
+};

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
pagesNetHos/st1/static/js/trtc-wx.js


Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio