diff --git a/apps/web-antd/src/adapter/component/index.ts b/apps/web-antd/src/adapter/component/index.ts index ddd6552d..d8c83e2c 100644 --- a/apps/web-antd/src/adapter/component/index.ts +++ b/apps/web-antd/src/adapter/component/index.ts @@ -80,6 +80,7 @@ export type ComponentType = | 'Upload' | 'UploadImage' | 'UploadImageSortable' + | 'UploadOssFile' | BaseFormComponentType; async function initComponentAdapter() { diff --git a/apps/web-antd/src/adapter/form.ts b/apps/web-antd/src/adapter/form.ts index 65ff793b..24ccc648 100644 --- a/apps/web-antd/src/adapter/form.ts +++ b/apps/web-antd/src/adapter/form.ts @@ -19,6 +19,8 @@ setupVbenForm({ Radio: 'checked', Switch: 'checked', Upload: 'fileList', + UploadImage: 'modelValue', + UploadOssFile: 'modelValue', }, }, defineRules: { diff --git a/apps/web-antd/src/components/form/components/upload-oss-file.vue b/apps/web-antd/src/components/form/components/upload-oss-file.vue new file mode 100644 index 00000000..521736b1 --- /dev/null +++ b/apps/web-antd/src/components/form/components/upload-oss-file.vue @@ -0,0 +1,156 @@ + + + diff --git a/apps/web-antd/src/views/business/order/product-order/components/detail.vue b/apps/web-antd/src/views/business/order/product-order/components/detail.vue index 2545a628..fd2343d7 100644 --- a/apps/web-antd/src/views/business/order/product-order/components/detail.vue +++ b/apps/web-antd/src/views/business/order/product-order/components/detail.vue @@ -126,7 +126,7 @@ const orderTypeMap = { {{ data.total_pay_price }} 元 - {{ data.items_price }} 元 + 药品:{{ data.items_price }} 元, 加工费:{{ data.process_price }} 元 {{ data.market_price }} 元 diff --git a/apps/web-antd/src/views/system/pharmacy/config/form.ts b/apps/web-antd/src/views/system/pharmacy/config/form.ts index c5f388cc..1dd38f47 100644 --- a/apps/web-antd/src/views/system/pharmacy/config/form.ts +++ b/apps/web-antd/src/views/system/pharmacy/config/form.ts @@ -255,121 +255,6 @@ export const modalFormProps: VbenFormProps = { rules: 'required', suffix: () => '%', // 后缀显示百分号 }, - { - // 银行卡信息分隔线(仅在新增时显示) - component: 'Divider', - fieldName: '', - label: 'x', - rules: 'required', - hideLabel: true, - dependencies: { - show: (values) => { - // 仅在新增时显示(id为空时) - return values.id == null; - }, - triggerFields: ['id'], - }, - renderComponentContent: () => { - return { - default: () => { - return '银行卡信息'; - }, - }; - }, - }, - { - // 开户人姓名字段(仅在新增时显示) - component: 'VbenInput', - formItemClass: 'col-span-6', - componentProps: { - placeholder: '请输入开户人姓名', - }, - dependencies: { - show: (values) => { - // 仅在新增时显示(id为空时) - return values.id == null; - }, - triggerFields: ['id'], - }, - fieldName: 'bank_user_name', - label: '开户人姓名', - rules: 'required', - }, - { - // 银行卡号字段(仅在新增时显示) - component: 'VbenInput', - formItemClass: 'col-span-6', - componentProps: { - placeholder: '请输入银行卡号', - }, - dependencies: { - show: (values) => { - // 仅在新增时显示(id为空时) - return values.id == null; - }, - triggerFields: ['id'], - }, - fieldName: 'bank_card', - label: '银行卡号', - rules: 'required', - }, - { - // 开户行字段(仅在新增时显示) - component: 'VbenInput', - formItemClass: 'col-span-6', - componentProps: { - placeholder: '请输入开户行', - }, - dependencies: { - show: (values) => { - // 仅在新增时显示(id为空时) - return values.id == null; - }, - triggerFields: ['id'], - }, - fieldName: 'bank_name', - label: '开户行', - rules: 'required', - }, - { - // 银联行号字段(仅在新增时显示,非必填) - component: 'VbenInput', - formItemClass: 'col-span-6', - componentProps: { - placeholder: '请输入银联行号', - }, - dependencies: { - show: (values) => { - // 仅在新增时显示(id为空时) - return values.id == null; - }, - triggerFields: ['id'], - }, - fieldName: 'bank_no', - label: '银联行号', - }, - { - // 银行账户类型字段(仅在新增时显示) - component: 'RadioGroup', - componentProps: { - options: [ - { label: '对公', value: 1 }, - { label: '对私', value: 2 }, - { label: '存折', value: 5 }, - ], - placeholder: '请选择银行账户类型', - }, - dependencies: { - show: (values) => { - // 仅在新增时显示(id为空时) - return values.id == null; - }, - triggerFields: ['id'], - }, - fieldName: 'bank_account_type', - label: '银行账户类型', - rules: 'required', - }, ], showDefaultActions: false, // 不显示默认操作按钮 }; diff --git a/apps/web-antd/src/views/system/pharmacy/config/table.ts b/apps/web-antd/src/views/system/pharmacy/config/table.ts index b5a21f79..b38a8721 100644 --- a/apps/web-antd/src/views/system/pharmacy/config/table.ts +++ b/apps/web-antd/src/views/system/pharmacy/config/table.ts @@ -42,13 +42,19 @@ export const gridOptions: VxeGridProps = { slots: { default: 'online_consultation_config' }, }, { - // 是否包邮列(显示为开关) field: 'is_shipping_free', align: 'left', title: '是否包邮', slots: { default: 'is_shipping_free' }, width: 120, }, + { + field: 'bank_card_report_status', + align: 'left', + title: '银行卡报备', + slots: { default: 'bank_card_report_status' }, + width: 120, + }, { // 订阅价格波动列(显示为开关) field: 'subscribe_price_change', diff --git a/apps/web-antd/src/views/system/pharmacy/index.vue b/apps/web-antd/src/views/system/pharmacy/index.vue index 02694399..435355c0 100644 --- a/apps/web-antd/src/views/system/pharmacy/index.vue +++ b/apps/web-antd/src/views/system/pharmacy/index.vue @@ -31,6 +31,9 @@ import FormModalDemo from './components/modal.vue'; import BindConsultationModal from '#/views/system/store/components/BindConsultationModal.vue'; import DrugPriceModal from '#/views/system/store/components/DrugPriceModal.vue'; import StoreExternalFieldModal from '#/views/system/store/components/StoreExternalFieldModal.vue'; +import BankCardReportModal from '#/views/system/store-bank-card/components/BankCardReportModal.vue'; +import BankCardStatusModal from '#/views/system/store-bank-card/components/BankCardStatusModal.vue'; +import { getStoreBankCardReportDetail } from '#/views/system/store-bank-card/api'; // 导入搜索表单配置 import { formOptions } from './config/search'; // 导入表格配置 @@ -110,6 +113,68 @@ const [DrugPriceModalComponent, drugPriceModalApi] = useVbenModal({ connectedComponent: DrugPriceModal, }); +const [BankCardReportModalComponent, bankCardReportModalApi] = useVbenModal({ + connectedComponent: BankCardReportModal, +}); + +const [BankCardStatusModalComponent, bankCardStatusModalApi] = useVbenModal({ + connectedComponent: BankCardStatusModal, +}); + +const openBankCardReport = async (row: any, update = false) => { + let report = null; + try { + report = await getStoreBankCardReportDetail(row.id); + } catch { + report = null; + } + bankCardReportModalApi.setData({ + storeId: row.id, + storeName: row.name, + mode: update && report?.id ? 'update' : 'report', + report, + gridApi, + }); + bankCardReportModalApi.open(); +}; + +const openBankCardStatus = (row: any) => { + bankCardStatusModalApi.setData({ + storeId: row.id, + storeName: row.name, + }); + bankCardStatusModalApi.open(); +}; + +function getBankCardReportTagColor(status: number) { + switch (Number(status)) { + case 1: + return 'processing'; + case 2: + return 'success'; + case 3: + case 4: + return 'error'; + default: + return 'default'; + } +} + +function getBankCardReportTagText(row: any) { + return Number(row.bank_card_report_status) === 0 + ? '报备' + : row.bank_card_report_status_text || '未报备'; +} + +function handleBankCardReportColumnClick(row: any) { + const status = Number(row.bank_card_report_status ?? 0); + if (status === 1 || status === 2) { + openBankCardStatus(row); + return; + } + openBankCardReport(row, status !== 0); +} + const showDrugPriceModal = (row: any) => { drugPriceModalApi.setData({ store_id: row.id, @@ -258,6 +323,8 @@ const batchSyncDrugPrice = () => { + diff --git a/apps/web-antd/src/views/system/store-bank-card/api/index.ts b/apps/web-antd/src/views/system/store-bank-card/api/index.ts new file mode 100644 index 00000000..af34ed86 --- /dev/null +++ b/apps/web-antd/src/views/system/store-bank-card/api/index.ts @@ -0,0 +1,43 @@ +import { requestClient } from '#/api/request'; + +const prefix = 'store-bank-card-report/'; + +export async function getStoreBankCardReportDetail(storeId: number) { + return requestClient.get(`${prefix}detail`, { + params: { store_id: storeId }, + }); +} + +export async function getSelectableBankCards(storeId: number) { + return requestClient.get<{ options: Array<{ value: string; label: string; payload: Record }> }>( + `${prefix}selectable-cards`, + { + params: { store_id: storeId }, + }, + ); +} + +export async function reportStoreBankCard(data: Record) { + return requestClient.post(`${prefix}report`, data); +} + +export async function updateStoreBankCard(data: Record) { + return requestClient.post(`${prefix}update`, data); +} + +export async function queryStoreBankCardStatus(data: { id: number }) { + return requestClient.post(`${prefix}query-status`, data); +} + +export async function syncStoreBankCardStatusByStore(storeId: number) { + return requestClient.post(`${prefix}sync-status-by-store`, { + store_id: storeId, + }); +} + +export async function migrateStoreBankCardToYiiStore(data: { + store_id: number; + report_id?: number; +}) { + return requestClient.post(`${prefix}migrate-bank-to-store`, data); +} diff --git a/apps/web-antd/src/views/system/store-bank-card/components/BankCardReportModal.vue b/apps/web-antd/src/views/system/store-bank-card/components/BankCardReportModal.vue new file mode 100644 index 00000000..8862c548 --- /dev/null +++ b/apps/web-antd/src/views/system/store-bank-card/components/BankCardReportModal.vue @@ -0,0 +1,222 @@ + + + diff --git a/apps/web-antd/src/views/system/store-bank-card/components/BankCardStatusModal.vue b/apps/web-antd/src/views/system/store-bank-card/components/BankCardStatusModal.vue new file mode 100644 index 00000000..791fc3ad --- /dev/null +++ b/apps/web-antd/src/views/system/store-bank-card/components/BankCardStatusModal.vue @@ -0,0 +1,200 @@ + + + diff --git a/apps/web-antd/src/views/system/store-bank-card/config/constants.ts b/apps/web-antd/src/views/system/store-bank-card/config/constants.ts new file mode 100644 index 00000000..b5acf075 --- /dev/null +++ b/apps/web-antd/src/views/system/store-bank-card/config/constants.ts @@ -0,0 +1,10 @@ +export const EPL_TRANSFER_ACCOUNT_TYPE_OPTIONS = [ + { label: '对公账户', value: '1' }, + { label: '法人账户', value: '2' }, + { label: '授权对公账户', value: '3' }, + { label: '授权个人账户', value: '4' }, +]; + +export const USE_TYPE_TRANSFER = '2'; + +export const USE_TYPE_TRANSFER_TEXT = '转账卡'; diff --git a/apps/web-antd/src/views/system/store-bank-card/config/form.ts b/apps/web-antd/src/views/system/store-bank-card/config/form.ts new file mode 100644 index 00000000..5edd79b5 --- /dev/null +++ b/apps/web-antd/src/views/system/store-bank-card/config/form.ts @@ -0,0 +1,157 @@ +import type { VbenFormProps } from '#/adapter/form'; + +import { + EPL_TRANSFER_ACCOUNT_TYPE_OPTIONS, + USE_TYPE_TRANSFER, +} from './constants'; + +export const bankCardReportFormProps: VbenFormProps = { + wrapperClass: 'grid-cols-12', + commonConfig: { + formItemClass: 'col-span-12', + componentProps: { + class: 'w-full', + }, + }, + layout: 'horizontal', + schema: [ + { + component: 'VbenInput', + fieldName: 'id', + label: 'ID', + dependencies: { show: false, triggerFields: ['id'] }, + }, + { + component: 'VbenInput', + fieldName: 'store_id', + label: '门店ID', + dependencies: { show: false, triggerFields: ['store_id'] }, + }, + { + component: 'VbenInput', + fieldName: 'only_remark', + label: '仅备注', + dependencies: { show: false, triggerFields: ['only_remark'] }, + }, + { + component: 'VbenInput', + fieldName: 'use_type', + label: '报备卡用途', + defaultValue: USE_TYPE_TRANSFER, + dependencies: { show: false, triggerFields: ['use_type'] }, + }, + { + component: 'VbenInput', + componentProps: { + disabled: true, + placeholder: '转账卡(useType=2)', + }, + fieldName: 'use_type_display', + label: '报备卡用途', + defaultValue: '转账卡(useType=2)', + dependencies: { + show: (values) => !values.only_remark, + triggerFields: ['only_remark'], + }, + }, + { + component: 'VbenInput', + componentProps: { placeholder: '请输入开户人姓名' }, + fieldName: 'bank_user_name', + label: '开户人姓名', + rules: 'required', + dependencies: { + show: (values) => !values.only_remark, + triggerFields: ['only_remark'], + }, + }, + { + component: 'VbenInput', + componentProps: { placeholder: '请输入银行卡号' }, + fieldName: 'bank_card', + label: '银行卡号', + rules: 'required', + dependencies: { + show: (values) => !values.only_remark, + triggerFields: ['only_remark'], + }, + }, + { + component: 'VbenInput', + componentProps: { + placeholder: '转账卡必填,参考易票联银行名称规范', + }, + fieldName: 'bank_name', + label: '开户银行名称', + rules: 'required', + dependencies: { + show: (values) => !values.only_remark, + triggerFields: ['only_remark'], + }, + }, + { + component: 'RadioGroup', + componentProps: { + options: EPL_TRANSFER_ACCOUNT_TYPE_OPTIONS, + }, + fieldName: 'account_type', + label: '账户类型', + rules: 'required', + defaultValue: '2', + dependencies: { + show: (values) => !values.only_remark, + triggerFields: ['only_remark'], + }, + }, + { + component: 'VbenInput', + componentProps: { + placeholder: '对公/授权对公账户必填;其他卡号非 62 开头必填', + }, + fieldName: 'bank_no', + label: '银联行号', + dependencies: { + show: (values) => !values.only_remark, + triggerFields: ['only_remark', 'account_type'], + }, + }, + { + component: 'VbenInput', + componentProps: { + placeholder: '选填;对公/授权对公填营业执照号,法人/授权个人填身份证号', + }, + fieldName: 'cert_no', + label: '证件号码', + dependencies: { + show: (values) => !values.only_remark, + triggerFields: ['only_remark', 'account_type'], + }, + }, + { + component: 'UploadOssFile', + componentProps: { + maxCount: 1, + }, + fieldName: 'attachment', + label: '合同附件', + rules: 'required', + dependencies: { + show: (values) => !values.only_remark && !values.id, + triggerFields: ['only_remark', 'id'], + }, + }, + { + component: 'VbenInput', + componentProps: { placeholder: '备注' }, + fieldName: 'remark', + label: '备注', + }, + { + component: 'VbenInput', + componentProps: { placeholder: '摘要' }, + fieldName: 'summary', + label: '摘要', + }, + ], + showDefaultActions: false, +}; diff --git a/apps/web-antd/src/views/system/store-input/config/form.ts b/apps/web-antd/src/views/system/store-input/config/form.ts index 05b4e98a..89c7dc41 100644 --- a/apps/web-antd/src/views/system/store-input/config/form.ts +++ b/apps/web-antd/src/views/system/store-input/config/form.ts @@ -239,73 +239,6 @@ export const modalFormProps: VbenFormProps = { suffix: () => '%', defaultValue: 100, }, - { - component: 'Divider', - fieldName: '', - label: 'x', - rules: 'required', - hideLabel: true, - renderComponentContent: () => { - return { - default: () => { - return '银行卡信息'; - }, - }; - }, - }, - { - component: 'VbenInput', - formItemClass: 'col-span-6', - componentProps: { - placeholder: '请输入开户人姓名', - }, - fieldName: 'bank_user_name', - label: '开户人姓名', - rules: 'required', - }, - { - component: 'VbenInput', - formItemClass: 'col-span-6', - componentProps: { - placeholder: '请输入银行卡号', - }, - fieldName: 'bank_card', - label: '银行卡号', - rules: 'required', - }, - { - component: 'VbenInput', - formItemClass: 'col-span-6', - componentProps: { - placeholder: '请输入开户行', - }, - fieldName: 'bank_name', - label: '开户行', - rules: 'required', - }, - { - component: 'VbenInput', - formItemClass: 'col-span-6', - componentProps: { - placeholder: '请输入银联行号', - }, - fieldName: 'bank_no', - label: '银联行号', - }, - { - component: 'RadioGroup', - componentProps: { - options: [ - { label: '对公', value: 1 }, - { label: '对私', value: 2 }, - { label: '存折', value: 5 }, - ], - placeholder: '请选择银行账户类型', - }, - fieldName: 'bank_account_type', - label: '银行账户类型', - rules: 'required', - }, ], showDefaultActions: false, }; diff --git a/apps/web-antd/src/views/system/store/config/form.ts b/apps/web-antd/src/views/system/store/config/form.ts index abe73f0c..0feb7e3d 100644 --- a/apps/web-antd/src/views/system/store/config/form.ts +++ b/apps/web-antd/src/views/system/store/config/form.ts @@ -287,109 +287,6 @@ export const modalFormProps: VbenFormProps = { // label: '颗粒药销售比例', // rules: 'required', // }, - { - component: 'Divider', - fieldName: '', - label: 'x', - rules: 'required', - hideLabel: true, - dependencies: { - show: (values) => { - return values.id == null; - }, - triggerFields: ['id'], - }, - renderComponentContent: () => { - return { - default: () => { - return '银行卡信息'; - }, - }; - }, - }, - { - component: 'VbenInput', - formItemClass: 'col-span-6', - componentProps: { - placeholder: '请输入开户人姓名', - }, - dependencies: { - show: (values) => { - return values.id == null; - }, - triggerFields: ['id'], - }, - fieldName: 'bank_user_name', - label: '开户人姓名', - rules: 'required', - }, - { - component: 'VbenInput', - formItemClass: 'col-span-6', - componentProps: { - placeholder: '请输入银行卡号', - }, - dependencies: { - show: (values) => { - return values.id == null; - }, - triggerFields: ['id'], - }, - fieldName: 'bank_card', - label: '银行卡号', - rules: 'required', - }, - { - component: 'VbenInput', - formItemClass: 'col-span-6', - componentProps: { - placeholder: '请输入开户行', - }, - dependencies: { - show: (values) => { - return values.id == null; - }, - triggerFields: ['id'], - }, - fieldName: 'bank_name', - label: '开户行', - rules: 'required', - }, - { - component: 'VbenInput', - formItemClass: 'col-span-6', - componentProps: { - placeholder: '请输入银联行号', - }, - dependencies: { - show: (values) => { - return values.id == null; - }, - triggerFields: ['id'], - }, - fieldName: 'bank_no', - label: '银联行号', - }, - { - component: 'RadioGroup', - componentProps: { - options: [ - { label: '对公', value: 1 }, - { label: '对私', value: 2 }, - { label: '存折', value: 5 }, - ], - placeholder: '请选择银行账户类型', - }, - dependencies: { - show: (values) => { - return values.id == null; - }, - triggerFields: ['id'], - }, - fieldName: 'bank_account_type', - label: '银行账户类型', - rules: 'required', - }, ], showDefaultActions: false, }; 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 a14f0ec2..96a8495b 100644 --- a/apps/web-antd/src/views/system/store/config/table.ts +++ b/apps/web-antd/src/views/system/store/config/table.ts @@ -46,6 +46,13 @@ export const gridOptions: VxeGridProps = { slots: { default: 'is_shipping_free' }, width: 120, }, + { + field: 'bank_card_report_status', + align: 'left', + title: '银行卡报备', + slots: { default: 'bank_card_report_status' }, + width: 120, + }, { // 订阅价格波动列(显示为开关) field: 'subscribe_price_change', diff --git a/apps/web-antd/src/views/system/store/index.vue b/apps/web-antd/src/views/system/store/index.vue index cd733dcf..80165894 100644 --- a/apps/web-antd/src/views/system/store/index.vue +++ b/apps/web-antd/src/views/system/store/index.vue @@ -32,6 +32,9 @@ 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 BankCardReportModal from '#/views/system/store-bank-card/components/BankCardReportModal.vue'; +import BankCardStatusModal from '#/views/system/store-bank-card/components/BankCardStatusModal.vue'; +import { getStoreBankCardReportDetail } from '#/views/system/store-bank-card/api'; import { formOptions } from './config/search'; import { gridOptions } from './config/table'; @@ -99,6 +102,68 @@ const [StoreExternalFieldModalComponent, storeExternalFieldModalApi] = useVbenMo connectedComponent: StoreExternalFieldModal, }); +const [BankCardReportModalComponent, bankCardReportModalApi] = useVbenModal({ + connectedComponent: BankCardReportModal, +}); + +const [BankCardStatusModalComponent, bankCardStatusModalApi] = useVbenModal({ + connectedComponent: BankCardStatusModal, +}); + +const openBankCardReport = async (row: any, update = false) => { + let report = null; + try { + report = await getStoreBankCardReportDetail(row.id); + } catch { + report = null; + } + bankCardReportModalApi.setData({ + storeId: row.id, + storeName: row.name, + mode: update && report?.id ? 'update' : 'report', + report, + gridApi, + }); + bankCardReportModalApi.open(); +}; + +const openBankCardStatus = (row: any) => { + bankCardStatusModalApi.setData({ + storeId: row.id, + storeName: row.name, + }); + bankCardStatusModalApi.open(); +}; + +function getBankCardReportTagColor(status: number) { + switch (Number(status)) { + case 1: + return 'processing'; + case 2: + return 'success'; + case 3: + case 4: + return 'error'; + default: + return 'default'; + } +} + +function getBankCardReportTagText(row: any) { + return Number(row.bank_card_report_status) === 0 + ? '报备' + : row.bank_card_report_status_text || '未报备'; +} + +function handleBankCardReportColumnClick(row: any) { + const status = Number(row.bank_card_report_status ?? 0); + if (status === 1 || status === 2) { + openBankCardStatus(row); + return; + } + openBankCardReport(row, status !== 0); +} + const showStoreExternalFieldModal = ( row: any, field: 'erp_id' | 'mes_id', @@ -285,6 +350,8 @@ const handleSwitchClinicType = (row: any) => { +