Browse Source

feat(订单): 添加订单明细条数显示功能

yz 1 week ago
parent
commit
fcb22bd610

+ 1 - 1
README.md

@@ -94,7 +94,7 @@ npm install --registry=https://registry.npmmirror.com
     - [x] 已提交订单禁用“提交”按钮,状态列展示“已提交”(急)
   - 中
     - [x] 库存不足可提交订单,仅提示不限制(中)
-    - [ ] 订单主表显示行数;查询页可见每单行数(中)
+    - [x] 订单主表显示行数;查询页可见每单行数(中)
     - [ ] 支持模糊搜索物料,弹窗多选添加(中)
     - [ ] 搜索新增“物料”条件,可查含某物料的订单(中)
     - [ ] 工厂端新增“订单查询/审核”功能,用于批准发货(急) -- 待确认 备注:原括号标注为“急”,为保持原文未调整优先级归类。

+ 46 - 8
src/views/order/factory/index.vue

@@ -33,6 +33,11 @@
         {{ parseInt(row.totalQuantity || 0) }}
       </template>
 
+      <!-- 明细条数显示 -->
+      <template slot="detailCount" slot-scope="{row}">
+        {{ (Array.isArray(row.pcBladeOrderItemList) ? row.pcBladeOrderItemList.length : (typeof row.detailCount === 'number' ? row.detailCount : 0)) }}
+      </template>
+
       <!-- 订单状态显示 -->
       <template slot="status" slot-scope="{row}">
         <el-tag :type="getOrderStatusTagType(row.status)">
@@ -68,6 +73,7 @@ import { getList } from '@/api/order/order'
 import { getOrderTypeLabel, getOrderTypeTagType, getOrderStatusLabel, getOrderStatusTagType } from '@/constants'
 import OrderItemTable from '@/components/order-item-table/index.vue'
 import { safeBigInt } from '@/util/util'
+import { getList as getOrderItemList } from '@/api/order/order-item'
 
 export default {
   name: 'FactoryOrderList',
@@ -86,9 +92,11 @@ export default {
 
     return {
       option: opt,
+      /** @type {FactoryOrderRecord[]} */
       data: [],
       form: {},
       loading: true,
+      /** @type {FactoryOrderRecord[]} */
       selectionList: [],
       page: { pageSize: 10, currentPage: 1, total: 0 },
       // 记录最后一次有效的搜索参数,保证分页时参数不丢失
@@ -120,26 +128,53 @@ export default {
       // 合并来源:上次有效参数 + 当前表单 + 本次传入
       const source = Object.assign({}, this.lastQuery || {}, this.form || {}, params || {})
       // 仅映射后端支持的查询参数,并兼容 Avue 日期范围
+      /** @type {any} */
+      const anySource = source
+      const formRange = Array.isArray(anySource.createTime) ? anySource.createTime : undefined
       const query = {
         orderCode: source.orderCode,
         orgName: source.orgName,
         customerName: source.customerName,
         receiverName: source.receiverName,
         receiverPhone: source.receiverPhone,
-        createTimeStart: source.createTimeStart || (Array.isArray(source.createTime) ? source.createTime[0] : undefined),
-        createTimeEnd: source.createTimeEnd || (Array.isArray(source.createTime) ? source.createTime[1] : undefined),
+        createTimeStart: source.createTimeStart || (formRange ? formRange[0] : undefined),
+        createTimeEnd: source.createTimeEnd || (formRange ? formRange[1] : undefined),
         orderType: source.orderType,
         status: source.status
       }
-      Object.keys(query).forEach(k => query[k] === undefined && delete query[k])
+      // 清理 undefined 字段,避免多余查询参数
+      const cleanedQuery = {}
+      if (query.orderCode !== undefined) cleanedQuery.orderCode = query.orderCode
+      if (query.orgName !== undefined) cleanedQuery.orgName = query.orgName
+      if (query.customerName !== undefined) cleanedQuery.customerName = query.customerName
+      if (query.receiverName !== undefined) cleanedQuery.receiverName = query.receiverName
+      if (query.receiverPhone !== undefined) cleanedQuery.receiverPhone = query.receiverPhone
+      if (query.createTimeStart !== undefined) cleanedQuery.createTimeStart = query.createTimeStart
+      if (query.createTimeEnd !== undefined) cleanedQuery.createTimeEnd = query.createTimeEnd
+      if (query.orderType !== undefined) cleanedQuery.orderType = query.orderType
+      if (query.status !== undefined) cleanedQuery.status = query.status
+
       // 持久化搜索条件,确保翻页时不丢失
-      this.lastQuery = Object.assign({}, query)
+      this.lastQuery = Object.assign({}, cleanedQuery)
 
-      getList(page.currentPage, page.pageSize, query)
-        .then(res => {
+      getList(page.currentPage, page.pageSize, cleanedQuery)
+        .then(async res => {
           const data = res.data && res.data.data ? res.data.data : { records: [], total: 0 }
-          this.data = Array.isArray(data.records) ? data.records : []
-          this.page.total = Number(data.total || 0)
+          const records = Array.isArray(data.records) ? data.records : []
+          const total = Number(data.total || 0)
+          // 并行查询每条订单的明细总数(使用分页响应 total 字段作为计数)
+          const counts = await Promise.all(records.map(async (row) => {
+            try {
+              const resp = await getOrderItemList(1, 1, { orderId: row.id })
+              const payload = resp && resp.data && resp.data.data ? resp.data.data : { total: 0 }
+              return Number(payload.total || 0)
+            } catch (e) {
+              return 0
+            }
+          }))
+          // 合并计数到记录中
+          this.data = records.map((row, idx) => ({ ...row, detailCount: counts[idx] }))
+          this.page.total = total
           this.loading = false
         })
         .catch(() => { this.loading = false })
@@ -162,15 +197,18 @@ export default {
       this.onLoad(this.page)
     },
     /** 选择变化 */
+    /** @param {FactoryOrderRecord[]} list */
     selectionChange(list) {
       this.selectionList = list
     },
     /** 页码变化:保持搜索条件不丢失并重新加载 */
+    /** @param {number} currentPage */
     currentChange(currentPage) {
       this.page.currentPage = currentPage
       this.onLoad(this.page, this.lastQuery)
     },
     /** 每页大小变化:保持搜索条件不丢失并重新加载 */
+    /** @param {number} pageSize */
     sizeChange(pageSize) {
       this.page.pageSize = pageSize
       this.onLoad(this.page, this.lastQuery)

+ 33 - 16
src/views/order/order/index-avue.vue

@@ -79,6 +79,11 @@
         {{ parseInt(row.totalQuantity || 0) }}
       </template>
 
+      <!-- 明细条数显示 -->
+      <template slot="detailCount" slot-scope="{row}">
+        {{ row.detailCount && typeof row.detailCount === 'number' ? row.detailCount : 0 }}
+      </template>
+
       <!-- 订单状态显示 -->
       <template slot="status" slot-scope="{row}">
         <el-tag :type="getOrderStatusTagType(row.status)">
@@ -130,6 +135,7 @@ import { option } from './option'
 // 原接口: import { getList, add, update, getDetail } from '@/api/order/order'
 import { add, update, getDetail } from '@/api/order/order'
 import { getOrderList } from '@/api/order/sales-order'
+import { getList as getOrderItemList } from '@/api/order/order-item'
 import { submitOrderToU9 } from '@/api/order/sales-order'
 import { getUnification } from '@/api/common'
 import {
@@ -154,15 +160,13 @@ export default {
   data() {
     return {
       option,
+      /** @type {import('@/api/types/order').SalesOrderRecord[]} */
       data: [],
       form: {},
       loading: true,
+      /** @type {import('@/api/types/order').SalesOrderRecord[]} */
       selectionList: [],
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0
-      },
+      page: { pageSize: 10, currentPage: 1, total: 0 },
 
       // 订单表单相关状态
       orderFormVisible: false,
@@ -200,22 +204,35 @@ export default {
      */
     onLoad(page, params = {}) {
       this.loading = true
-      // 仅映射销售订单接口支持的查询参数,并兼容 Avue 日期范围
+      /** @type {any} */
+      const anySource = params
+      const formRange = Array.isArray(anySource.createTime) ? anySource.createTime : undefined
       const query = {
-        orderCode: params.orderCode,
-        orgName: params.orgName,
-        customerName: params.customerName,
-        receiverName: params.receiverName,
-        receiverPhone: params.receiverPhone,
-        createTimeStart: params.createTimeStart || (Array.isArray(params.createTime) ? params.createTime[0] : undefined),
-        createTimeEnd: params.createTimeEnd || (Array.isArray(params.createTime) ? params.createTime[1] : undefined)
+        orderCode: anySource.orderCode,
+        orgName: anySource.orgName,
+        customerName: anySource.customerName,
+        receiverName: anySource.receiverName,
+        receiverPhone: anySource.receiverPhone,
+        createTimeStart: anySource.createTimeStart || (formRange ? formRange[0] : undefined),
+        createTimeEnd: anySource.createTimeEnd || (formRange ? formRange[1] : undefined)
       }
-      // 移除 undefined 字段,避免向后端传递空参数
       Object.keys(query).forEach(k => query[k] === undefined && delete query[k])
 
-      getOrderList(page.currentPage, page.pageSize, query).then(res => {
+      getOrderList(page.currentPage, page.pageSize, query).then(async res => {
         const data = res.data.data
-        this.data = data.records
+        const records = Array.isArray(data.records) ? data.records : []
+        // 与工厂列表一致:并行查询每条订单的明细总数,使用分页响应的 total
+        const counts = await Promise.all(records.map(async (row) => {
+          try {
+            const resp = await getOrderItemList(1, 1, { orderId: row.id })
+            const payload = resp && resp.data && resp.data.data ? resp.data.data : { total: 0 }
+            return Number(payload.total || 0)
+          } catch (e) {
+            return 0
+          }
+        }))
+        // 将计算得到的明细条数合并到每条记录的 detailCount 字段
+        this.data = records.map((row, idx) => ({ ...row, detailCount: counts[idx] }))
         this.page.total = data.total
         this.loading = false
       }).catch(() => {

+ 9 - 0
src/views/order/order/option.js

@@ -189,6 +189,15 @@ export const option = {
       }]
     },
     {
+      label: '明细条数',
+      prop: 'detailCount',
+      minWidth: 100,
+      align: 'center',
+      slot: true,
+      addDisplay: false,
+      editDisabled: true
+    },
+    {
       label: '收货人姓名',
       prop: 'receiverName',
       minWidth: 120,