| | |
| | | { key: 'quality', title: '种子质检', hint: '袋码、托盘与批次', icon: 'scan', permission: 'mes:qc-seed-quality:submit' }, |
| | | { key: 'quality-records', title: '质检记录', hint: '结果与不合格原因', icon: 'records', permission: 'mes:qc-seed-quality:query' }, |
| | | { key: 'sales', title: '销售出库', hint: '拣货、运单与出库', icon: 'box', permission: 'mes:wm-product-sales:query' }, |
| | | { key: 'productissue', title: '生产领料', hint: '扫码领用物料', icon: 'work', permission: 'mes:wm-product-issue:create' }, |
| | | { key: 'miscissue', title: '其他出库', hint: '扫码新增出库明细', icon: 'box', permission: 'mes:wm-misc-issue:create' }, |
| | | { key: 'transfer', title: '库存移库', hint: '扫码新增移库明细', icon: 'layers', permission: 'mes:wm-transfer:create' }, |
| | | { key: 'stocktaking', title: '盘点任务', hint: '扫码提交盘点数量', icon: 'records', permission: 'mes:wm-stock-taking-task:update' }, |
| | | { key: 'returnsales', title: '销售退货', hint: '扫码新增退货明细', icon: 'back', permission: 'mes:wm-return-sales:create' }, |
| | | { key: 'returnissue', title: '生产退料', hint: '扫码新增退料明细', icon: 'warehouse', permission: 'mes:wm-return-issue:create' }, |
| | | ] as const; |
| | | export function can(permission: string) { return useAccessStore().accessCodes.includes(permission); } |
| | | export function availableFeatures() { |
| | |
| | | if (key === 'records') return can('mes:pro-scan-in:query') && useAccessStore().accessMenus.some(m => m.path === '/mobile/inbound'); |
| | | return availableFeatures().some(f => f.key === key); |
| | | } |
| | | export function extractCode(raw: string) { |
| | | let value = raw.trim(); |
| | | if (!value) throw new Error('请扫描或输入码值'); |
| | | if (/^https?:\/\//i.test(value)) { |
| | | const code = new URL(value).searchParams.get('code'); |
| | | if (!code) throw new Error('该链接不包含业务码值'); |
| | | value = code.trim(); |
| | | } |
| | | if (!value || value.length > 64 || /\s/.test(value)) throw new Error('码值格式不正确'); |
| | | return value; |
| | | } |
| | | export { extractCode } from '#/utils/traceCode'; |