Bläddra i källkod

提供平台能力

cc12458 4 månader sedan
förälder
incheckning
073627f2eb

+ 1 - 1
.env/.env.production

@@ -1,3 +1,3 @@
-APP_BASE=/
+APP_BASE=/pharmacy/pda/
 
 APP_API_PROXY=https://wx.hzliuzhi.com

+ 1 - 0
@types/env.d.ts

@@ -2,6 +2,7 @@
 
 interface ImportMetaEnv {
   readonly SIX_TITLE?: string;
+  readonly SIX_API?: string;
 }
 
 interface ImportMeta {

+ 17 - 1
@types/global.d.ts

@@ -1,2 +1,18 @@
 export {};
-declare global {}
+declare global {
+  export interface Platform extends EventTarget {
+    addEventListener<K extends keyof PlatformEventMap>(type: K, listener: (this: Platform, ev: PlatformEventMap[K]) => void): void;
+
+    removeEventListener<K extends keyof PlatformEventMap>(type: K, listener: (this: Platform, ev: PlatformEventMap[K]) => void): void;
+  }
+
+  export interface PlatformEventMap {
+    scan: CustomEvent<{ code: string; type?: number; message?: string }>;
+  }
+
+  interface Window {
+    platform: Platform;
+  }
+
+  declare const platform: Platform;
+}

+ 1 - 1
request/file.request.ts

@@ -8,7 +8,7 @@ import router from '@/router';
 const FileHttpClient = createAlova({
   requestAdapter: adapterFetch(),
   statesHook: VueHook,
-  baseURL: '/manager/file/',
+  baseURL: `${ import.meta.env.SIX_API ?? '' }/manager/file/`,
   async beforeRequest(method) {
     if (!method.config.meta?.ignoreToken) {
       method.config.headers.Authorization ??= useAccountStore(pinia).token;

+ 1 - 1
request/pharmacy.request.ts

@@ -8,7 +8,7 @@ import router from '@/router';
 const PharmacyHttpClient = createAlova({
   requestAdapter: adapterFetch(),
   statesHook: VueHook,
-  baseURL: '/manager/yfc-admin/',
+  baseURL: `${ import.meta.env.SIX_API ?? '' }/manager/yfc-admin/`,
   async beforeRequest(method) {
     if (!method.config.meta?.ignoreToken) {
       method.config.headers.Authorization ??= useAccountStore(pinia).token;

+ 1 - 1
request/system.request.ts

@@ -6,7 +6,7 @@ import pinia, { useAccountStore } from '@/stores';
 const SystemHttpClient = createAlova({
   requestAdapter: adapterFetch(),
   statesHook: VueHook,
-  baseURL: '/manager/system/',
+  baseURL: `${ import.meta.env.SIX_API ?? '' }/manager/system/`,
   async beforeRequest(method) {
     if (!method.config.meta?.ignoreToken) method.config.headers.Authorization ??= useAccountStore(pinia).token;
   },

+ 1 - 0
src/core/launch/index.ts

@@ -23,3 +23,4 @@ export default async function launch(component: Component, ...launcher: (Launche
 }
 
 export { debugLaunch } from './debug.launch.ts';
+export { platformLaunch } from './platform.launch.ts';

+ 7 - 0
src/core/launch/platform.launch.ts

@@ -0,0 +1,7 @@
+import type { Launcher } from '@/core/launch';
+
+export function platformLaunch(): Launcher {
+  return async () => {
+    window.platform ??= new EventTarget();
+  };
+}

+ 2 - 1
src/main.ts

@@ -4,10 +4,11 @@ import 'vant/es/toast/style'
 import 'vant/es/notify/style'
 
 import App from './App.vue';
-import launch, { debugLaunch } from '@/core/launch';
+import launch, { debugLaunch, platformLaunch } from '@/core/launch';
 
 launch(App, [
   debugLaunch('debug', true),
+  platformLaunch()
 ]).then(
   (app) => {
     app.use(Lazyload, { lazyComponent: true });

+ 16 - 0
src/pages/StepPage.vue

@@ -3,6 +3,7 @@ import { useStepStore } from '@/stores';
 import { useRequest } from 'alova/client';
 import { getDataMethod } from '@/api/pda.api.ts';
 import { defaultMenus } from '@/model/menu.model.ts';
+import { tryOnBeforeMount, tryOnUnmounted } from '@vueuse/core';
 
 const router = useRouter();
 const route = useRoute();
@@ -17,6 +18,21 @@ const loaded = computed(() => !!data.value?.no);
 const readonly = ref(false);
 const keyword = ref<string>(dataset.value?.no ?? '');
 
+const ignoreParentScanner = ref(false);
+provide('ignoreParentScanner', ignoreParentScanner);
+const update = (event: PlatformEventMap['scan']) => {
+  if (ignoreParentScanner.value) {
+    event.stopPropagation();
+    event.preventDefault();
+  } else {
+    keyword.value = event.detail.code;
+    const toast = showLoadingToast({ message: '查询中...', duration: 0 });
+    search().finally(() => toast.close());
+  }
+};
+tryOnBeforeMount(() => platform?.addEventListener('scan', update));
+tryOnUnmounted(() => platform?.removeEventListener('scan', update));
+
 const {
   data,
   loading,

+ 2 - 0
src/themes/index.css

@@ -1,6 +1,8 @@
 @import "tailwindcss";
+@import "./legacy.css";
 
 #app {
   height: 100vh;
   overflow: hidden;
 }
+

+ 144 - 0
src/themes/legacy.css

@@ -0,0 +1,144 @@
+
+:root, :host {--font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing: .25rem;--container-sm: 24rem;--text-xl: 1.25rem;--text-xl--line-height: calc(1.75 / 1.25);--default-font-family: var(--font-sans);--default-mono-font-family: var(--font-mono)}
+
+*, :after, :before, ::backdrop {box-sizing: border-box;border: 0 solid;margin: 0;padding: 0}
+
+::file-selector-button {box-sizing: border-box;border: 0 solid;margin: 0;padding: 0}
+
+html, :host {-webkit-text-size-adjust: 100%;tab-size: 4;line-height: 1.5;font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings: var(--default-font-feature-settings, normal);font-variation-settings: var(--default-font-variation-settings, normal);-webkit-tap-highlight-color: transparent}
+
+hr {height: 0;color: inherit;border-top-width: 1px}
+
+abbr:where([title]) {-webkit-text-decoration: underline dotted;text-decoration: underline dotted}
+
+h1, h2, h3, h4, h5, h6 {font-size: inherit;font-weight: inherit}
+
+a {color: inherit;-webkit-text-decoration: inherit;text-decoration: inherit}
+
+b, strong {font-weight: bolder}
+
+code, kbd, samp, pre {font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings: var(--default-mono-font-feature-settings, normal);font-variation-settings: var(--default-mono-font-variation-settings, normal);font-size: 1em}
+
+small {font-size: 80%}
+
+sub, sup {vertical-align: baseline;font-size: 75%;line-height: 0;position: relative}
+
+sub {bottom: -.25em}
+
+sup {top: -.5em}
+
+table {text-indent: 0;border-color: inherit;border-collapse: collapse}
+
+:-moz-focusring {outline: auto}
+
+progress {vertical-align: baseline}
+
+summary {display: list-item}
+
+ol, ul, menu {list-style: none}
+
+img, svg, video, canvas, audio, iframe, embed, object {vertical-align: middle;display: block}
+
+img, video {max-width: 100%;height: auto}
+
+button, input, select, optgroup, textarea {font: inherit;font-feature-settings: inherit;font-variation-settings: inherit;letter-spacing: inherit;color: inherit;opacity: 1;background-color: rgba(0, 0, 0, 0);border-radius: 0}
+
+::file-selector-button {font: inherit;font-feature-settings: inherit;font-variation-settings: inherit;letter-spacing: inherit;color: inherit;opacity: 1;background-color: rgba(0, 0, 0, 0);border-radius: 0}
+
+:where(select:is([multiple],[size])) optgroup {font-weight: bolder}
+
+:where(select:is([multiple],[size])) optgroup option {padding-inline-start: 20px}
+
+::file-selector-button {margin-inline-end: 4px}
+
+::placeholder {opacity: 1}
+
+@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px) {
+  ::placeholder {color: color-mix(in oklab, currentColor 50%, transparent)}
+}
+
+textarea {resize: vertical}
+
+::-webkit-search-decoration {-webkit-appearance: none}
+
+::-webkit-date-and-time-value {min-height: 1lh;text-align: inherit}
+
+::-webkit-datetime-edit {display: inline-flex}
+
+::-webkit-datetime-edit-fields-wrapper {padding: 0}
+
+::-webkit-datetime-edit {padding-block: 0}
+
+::-webkit-datetime-edit-year-field {padding-block: 0}
+
+::-webkit-datetime-edit-month-field {padding-block: 0}
+
+::-webkit-datetime-edit-day-field {padding-block: 0}
+
+::-webkit-datetime-edit-hour-field {padding-block: 0}
+
+::-webkit-datetime-edit-minute-field {padding-block: 0}
+
+::-webkit-datetime-edit-second-field {padding-block: 0}
+
+::-webkit-datetime-edit-millisecond-field {padding-block: 0}
+
+::-webkit-datetime-edit-meridiem-field {padding-block: 0}
+
+:-moz-ui-invalid {box-shadow: none}
+
+button, input:where([type=button],[type=reset],[type=submit]) {-webkit-appearance: button;appearance: button}
+
+::file-selector-button {-webkit-appearance: button;appearance: button}
+
+::-webkit-inner-spin-button {height: auto}
+
+::-webkit-outer-spin-button {height: auto}
+
+[hidden]:where(:not([hidden=until-found])) {display: none !important}
+
+.static {position: static}
+
+.m-auto {margin: auto}
+
+.my-4 {margin-block: calc(var(--spacing) * 4)}
+
+.mt-8 {margin-top: calc(var(--spacing) * 8)}
+
+.block {display: block}
+
+.flex {display: flex}
+
+.table {display: table}
+
+.size-full {width: 100%;height: 100%}
+
+.w-24 {width: calc(var(--spacing) * 24)}
+
+.w-full {width: 100%}
+
+.max-w-sm {max-width: var(--container-sm)}
+
+.min-w-\[600px\] {min-width: 600px}
+
+.flex-auto {flex: auto}
+
+.flex-none {flex: none}
+
+.border-collapse {border-collapse: collapse}
+
+.flex-col {flex-direction: column}
+
+.overflow-hidden {overflow: hidden}
+
+.border {border-style: var(--tw-border-style);border-width: 1px}
+
+.p-4 {padding: calc(var(--spacing) * 4)}
+
+.px-4 {padding-inline: calc(var(--spacing) * 4)}
+
+.py-4 {padding-block: calc(var(--spacing) * 4)}
+
+.text-center {text-align: center}
+
+.text-xl {font-size: var(--text-xl);line-height: var(--tw-leading, var(--text-xl--line-height))}