diff --git a/apps/admin/src/components.d.ts b/apps/admin/src/components.d.ts index e39958f..1a61ff8 100644 --- a/apps/admin/src/components.d.ts +++ b/apps/admin/src/components.d.ts @@ -13,17 +13,22 @@ declare module 'vue' { export interface GlobalComponents { ElAlert: typeof import('element-plus/es')['ElAlert'] ElAside: typeof import('element-plus/es')['ElAside'] + ElBadge: typeof import('element-plus/es')['ElBadge'] ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb'] ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem'] ElButton: typeof import('element-plus/es')['ElButton'] ElCascader: typeof import('element-plus/es')['ElCascader'] ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup'] + ElCol: typeof import('element-plus/es')['ElCol'] + ElCollapse: typeof import('element-plus/es')['ElCollapse'] + ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem'] ElColorPicker: typeof import('element-plus/es')['ElColorPicker'] ElContainer: typeof import('element-plus/es')['ElContainer'] ElDescriptions: typeof import('element-plus/es')['ElDescriptions'] ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem'] ElDialog: typeof import('element-plus/es')['ElDialog'] + ElDrawer: typeof import('element-plus/es')['ElDrawer'] ElDropdown: typeof import('element-plus/es')['ElDropdown'] ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu'] @@ -41,10 +46,12 @@ declare module 'vue' { ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] ElOption: typeof import('element-plus/es')['ElOption'] ElOptionGroup: typeof import('element-plus/es')['ElOptionGroup'] + ElPagination: typeof import('element-plus/es')['ElPagination'] ElPopover: typeof import('element-plus/es')['ElPopover'] ElRadio: typeof import('element-plus/es')['ElRadio'] ElRadioButton: typeof import('element-plus/es')['ElRadioButton'] ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] + ElRow: typeof import('element-plus/es')['ElRow'] ElSelect: typeof import('element-plus/es')['ElSelect'] ElSwitch: typeof import('element-plus/es')['ElSwitch'] ElTable: typeof import('element-plus/es')['ElTable'] diff --git a/apps/admin/src/views/product-family/AutoGroupDialog.vue b/apps/admin/src/views/product-family/AutoGroupDialog.vue new file mode 100644 index 0000000..69fc070 --- /dev/null +++ b/apps/admin/src/views/product-family/AutoGroupDialog.vue @@ -0,0 +1,91 @@ + + + + + + + + + + {{ row.familyCode ?? '—' }} + + + + + + + {{ n }} + + + + + + 取消 + + 确认建族({{ groups.length }}) + + + + + + diff --git a/apps/admin/src/views/product-family/CustomMemberDialog.vue b/apps/admin/src/views/product-family/CustomMemberDialog.vue new file mode 100644 index 0000000..8eab76e --- /dev/null +++ b/apps/admin/src/views/product-family/CustomMemberDialog.vue @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 加一行 + + + + + 取消 + 创建并入族 + + + + + diff --git a/apps/admin/src/views/product-family/FamilyDetailDrawer.vue b/apps/admin/src/views/product-family/FamilyDetailDrawer.vue new file mode 100644 index 0000000..65b7af1 --- /dev/null +++ b/apps/admin/src/views/product-family/FamilyDetailDrawer.vue @@ -0,0 +1,326 @@ + + + + + + + + + {{ family.familyCode }} + {{ family.familyName }} + 待处理:上游已变化 + + + + 重算 + + + + + + + + + + + + + + + + + + + + + + 保存 + + + + + + + + + + + 添加成员 + + + 新建自定义成员 + + + + + + {{ row.logisticsLabel ?? '—' }} + + + {{ row.craftLabel ?? '—' }} + + + {{ row.warehouseLabel ?? '—' }} + + + + + {{ row.source === 'CUSTOM' ? '自建' : 'SDS' }} + + + + + + 主 + + + + + 移除 + + + + + + + + 尺码 {{ matrixSummary.sizes }} + 颜色 {{ matrixSummary.colors }} + 工艺 {{ matrixSummary.crafts }} + 物流 {{ matrixSummary.logistics }} + 共 {{ matrixSummary.rows }} 格 + + 起价 ¥{{ matrixSummary.minPrice }} + + + + + + + + + + {{ row.sizeName ?? row.sizeId }} + + + + + + + + + + + + + diff --git a/apps/admin/src/views/product-family/FamilyView.vue b/apps/admin/src/views/product-family/FamilyView.vue new file mode 100644 index 0000000..3ba046d --- /dev/null +++ b/apps/admin/src/views/product-family/FamilyView.vue @@ -0,0 +1,188 @@ + + + + + + + 搜索 + 自动成族 + 新建族 + + + + + + + {{ row.familyCode ?? '—' }} + + + + + + + {{ row._count.originGoods }} + + {{ row._count.originGoods }} + + + + {{ row._count.priceOverrides }} + + + + 自动 + 锁定 + + + + + 待处理(上游已变) + 正常 + + + + {{ new Date(row.updatedAt).toLocaleString() }} + + + + 详情 + + + + + + + + + + + + + + + + + + + + + + 取消 + 创建 + + + + + + diff --git a/apps/admin/src/views/product-family/PriceOverridePanel.vue b/apps/admin/src/views/product-family/PriceOverridePanel.vue new file mode 100644 index 0000000..7a195f6 --- /dev/null +++ b/apps/admin/src/views/product-family/PriceOverridePanel.vue @@ -0,0 +1,196 @@ + + + + + + + + + + + + + 尺码 \ 颜色 + {{ c.name }} + + + + + {{ s.name }} + + + (editing[`${s.key}|${c.key}`] = v ?? 0)" + @blur="saveEdit(s.key, c.key)" + @keyup.enter="saveEdit(s.key, c.key)" + /> + + ¥{{ rowOf(s.key, c.key)!.price }} + 改 + + + — + + + + + + + + 已设人工价({{ family.priceOverrides.length }}) + + + + {{ matrix?.sizes.find((s) => s.key === row.sizeId)?.name ?? row.sizeId }} + + + + + {{ matrix?.colors.find((c) => c.key === row.colorId)?.name ?? row.colorId }} + + + + + + + {{ row.derivedPrice ?? '—' }} + + + + {{ row.diff }} + — + + + + + + 删除 + + + + + + + + diff --git a/apps/admin/src/views/product-management/ProductManagementView.vue b/apps/admin/src/views/product-management/ProductManagementView.vue index 591d719..c4f1185 100644 --- a/apps/admin/src/views/product-management/ProductManagementView.vue +++ b/apps/admin/src/views/product-management/ProductManagementView.vue @@ -1,15 +1,17 @@