核价器+列表平台搜素+仪表盘数据
Some checks failed
CI / build (18.x) (push) Failing after 16m49s
CI / build (20.x) (push) Failing after 45m25s
CI / deploy-preview (push) Has been skipped
CI / lint (push) Failing after 43m26s
CI / test (push) Successful in 49m50s
CI / security (push) Successful in 36m55s

This commit is contained in:
97694731 2026-06-27 17:11:48 +08:00
parent 520712bfab
commit 62e3781ecf
13 changed files with 207 additions and 70 deletions

View File

@ -45,8 +45,10 @@ export const fetchEmployeeStats = async () => {
*/
export const fetchStoreInfo = async (params = {}) => {
const response = await request.get(`${ADMIN_BASE}/store-info`, { params })
const data = response?.data
return (data?.stores ?? []).map(item => ({
const data = response
console.log(data.data);
return (data?.data ?? []).map(item => ({
store_name: item.store_name ?? '-',
store_type: item.store_type ?? '-',
sale_count: item.sale_count ?? 0,

View File

@ -33,6 +33,7 @@ const normalizeListResponse = (payload) => {
* @param {string} [params.status] - 出库单状态
* @param {string} [params.warehouse_id] - 仓库ID
* @param {string} [params.customer_id] - 平台ID
* @param {string} [params.shop_type] - 平台类型 1拼多多 2孔夫子 5闲鱼
* @param {string} [params.sales_order_id] - 关联销售订单ID
* @param {string} [params.start_date] - 开始日期
* @param {string} [params.end_date] - 结束日期
@ -42,12 +43,13 @@ const normalizeListResponse = (payload) => {
* @param {string} [params.page_size] - 每页条数
* @returns {Promise<{ list: Array, total: number }>} 标准化后的出库单列表
*/
export const fetchOutboundList = async ({ out_no, status, warehouse_id, customer_id, sales_order_id, start_date, end_date, association_order_no, logistics_no, page, page_size }) => {
export const fetchOutboundList = async ({ out_no, status, warehouse_id, customer_id, shop_type, sales_order_id, start_date, end_date, association_order_no, logistics_no, page, page_size }) => {
const params = {
out_no: out_no || undefined,
status: status || undefined,
warehouse_id: warehouse_id || undefined,
customer_id: customer_id || undefined,
shop_type: shop_type || undefined,
sales_order_id: sales_order_id || undefined,
start_date: start_date || undefined,
end_date: end_date || undefined,

View File

@ -33,11 +33,11 @@ const normalizeListResponse = (payload) => {
* @param {string} [params.logistics_no] - 快递单号
* @returns {Promise<{ list: Array, total: number }>} 标准化后的销售订单列表
*/
export const fetchSalesOrderList = async ({ keyword, status, customer_id, warehouse_id, page, pageSize, sort_by, sort_order, association_order_no, logistics_no }) => {
export const fetchSalesOrderList = async ({ keyword, status, shop_type, warehouse_id, page, pageSize, sort_by, sort_order, association_order_no, logistics_no }) => {
const params = {
so_no: keyword || undefined,
status,
customer_id,
shop_type: shop_type || undefined,
warehouse_id,
page,
page_size: pageSize,
@ -143,10 +143,11 @@ export const returnSalesOrderItem = async (data) => {
* @param {string} [params.logistics_no] - 快递单号
* @returns {Promise<{list: Array, total: number}>}
*/
export const fetchSalesOrderDetails = async ({ page, pageSize, association_order_no, logistics_no }) => {
export const fetchSalesOrderDetails = async ({ page, pageSize, shop_type, association_order_no, logistics_no }) => {
const params = {
page,
page_size: pageSize,
shop_type: shop_type || undefined,
association_order_no: association_order_no || undefined,
logistics_no: logistics_no || undefined
}

View File

@ -38,11 +38,11 @@ const normalizeListResponse = (payload) => {
* @param {number} [params.pageSize] - 每页条数
* @returns {Promise<{ list: Array, total: number }>} 标准化后的发货单列表
*/
export const fetchShippingOrderList = async ({ check_no, status, customer_id, warehouse_id, sales_order_id, wave_task_id, association_order_no, logistics_no, page, pageSize }) => {
export const fetchShippingOrderList = async ({ check_no, status, shop_type, warehouse_id, sales_order_id, wave_task_id, association_order_no, logistics_no, page, pageSize }) => {
const params = {
check_no: check_no || undefined,
status,
customer_id,
shop_type: shop_type || undefined,
warehouse_id,
sales_order_id,
wave_task_id,
@ -62,6 +62,7 @@ export const fetchShippingOrderList = async ({ check_no, status, customer_id, wa
* @param {number} [params.page] - 页码默认1
* @param {number} [params.pageSize] - 每页条数默认20最大100
* @param {number} [params.customer_id] - 按平台ID筛选
* @param {number} [params.shop_type] - 按平台类型筛选1=拼多多 2=孔夫子 5=闲鱼
* @param {string} [params.shipping_no] - 按发货单号模糊搜索
* @param {number} [params.start_date] - 创建时间起始时间戳秒
* @param {number} [params.end_date] - 创建时间截止时间戳秒
@ -69,12 +70,13 @@ export const fetchShippingOrderList = async ({ check_no, status, customer_id, wa
* @param {string} [params.logistics_no] - 快递单号模糊搜索
* @returns {Promise<{ list: Array, total: number }>} 标准化后的发货单列表
*/
export const fetchShippingOrderDetailList = async ({ status, page, pageSize, customer_id, shipping_no, start_date, end_date, association_order_no, logistics_no }) => {
export const fetchShippingOrderDetailList = async ({ status, page, pageSize, customer_id, shop_type, shipping_no, start_date, end_date, association_order_no, logistics_no }) => {
const params = {
status,
page,
page_size: pageSize,
customer_id,
shop_type,
shipping_no: shipping_no || undefined,
start_date,
end_date,

View File

@ -14,8 +14,8 @@ const USE_MOCK = false // 设置为true使用模拟数据
// 创建axios实例
const request = axios.create({
// baseURL: import.meta.env.DEV ? '/api' : (import.meta.env.VITE_API_BASE || 'http://127.0.0.1:9090/api'),
// baseURL: import.meta.env.DEV ? '/api' : (import.meta.env.VITE_API_BASE || 'http://192.168.101.213:9090/api'),
baseURL: import.meta.env.DEV ? '/api' : (import.meta.env.VITE_API_BASE || 'https://psi.api.buzhiyushu.cn/api'),
baseURL: import.meta.env.DEV ? '/api' : (import.meta.env.VITE_API_BASE || 'http://192.168.101.213:9090/api'),
// baseURL: import.meta.env.DEV ? '/api' : (import.meta.env.VITE_API_BASE || 'https://psi.api.buzhiyushu.cn/api'),
timeout: 10000,
// 用 JSONbig 替代默认 JSON.parse保留大整数精度
transformResponse: [

View File

@ -130,7 +130,7 @@
</el-table-column>
<el-table-column label="价格" min-width="100" align="right">
<template #default="{ row }">
<span class="price">{{ row.price ? `¥${(row.price / 100).toFixed(2)}` : '-' }}</span>
<span class="price">{{ row.sale_price ? `¥${(row.sale_price / 100).toFixed(2)}` : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="创建时间" min-width="150" align="center">
@ -361,6 +361,8 @@ const loadStoreInfo = async () => {
params.store_name = storeName.value.trim()
}
storeInfo.value = await fetchStoreInfo(params)
console.log(storeInfo.value);
} catch (error) {
console.error('加载店铺信息失败:', error)
storeInfo.value = []

View File

@ -415,7 +415,10 @@ export default {
/** 通过自定义协议启动核价器 exe */
const handleOpenExe = () => {
window.location.href = 'kfzprice://launch'
const url = dir.value
? 'kfzprice://launch?dir=' + dir.value
: 'kfzprice://launch'
window.location.href = url
ElMessage.success({ message: '启动指令已发送', duration: 1000, customClass: 'scan-success-message' })
}

View File

@ -1,13 +1,24 @@
<template>
<div style="margin-bottom: 16px">
<el-steps :active="1" align-center>
<el-step title="销售订单" />
<el-step title="出库管理" />
<el-step title="发货单" />
<div class="step-bar-wrapper">
<el-steps :active="2" align-center finish-status="success" process-status="process">
<el-step>
<template #title>
<span class="step-link" @click="$router.push('/sales-order')">销售订单</span>
</template>
</el-step>
<el-step title="生成出库单" />
<el-step>
<template #title>
<span class="step-link" @click="$router.push('/outbound')">出库管理</span>
</template>
</el-step>
<el-step title="生成发货单" />
<el-step>
<template #title>
<span class="step-link" @click="$router.push('/shipping-order')">发货单</span>
</template>
</el-step>
</el-steps>
<div style="text-align: right; margin-top: 12px">
<el-button type="primary" @click="$router.push('/shipping-order')">下一步</el-button>
</div>
</div>
<el-card class="outbound-manager">
<template #header>
@ -28,8 +39,8 @@
<el-select v-model="searchParams.warehouse_id" placeholder="仓库" clearable style="width: 160px">
<el-option v-for="item in warehouseOptions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
<el-select v-model="searchParams.customer_id" placeholder="平台" clearable filterable style="width: 180px">
<el-option v-for="item in customerOptions" :key="item.id" :label="item.name" :value="item.id" />
<el-select v-model="searchParams.shop_type" placeholder="平台" clearable style="width: 180px">
<el-option v-for="item in shopTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<el-input v-model="searchParams.association_order_no" placeholder="第三方订单编号" clearable style="width: 200px"
@keyup.enter="handleSearch" />
@ -250,14 +261,14 @@ export default defineComponent({
keyword: string
status: number | null
warehouse_id: number | null
customer_id: number | null
shop_type: number | null
association_order_no: string
logistics_no: string
}>({
keyword: '',
status: null,
warehouse_id: null,
customer_id: null,
shop_type: null,
association_order_no: '',
logistics_no: ''
})
@ -291,6 +302,11 @@ export default defineComponent({
}
//
const shopTypeOptions = ref([
{ label: '闲鱼', value: 5 },
{ label: '孔夫子', value: 2 },
{ label: '拼多多', value: 1 }
])
const warehouseOptions = ref<any[]>([])
const customerOptions = ref<any[]>([])
const locationOptions = ref<any[]>([])
@ -374,7 +390,7 @@ export default defineComponent({
out_no: searchParams.keyword || undefined,
status: searchParams.status !== null ? String(searchParams.status) : undefined,
warehouse_id: searchParams.warehouse_id !== null ? String(searchParams.warehouse_id) : undefined,
customer_id: searchParams.customer_id !== null ? String(searchParams.customer_id) : undefined,
shop_type: searchParams.shop_type !== null ? searchParams.shop_type : undefined,
association_order_no: searchParams.association_order_no || undefined,
logistics_no: searchParams.logistics_no || undefined,
page: String(pagination.current),
@ -500,7 +516,7 @@ export default defineComponent({
searchParams.keyword = ''
searchParams.status = null
searchParams.warehouse_id = null
searchParams.customer_id = null
searchParams.shop_type = null
searchParams.association_order_no = ''
searchParams.logistics_no = ''
pagination.current = 1
@ -630,6 +646,7 @@ export default defineComponent({
formData,
formRules,
warehouseOptions,
shopTypeOptions,
customerOptions,
locationOptions,
salesOrderOptions,
@ -682,6 +699,26 @@ export default defineComponent({
</script>
<style scoped lang="scss">
/* 步骤条 */
.step-bar-wrapper {
background: #fff;
border-radius: 8px;
padding: 20px 40px;
margin-bottom: 16px;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.06);
.step-link {
color: #409eff;
cursor: pointer;
transition: color 0.2s;
&:hover {
color: #66b1ff;
text-decoration: underline;
}
}
}
.outbound-manager {
width: 100%;
}

View File

@ -19,8 +19,10 @@
:remote-method="loadWarehouses" :loading="warehouseLoading" style="width: 160px">
<el-option v-for="item in warehouseOptions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
<el-select v-model="searchParams.customer_id" placeholder="平台" clearable filterable style="width: 180px">
<el-option v-for="item in customerOptions" :key="item.id" :label="item.name" :value="item.id" />
<el-select v-model="searchParams.shop_type" placeholder="平台" clearable style="width: 180px">
<el-option label="闲鱼" :value="5" />
<el-option label="孔夫子" :value="2" />
<el-option label="拼多多" :value="1" />
</el-select>
<el-input v-model="searchParams.association_order_no" placeholder="第三方订单编号" clearable style="width: 200px"
@keyup.enter="handleSearch" />
@ -50,7 +52,7 @@
<template #default="{ row }">{{ row.items?.[0]?.product_code || '-' }}</template>
</el-table-column>
<el-table-column label="平台" min-width="120" align="center">
<template #default="{ row }">{{ row.sales_person || '-' }}</template>
<template #default="{ row }">{{ row.sales_person || '-' }}{{ row.shop_type_text || '-' }}</template>
</el-table-column>
<el-table-column label="单价" width="90" align="center">
<template #default="{ row }">
@ -254,14 +256,14 @@ export default defineComponent({
keyword: string
status: number | null
warehouse_id: number | null
customer_id: number | null
shop_type: number | null
association_order_no: string
logistics_no: string
}>({
keyword: '',
status: null,
warehouse_id: null,
customer_id: null,
shop_type: null,
association_order_no: '',
logistics_no: ''
})
@ -297,7 +299,6 @@ export default defineComponent({
//
const warehouseOptions = ref<any[]>([])
const warehouseLoading = ref<boolean>(false)
const customerOptions = ref<any[]>([])
// ID
const warehouseMap = ref<Record<string, string>>({})
@ -376,6 +377,7 @@ export default defineComponent({
const res = await fetchSalesOrderDetails({
page: pagination.current,
pageSize: pagination.pageSize,
shop_type: searchParams.shop_type !== null ? searchParams.shop_type : undefined,
association_order_no: searchParams.association_order_no,
logistics_no: searchParams.logistics_no
})
@ -400,7 +402,7 @@ export default defineComponent({
searchParams.keyword = ''
searchParams.status = null
searchParams.warehouse_id = null
searchParams.customer_id = null
searchParams.shop_type = null
searchParams.association_order_no = ''
searchParams.logistics_no = ''
pagination.current = 1
@ -586,7 +588,6 @@ export default defineComponent({
warehouseOptions,
warehouseLoading,
loadWarehouses,
customerOptions,
warehouseMap,
customerMap,
totalAmountYuan,

View File

@ -1,13 +1,24 @@
<template>
<div style="margin-bottom: 16px">
<el-steps :active="0" align-center>
<el-step title="销售订单" />
<el-step title="出库管理" />
<el-step title="发货单" />
<div class="step-bar-wrapper">
<el-steps :active="0" align-center finish-status="success" process-status="process">
<el-step>
<template #title>
<span class="step-link" @click="$router.push('/sales-order')">销售订单</span>
</template>
</el-step>
<el-step title="生成出库单" />
<el-step>
<template #title>
<span class="step-link" @click="$router.push('/outbound')">出库管理</span>
</template>
</el-step>
<el-step title="生成发货单" />
<el-step>
<template #title>
<span class="step-link" @click="$router.push('/shipping-order')">发货单</span>
</template>
</el-step>
</el-steps>
<div style="text-align: right; margin-top: 12px">
<el-button type="primary" @click="$router.push('/outbound')">下一步</el-button>
</div>
</div>
<el-card class="sales-order-manager">
<template #header>
@ -27,8 +38,10 @@
<el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<LocationSelect v-model="searchParams.warehouse_id" style="width: 160px" />
<el-select v-model="searchParams.customer_id" placeholder="平台" clearable filterable style="width: 180px">
<el-option v-for="item in customerOptions" :key="item.id" :label="item.name" :value="item.id" />
<el-select v-model="searchParams.shop_type" placeholder="平台" clearable style="width: 180px">
<el-option label="闲鱼" :value="5" />
<el-option label="孔夫子" :value="2" />
<el-option label="拼多多" :value="1" />
</el-select>
<el-input v-model="searchParams.association_order_no" placeholder="第三方订单编号" clearable style="width: 200px"
@keyup.enter="handleSearch" />
@ -332,14 +345,14 @@ export default defineComponent({
keyword: string
status: number | null
warehouse_id: number | null
customer_id: number | null
shop_type: number | null
association_order_no: string
logistics_no: string
}>({
keyword: '',
status: null,
warehouse_id: null,
customer_id: null,
shop_type: null,
association_order_no: '',
logistics_no: ''
})
@ -454,7 +467,7 @@ export default defineComponent({
keyword: searchParams.keyword,
status: searchParams.status || undefined,
warehouse_id: searchParams.warehouse_id || undefined,
customer_id: searchParams.customer_id || undefined,
shop_type: searchParams.shop_type !== null ? searchParams.shop_type : undefined,
association_order_no: searchParams.association_order_no || undefined,
logistics_no: searchParams.logistics_no || undefined,
page: pagination.current,
@ -483,7 +496,7 @@ export default defineComponent({
searchParams.keyword = ''
searchParams.status = null
searchParams.warehouse_id = null
searchParams.customer_id = null
searchParams.shop_type = null
searchParams.association_order_no = ''
searchParams.logistics_no = ''
pagination.current = 1
@ -733,6 +746,26 @@ export default defineComponent({
</script>
<style scoped lang="scss">
/* 步骤条 */
.step-bar-wrapper {
background: #fff;
border-radius: 8px;
padding: 20px 40px;
margin-bottom: 16px;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.06);
.step-link {
color: #409eff;
cursor: pointer;
transition: color 0.2s;
&:hover {
color: #66b1ff;
text-decoration: underline;
}
}
}
.sales-order-manager {
width: 100%;
}

View File

@ -18,8 +18,10 @@
<el-select v-model="searchParams.status" placeholder="状态" clearable style="width: 130px">
<el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<el-select v-model="searchParams.customer_id" placeholder="平台" clearable filterable style="width: 180px">
<el-option v-for="item in customerOptions" :key="item.id" :label="item.name" :value="item.id" />
<el-select v-model="searchParams.shop_type" placeholder="平台" clearable style="width: 180px">
<el-option label="闲鱼" :value="5" />
<el-option label="孔夫子" :value="2" />
<el-option label="拼多多" :value="1" />
</el-select>
<el-input v-model="searchParams.association_order_no" placeholder="第三方订单编号" clearable style="width: 220px"
@keyup.enter="handleSearch">
@ -320,13 +322,13 @@ export default defineComponent({
const searchParams = reactive<{
keyword: string
status: number | null
customer_id: number | null
shop_type: number | null
association_order_no: string
logistics_no: string
}>({
keyword: '',
status: null,
customer_id: null,
shop_type: null,
association_order_no: '',
logistics_no: ''
})
@ -338,7 +340,6 @@ export default defineComponent({
})
//
const customerOptions = ref<any[]>([])
//
const detailVisible = ref<boolean>(false)
@ -384,7 +385,7 @@ export default defineComponent({
const res = await fetchShippingOrderDetailList({
shipping_no: searchParams.keyword || undefined,
status: searchParams.status || undefined,
customer_id: searchParams.customer_id || undefined,
shop_type: searchParams.shop_type !== null ? searchParams.shop_type : undefined,
association_order_no: searchParams.association_order_no || undefined,
logistics_no: searchParams.logistics_no || undefined,
page: pagination.current,
@ -409,7 +410,7 @@ export default defineComponent({
const resetSearch = (): void => {
searchParams.keyword = ''
searchParams.status = null
searchParams.customer_id = null
searchParams.shop_type = null
searchParams.association_order_no = ''
searchParams.logistics_no = ''
pagination.current = 1
@ -625,7 +626,6 @@ export default defineComponent({
statusOptions,
searchParams,
pagination,
customerOptions,
detailVisible,
detailData,
detailCache,

View File

@ -1,9 +1,28 @@
<template>
<el-steps :active="2" align-center style="margin-bottom: 16px">
<el-step title="销售订单" />
<el-step title="出库管理" />
<el-step title="发货单" />
<div class="step-bar-wrapper">
<el-steps :active="4" align-center finish-status="success" process-status="process">
<el-step>
<template #title>
<span class="step-link" @click="$router.push('/sales-order')">销售订单</span>
</template>
</el-step>
<el-step title="生成出库单" />
<el-step>
<template #title>
<span class="step-link" @click="$router.push('/outbound')">出库管理</span>
</template>
</el-step>
<el-step title="生成发货单" />
<el-step>
<template #title>
<div class="step-title-wrap">
<span class="step-link" @click="$router.push('/shipping-order')">发货单</span>
<span class="step-tip-inline">直接扫码书后条形码按提示操作即可</span>
</div>
</template>
</el-step>
</el-steps>
</div>
<div class="shipping-order-container">
<!-- 左侧卡片商品详情 -->
<el-card class="left-card" shadow="never">
@ -136,8 +155,10 @@
<el-select v-model="searchParams.warehouse_id" placeholder="仓库" clearable style="width: 140px">
<el-option v-for="item in warehouseOptions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
<el-select v-model="searchParams.customer_id" placeholder="平台" clearable filterable style="width: 160px">
<el-option v-for="item in customerOptions" :key="item.id" :label="item.name" :value="item.id" />
<el-select v-model="searchParams.shop_type" placeholder="平台" clearable style="width: 160px">
<el-option label="闲鱼" :value="5" />
<el-option label="孔夫子" :value="2" />
<el-option label="拼多多" :value="1" />
</el-select>
<el-input v-model="searchParams.association_order_no" placeholder="第三方订单编号" clearable style="width: 200px"
@keyup.enter="handleSearch" />
@ -456,14 +477,14 @@ export default defineComponent({
keyword: string
status: number | null
warehouse_id: number | null
customer_id: number | null
shop_type: number | null
association_order_no: string
logistics_no: string
}>({
keyword: '',
status: 1, // ""
warehouse_id: null,
customer_id: null,
shop_type: null,
association_order_no: '',
logistics_no: ''
})
@ -1094,7 +1115,7 @@ export default defineComponent({
check_no: searchParams.keyword,
status: searchParams.status || undefined,
warehouse_id: searchParams.warehouse_id || undefined,
customer_id: searchParams.customer_id || undefined,
shop_type: searchParams.shop_type !== null ? searchParams.shop_type : undefined,
association_order_no: searchParams.association_order_no || undefined,
logistics_no: searchParams.logistics_no || undefined,
page: pagination.current,
@ -1121,7 +1142,7 @@ export default defineComponent({
searchParams.keyword = ''
searchParams.status = 1
searchParams.warehouse_id = null
searchParams.customer_id = null
searchParams.shop_type = null
searchParams.association_order_no = ''
searchParams.logistics_no = ''
pagination.current = 1
@ -1216,6 +1237,39 @@ export default defineComponent({
</script>
<style scoped lang="scss">
/* 步骤条 */
.step-bar-wrapper {
background: #fff;
border-radius: 8px;
padding: 20px 40px;
margin-bottom: 16px;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.06);
.step-link {
color: #409eff;
cursor: pointer;
transition: color 0.2s;
&:hover {
color: #66b1ff;
text-decoration: underline;
}
}
.step-title-wrap {
display: flex;
flex-direction: column;
align-items: center;
}
.step-tip-inline {
color: #909399;
font-size: 12px;
margin-top: 2px;
white-space: nowrap;
}
}
.shipping-order-container {
display: flex;
gap: 12px;

View File

@ -246,8 +246,8 @@ module.exports = defineConfig({
proxy: {
'/api': {
// target: 'http://127.0.0.1:9090',
// target: 'http://192.168.101.213:9090',
target: 'https://psi.api.buzhiyushu.cn',
target: 'http://192.168.101.213:9090',
// target: 'https://psi.api.buzhiyushu.cn',
// target: 'https://psi.api.buzhiyushu.cn',
changeOrigin: true
},