|
|
@@ -78,147 +78,15 @@
|
|
|
@confirm="confirmPackageSelection"
|
|
|
/>
|
|
|
|
|
|
- <wd-popup
|
|
|
- v-model="templateVisible"
|
|
|
- position="bottom"
|
|
|
- root-portal
|
|
|
- lock-scroll
|
|
|
- :close-on-click-modal="false"
|
|
|
- custom-style="border-radius: 32rpx 32rpx 0 0; overflow: hidden;"
|
|
|
- @close="resetTemplateForm"
|
|
|
- >
|
|
|
- <view class="visit-template">
|
|
|
- <view class="visit-template__header">
|
|
|
- <view>
|
|
|
- <view class="visit-template__title">拜访明细</view>
|
|
|
- <view class="visit-template__subtitle">{{ templateTarget?.name }}</view>
|
|
|
- </view>
|
|
|
- <view class="visit-template__close" @click="templateVisible = false">
|
|
|
- <wd-icon name="close" size="32rpx" color="#8b98a8" />
|
|
|
- </view>
|
|
|
- </view>
|
|
|
-
|
|
|
- <view v-if="templateLoading" class="visit-template__loading">正在加载拜访模板</view>
|
|
|
-
|
|
|
- <scroll-view v-else class="visit-template__scroll" scroll-y>
|
|
|
- <wd-cell title="拜访时间" :value="templateSignDate" />
|
|
|
-
|
|
|
- <wd-cell
|
|
|
- v-if="templateTarget?.type === 'pharmacy'"
|
|
|
- title="拜访人员"
|
|
|
- required
|
|
|
- >
|
|
|
- <wd-input
|
|
|
- v-model="templateForm.visitor"
|
|
|
- no-border
|
|
|
- align-right
|
|
|
- placeholder="请输入拜访人员"
|
|
|
- />
|
|
|
- </wd-cell>
|
|
|
-
|
|
|
- <wd-cell title="推广药品" required is-link :value="templateDrugText" @click="openDrugPicker" />
|
|
|
- <wd-cell
|
|
|
- title="拜访目的"
|
|
|
- required
|
|
|
- is-link
|
|
|
- :value="templatePurposeText"
|
|
|
- @click="purposePickerVisible = true"
|
|
|
- />
|
|
|
- <wd-cell
|
|
|
- title="拜访结果"
|
|
|
- required
|
|
|
- is-link
|
|
|
- :value="templateResultText"
|
|
|
- @click="resultPickerVisible = true"
|
|
|
- />
|
|
|
-
|
|
|
- <wd-cell v-if="requiresDepartment" title="拜访科室" required>
|
|
|
- <wd-input
|
|
|
- v-model="templateForm.department"
|
|
|
- no-border
|
|
|
- align-right
|
|
|
- placeholder="请输入拜访科室"
|
|
|
- />
|
|
|
- </wd-cell>
|
|
|
-
|
|
|
- <ImgUpload
|
|
|
- v-if="requiresTemplatePhoto"
|
|
|
- v-model:value="templateForm.photoUrls"
|
|
|
- :task-field-config="templatePhotoFieldConfig"
|
|
|
- />
|
|
|
-
|
|
|
- <template v-if="templateTarget?.type === 'hospital' && templateType === 'TEMPLATE2'">
|
|
|
- <view
|
|
|
- v-for="item in templateEvaluationItems"
|
|
|
- :key="item.key"
|
|
|
- class="visit-template__field"
|
|
|
- >
|
|
|
- <view class="visit-template__field-label">
|
|
|
- <text class="visit-template__required">*</text>{{ item.label }}
|
|
|
- </view>
|
|
|
- <wd-radio-group
|
|
|
- v-model="templateForm[item.key]"
|
|
|
- direction="horizontal"
|
|
|
- type="button"
|
|
|
- >
|
|
|
- <wd-radio value="true">是</wd-radio>
|
|
|
- <wd-radio value="false">否</wd-radio>
|
|
|
- </wd-radio-group>
|
|
|
- </view>
|
|
|
- </template>
|
|
|
-
|
|
|
- <view class="visit-template__field visit-template__field--vertical">
|
|
|
- <view class="visit-template__field-label visit-template__field-label--vertical">
|
|
|
- 备注
|
|
|
- </view>
|
|
|
- <wd-textarea
|
|
|
- v-model="templateForm.remark"
|
|
|
- placeholder="请输入备注"
|
|
|
- clearable
|
|
|
- auto-height
|
|
|
- custom-style="min-height: 180rpx;"
|
|
|
- />
|
|
|
- </view>
|
|
|
- </scroll-view>
|
|
|
-
|
|
|
- <view class="visit-template__actions">
|
|
|
- <view
|
|
|
- class="visit-template__button visit-template__button--cancel"
|
|
|
- @click="templateVisible = false"
|
|
|
- >
|
|
|
- 取消
|
|
|
- </view>
|
|
|
- <view
|
|
|
- class="visit-template__button visit-template__button--submit"
|
|
|
- :class="{ 'visit-template__button--disabled': signSubmitting }"
|
|
|
- @click="submitTemplateSign"
|
|
|
- >
|
|
|
- {{ signSubmitting ? '提交中' : '提交打卡' }}
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- </wd-popup>
|
|
|
-
|
|
|
- <wd-select-picker
|
|
|
- v-model="templateForm.drug"
|
|
|
- v-model:visible="drugPickerVisible"
|
|
|
- title="选择推广药品"
|
|
|
- :columns="drugOptions"
|
|
|
- root-portal
|
|
|
- />
|
|
|
- <wd-select-picker
|
|
|
- v-model="templateForm.purpose"
|
|
|
- v-model:visible="purposePickerVisible"
|
|
|
- title="选择拜访目的"
|
|
|
- :columns="purposeOptions"
|
|
|
- root-portal
|
|
|
- />
|
|
|
- <wd-picker
|
|
|
- v-model="templateForm.result"
|
|
|
- v-model:visible="resultPickerVisible"
|
|
|
- title="选择拜访结果"
|
|
|
- :columns="resultOptions"
|
|
|
- root-portal
|
|
|
+ <VisitTemplate
|
|
|
+ v-model:visible="templateVisible"
|
|
|
+ :target="templateTarget"
|
|
|
+ :package-item="templatePackageItem"
|
|
|
+ :dept-id="deptId"
|
|
|
+ :task-type-id="templateTaskTypeId"
|
|
|
+ :sign-date="templateSignDate"
|
|
|
+ :submitting="signSubmitting"
|
|
|
+ @confirm="submitTemplateSign"
|
|
|
/>
|
|
|
</template>
|
|
|
|
|
|
@@ -229,28 +97,24 @@ import dayjs from 'dayjs'
|
|
|
|
|
|
import type { LocationResult } from '@/lib/location'
|
|
|
|
|
|
-import { getDictTypeApi } from '@/services/modules/common'
|
|
|
-import type { DictItem } from '@/services/modules/common/type'
|
|
|
import { getPackageListByTaskTypeApi } from '@/services/modules/information'
|
|
|
import type { SharePackageItem } from '@/services/modules/information/type'
|
|
|
-import { getListDrugTableApi } from '@/services/modules/task/taskFrom'
|
|
|
-import type { TaskFieldConfigItem } from '@/services/modules/task/taskFrom/type'
|
|
|
import {
|
|
|
getSignListByUserIdApi,
|
|
|
- getVisitTemplateApi,
|
|
|
isVisitTimeApi,
|
|
|
saveSignInfoApi,
|
|
|
} from '@/services/modules/task/taskVisit'
|
|
|
import type {
|
|
|
SaveSignInfoRequest,
|
|
|
+ VisitSignDetail,
|
|
|
VisitSignRecordItem,
|
|
|
VisitToType,
|
|
|
} from '@/services/modules/task/taskVisit/type'
|
|
|
|
|
|
import { useUserStore } from '@/stores/modules/user'
|
|
|
|
|
|
-import ImgUpload from '../../../task-form/components/ImgUpload.vue'
|
|
|
import type { VisitLocationStatus, VisitTarget, VisitTargetType } from '../../types'
|
|
|
+import VisitTemplate from '../visit-template/index.vue'
|
|
|
|
|
|
type RequestStatus = 'idle' | 'loading' | 'ready' | 'error'
|
|
|
|
|
|
@@ -269,21 +133,6 @@ interface PackagePickerConfirmEvent {
|
|
|
selectedItems: SharePackageItem[]
|
|
|
}
|
|
|
|
|
|
-interface TemplateFormState {
|
|
|
- drug: string[]
|
|
|
- purpose: string[]
|
|
|
- result: Array<string | number>
|
|
|
- visitor: string
|
|
|
- department: string
|
|
|
- photoUrls: string
|
|
|
- rightHcp: string
|
|
|
- rightInfo: string
|
|
|
- rightActivity: string
|
|
|
- remark: string
|
|
|
-}
|
|
|
-
|
|
|
-type TemplateEvaluationKey = 'rightHcp' | 'rightInfo' | 'rightActivity'
|
|
|
-
|
|
|
const SAME_TARGET_COOLDOWN_SECONDS = 4 * 60 * 60
|
|
|
const GLOBAL_COOLDOWN_SECONDS =
|
|
|
import.meta.env.VITE_MODE === 'production_luoxin' ? 60 * 60 : 30 * 60
|
|
|
@@ -323,45 +172,10 @@ const packageList = ref<SharePackageItem[]>([])
|
|
|
const selectedPackageValues = ref<Array<string | number>>([])
|
|
|
|
|
|
const templateVisible = ref(false)
|
|
|
-const templateLoading = ref(false)
|
|
|
-const templateType = ref('')
|
|
|
const templateTarget = ref<VisitTarget>()
|
|
|
const templatePackageItem = ref<SharePackageItem>()
|
|
|
+const templateTaskTypeId = ref('')
|
|
|
const templateSignDate = ref('')
|
|
|
-const drugPickerVisible = ref(false)
|
|
|
-const purposePickerVisible = ref(false)
|
|
|
-const resultPickerVisible = ref(false)
|
|
|
-const drugOptions = ref<Array<{ label: string; value: string }>>([])
|
|
|
-const purposeOptions = ref<Array<{ label: string; value: string }>>([])
|
|
|
-const resultOptions = ref<Array<{ label: string; value: string }>>([])
|
|
|
-
|
|
|
-const createTemplateForm = (): TemplateFormState => ({
|
|
|
- drug: [],
|
|
|
- purpose: [],
|
|
|
- result: [],
|
|
|
- visitor: '',
|
|
|
- department: '',
|
|
|
- photoUrls: '',
|
|
|
- rightHcp: '',
|
|
|
- rightInfo: '',
|
|
|
- rightActivity: '',
|
|
|
- remark: '',
|
|
|
-})
|
|
|
-
|
|
|
-const templateForm = ref<TemplateFormState>(createTemplateForm())
|
|
|
-
|
|
|
-const templateEvaluationItems: Array<{ key: TemplateEvaluationKey; label: string }> = [
|
|
|
- { key: 'rightHcp', label: '是否针对了正确的 HCP' },
|
|
|
- { key: 'rightInfo', label: '是否传递了正确的信息' },
|
|
|
- { key: 'rightActivity', label: '是否采取了正确的活动形式和频率' },
|
|
|
-]
|
|
|
-
|
|
|
-const templatePhotoFieldConfig = {
|
|
|
- taskFiledValue: '现场照片',
|
|
|
- isMustfill: '1',
|
|
|
- taskFiledMinsize: 1,
|
|
|
- taskFiledMaxsize: 5,
|
|
|
-} as TaskFieldConfigItem
|
|
|
|
|
|
const deptId = computed(() => userStore.currentUserInfo?.deptId || '')
|
|
|
const userId = computed(() => userStore.currentUserInfo?.userId || '')
|
|
|
@@ -373,30 +187,6 @@ const selectedPackage = computed(() => {
|
|
|
return packageList.value.find((item) => String(item.value) === String(selectedValue))
|
|
|
})
|
|
|
|
|
|
-const templateDrugText = computed(() => templateForm.value.drug.join('、') || '请选择')
|
|
|
-const templatePurposeText = computed(() => {
|
|
|
- const selectedValues = new Set(templateForm.value.purpose.map(String))
|
|
|
- return purposeOptions.value
|
|
|
- .filter((item) => selectedValues.has(item.value))
|
|
|
- .map((item) => item.label)
|
|
|
- .join('、') || '请选择'
|
|
|
-})
|
|
|
-const templateResultText = computed(() => {
|
|
|
- const selectedValue = templateForm.value.result[0]
|
|
|
- return resultOptions.value.find((item) => item.value === String(selectedValue))?.label || '请选择'
|
|
|
-})
|
|
|
-const requiresDepartment = computed(() => {
|
|
|
- return templateTarget.value?.type === 'hospital' && templateType.value !== 'TEMPLATE2'
|
|
|
-})
|
|
|
-const requiresTemplatePhoto = computed(() => {
|
|
|
- const targetType = templateTarget.value?.type
|
|
|
- return (
|
|
|
- requiresDepartment.value ||
|
|
|
- (targetType === 'company' && templateType.value === 'TEMPLATE2') ||
|
|
|
- (targetType === 'pharmacy' && templateType.value === 'TEMPLATE3')
|
|
|
- )
|
|
|
-})
|
|
|
-
|
|
|
const cooldownDeadline = computed(() => {
|
|
|
const targetId = props.target?.signEntId
|
|
|
let latestSignTime = 0
|
|
|
@@ -613,126 +403,30 @@ const confirmPackageSelection = async (event: PackagePickerConfirmEvent) => {
|
|
|
const hasTaskTypeTemplate = userStore.currentUserInfo?.hasTaskTypeTemplate || []
|
|
|
|
|
|
if (hasTaskTypeTemplate.includes(taskTypeId)) {
|
|
|
- await openTemplateForm(target, packageItem, taskTypeId)
|
|
|
+ openTemplateForm(target, packageItem, taskTypeId)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
await submitSign(target, packageItem)
|
|
|
}
|
|
|
|
|
|
-const DICT_TYPE_MAP: Record<VisitTargetType, string> = {
|
|
|
- hospital: 'user_sign_detail_purpose',
|
|
|
- company: 'user_sign_detail_distribution_purpose',
|
|
|
- pharmacy: 'user_sign_detail_pharmacy_purpose',
|
|
|
-}
|
|
|
-
|
|
|
-const toDictOptions = (list: DictItem[]) => {
|
|
|
- return list.map((item) => ({ label: item.label, value: item.value }))
|
|
|
-}
|
|
|
-
|
|
|
-const openTemplateForm = async (
|
|
|
+const openTemplateForm = (
|
|
|
target: VisitTarget,
|
|
|
packageItem: SharePackageItem,
|
|
|
taskTypeId: string
|
|
|
) => {
|
|
|
- const currentDeptId = deptId.value
|
|
|
- if (!currentDeptId) return
|
|
|
-
|
|
|
templateTarget.value = target
|
|
|
templatePackageItem.value = packageItem
|
|
|
+ templateTaskTypeId.value = taskTypeId
|
|
|
templateSignDate.value = dayjs().format('YYYY-MM-DD HH:mm:ss')
|
|
|
- templateForm.value = createTemplateForm()
|
|
|
- templateLoading.value = true
|
|
|
templateVisible.value = true
|
|
|
-
|
|
|
- try {
|
|
|
- const templateRes = await getVisitTemplateApi({ deptId: currentDeptId, taskTypeId })
|
|
|
- templateType.value = templateRes.data?.template || ''
|
|
|
-
|
|
|
- const purposeDictType =
|
|
|
- target.type === 'hospital' && templateType.value === 'TEMPLATE2'
|
|
|
- ? 'user_sign_detail_template2_purpose'
|
|
|
- : DICT_TYPE_MAP[target.type]
|
|
|
-
|
|
|
- const [drugRes, purposeRes, resultRes] = await Promise.all([
|
|
|
- getListDrugTableApi(String(packageItem.value)),
|
|
|
- getDictTypeApi(purposeDictType),
|
|
|
- getDictTypeApi('user_sign_detail_result'),
|
|
|
- ])
|
|
|
-
|
|
|
- if (templateTarget.value?.id !== target.id) return
|
|
|
-
|
|
|
- drugOptions.value = (Array.isArray(drugRes.data) ? drugRes.data : []).map((item) => ({
|
|
|
- label: String(item),
|
|
|
- value: String(item),
|
|
|
- }))
|
|
|
- purposeOptions.value = toDictOptions(Array.isArray(purposeRes.data) ? purposeRes.data : [])
|
|
|
- resultOptions.value = toDictOptions(Array.isArray(resultRes.data) ? resultRes.data : [])
|
|
|
- } catch {
|
|
|
- templateVisible.value = false
|
|
|
- } finally {
|
|
|
- templateLoading.value = false
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
-const openDrugPicker = () => {
|
|
|
- if (drugOptions.value.length === 0) {
|
|
|
- showToast('暂无可选推广药品')
|
|
|
- return
|
|
|
- }
|
|
|
- drugPickerVisible.value = true
|
|
|
-}
|
|
|
-
|
|
|
-const submitTemplateSign = async () => {
|
|
|
+const submitTemplateSign = async (userSignDetail: VisitSignDetail) => {
|
|
|
const target = templateTarget.value
|
|
|
const packageItem = templatePackageItem.value
|
|
|
if (!target || !packageItem) return
|
|
|
|
|
|
- const form = templateForm.value
|
|
|
- const result = String(form.result[0] ?? '')
|
|
|
- const needsEvaluation = target.type === 'hospital' && templateType.value === 'TEMPLATE2'
|
|
|
- const photoUrls = form.photoUrls
|
|
|
- .split(',')
|
|
|
- .map((item) => item.trim())
|
|
|
- .filter(Boolean)
|
|
|
-
|
|
|
- if (
|
|
|
- form.drug.length === 0 ||
|
|
|
- form.purpose.length === 0 ||
|
|
|
- !result ||
|
|
|
- (target.type === 'pharmacy' && !form.visitor.trim()) ||
|
|
|
- (requiresDepartment.value && !form.department.trim()) ||
|
|
|
- (requiresTemplatePhoto.value && photoUrls.length === 0) ||
|
|
|
- (needsEvaluation && (!form.rightHcp || !form.rightInfo || !form.rightActivity))
|
|
|
- ) {
|
|
|
- showToast('请完善拜访信息')
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- const userSignDetail: Record<string, unknown> = {
|
|
|
- templateType: templateType.value,
|
|
|
- drug: form.drug,
|
|
|
- purpose: form.purpose,
|
|
|
- result,
|
|
|
- remark: form.remark.trim(),
|
|
|
- visitor: form.visitor.trim(),
|
|
|
- detail: needsEvaluation
|
|
|
- ? [
|
|
|
- {
|
|
|
- rightHcp: form.rightHcp === 'true',
|
|
|
- rightInfo: form.rightInfo === 'true',
|
|
|
- rightActivity: form.rightActivity === 'true',
|
|
|
- },
|
|
|
- ]
|
|
|
- : requiresDepartment.value
|
|
|
- ? [{ departmentName: form.department.trim(), fileUrl: photoUrls }]
|
|
|
- : [],
|
|
|
- scenePhotoJson:
|
|
|
- requiresTemplatePhoto.value && !requiresDepartment.value
|
|
|
- ? [{ name: '', fileUrl: photoUrls }]
|
|
|
- : [],
|
|
|
- }
|
|
|
-
|
|
|
const submitted = await submitSign(target, packageItem, userSignDetail, templateSignDate.value)
|
|
|
|
|
|
if (submitted) {
|
|
|
@@ -740,21 +434,10 @@ const submitTemplateSign = async () => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-const resetTemplateForm = () => {
|
|
|
- templateTarget.value = undefined
|
|
|
- templatePackageItem.value = undefined
|
|
|
- templateType.value = ''
|
|
|
- templateSignDate.value = ''
|
|
|
- templateForm.value = createTemplateForm()
|
|
|
- drugOptions.value = []
|
|
|
- purposeOptions.value = []
|
|
|
- resultOptions.value = []
|
|
|
-}
|
|
|
-
|
|
|
const submitSign = async (
|
|
|
target: VisitTarget,
|
|
|
packageItem: SharePackageItem,
|
|
|
- userSignDetail: Record<string, unknown> = {},
|
|
|
+ userSignDetail: VisitSignDetail | Record<string, never> = {},
|
|
|
signDate = dayjs().format('YYYY-MM-DD HH:mm:ss')
|
|
|
) => {
|
|
|
const location = props.currentLocation
|
|
|
@@ -808,6 +491,10 @@ watch(
|
|
|
() => {
|
|
|
packagePickerVisible.value = false
|
|
|
templateVisible.value = false
|
|
|
+ templateTarget.value = undefined
|
|
|
+ templatePackageItem.value = undefined
|
|
|
+ templateTaskTypeId.value = ''
|
|
|
+ templateSignDate.value = ''
|
|
|
packageLoading.value = false
|
|
|
packageList.value = []
|
|
|
selectedPackageValues.value = []
|
|
|
@@ -1054,128 +741,4 @@ const showToast = (title: string, duration?: number) => {
|
|
|
font-weight: 650;
|
|
|
line-height: 34rpx;
|
|
|
}
|
|
|
-
|
|
|
-.visit-template {
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- max-height: 88vh;
|
|
|
- padding-bottom: env(safe-area-inset-bottom);
|
|
|
- background: #f5f7fa;
|
|
|
-}
|
|
|
-
|
|
|
-.visit-template__header {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: space-between;
|
|
|
- padding: 28rpx 30rpx;
|
|
|
- background: #ffffff;
|
|
|
- border-bottom: 2rpx solid #edf1f5;
|
|
|
-}
|
|
|
-
|
|
|
-.visit-template__title {
|
|
|
- color: #172033;
|
|
|
- font-size: 32rpx;
|
|
|
- font-weight: 700;
|
|
|
- line-height: 44rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.visit-template__subtitle {
|
|
|
- max-width: 560rpx;
|
|
|
- margin-top: 4rpx;
|
|
|
- overflow: hidden;
|
|
|
- color: #8491a2;
|
|
|
- font-size: 22rpx;
|
|
|
- line-height: 32rpx;
|
|
|
- text-overflow: ellipsis;
|
|
|
- white-space: nowrap;
|
|
|
-}
|
|
|
-
|
|
|
-.visit-template__close {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- width: 60rpx;
|
|
|
- height: 60rpx;
|
|
|
- background: #f4f7fa;
|
|
|
- border-radius: 50%;
|
|
|
-}
|
|
|
-
|
|
|
-.visit-template__loading {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- height: 420rpx;
|
|
|
- color: #8491a2;
|
|
|
- font-size: 26rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.visit-template__scroll {
|
|
|
- height: 860rpx;
|
|
|
- padding-top: 18rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.visit-template__field {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: space-between;
|
|
|
- min-height: 104rpx;
|
|
|
- padding: 20rpx 30rpx;
|
|
|
- background: #ffffff;
|
|
|
- border-top: 2rpx solid #f1f3f6;
|
|
|
- box-sizing: border-box;
|
|
|
-}
|
|
|
-
|
|
|
-.visit-template__field--vertical {
|
|
|
- align-items: stretch;
|
|
|
- flex-direction: column;
|
|
|
-}
|
|
|
-
|
|
|
-.visit-template__field-label {
|
|
|
- margin-right: 24rpx;
|
|
|
- color: #303a49;
|
|
|
- font-size: 26rpx;
|
|
|
- line-height: 38rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.visit-template__field-label--vertical {
|
|
|
- margin: 0 0 16rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.visit-template__required {
|
|
|
- margin-right: 6rpx;
|
|
|
- color: #e65d5d;
|
|
|
-}
|
|
|
-
|
|
|
-.visit-template__actions {
|
|
|
- display: flex;
|
|
|
- gap: 18rpx;
|
|
|
- padding: 20rpx 28rpx;
|
|
|
- background: #ffffff;
|
|
|
- box-shadow: 0 -8rpx 24rpx rgba(31, 51, 73, 0.06);
|
|
|
-}
|
|
|
-
|
|
|
-.visit-template__button {
|
|
|
- flex: 1;
|
|
|
- height: 82rpx;
|
|
|
- margin: 0;
|
|
|
- padding: 0;
|
|
|
- border-radius: 16rpx;
|
|
|
- font-size: 28rpx;
|
|
|
- line-height: 82rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.visit-template__button--cancel {
|
|
|
- color: #53657a;
|
|
|
- background: #eef2f6;
|
|
|
-}
|
|
|
-
|
|
|
-.visit-template__button--submit {
|
|
|
- color: #ffffff;
|
|
|
- background: linear-gradient(135deg, #50b5ff 0%, #2f8cf7 100%);
|
|
|
-}
|
|
|
-
|
|
|
-.visit-template__button--disabled {
|
|
|
- opacity: 0.6;
|
|
|
- pointer-events: none;
|
|
|
-}
|
|
|
</style>
|