1. 诊所管理

This commit is contained in:
李琦
2026-06-18 10:52:42 +08:00
parent 73d535378e
commit 66a2243042
8 changed files with 558 additions and 472 deletions

View File

@@ -1,8 +1,11 @@
<template>
<business-page-layout title="商品订单" :show-back="true">
<view class="order-list-container">
<!-- 顶部筛选 -->
<page-sticky-header>
<!-- 终极修复弃用会导致冲突的 page-sticky-header -->
<!-- 改用原生 native-sticky-header绑定动态计算的导航栏高度精准吸附在 u-navbar 下方 -->
<view class="native-sticky-header" :style="{ top: navTopOffset + 'px' }">
<view class="header-solid-bg">
<view class="quick-filter">
<view class="filter-row date-row">
<picker mode="date" :value="dateStart" @change="onStart">
@@ -12,9 +15,10 @@
<picker mode="date" :value="dateEnd" @change="onEnd">
<view class="filter-picker date-picker">{{ dateEnd || '结束日期' }}</view>
</picker>
<view class="btn-query" @click="reload">查询</view>
</view>
<view class="filter-query-btn" @click="reload">查询</view>
</view>
<collapsible-filter-panel title="订单筛选" @clear="resetFilter">
<view class="filter-row">
<text class="filter-label">订单号</text>
@@ -39,7 +43,8 @@
</picker>
</view>
</collapsible-filter-panel>
</page-sticky-header>
</view>
</view>
<!-- 统计卡片区 -->
<scroll-view v-if="statItems.length" class="stats-scroll" scroll-x>
@@ -61,63 +66,62 @@
:hover-stay-time="150"
@click="goDetail(item)"
>
<!-- 顶部单号与状态 -->
<view class="card-head">
<view class="order-id">
<text class="id-icon"></text>
<text class="id-text">{{ rowDisplay(item).orderNo }}</text>
<!-- 顶部业务归属与状态 -->
<view class="card-header">
<view class="header-left">
<!-- 诊所信息提权放在最醒目的左上角 -->
<view class="clinic-tag" v-if="rowDisplay(item).storeName !== '-'">
<text class="clinic-name">{{ rowDisplay(item).storeName }}</text>
</view>
<view
class="status-badge"
:class="['status-' + (rowDisplay(item).status || 'default')]"
>
<view class="order-no-wrap">
<text class="lbl">单号</text>
<text class="val">{{ rowDisplay(item).orderNo }}</text>
</view>
</view>
<view class="status-text" :class="['status-' + (rowDisplay(item).status || 'default')]">
{{ rowDisplay(item).statusText }}
</view>
</view>
<!-- 核心商品与收件信息无边框内联排版节省大量高度 -->
<view class="card-body">
<!-- 核心视觉区商品与金额 -->
<view class="main-info">
<view class="title-wrap">
<text class="goods-title">{{ rowDisplay(item).productSummary || '药品订单' }}</text>
<view class="goods-tags">
<!-- 药品名称与标签同行排版 -->
<view class="product-row">
<text class="product-name">{{ rowDisplay(item).productSummary || '药品订单' }}</text>
</view>
<view class="tags-row">
<text class="modern-tag tag-type">{{ rowDisplay(item).prescriptionTypeText }}</text>
<text class="modern-tag tag-delivery">{{ rowDisplay(item).deliveryText }}</text>
</view>
<!-- 去掉臃肿的灰色岛采用精致的文本网格 -->
<view class="info-grid">
<view class="info-item" v-if="rowDisplay(item).userNickname !== '-'">
<text class="info-lbl">就诊人</text>
<text class="info-val">{{ rowDisplay(item).userNickname }}</text>
</view>
<view class="price-wrap">
<view class="info-item">
<text class="info-lbl">收件人</text>
<text class="info-val">
{{ rowDisplay(item).receiverName }}
<text class="info-sub" v-if="rowDisplay(item).receiverMobile">{{ rowDisplay(item).receiverMobile }}</text>
</text>
</view>
</view>
</view>
<!-- 底部时间价格与操作水平对齐 -->
<view class="card-footer">
<text class="time">{{ rowDisplay(item).createdAt }}</text>
<view class="footer-actions">
<view class="price-block">
<text class="price-lbl">实付</text>
<text class="currency">¥</text>
<text class="amount">{{ rowDisplay(item).totalPayPrice.replace('¥', '').trim() }}</text>
</view>
</view>
<!-- 信息岛 (Info Island)聚合次要信息的高级灰底区块 -->
<view class="info-island">
<view class="island-row" v-if="rowDisplay(item).userNickname !== '-'">
<text class="island-label">就诊人</text>
<text class="island-value">{{ rowDisplay(item).userNickname }}</text>
</view>
<view class="island-row">
<text class="island-label">收件人</text>
<text class="island-value">
{{ rowDisplay(item).receiverName }}
<text class="muted" v-if="rowDisplay(item).receiverMobile"> · {{ rowDisplay(item).receiverMobile }}</text>
</text>
</view>
<view class="island-row" v-if="rowDisplay(item).storeName !== '-'">
<text class="island-label">开方诊所</text>
<text class="island-value">{{ rowDisplay(item).storeName }}</text>
</view>
</view>
</view>
<!-- 底部时间与操作按键 -->
<view class="card-foot">
<text class="time">{{ rowDisplay(item).createdAt }}</text>
<view class="actions">
<view
v-if="rowDisplay(item).canViewPrescription"
class="btn-ghost"
class="btn-outline"
@click.stop="openPrescription(rowDisplay(item).pId)"
>
查看处方
@@ -137,8 +141,8 @@
</template>
<script>
// 这里已经移除了引入产生冲突的 PageStickyHeader以保证代码的纯净性
import BusinessPageLayout from '@/subPackages/sub_business_shared/components/business-page-layout.vue'
import PageStickyHeader from '@/subPackages/sub_business_shared/components/PageStickyHeader.vue'
import CollapsibleFilterPanel from '@/subPackages/sub_business_shared/components/CollapsibleFilterPanel.vue'
import PrescriptionDetailPopup from './components/PrescriptionDetailPopup.vue'
import { withWxKey } from '@/utils/wxListKey.js'
@@ -172,7 +176,7 @@ const PRESCRIPTION_TYPE_OPTIONS = [
export default {
mixins: [businessMixin],
components: { BusinessPageLayout, PageStickyHeader, CollapsibleFilterPanel, PrescriptionDetailPopup },
components: { BusinessPageLayout, CollapsibleFilterPanel, PrescriptionDetailPopup },
data() {
return {
list: [],
@@ -186,6 +190,7 @@ export default {
dateStart: '',
dateEnd: '',
statItems: [],
navTopOffset: 0, // 新增:用于存放导航栏计算后的确切高度
}
},
computed: {
@@ -199,6 +204,14 @@ export default {
return PRESCRIPTION_TYPE_OPTIONS.map(o => o.label)
},
},
created() {
// 动态计算顶部 u-navbar 的总高度 (状态栏 + navbar 固定 44px 高度)
// 这一步与 business-page-layout 内的计算逻辑保持完全一致,保证完美对接
const sys = uni.getSystemInfoSync()
const statusBarHeight = this.$statusBarHeight || sys.statusBarHeight || 0
const navbarHeight = this.$navbarHeight || 44
this.navTopOffset = statusBarHeight + navbarHeight
},
onLoad() {
this.applyOrderFilter(loadOrderFilter())
this.bizApi.getOrderStatusOption().then(w => {
@@ -330,10 +343,11 @@ export default {
<style lang="scss" scoped>
$theme-primary: #6acdbb;
$color-bg-base: #F2F4F7; /* Apple 风格的冷调高级灰底色 */
$color-bg-base: #F2F4F7;
$color-text-main: #1D2129;
$color-text-body: #4E5969;
$color-text-muted: #86909C;
$color-border: #E5E6EB;
.order-list-container {
background-color: $color-bg-base;
@@ -341,271 +355,253 @@ $color-text-muted: #86909C;
padding-bottom: 60rpx;
}
/* 筛选区 */
/* ================= 核心:完美吸顶方案 ================= */
/* 原生 sticky 结合 Vue 计算出的精确导航栏高度(top),严丝合缝拦截在导航栏正下方 */
.native-sticky-header {
position: -webkit-sticky;
position: sticky;
z-index: 100; /* 高层级,保证滑动时覆盖在下方的卡片上 */
background-color: $color-bg-base; /* 必须有底色用于防穿透遮挡 */
}
.header-solid-bg {
/* 使用 padding 将内容向内挤,防止滑动过程的透明间隙穿透问题 */
padding: 16rpx 24rpx 16rpx;
}
/* 筛选项 UI 美化 */
.quick-filter {
background: #fff;
padding: 24rpx;
margin-bottom: 16rpx;
border-radius: 16rpx;
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.06);
padding: 16rpx 20rpx;
border-radius: 20rpx;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.04);
}
.filter-row {
display: flex;
align-items: center;
gap: 16rpx;
margin-bottom: 24rpx;
&:last-child { margin-bottom: 0; }
}
.date-row {
margin-bottom: 0;
justify-content: space-between;
}
.filter-label {
font-size: 28rpx;
color: $color-text-body;
min-width: 140rpx;
min-width: 130rpx;
}
.filter-input, .filter-picker {
flex: 1;
font-size: 28rpx;
padding: 16rpx 20rpx;
font-size: 26rpx;
padding: 14rpx 20rpx;
background: #F7F8FA;
border-radius: 12rpx;
color: $color-text-main;
}
.date-row { flex-wrap: nowrap; }
.date-picker { text-align: center; }
.sep { color: $color-text-muted; margin: 0 8rpx; font-size: 24rpx; }
.filter-query-btn {
text-align: center;
padding: 24rpx;
.sep { color: $color-text-muted; font-size: 24rpx; }
/* 重新设计的紧凑型查询按钮 */
.btn-query {
flex-shrink: 0;
background: $theme-primary;
color: #fff;
border-radius: 16rpx;
font-size: 30rpx;
font-weight: 600;
margin-top: 32rpx;
box-shadow: 0 8rpx 24rpx rgba(106, 205, 187, 0.2);
padding: 0 32rpx;
height: 60rpx;
line-height: 60rpx;
border-radius: 30rpx; /* 胶囊圆角 */
font-size: 26rpx;
font-weight: 500;
box-shadow: 0 4rpx 12rpx rgba(106, 205, 187, 0.3);
transition: opacity 0.2s;
&:active { opacity: 0.8; }
}
/* 统计卡片 */
.stats-scroll {
margin-bottom: 20rpx;
white-space: nowrap;
}
.stats {
display: inline-flex;
gap: 20rpx;
padding: 16rpx 32rpx;
}
.stats-scroll { margin-bottom: 16rpx; white-space: nowrap; }
.stats { display: inline-flex; gap: 20rpx; padding: 0 24rpx; }
.stat-card {
display: inline-block;
width: 320rpx;
width: 300rpx;
background: #fff;
padding: 32rpx;
border-radius: 24rpx;
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.02);
vertical-align: top;
white-space: normal;
}
.stat-label {
display: block;
font-size: 26rpx;
color: $color-text-muted;
}
.stat-value {
display: block;
font-size: 42rpx;
color: $color-text-main;
font-weight: 700;
margin-top: 12rpx;
padding: 24rpx;
border-radius: 20rpx;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.03);
}
.stat-label { display: block; font-size: 24rpx; color: $color-text-muted; }
.stat-value { display: block; font-size: 38rpx; color: $color-text-main; font-weight: 700; margin-top: 8rpx; }
/* ================= 核心高级卡片样式 ================= */
.card-list-wrap {
//padding: 0 24rpx;
padding: 0 24rpx;
}
.premium-card {
background: #ffffff;
border-radius: 32rpx; /* 超大圆角带来前沿视觉享受 */
border-radius: 24rpx;
margin-bottom: 24rpx;
padding: 32rpx;
border: 1rpx solid #E5E6EB;
box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.015); /* 极其克制的阴影 */
transition: all 0.2s ease;
padding: 28rpx;
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.02);
border: 1px solid rgba(229, 230, 235, 0.5);
}
.card-hover {
transform: scale(0.98);
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.01);
transform: scale(0.99);
background-color: #FAFAFA;
}
/* 卡片头部 */
.card-head {
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 28rpx;
align-items: flex-start;
margin-bottom: 20rpx;
}
.order-id {
.header-left {
display: flex;
flex-direction: column;
gap: 8rpx;
}
.clinic-tag {
display: inline-flex;
}
.clinic-name {
font-size: 24rpx;
color: $color-text-main;
background: #F2F3F5;
padding: 4rpx 16rpx;
border-radius: 8rpx;
font-weight: 500;
}
.order-no-wrap {
font-size: 24rpx;
display: flex;
align-items: center;
gap: 12rpx;
}
.order-no-wrap .lbl { color: $color-text-muted; }
.order-no-wrap .val { color: $color-text-body; font-family: monospace; letter-spacing: 0.5rpx;}
.id-icon {
font-size: 20rpx;
color: #fff;
background-color: #C9CDD4;
padding: 4rpx 12rpx;
border-radius: 6rpx;
font-weight: 600;
}
.id-text {
font-size: 26rpx;
color: $color-text-muted;
font-family: SF Pro Text, monospace, sans-serif;
letter-spacing: 0.5rpx;
}
/* 状态标签配色优化 */
.status-badge {
.status-text {
font-size: 26rpx;
font-weight: 600;
color: $theme-primary;
margin-top: 4rpx;
}
/* 可根据实际的状态值(status)配置置灰 */
.status-done { color: $color-text-muted; font-weight: 400; }
.status-cancel { color: #F53F3F; }
/* 核心内容区 */
/* 卡片主体 */
.card-body {
margin-bottom: 24rpx;
}
.main-info {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 24rpx;
gap: 20rpx;
.product-row {
margin-bottom: 12rpx;
}
.title-wrap {
flex: 1;
}
.goods-title {
font-size: 32rpx;
.product-name {
font-size: 30rpx; /* 适中的药品名称 */
font-weight: 600;
color: $color-text-main;
line-height: 1.4;
margin-bottom: 16rpx;
/* 多行截断 */
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.goods-tags {
.tags-row {
display: flex;
flex-wrap: wrap;
gap: 12rpx;
margin-bottom: 20rpx;
}
.modern-tag {
font-size: 22rpx;
padding: 4rpx 14rpx;
border-radius: 8rpx;
padding: 4rpx 12rpx;
border-radius: 6rpx;
font-weight: 500;
}
.tag-type { background: #FFF3E8; color: #FF7D00; } /* 柔和爱马仕橙 */
.tag-delivery { background: #E8F3FF; color: #165DFF; } /* 科技蓝 */
.tag-type { background: #FFF3E8; color: #FF7D00; }
.tag-delivery { background: #E8F3FF; color: #165DFF; }
.price-wrap {
/* 雅致的信息网格排版 */
.info-grid {
display: flex;
align-items: baseline;
color: $color-text-main;
flex-direction: column;
gap: 8rpx;
background: transparent; /* 去除灰底 */
}
.currency {
font-size: 28rpx;
font-weight: 600;
margin-right: 4rpx;
}
.amount {
font-size: 44rpx;
font-weight: 700;
font-family: DIN Alternate, SF Pro Display, sans-serif;
}
/* 高级信息岛 (Inset Info Box) */
.info-island {
background-color: #F7F8FA;
border-radius: 16rpx;
padding: 24rpx;
}
.island-row {
.info-item {
display: flex;
font-size: 24rpx;
line-height: 1.6;
margin-bottom: 12rpx;
&:last-child {
margin-bottom: 0;
}
.island-label {
font-size: 26rpx;
line-height: 1.5;
}
.info-lbl {
color: $color-text-muted;
width: 110rpx;
flex-shrink: 0;
}
.island-value {
}
.info-val {
color: $color-text-body;
flex: 1;
word-break: break-all;
}
.muted {
}
.info-sub {
color: $color-text-muted;
}
margin-left: 12rpx;
font-size: 24rpx;
}
/* 卡片底部 */
.card-foot {
.card-footer {
display: flex;
justify-content: space-between;
align-items: center;
border-top: 1rpx solid #F2F3F5;
border-top: 1rpx dashed $color-border;
padding-top: 24rpx;
}
.time {
font-size: 24rpx;
color: $color-text-muted;
}
.footer-actions {
display: flex;
align-items: center;
gap: 24rpx;
}
.price-block {
display: flex;
align-items: baseline;
}
.price-lbl {
font-size: 22rpx;
color: $color-text-muted;
margin-right: 8rpx;
}
.currency {
font-size: 24rpx;
color: $color-text-main;
font-weight: 600;
}
.amount {
font-size: 36rpx;
font-weight: 700;
color: $color-text-main;
font-family: DIN Alternate, SF Pro Display, sans-serif;
}
.btn-ghost {
/* 美化的边框按钮 */
.btn-outline {
font-size: 26rpx;
color: $theme-primary;
background: rgba(106, 205, 187, 0.08);
padding: 10rpx 32rpx;
border: 1px solid $theme-primary;
padding: 8rpx 28rpx;
border-radius: 30rpx;
font-weight: 500;
transition: background-color 0.2s;
background: transparent;
transition: all 0.2s;
&:active {
background: rgba(106, 205, 187, 0.15);
background: rgba(106, 205, 187, 0.08);
}
}
.empty-state {
text-align: center;
color: $color-text-muted;
padding: 120rpx 0;
font-size: 28rpx;
}
.empty-state { text-align: center; color: $color-text-muted; padding: 120rpx 0; font-size: 28rpx; }
</style>

View File

@@ -1,15 +1,15 @@
<template>
<page-layout :is-platform="true" :title="title" :show-back="showBack" :show-tabbar="showTabbar" :tab-index="tabIndex">
<business-page-layout :title="title" :show-back="showBack" :show-tabbar="showTabbar" :tab-index="tabIndex">
<slot />
</page-layout>
</business-page-layout>
</template>
<script>
import PageLayout from '@/subPackages/sub_salesperson_manage/components/PageLayout.vue';
import BusinessPageLayout from '@/subPackages/sub_platform_admin/components/business-page-layout.vue';
export default {
name: 'StorePageLayout',
components: { PageLayout },
components: { BusinessPageLayout },
props: {
title: { type: String, default: '' },
showBack: { type: Boolean, default: true },

View File

@@ -139,7 +139,7 @@ export function createDefaultStoreInputForm() {
position: '',
province_id: null,
city_id: null,
clinic_type: 2,
clinic_type: 1,
type: 0,
is_shipping_free: 0,
subscribe_price_change: 0,

View File

@@ -12,6 +12,7 @@
:value="show"
mode="bottom"
border-radius="24"
:z-index="10090"
:safe-area-inset-bottom="true"
:mask-close-able="maskCloseable"
@input="onPopupInput"

View File

@@ -74,8 +74,6 @@ export default {
<style scoped>
.picker-wrap {
width: 100%;
position: relative;
z-index: 1;
}
.promoter-picker {
display: flex;

View File

@@ -6,9 +6,9 @@
<text :class="displayText ? 'region-text' : 'region-placeholder'">{{ displayText || placeholder }}</text>
<view class="drawer-body">
<u-icon name="arrow-right" color="#c0c4cc" size="28"></u-icon>
<u-input v-model="keyword" placeholder="搜索省/市/区" clearable />
</view>
@@ -21,7 +21,7 @@
<u-input v-model="keyword" placeholder="搜索省/市/区" clearable :adjust-position="false" />
</view>
<scroll-view scroll-y class="list-scroll">
<scroll-view scroll-x class="crumb-scroll">
<view class="crumbs">
@@ -69,6 +69,7 @@ export default {
</scroll-view>
</view>
</drawer-page-container>
</view>
@@ -93,9 +94,56 @@ export default {
getInitialPickerLevel,
levelOptionsToRows,
searchAddressHits,
searchHitsToRows,
applySearchHit,
rowHasNextLevel,
truncateContextToBreadcrumb,
getNextLevel,
canCompleteAfterSelect,
} from '@/subPackages/sub_clinic_salesperson/utils/address-index.js'
export default {
name: 'RegionAddressPicker',
components: { DrawerPageContainer },
props: {
value: { type: Array, default: () => [] },
placeholder: { type: String, default: '请选择省市区' },
},
data() {
return {
show: false,
keyword: '',
currentLevel: 'province',
ctx: { provinceId: undefined, cityId: undefined, districtId: undefined },
keyboardHeight: 0,
}
},
computed: {
@@ -175,14 +223,14 @@ export default {
minHeight: '240rpx',
}
.drawer-body { display: flex; flex-direction: column; max-height: 70vh; }
},
},
watch: {
.list-scroll { flex: 1; max-height: 52vh; }
show(val) {
if (val) {

View File

@@ -35,19 +35,40 @@
/>
</u-form-item>
<u-form-item label="诊所类型" right-icon="arrow-right">
<u-input :value="clinicTypes[clinicTypeIndex].label" type="select" @click="showClinicType = true" placeholder="请选择" />
<u-select v-model="showClinicType" :list="clinicTypes" @confirm="onClinicTypeConfirm"></u-select>
<u-form-item label="诊所类型" :border-bottom="false">
<view class="clinic-type-cards">
<view
v-for="(item, idx) in clinicTypes"
:key="item.value"
class="clinic-type-card"
:class="{ active: clinicTypeIndex === idx }"
@click="selectClinicType(idx)"
>
<text class="clinic-type-label">{{ item.label }}</text>
</view>
</view>
</u-form-item>
<u-form-item label="是否包邮" right-icon="arrow-right">
<u-input :value="yesNoLabel(form.is_shipping_free)" type="select" @click="showYesNo = true" placeholder="请选择" />
<u-select v-model="showYesNo" :list="yesNo" @confirm="e => onPickConfirm('is_shipping_free', e)"></u-select>
<u-form-item label="是否包邮">
<view class="switch-row">
<text class="switch-hint">{{ Number(form.is_shipping_free) === 1 ? '包邮' : '不包邮' }}</text>
<switch
:checked="Number(form.is_shipping_free) === 1"
color="#6acdbb"
@change="onShippingFreeChange"
/>
</view>
</u-form-item>
<u-form-item label="订阅价格波动" right-icon="arrow-right">
<u-input :value="subscribeOpts[form.subscribe_price_change === 1 ? 1 : 0].label" type="select" @click="showSub = true" placeholder="请选择" />
<u-select v-model="showSub" :list="subscribeOpts" @confirm="e => onPickConfirm('subscribe_price_change', e)"></u-select>
<u-form-item label="订阅价格波动">
<view class="switch-row">
<text class="switch-hint">{{ Number(form.subscribe_price_change) === 0 ? '订阅' : '不订阅' }}</text>
<switch
:checked="Number(form.subscribe_price_change) === 0"
color="#6acdbb"
@change="onSubscribeChange"
/>
</view>
</u-form-item>
<u-form-item label="营业时间" right-icon="arrow-right">
@@ -211,22 +232,17 @@ export default {
// uView select/picker 显示状态控制
showStoreType: false,
showClinicType: false,
showYesNo: false,
showSub: false,
showStartTime: false,
showEndTime: false,
showBankType: false,
clinicTypeIndex: 1,
clinicTypeIndex: 0,
bankTypeIndex: 0,
// uView 格式的下拉数据
storeTypes: [{ label: '诊所', value: 0 }, { label: '药店', value: 1 }],
storeTypeIndex: 0,
clinicTypes: [{ label: '西医诊所', value: 1 }, { label: '中医诊所', value: 2 }],
yesNo: [{ label: '不包邮', value: 0 }, { label: '包邮', value: 1 }],
subscribeOpts: [{ label: '订阅价格波动', value: 0 }, { label: '不订阅价格波动', value: 1 }],
bankTypes: [{ label: '对公', value: 1 }, { label: '对私', value: 2 }, { label: '存折', value: 5 }],
form: createDefaultStoreInputForm(),
@@ -306,7 +322,17 @@ export default {
this.bankTypeIndex = Math.max(0, this.bankTypes.findIndex((b) => b.value === Number(d.bank_account_type)))
})
},
yesNoLabel(v) { return Number(v) === 1 ? '包邮' : '不包邮' },
selectClinicType(idx) {
this.clinicTypeIndex = idx
this.form.clinic_type = this.clinicTypes[idx].value
},
onShippingFreeChange(e) {
this.form.is_shipping_free = e.detail.value ? 1 : 0
},
onSubscribeChange(e) {
this.form.subscribe_price_change = e.detail.value ? 0 : 1
},
// --- 下拉及选择器确认事件 ---
onStoreTypeConfirm(e) {
@@ -314,19 +340,11 @@ export default {
this.form.type = selected.value
this.storeTypeIndex = this.storeTypes.findIndex((item) => item.value === selected.value)
},
onClinicTypeConfirm(e) {
const selected = e[0];
this.form.clinic_type = selected.value;
this.clinicTypeIndex = this.clinicTypes.findIndex(item => item.value === selected.value);
},
onBankTypeConfirm(e) {
const selected = e[0];
this.form.bank_account_type = selected.value;
this.bankTypeIndex = this.bankTypes.findIndex(item => item.value === selected.value);
},
onPickConfirm(field, e) {
this.form[field] = e[0].value;
},
onTimeConfirm(field, e) {
this.form[field] = `${e.hour}:${e.minute}`;
},
@@ -490,6 +508,31 @@ export default {
.time-box { flex: 1; text-align: center; background: #f5f7fa; padding: 12rpx 0; border-radius: 8rpx; font-size: 28rpx; color: #606266; }
.time-sep { margin: 0 20rpx; color: #999; }
.clinic-type-cards { display: flex; gap: 20rpx; width: 100%; }
.clinic-type-card {
flex: 1;
padding: 24rpx 16rpx;
text-align: center;
background: #f5f7fa;
border: 2rpx solid #e4e7ed;
border-radius: 12rpx;
box-sizing: border-box;
}
.clinic-type-card.active {
background: rgba(106, 205, 187, 0.08);
border-color: #6acdbb;
}
.clinic-type-label { font-size: 28rpx; color: #303133; }
.clinic-type-card.active .clinic-type-label { color: #6acdbb; font-weight: 600; }
.switch-row {
display: flex;
align-items: center;
justify-content: flex-end;
width: 100%;
gap: 16rpx;
}
.switch-hint { font-size: 26rpx; color: #86909c; }
/* 图片资料区域 */
.upload-group { margin-bottom: 30rpx; padding-bottom: 20rpx; border-bottom: 1rpx solid #f5f5f5; }
.upload-group:last-child { border-bottom: none; }

View File

@@ -6,8 +6,8 @@ export function checkDev(key = '') {
// 判断某些模块是否开启
switch (key) {
case 'dev':
return false;
// return true;
// return false;
return true;
case 'open-im':
// return false;
return true;