我应该如何计算 IndexedDB 数据库中多个表的总销售额?
How should I calculate total sales from multiple tables in a IndexedDB database?
我正在尝试使用 Dexie.js 在 JavaScript 中创建一个简单的 stock/sales 应用程序。我不确定如何在不编写可怕的递归代码的情况下返回总销售额,该代码多次运行针对一个产品总销售额的查询。
我的架构有点像这样:
clients: "++id, name, phone",
order: "++id, clientId, daate",
order_content: "orderId, productId, qty",
product: "++id, name, mu, mk_cost, sa_cost, prod_cost",
stock: "++id, date, productId, qty, lot"
我将产品类型以及价格和其他详细信息存储在 "Product" 中。下订单时,我将 clientId 存储在 Order 中,然后我使用 "order_content" 将项目存储在那里,使用 orderId 作为排序键。
我基本上想对每一项做一个总计,然后把它们相加。
我在 db.product.each() 循环中尝试了 运行 下面的代码,但似乎我让自己变得复杂了。
var product1Total = 0;
function calculateTotal(productId, price){
db.order_content
.where("productID")
.equals(productId)
.each(function(item){
product1Total += (price * qty)
})
}
谢谢!
你的查询没有问题,但你应该将它封装在一个返回承诺的函数中。这很容易通过链接从 Dexie 的 Collection.each().
返回的承诺来实现
function calculateTotal(productId, price) {
var total = 0;
return db.order_content
.where("productID")
.equals(productId)
.each(function(item){
total += (price * item.qty)
}).then (function () {
return total;
});
}
或者在 ES7 中:
async function calculateTotal (productId, price) {
var total = 0;
await db.order_content
.where("productID")
.equals(productId)
.each (item => total += (price * item.qty));
return total;
}
如果您的目标是在单个查询中获得特定订单的总价,并且 prod_cost 是您产品的成本,并且您想要某个订单的总价,您应该这样做类似于以下内容:
function calculateTotal (orderId) {
return db.order_content
.where('orderId').equals(orderId).toArray()
.then(orderContents => {
return Promise.all(
orderContents.map(oc => db.product.get(oc.productId))
).then (products => {
return orderContents.reduce (
(total, oc, i) => total + oc.qty * producs[i].prod_cost, 0);
});
});
}
或使用异步函数:
async function calculateTotal (orderId) {
let orderContents = await db.order_content
.where('orderId').equals(orderId).toArray();
let products = await Promise.all(orderContents.map(oc =>
db.product.get(oc.productId));
return orderContents.reduce (
(total, oc, i) => total + oc.qty * producs[i].prod_cost, 0);
}
或使用香草 ES5 javascript:
function calculateTotal (orderId) {
return db.order_content
.where('orderId').equals(orderId).toArray()
.then(function (orderContents) {
return Dexie.Promise.all(
orderContents.map(function (oc) {
return db.product.get(oc.productId);
})
).then (function (products) {
return orderContents.reduce (
function (total, oc, i) {
return total + oc.qty * producs[i].prod_cost;
}, 0);
});
});
}
我正在尝试使用 Dexie.js 在 JavaScript 中创建一个简单的 stock/sales 应用程序。我不确定如何在不编写可怕的递归代码的情况下返回总销售额,该代码多次运行针对一个产品总销售额的查询。
我的架构有点像这样:
clients: "++id, name, phone",
order: "++id, clientId, daate",
order_content: "orderId, productId, qty",
product: "++id, name, mu, mk_cost, sa_cost, prod_cost",
stock: "++id, date, productId, qty, lot"
我将产品类型以及价格和其他详细信息存储在 "Product" 中。下订单时,我将 clientId 存储在 Order 中,然后我使用 "order_content" 将项目存储在那里,使用 orderId 作为排序键。
我基本上想对每一项做一个总计,然后把它们相加。
我在 db.product.each() 循环中尝试了 运行 下面的代码,但似乎我让自己变得复杂了。
var product1Total = 0;
function calculateTotal(productId, price){
db.order_content
.where("productID")
.equals(productId)
.each(function(item){
product1Total += (price * qty)
})
}
谢谢!
你的查询没有问题,但你应该将它封装在一个返回承诺的函数中。这很容易通过链接从 Dexie 的 Collection.each().
返回的承诺来实现function calculateTotal(productId, price) {
var total = 0;
return db.order_content
.where("productID")
.equals(productId)
.each(function(item){
total += (price * item.qty)
}).then (function () {
return total;
});
}
或者在 ES7 中:
async function calculateTotal (productId, price) {
var total = 0;
await db.order_content
.where("productID")
.equals(productId)
.each (item => total += (price * item.qty));
return total;
}
如果您的目标是在单个查询中获得特定订单的总价,并且 prod_cost 是您产品的成本,并且您想要某个订单的总价,您应该这样做类似于以下内容:
function calculateTotal (orderId) {
return db.order_content
.where('orderId').equals(orderId).toArray()
.then(orderContents => {
return Promise.all(
orderContents.map(oc => db.product.get(oc.productId))
).then (products => {
return orderContents.reduce (
(total, oc, i) => total + oc.qty * producs[i].prod_cost, 0);
});
});
}
或使用异步函数:
async function calculateTotal (orderId) {
let orderContents = await db.order_content
.where('orderId').equals(orderId).toArray();
let products = await Promise.all(orderContents.map(oc =>
db.product.get(oc.productId));
return orderContents.reduce (
(total, oc, i) => total + oc.qty * producs[i].prod_cost, 0);
}
或使用香草 ES5 javascript:
function calculateTotal (orderId) {
return db.order_content
.where('orderId').equals(orderId).toArray()
.then(function (orderContents) {
return Dexie.Promise.all(
orderContents.map(function (oc) {
return db.product.get(oc.productId);
})
).then (function (products) {
return orderContents.reduce (
function (total, oc, i) {
return total + oc.qty * producs[i].prod_cost;
}, 0);
});
});
}