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