diff --git a/apps/web-antd/src/components/salesperson/SalespersonSettlementConfirmModal.vue b/apps/web-antd/src/components/salesperson/SalespersonSettlementConfirmModal.vue new file mode 100644 index 00000000..0e23e361 --- /dev/null +++ b/apps/web-antd/src/components/salesperson/SalespersonSettlementConfirmModal.vue @@ -0,0 +1,101 @@ + + + diff --git a/apps/web-antd/src/views/business/store/settings/api/index.ts b/apps/web-antd/src/views/business/store/settings/api/index.ts index 9b6beb2e..5b0aae7b 100644 --- a/apps/web-antd/src/views/business/store/settings/api/index.ts +++ b/apps/web-antd/src/views/business/store/settings/api/index.ts @@ -89,3 +89,62 @@ export async function salespersonCreateApi(data) { export async function salespersonUpdateApi(data) { return requestClient.post(`salesperson/update`, data); } + +export interface DrugCommissionListItem { + drug_id: number; + drug_name: string; + pinyin_simple?: string; + image?: string; + drug_spec: string; + buy_price: string; + price: string; + commission: string; +} + +export interface DrugCommissionListResult { + items: DrugCommissionListItem[]; + total: number; + page: number; + pageSize: number; +} + +export async function getDrugCommissionListApi(params: Record) { + return requestClient.get( + `salesperson/drug-commission-list`, + { params }, + ); +} + +export async function saveDrugCommissionApi(data: { + salesperson_id: number; + items: { drug_id: number; commission: string }[]; +}) { + return requestClient.post(`salesperson/save-drug-commission`, data); +} + +export async function getDrugCommissionCopyFromApi(fromSalespersonId: number) { + return requestClient.get<{ items: { drug_id: number; commission: string }[] }>( + `salesperson/drug-commission-copy-from`, + { params: { from_salesperson_id: fromSalespersonId } }, + ); +} + +export async function getCommissionListApi(params: Record) { + return requestClient.get(`salesperson/commission-list`, { params }); +} + +export async function getSettlementPreviewApi(params: Record) { + return requestClient.get(`salesperson/settlement-preview`, { params }); +} + +export async function confirmSettlementApi(data: Record) { + return requestClient.post(`salesperson/settlement`, data); +} + +export async function getSettlementListApi(params: Record) { + return requestClient.get(`salesperson/settlement-list`, { params }); +} + +export async function getSettlementDetailApi(params: { id: number }) { + return requestClient.get(`salesperson/settlement-detail`, { params }); +} diff --git a/apps/web-antd/src/views/business/store/settings/components/SalespersonCard.vue b/apps/web-antd/src/views/business/store/settings/components/SalespersonCard.vue index 64d28f76..764c3c19 100644 --- a/apps/web-antd/src/views/business/store/settings/components/SalespersonCard.vue +++ b/apps/web-antd/src/views/business/store/settings/components/SalespersonCard.vue @@ -1,128 +1,159 @@ diff --git a/apps/web-antd/src/views/business/store/settings/components/SalespersonCommissionDrawer.vue b/apps/web-antd/src/views/business/store/settings/components/SalespersonCommissionDrawer.vue new file mode 100644 index 00000000..50805f7e --- /dev/null +++ b/apps/web-antd/src/views/business/store/settings/components/SalespersonCommissionDrawer.vue @@ -0,0 +1,299 @@ + + + diff --git a/apps/web-antd/src/views/business/store/settings/components/SalespersonCreateModal.vue b/apps/web-antd/src/views/business/store/settings/components/SalespersonCreateModal.vue index 04c7b2a1..b67258c0 100644 --- a/apps/web-antd/src/views/business/store/settings/components/SalespersonCreateModal.vue +++ b/apps/web-antd/src/views/business/store/settings/components/SalespersonCreateModal.vue @@ -1,5 +1,5 @@ + diff --git a/apps/web-antd/src/views/business/store/settings/components/SalespersonDrugCommissionEditor.vue b/apps/web-antd/src/views/business/store/settings/components/SalespersonDrugCommissionEditor.vue new file mode 100644 index 00000000..5a409351 --- /dev/null +++ b/apps/web-antd/src/views/business/store/settings/components/SalespersonDrugCommissionEditor.vue @@ -0,0 +1,267 @@ + + + + + diff --git a/apps/web-antd/src/views/business/store/settings/config/form.ts b/apps/web-antd/src/views/business/store/settings/config/form.ts index fa8a72ef..8b401934 100644 --- a/apps/web-antd/src/views/business/store/settings/config/form.ts +++ b/apps/web-antd/src/views/business/store/settings/config/form.ts @@ -82,10 +82,24 @@ export const salespersonModalFormProps: VbenFormProps = { defaultValue: 0, }, { - component: 'Input', + component: 'InputNumber', fieldName: 'split', - label: '分成', - rules: 'required', + label: '分成比例(%)', + componentProps: { + min: 0, + max: 100, + precision: 2, + class: 'w-full', + }, + dependencies: { + show(values) { + return Number(values?.split_type) === 1; + }, + rules(values) { + return Number(values?.split_type) === 1 ? 'required' : ''; + }, + triggerFields: ['split_type'], + }, }, // { // component: 'UploadImage', diff --git a/apps/web-antd/src/views/business/store/settings/index.vue b/apps/web-antd/src/views/business/store/settings/index.vue index 3418fa75..585c581d 100644 --- a/apps/web-antd/src/views/business/store/settings/index.vue +++ b/apps/web-antd/src/views/business/store/settings/index.vue @@ -728,8 +728,16 @@ const handleSwitchClinicType = () => { - - + + + diff --git a/apps/web-antd/src/views/system/store/api/salesperson.ts b/apps/web-antd/src/views/system/store/api/salesperson.ts new file mode 100644 index 00000000..c993213d --- /dev/null +++ b/apps/web-antd/src/views/system/store/api/salesperson.ts @@ -0,0 +1,35 @@ +import { requestClient } from '#/api/request'; + +const prefix = 'salesperson/'; + +export function getSalespersonList(params: { store_id: number; page?: number; pageSize?: number }) { + return requestClient.get(`${prefix}list`, { params }); +} + +export function getCommissionList(params: Record) { + return requestClient.get(`${prefix}commission-list`, { params }); +} + +export function getSettlementPreview(params: Record) { + return requestClient.get(`${prefix}settlement-preview`, { params }); +} + +export function confirmSettlement(data: Record) { + return requestClient.post(`${prefix}settlement`, data); +} + +export function getSettlementList(params: Record) { + return requestClient.get(`${prefix}settlement-list`, { params }); +} + +export function getSettlementDetail(params: { id: number; store_id: number }) { + return requestClient.get(`${prefix}settlement-detail`, { params }); +} + +export function getDrugCommissionList(params: Record) { + return requestClient.get(`${prefix}drug-commission-list`, { params }); +} + +export function saveDrugCommission(data: Record) { + return requestClient.post(`${prefix}save-drug-commission`, data); +} diff --git a/apps/web-antd/src/views/system/store/components/SalespersonCommissionDrawer.vue b/apps/web-antd/src/views/system/store/components/SalespersonCommissionDrawer.vue new file mode 100644 index 00000000..b9a35d5b --- /dev/null +++ b/apps/web-antd/src/views/system/store/components/SalespersonCommissionDrawer.vue @@ -0,0 +1,282 @@ + + + diff --git a/apps/web-antd/src/views/system/store/config/table.ts b/apps/web-antd/src/views/system/store/config/table.ts index 09d80055..35967ebb 100644 --- a/apps/web-antd/src/views/system/store/config/table.ts +++ b/apps/web-antd/src/views/system/store/config/table.ts @@ -77,8 +77,8 @@ export const gridOptions: VxeGridProps = { }, // { field: 'shouzimu', title: '诊所首字母' }, { field: 'position', title: '详细地址' }, - { field: 'new_admin.nick_name', title: '业务员' }, - // { field: 'contact', title: '联系人' }, + { field: 'new_admin.nick_name', title: '业务员', slots: { default: 'sales_admin' } }, + { field: 'store_admin.phone', title: '管理员手机', slots: { default: 'store_admin_phone' } }, { field: 'mobile', title: '联系人、电话', slots: { default: 'mobile' } }, { field: 'start_time', diff --git a/apps/web-antd/src/views/system/store/index.vue b/apps/web-antd/src/views/system/store/index.vue index 37728c8f..0efe38b0 100644 --- a/apps/web-antd/src/views/system/store/index.vue +++ b/apps/web-antd/src/views/system/store/index.vue @@ -28,6 +28,7 @@ import FormModalDemo from './components/modal.vue'; import DrugPriceModal from './components/DrugPriceModal.vue'; import BindConsultationModal from './components/BindConsultationModal.vue'; import StoreExternalFieldModal from './components/StoreExternalFieldModal.vue'; +import SalespersonCommissionDrawer from './components/SalespersonCommissionDrawer.vue'; import { formOptions } from './config/search'; import { gridOptions } from './config/table'; @@ -177,6 +178,12 @@ function copyText(source) { } const { copy } = useClipboard({ legacy: true }); +const salespersonDrawerRef = ref>(); + +const openSalespersonCommission = (row: { id: number; name: string }) => { + salespersonDrawerRef.value?.open(row); +}; + /** * 更新包邮状态 */ @@ -255,6 +262,7 @@ const handleSwitchClinicType = (row: any) => { + + +