This commit is contained in:
2026-06-04 17:51:11 +08:00
parent 65033666ef
commit c6a8bc39da
22 changed files with 39 additions and 41 deletions
+1 -2
View File
@@ -83,8 +83,6 @@ import { useRouter } from 'vue-router'
import { apiRequest } from '@/shared/api'
import { Chart, registerables } from 'chart.js'
Chart.register(...registerables)
const router = useRouter()
const chartCanvas = ref<HTMLCanvasElement | null>(null)
let chartInstance: Chart | null = null
@@ -206,6 +204,7 @@ const renderChart = () => {
}
onMounted(() => {
Chart.register(...registerables)
loadAluminumPrice()
})
</script>
@@ -1,5 +1,5 @@
<script setup lang="ts">
import { ref, computed } from 'vue'
import { ref, computed, onMounted } from 'vue'
import { useInventory } from '../composables/useInventory'
import { handleApiError } from '@/shared/notification'
@@ -34,6 +34,10 @@ function refreshFinance() {
loadFinance()
}
onMounted(() => {
refreshFinance()
})
const totalReceivable = computed(() => {
return state.financeSummary?.total_receivable ?? 0
})
@@ -65,8 +69,6 @@ function getTransactionStatusLabel(status: string): string {
}
return map[status] || status
}
refreshFinance()
</script>
<template>
@@ -155,8 +157,8 @@ refreshFinance()
<el-table-column label="应收余额">
<template #default="{ row }">{{ formatCurrency(row.receivable_balance) }}</template>
</el-table-column>
<el-empty v-if="!state.loading && state.customerFinanceStatement.length === 0" description="暂无数据" />
</el-table>
<el-empty v-if="!state.loading && state.customerFinanceStatement.length === 0" description="暂无数据" />
</el-card>
<el-card style="margin-bottom: 16px;">
@@ -179,8 +181,8 @@ refreshFinance()
<el-table-column label="应付余额">
<template #default="{ row }">{{ formatCurrency(row.payable_balance) }}</template>
</el-table-column>
<el-empty v-if="!state.loading && state.supplierFinanceStatement.length === 0" description="暂无数据" />
</el-table>
<el-empty v-if="!state.loading && state.supplierFinanceStatement.length === 0" description="暂无数据" />
</el-card>
<el-card style="margin-bottom: 16px;">
@@ -202,8 +204,8 @@ refreshFinance()
<el-table-column label="未结款">
<template #default="{ row }">{{ formatCurrency(row.unsettled_amount) }}</template>
</el-table-column>
<el-empty v-if="!state.loading && state.customerProductStatement.length === 0" description="暂无数据" />
</el-table>
<el-empty v-if="!state.loading && state.customerProductStatement.length === 0" description="暂无数据" />
</el-card>
<el-card style="margin-bottom: 16px;">
@@ -225,8 +227,8 @@ refreshFinance()
<el-table-column label="未结款">
<template #default="{ row }">{{ formatCurrency(row.unsettled_amount) }}</template>
</el-table-column>
<el-empty v-if="!state.loading && state.supplierProductStatement.length === 0" description="暂无数据" />
</el-table>
<el-empty v-if="!state.loading && state.supplierProductStatement.length === 0" description="暂无数据" />
</el-card>
<el-card>
@@ -256,8 +258,8 @@ refreshFinance()
<el-table-column label="日期">
<template #default="{ row }">{{ formatDate(row.transaction_date) }}</template>
</el-table-column>
<el-empty v-if="!state.loading && state.financeTransactions.length === 0" description="暂无数据" />
</el-table>
<el-empty v-if="!state.loading && state.financeTransactions.length === 0" description="暂无数据" />
</el-card>
</div>
</template>
@@ -197,8 +197,8 @@ function closeRestockModal() {
<el-button type="danger" size="small" @click="deleteMaterial(row.id)">删除</el-button>
</template>
</el-table-column>
<el-empty v-if="!state.loading && state.materials.length === 0" description="暂无物料数据" />
</el-table>
<el-empty v-if="!state.loading && state.materials.length === 0" description="暂无物料数据" />
<el-dialog
v-model="showModal"
@@ -148,8 +148,8 @@ function closeModal() {
<el-button type="danger" size="small" @click="deleteProduct(row.id)">删除</el-button>
</template>
</el-table-column>
<el-empty v-if="!state.loading && state.finishedProducts.length === 0" description="暂无成品数据" />
</el-table>
<el-empty v-if="!state.loading && state.finishedProducts.length === 0" description="暂无成品数据" />
<el-dialog
v-model="showModal"
@@ -1,5 +1,5 @@
<script setup lang="ts">
import { ref, computed } from 'vue'
import { ref, computed, onMounted } from 'vue'
import { useInventory } from '../composables/useInventory'
import { apiRequest } from '@/shared/api'
import { addNotification, handleApiError } from '@/shared/notification'
@@ -232,12 +232,14 @@ function closeReceiveModal() {
}
async function initData() {
await loadPurchaseOrders()
await loadMaterials()
await loadSuppliers()
await loadPurchaseOrders()
}
initData()
onMounted(() => {
initData()
})
</script>
<template>
@@ -324,8 +326,8 @@ initData()
</el-button>
</template>
</el-table-column>
<el-empty v-if="!state.loading && state.purchaseOrders.length === 0" description="暂无采购订单" />
</el-table>
<el-empty v-if="!state.loading && state.purchaseOrders.length === 0" description="暂无采购订单" />
<el-dialog
v-model="showModal"
@@ -1,5 +1,5 @@
<script setup lang="ts">
import { ref, computed } from 'vue'
import { ref, computed, onMounted } from 'vue'
import { useInventory } from '../composables/useInventory'
import { apiRequest } from '@/shared/api'
import { addNotification, handleApiError } from '@/shared/notification'
@@ -260,13 +260,15 @@ function closeConsumptionModal() {
}
async function initData() {
await loadProductionOrders()
await loadCustomers()
await loadMaterials()
await loadFinishedProducts()
await loadProductionOrders()
}
initData()
onMounted(() => {
initData()
})
</script>
<template>
@@ -344,8 +346,8 @@ initData()
</el-button>
</template>
</el-table-column>
<el-empty v-if="!state.loading && state.productionOrders.length === 0" description="暂无销售订单" />
</el-table>
<el-empty v-if="!state.loading && state.productionOrders.length === 0" description="暂无销售订单" />
<el-dialog
v-model="showModal"
@@ -383,7 +383,6 @@ const uploadFile = async () => {
}
const startPolling = async (taskId: string) => {
console.log('[Polling] 开始轮询任务:', taskId)
state.polling = true
state.progress = 10
let pollCount = 0
@@ -146,7 +146,7 @@
></iframe>
</div>
<div id="preview-3d" v-else class="viewer-section viewer-section-hero">
<div id="preview-3d-placeholder" v-else class="viewer-section viewer-section-hero">
<div class="summary-header">
<h3>3D 预览</h3>
<span class="badge badge-warning">未生成</span>
@@ -631,14 +631,8 @@ const camControllerOptions = [
]
const loadTask = async () => {
console.log('[ResultView] loadTask 开始, taskId:', route.params.taskId)
try {
state.task = await apiRequest<TaskData>(`/api/status/${route.params.taskId}`, { method: 'POST' })
console.log('任务数据:', state.task)
console.log('key_info:', state.task.key_info)
console.log('cavity_data:', state.task.cavity_data)
console.log('analysis_result:', state.task.analysis_result)
console.log('geometry_data:', (state.task as any).geometry_data)
if (state.task?.best_scheme_id) {
state.selectedSchemeId = state.task.best_scheme_id
} else if (state.task?.candidate_schemes?.length) {
@@ -1 +1 @@
import{D as e,g as t,t as n,y as r}from"./index-DLhcHKuU.js";var i={};function a(n,i){return e(),r(`div`,null,[...i[0]||=[t(`div`,{class:`page-header`},[t(`h1`,{class:`page-title`},`设计体系`),t(`p`,{class:`page-subtitle`},`迁移中...`)],-1)]])}var o=n(i,[[`render`,a]]);export{o as default};
import{D as e,g as t,t as n,y as r}from"./index-BZsdwppN.js";var i={};function a(n,i){return e(),r(`div`,null,[...i[0]||=[t(`div`,{class:`page-header`},[t(`h1`,{class:`page-title`},`设计体系`),t(`p`,{class:`page-subtitle`},`迁移中...`)],-1)]])}var o=n(i,[[`render`,a]]);export{o as default};
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
.hero-section[data-v-1a4785c1]{text-align:center;padding:var(--space-16) 0}.hero-title[data-v-1a4785c1]{font-size:var(--text-4xl);font-weight:var(--font-bold);color:var(--text-primary);margin-bottom:var(--space-4)}.hero-subtitle[data-v-1a4785c1]{font-size:var(--text-lg);color:var(--text-tertiary);max-width:600px;margin:0 auto var(--space-8)}.features-grid[data-v-1a4785c1]{gap:var(--space-6);margin-top:var(--space-12);grid-template-columns:repeat(auto-fit,minmax(280px,1fr));display:grid}.feature-card[data-v-1a4785c1]{background:var(--bg-primary);border:1px solid var(--border-light);border-radius:var(--radius-xl);padding:var(--space-6);text-align:left}.feature-card[style*=cursor][data-v-1a4785c1]:hover{border-color:var(--primary-200);box-shadow:var(--shadow-md);transition:all .2s;transform:translateY(-2px)}.feature-icon[data-v-1a4785c1]{background:var(--primary-50);border-radius:var(--radius-lg);width:40px;height:40px;color:var(--primary-500);font-size:var(--text-lg);margin-bottom:var(--space-4);justify-content:center;align-items:center;display:flex}.feature-title[data-v-1a4785c1]{font-size:var(--text-base);font-weight:var(--font-semibold);color:var(--text-primary);margin-bottom:var(--space-2)}.feature-desc[data-v-1a4785c1]{font-size:var(--text-sm);color:var(--text-tertiary);line-height:1.6}
.hero-section[data-v-dc82ceb2]{text-align:center;padding:var(--space-16) 0}.hero-title[data-v-dc82ceb2]{font-size:var(--text-4xl);font-weight:var(--font-bold);color:var(--text-primary);margin-bottom:var(--space-4)}.hero-subtitle[data-v-dc82ceb2]{font-size:var(--text-lg);color:var(--text-tertiary);max-width:600px;margin:0 auto var(--space-8)}.features-grid[data-v-dc82ceb2]{gap:var(--space-6);margin-top:var(--space-12);grid-template-columns:repeat(auto-fit,minmax(280px,1fr));display:grid}.feature-card[data-v-dc82ceb2]{background:var(--bg-primary);border:1px solid var(--border-light);border-radius:var(--radius-xl);padding:var(--space-6);text-align:left}.feature-card[style*=cursor][data-v-dc82ceb2]:hover{border-color:var(--primary-200);box-shadow:var(--shadow-md);transition:all .2s;transform:translateY(-2px)}.feature-icon[data-v-dc82ceb2]{background:var(--primary-50);border-radius:var(--radius-lg);width:40px;height:40px;color:var(--primary-500);font-size:var(--text-lg);margin-bottom:var(--space-4);justify-content:center;align-items:center;display:flex}.feature-title[data-v-dc82ceb2]{font-size:var(--text-base);font-weight:var(--font-semibold);color:var(--text-primary);margin-bottom:var(--space-2)}.feature-desc[data-v-dc82ceb2]{font-size:var(--text-sm);color:var(--text-tertiary);line-height:1.6}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{C as e,D as t,N as n,P as r,a as i,f as a,g as o,l as s,n as c,o as l,p as u,t as d,v as f,y as p,z as m}from"./index-DLhcHKuU.js";var h={class:`login-container`},g={class:`login-card`},_={class:`form-group`},v={class:`form-group`},y={key:0,class:`form-error`},b=[`disabled`],x=d(e({__name:`LoginView`,setup(e){let d=s(),x=r({username:``,password:``,error:``,loading:!1}),S=async()=>{x.error=``,x.loading=!0;try{let e=await l(`/api/auth/login/json`,{method:`POST`,body:JSON.stringify({username:x.username,password:x.password})});i(e.access_token,e.user),c(`登录成功`,`success`),d.push(`/`)}catch(e){x.error=e.message||`登录失败`}finally{x.loading=!1}};return(e,r)=>(t(),p(`div`,h,[o(`div`,g,[r[4]||=o(`div`,{class:`login-header`},[o(`div`,{class:`login-logo`},`G`),o(`h1`,{class:`login-title`},`Gemold`),o(`p`,{class:`login-subtitle`},`模具制造管理系统`)],-1),o(`form`,{onSubmit:u(S,[`prevent`])},[o(`div`,_,[r[2]||=o(`label`,{class:`form-label`},`用户名`,-1),n(o(`input`,{"onUpdate:modelValue":r[0]||=e=>x.username=e,type:`text`,class:`form-input`,placeholder:`请输入用户名`,required:``},null,512),[[a,x.username]])]),o(`div`,v,[r[3]||=o(`label`,{class:`form-label`},`密码`,-1),n(o(`input`,{"onUpdate:modelValue":r[1]||=e=>x.password=e,type:`password`,class:`form-input`,placeholder:`请输入密码`,required:``},null,512),[[a,x.password]])]),x.error?(t(),p(`div`,y,m(x.error),1)):f(``,!0),o(`button`,{type:`submit`,class:`btn btn-primary w-full mt-4`,disabled:x.loading},m(x.loading?`登录中...`:`登录`),9,b)],32)])]))}}),[[`__scopeId`,`data-v-01da5b35`]]);export{x as default};
import{C as e,D as t,N as n,P as r,a as i,f as a,g as o,l as s,n as c,o as l,p as u,t as d,v as f,y as p,z as m}from"./index-BZsdwppN.js";var h={class:`login-container`},g={class:`login-card`},_={class:`form-group`},v={class:`form-group`},y={key:0,class:`form-error`},b=[`disabled`],x=d(e({__name:`LoginView`,setup(e){let d=s(),x=r({username:``,password:``,error:``,loading:!1}),S=async()=>{x.error=``,x.loading=!0;try{let e=await l(`/api/auth/login/json`,{method:`POST`,body:JSON.stringify({username:x.username,password:x.password})});i(e.access_token,e.user),c(`登录成功`,`success`),d.push(`/`)}catch(e){x.error=e.message||`登录失败`}finally{x.loading=!1}};return(e,r)=>(t(),p(`div`,h,[o(`div`,g,[r[4]||=o(`div`,{class:`login-header`},[o(`div`,{class:`login-logo`},`G`),o(`h1`,{class:`login-title`},`Gemold`),o(`p`,{class:`login-subtitle`},`模具制造管理系统`)],-1),o(`form`,{onSubmit:u(S,[`prevent`])},[o(`div`,_,[r[2]||=o(`label`,{class:`form-label`},`用户名`,-1),n(o(`input`,{"onUpdate:modelValue":r[0]||=e=>x.username=e,type:`text`,class:`form-input`,placeholder:`请输入用户名`,required:``},null,512),[[a,x.username]])]),o(`div`,v,[r[3]||=o(`label`,{class:`form-label`},`密码`,-1),n(o(`input`,{"onUpdate:modelValue":r[1]||=e=>x.password=e,type:`password`,class:`form-input`,placeholder:`请输入密码`,required:``},null,512),[[a,x.password]])]),x.error?(t(),p(`div`,y,m(x.error),1)):f(``,!0),o(`button`,{type:`submit`,class:`btn btn-primary w-full mt-4`,disabled:x.loading},m(x.loading?`登录中...`:`登录`),9,b)],32)])]))}}),[[`__scopeId`,`data-v-01da5b35`]]);export{x as default};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{D as e,g as t,t as n,y as r}from"./index-DLhcHKuU.js";var i={};function a(n,i){return e(),r(`div`,null,[...i[0]||=[t(`div`,{class:`page-header`},[t(`h1`,{class:`page-title`},`灰度发布与回滚`),t(`p`,{class:`page-subtitle`},`迁移中...`)],-1)]])}var o=n(i,[[`render`,a]]);export{o as default};
import{D as e,g as t,t as n,y as r}from"./index-BZsdwppN.js";var i={};function a(n,i){return e(),r(`div`,null,[...i[0]||=[t(`div`,{class:`page-header`},[t(`h1`,{class:`page-title`},`灰度发布与回滚`),t(`p`,{class:`page-subtitle`},`迁移中...`)],-1)]])}var o=n(i,[[`render`,a]]);export{o as default};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -61,7 +61,7 @@
} catch (e) {}
})();
</script>
<script type="module" crossorigin src="/static/assets/index-DLhcHKuU.js"></script>
<script type="module" crossorigin src="/static/assets/index-BZsdwppN.js"></script>
<link rel="stylesheet" crossorigin href="/static/assets/index-O0fr6NFx.css">
</head>
<body>