1.新增订单时,同时可以新增订单明细,保存时需要根据明细计算总价

1.1 前端显示
订单明细,新增,编辑,删除,批量删除 (此时是在内存中操作)
前端计算,并修改总价
1.2 保存订单时后端重新计算
后端使用服务端函数重新计算,并修改订单总价

2.修改订单明细时

订单明细: 新增,编辑,删除,批量删除,批量编辑,导入 此时是实时修改
都要触发服务端重新计算,并将最新价格设置到订单表单的总价字段上显示

操作步骤

1.前端显示
订单明细表列表事件设置:

afterChange事件


console.log('after ',event.event)

console.log('event.api.mainFormApi.fApi',event.api.mainFormApi.fApi)
console.log('event.api.importJsModule',event.api.importJsModule)

const { sumOrderTotalAfterChangeDetail } = await event.api.importJsModule('js/order/orderDetailList.js')
sumOrderTotalAfterChangeDetail(event)

js/order/orderDetailList.js 这个函数在web静态资源中写了一个js文件

export async function sumOrderTotalAfterChangeDetail(event){
    console.log('刷新 订单总价')

    if(event.isRefSubTable){//当前是关联子表单
      let total=0

        if(event.refSubTableMainTableAddSence){
            //主表新增场景,此时暂未添加到数据库
         const rows = event.api.tableApi.getRows()     
         console.log('当前全部订单明细',rows)
          for(let i=0;i<rows.length;i++){
           const row= rows[i]
           if(row.num!=null && row.price!=null){
             total+=row.num*row.price
           }       
          }
      //total = total.toFixed(2)

        }else{
            //主表编辑场景,此时已添加到数据库,getById,但是仅筛选total,以防覆盖已编辑字段
         const order_id = event.api.mainFormApi.fApiRef.value.getValue('id')
         //console.log('order_id formData.order_id ',order_id,formData.order_id)
         const data = await event.api.mainFormApi.methodsRef.value.getById(order_id)
         total = data.total
        }
        event.api.mainFormApi.fApiRef.value.setValue('total',total)
    }
}

2.保存订单和修改订单明细 时后端重新计算

2.1 先写一个计算订单总价并修改的服务端函数

如图新建一个服务端函数(根据订单id查询明细计算订单总价并修改)

内容:

//计算订单总价
//触发调用场景
//1.新增订单时(有订单明细) 
//2.新增 订单明细
//3.编辑 订单明细
//4.删除 订单明细
//5.批量删除 订单明细
export function caculateOrderTotal(orderId){
    const param = {
  tableCode:'sale_order_detail',
  whereCondition:{
      field:'order_id',
         compare:'=',
         value: orderId
     }
 }

 const list = dataService.select(param)
  //print('==abc=print==计算总价=list==',list)
    let total=MathUtil.of(0)
    if(list?.length>0){
        for(let i=0;i<list.length;i++){
            const row = list[i]
            if(row.price!=null && row.num!=null){
                total= MathUtil.add(total,MathUtil.multiply(row.price,row.num))
            }
        }
    }
    const updateTotalParam={
      tableCode:'sale_order',
         formData:{id:orderId,total}
    }
    print('==print=修改订单总价===',updateTotalParam)
  dataService.update(updateTotalParam)
    return total;
}

订单新增时需要配置执行下这个函数:

打开订单表找到表单服务配置:

如图写触发函数

内容:

import { caculateOrderTotal } from '@/order/orderService'
/**
* add 新增
* @param context ={ pd }
* @return count 1
*/
export function add(context) {

  const order = baseFormService.add(context);

     const total = caculateOrderTotal(order.id)
     console.log('==重新计算订单总价==',total)
     return order;
}

订单明细,新增,编辑,删除,批量删除,批量编辑,导入 时也需要重新计算订单总价
打开订单明细表,编辑表单服务设置

内容如下:

import { caculateOrderTotal } from '@/order/orderService'
//====方案一: 在add,edit,del,batchDel,batchEdit,importData事件里重新计算订单总价===begin====
/**
* add 新增
* @param context ={ pd }
* @return count 1
*/
/*export function add(context) {    
  const detail = baseFormService.add(context);


     //重新计算订单总价
     const order_id = detail.order_id
     caculateOrderTotal(order_id)

  return detail
}*/


/**
* edit 编辑
* @param context={pd}
* @return count 1
*/
/*export function edit(context) {
  const detail = baseFormService.edit(context);

     //重新计算订单总价
     const order_id = detail.order_id
     caculateOrderTotal(order_id)

  return detail
}*/


/**
* 删除
* @param context ={id}
* @return 删除数量
*/
/*export function del(context) {
  const count = baseFormService.del(context);  

    console.log('context deleteRow? event ',context.event,context.id,context.deleteRow)
     //重新计算订单总价
     const order_id = context.deleteRow.order_id
     caculateOrderTotal(order_id)

  return count
}*/

/**
* 删除
* @param context ={ids}
* @return 删除数量
*/
/*export function batchDel(context) {
  const count = baseFormService.batchDel(context);

    //重新计算订单总价,批量考虑订单详情单独配置菜单场景,批量删除时可能不是同一个订单下的
    const order_ids = new Set()
    for(let i=0;i<context.deleteRows.length;i++){
      const row = context.deleteRows[i]        
        order_ids.add(row.order_id)
    }    
    for(const order_id of order_ids){
     caculateOrderTotal(order_id) 
    }


    return count
}*/

/**
* 批量编辑
* @param context={pd,updateFields,ids,conditions(GroupWhereList)  }
* @return 修改数量
*/
/*
export function batchEdit(context) {
  const count = baseFormService.batchEdit(context);

     //根据detail ids找到 order_ids重新计算total
     const order_ids=new Set()     
     const ids = context.ids
     const details = dataService.select({tableCode:'sale_order_detail',distinct:true,selectFields:['order_id'],whereCondition:{field:'id',compare:'in',value:ids}})     
     for(let i=0;i<details.length;i++){
       const detail = details[i]
          order_ids.add(detail.order_id)
     }
    for(const order_id of order_ids){
     caculateOrderTotal(order_id) 
    }

     return count
}*/

/**导入数据
* @param context={ processRepeatRecord,processType,byFieldName,emptyValueCover,tableId,tableName,list}
* @return {insertCount,updateCount}
*/
/*
export function importData(context) {

  const result = baseFormService.importData(context);

    //导入的数据中 找到 order_ids,重新计算total
     const order_ids = new Set()
     const list = context.list
     for(let i =0;i<list.length;i++){
       const row =list[i]
         if(row.order_id){
             order_ids.add(row.order_id)                  
         }
     }
    for(const order_id of order_ids){
      caculateOrderTotal(order_id) 
    }

     return result
}*/
//====方案一: 在add,edit,del,batchDel,batchEdit,importData事件里重新计算订单总价===end====

//====方案二: 在afterChange事件里重新计算订单总价=====
export function afterChange(context){
    //收集可能受影响的 订单id
    const order_ids = new Set()
    if(context.event=='add'||context.event=='edit'){
      const detail = context.pd
      const order_id = detail.order_id
      order_ids.add(order_id)
    } else if(context.event=='del'){
        const order_id = context.deleteRow.order_id
        order_ids.add(order_id)
    }else if(context.event=='batchDel'){
        for(let i=0;i<context.deleteRows.length;i++){
            const row = context.deleteRows[i]        
            order_ids.add(row.order_id)
        }
    }else if(context.event=='batchEdit'){
        const ids = context.ids
        const details = dataService.select({tableCode:'sale_order_detail',distinct:true,selectFields:['order_id'],whereCondition:{field:'id',compare:'in',value:ids}})     
        for(let i=0;i<details.length;i++){
                const detail = details[i]
                 order_ids.add(detail.order_id)
        }
    }else if(context.event=='importData'){
      const list = context.list
         for(let i =0;i<list.length;i++){
             const row =list[i]
             if(row.order_id){
                 order_ids.add(row.order_id)                  
             }
         }
    }
    //重新计算订单总价
    for(const order_id of order_ids){
        caculateOrderTotal(order_id) 
    }
}

同时订单明细变化了,界面上,也需要修改订单总价(查询并设置订单总价)
在订单明细列表事件配置:

配置如下:

console.log('after ',event.event)

console.log('event.api.mainFormApi.fApi',event.api.mainFormApi.fApi)
console.log('event.api.importJsModule',event.api.importJsModule)

const { sumOrderTotalAfterChangeDetail } = await event.api.importJsModule('js/order/orderDetailList.js')
sumOrderTotalAfterChangeDetail(event)

这样全部完成后,就能自动计算总价了

文档更新时间: 2026-07-03 07:49   作者:admin