1. 特色方功能迭代(固定价格),固定价格目前统一使用药品id(-102),后期会考虑新增特色方的时候自动添加一个特色方药品
Some checks failed
CI / Test (ubuntu-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Lint (ubuntu-latest) (push) Has been cancelled
CI / Lint (windows-latest) (push) Has been cancelled
CI / Check (ubuntu-latest) (push) Has been cancelled
CI / Check (windows-latest) (push) Has been cancelled
CI / CI OK (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Website on push / Deploy Push Playground Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Docs Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Antd Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Element Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Naive Ftp (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
Lock Threads / action (push) Has been cancelled
Issue Close Require / close-issues (push) Has been cancelled

2. 退款的时候可以退回分成
This commit is contained in:
李琦
2026-07-09 15:45:39 +08:00
parent 5620c39e1e
commit d93e465d3c
48 changed files with 556 additions and 160 deletions

View File

@@ -10,6 +10,7 @@ import { Button, Image, message, Avatar } from 'ant-design-vue';
import { useVbenForm } from '#/adapter/form';
import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { TableAction } from '#/components/table-action';
import SensitiveText from '#/components/sensitive-text/SensitiveText.vue';
import {
createAdmin,
deleteAdmin,
@@ -293,13 +294,16 @@ const copyToClipboard = async (text: string) => {
{{ row.doctor_profile?.name || `su_id: ${row.doctor_id}` }}
</div>
<div v-if="row.doctor_profile?.mobile" class="text-xs text-gray-400">
{{ row.doctor_profile.mobile }}
<SensitiveText :record="row.doctor_profile" field="mobile" />
</div>
</div>
</div>
</Button>
<span v-else>-</span>
</template>
<template #phone="{ row }">
<SensitiveText :record="row" field="phone" />
</template>
<template #login_account="{ row }">
<span v-if="row.login_account">
<Button

View File

@@ -88,7 +88,7 @@ function buildColumns(formType: AdminFormType) {
}
cols.push(
{ field: 'phone', title: '手机号码' },
{ field: 'phone', title: '手机号码', slots: { default: 'phone' } },
{
field: 'login_account',
align: 'left',

View File

@@ -44,7 +44,7 @@ export const gridOptions: VxeGridProps<RowType> = {
{ field: 'code', title: '业务推广码' },
{ field: 'platform.name', title: '所属平台' },
{ field: 'supplier.name', title: '所属供应商' },
{ field: 'phone', title: '手机号码' },
{ field: 'phone', title: '手机号码', slots: { default: 'phone' } },
{
field: 'login_account',
align: 'left',

View File

@@ -5,6 +5,8 @@ import { useVbenModal } from '@vben/common-ui';
import { Avatar, Descriptions, DescriptionsItem, Image, Spin, message } from 'ant-design-vue';
import SensitiveText from '#/components/sensitive-text/SensitiveText.vue';
import { getDoctorInputDetail } from '../api';
import {
inputUserDisplayName,
@@ -72,8 +74,12 @@ const [Modal, modalApi] = useVbenModal({
<Descriptions :column="2" bordered>
<DescriptionsItem label="ID">{{ detailData.id }}</DescriptionsItem>
<DescriptionsItem label="医生姓名">{{ detailData.name }}</DescriptionsItem>
<DescriptionsItem label="手机号">{{ detailData.mobile }}</DescriptionsItem>
<DescriptionsItem label="身份证">{{ detailData.idcard }}</DescriptionsItem>
<DescriptionsItem label="手机号">
<SensitiveText :record="detailData" field="mobile" />
</DescriptionsItem>
<DescriptionsItem label="身份证">
<SensitiveText :record="detailData" field="idcard" />
</DescriptionsItem>
<DescriptionsItem label="身份">{{ getTypeText(detailData.type) }}</DescriptionsItem>
<DescriptionsItem label="签名类型">{{ getSignTypeText(detailData.sign_type) }}</DescriptionsItem>
<DescriptionsItem label="科室">{{ detailData.depart?.name || '-' }}</DescriptionsItem>

View File

@@ -41,7 +41,7 @@ export const inputGridOptions: VxeGridProps<RowType> = {
{ type: 'checkbox', width: 60 },
{ field: 'id', align: 'left', title: 'ID', width: 100 },
{ field: 'name', align: 'left', title: '医生姓名' },
{ field: 'mobile', title: '手机号', width: 140 },
{ field: 'mobile', title: '手机号', width: 140, slots: { default: 'mobile' } },
{
field: 'type',
align: 'left',
@@ -111,7 +111,7 @@ export const auditGridOptions: VxeGridProps<RowType> = {
{ type: 'checkbox', width: 60 },
{ field: 'id', align: 'left', title: 'ID', width: 100 },
{ field: 'name', align: 'left', title: '医生姓名' },
{ field: 'mobile', title: '手机号', width: 140 },
{ field: 'mobile', title: '手机号', width: 140, slots: { default: 'mobile' } },
{
field: 'type',
align: 'left',

View File

@@ -9,6 +9,7 @@ import { Avatar, Tag } from 'ant-design-vue';
import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { TableAction } from '#/components/table-action';
import SensitiveText from '#/components/sensitive-text/SensitiveText.vue';
import DetailModal from './components/DetailModal.vue';
import FormModalDemo from './components/modal.vue';
@@ -119,6 +120,9 @@ const getStatusText = (status: number) => {
</div>
<span v-else>-</span>
</template>
<template #mobile="{ row }">
<SensitiveText :record="row" field="mobile" />
</template>
<template #action="{ row }">
<TableAction
:actions="[

View File

@@ -14,6 +14,7 @@ import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { Icon } from '#/components/icon';
import QrCodePreview from '#/components/modal/QrCodePreview.vue';
import PromoterInfoCard from '#/components/promoter/PromoterInfoCard.vue';
import SensitiveText from '#/components/sensitive-text/SensitiveText.vue';
import { TableAction } from '#/components/table-action';
// 导入药店管理相关的API(直接使用store的API)
@@ -478,8 +479,7 @@ const batchSyncDrugPrice = () => {
<Button type="link" @click="copyText(row.contact)">复制</Button>
</div>
<div>
号码:{{ row.mobile }}
<Button type="link" @click="copyText(row.mobile)">复制</Button>
号码:<SensitiveText :record="row" field="mobile" />
</div>
</template>
<template #qr_code="{ row }">

View File

@@ -12,6 +12,8 @@ import {
message,
} from 'ant-design-vue';
import SensitiveText from '#/components/sensitive-text/SensitiveText.vue';
import { getStoreInputDetail } from '../api';
import DoctorInputCardGrid from './DoctorInputCardGrid.vue';
import { getLinkedDoctors } from '../utils/doctorInputDisplay';
@@ -86,7 +88,9 @@ const [Modal, modalApi] = useVbenModal({
}}
</DescriptionsItem>
<DescriptionsItem label="联系人">{{ detailData.contact }}</DescriptionsItem>
<DescriptionsItem label="联系电话">{{ detailData.mobile }}</DescriptionsItem>
<DescriptionsItem label="联系电话">
<SensitiveText :record="detailData" field="mobile" />
</DescriptionsItem>
<DescriptionsItem label="省市区">
{{ detailData.province?.name }} {{ detailData.city?.name }}
</DescriptionsItem>

View File

@@ -9,6 +9,8 @@ import {
Popover,
} from 'ant-design-vue';
import SensitiveText from '#/components/sensitive-text/SensitiveText.vue';
import { resolveAvatarUrl } from '../utils/inputUser';
import {
doctorCertImages,
@@ -98,8 +100,12 @@ function cardClass(doc: Record<string, any>) {
<Descriptions :column="1" size="small" class="max-w-[480px]">
<DescriptionsItem label="ID">{{ doc.id }}</DescriptionsItem>
<DescriptionsItem label="姓名">{{ doc.name }}</DescriptionsItem>
<DescriptionsItem label="手机号">{{ doc.mobile || '-' }}</DescriptionsItem>
<DescriptionsItem label="身份证">{{ doc.idcard || '-' }}</DescriptionsItem>
<DescriptionsItem label="手机号">
<SensitiveText :record="doc" field="mobile" />
</DescriptionsItem>
<DescriptionsItem label="身份证">
<SensitiveText :record="doc" field="idcard" />
</DescriptionsItem>
<DescriptionsItem label="身份">{{ getDoctorTypeText(doc.type) }}</DescriptionsItem>
<DescriptionsItem label="签名类型">
{{ getSignTypeText(doc.sign_type) }}

View File

@@ -57,7 +57,7 @@ export const inputGridOptions: VxeGridProps<RowType> = {
slots: { default: 'status' },
},
{ field: 'contact', title: '联系人' },
{ field: 'mobile', title: '联系电话' },
{ field: 'mobile', title: '联系电话', slots: { default: 'mobile' } },
{ field: 'position', title: '详细地址' },
{ field: 'created_at', title: '录入时间' },
{
@@ -159,7 +159,7 @@ export const auditGridOptions: VxeGridProps<RowType> = {
},
{ field: 'audit_time', title: '审核时间', slots: { default: 'audit_time' } },
{ field: 'contact', title: '联系人' },
{ field: 'mobile', title: '联系电话' },
{ field: 'mobile', title: '联系电话', slots: { default: 'mobile' } },
{ field: 'position', title: '详细地址' },
{ field: 'created_at', title: '录入时间' },
{

View File

@@ -10,6 +10,7 @@ import { Avatar, Button, message, Tag } from 'ant-design-vue';
import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { TableAction } from '#/components/table-action';
import SensitiveText from '#/components/sensitive-text/SensitiveText.vue';
import PromoterInfoCard from '#/components/promoter/PromoterInfoCard.vue';
import {
@@ -158,6 +159,9 @@ const getStatusText = (status: number) => {
<template #promoter_admin="{ row }">
<PromoterInfoCard :admin="row.promoter_admin" size="compact" />
</template>
<template #mobile="{ row }">
<SensitiveText :record="row" field="mobile" />
</template>
<template #action="{ row }">
<TableAction
:actions="[

View File

@@ -1,6 +1,8 @@
<script lang="ts" setup>
import { Button } from 'ant-design-vue';
import SensitiveText from '#/components/sensitive-text/SensitiveText.vue';
defineProps<{
row: Record<string, any>;
variant: 'clinic' | 'pharmacy';
@@ -52,16 +54,12 @@ function getClinicTypeText(clinicType: number) {
</div>
<div class="info-item">
<span class="info-item__label">管理员</span>
<template v-if="row.store_admin?.phone">
<Button
type="link"
size="small"
class="info-item__action"
@click="onCopy(row.store_admin.phone)"
>
{{ row.store_admin.phone }}
</Button>
</template>
<SensitiveText
v-if="row.store_admin?.phone"
:record="row.store_admin"
field="phone"
empty-text="-"
/>
<span v-else class="info-item__value">-</span>
</div>
</template>

View File

@@ -14,6 +14,7 @@ import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { Icon } from '#/components/icon';
import QrCodePreview from '#/components/modal/QrCodePreview.vue';
import PromoterInfoCard from '#/components/promoter/PromoterInfoCard.vue';
import SensitiveText from '#/components/sensitive-text/SensitiveText.vue';
import { TableAction } from '#/components/table-action';
import { resolveAvatarUrl } from '#/views/system/store-input/utils/inputUser';
@@ -510,8 +511,7 @@ const handleSwitchClinicType = (row: any) => {
<Button type="link" @click="copyText(row.contact)">复制</Button>
</div>
<div>
号码:{{ row.mobile }}
<Button type="link" @click="copyText(row.mobile)">复制</Button>
号码:<SensitiveText :record="row" field="mobile" />
</div>
</template>
<template #qr_code="{ row }">