购物车商品服务费计算规则:
总服务费 = order_items明细费用加和 + order服务费用
order服务费用(Bank Charge,Shipping Fee)
order_items服务费(Handling Fee,Global Shipping,Frontend QC,HNMR 等)
order服务费用由当前选中cart_item按kg数量转换统计重量,选取区间价格写入order_servers
order_items服务费,遍历cart_item的服务费写入order_servers
需要注意的是:
1,服务费没有记录到数据库之前,实际运算为准,记录到数据库后,以数据库中数值为准。(防止算法的改变影响历史数据)
2,购物车多件数费用= (单件成本+ 单件服务费)* 件数 - (单件成本 * 件数) - 实际服务费
3,多件数的实际服务费,例如算国际运费的时候,服务费是总重量重新计算的服务费。
4, 前台购物车是,总服务费不可编辑,所以展示的时候和create的时候都要单独调init_with_default_serves去算费用(不能在前台有可编辑的地方);后台则需要可编辑费用,编辑后存储,取存储值,没编辑前取算法默认值。
路径:app/controllers/my_ichemical/orders_controller.rb
action:new
订单创建时初始化:
@order.migrate_from_cart_items
路径:app/models/orders/order.rb
def migrate_from_cart_items(cart_item_ids: nil)
cart_items = user.cart_items.checked.default_where(myself: self.myself)
cart_items.each do |cart_item|
self.order_items.build cart_item_id: cart_item.id, good_type: cart_item.good_type, good_id: cart_item.good_id, quantity: cart_item.quantity
end
init_with_default_serves
end
def init_with_default_serves(cart_item_ids: nil)
summary = CartItem.checked_items(user_id: self.user_id, myself: self.myself, extra: self.extra)
summary.promote_charges.each do |promote_charge|
self.order_promotes.build(promote_charge_id: promote_charge.id, promote_id: promote_charge.promote_id, amount: promote_charge.subtotal)
end
# 总订单的服务费根据重量算在总单子上
summary.serve_charges.each do |serve_charge|
self.order_serves.build(serve_charge_id: serve_charge.id, serve_id: serve_charge.serve_id, amount: serve_charge.subtotal)
end
compute_sum
end
路径:app/models/cart_item.rb
def self.checked_items(user_id: nil, buyer_id: nil, session_id: nil, myself: nil, extra: {})
if user_id
@checked_items = CartItem.default_where(user_id: user_id, myself: myself).pending.checked
buyer_id = User.find(user_id).buyer_id
puts "-----> Checked User: #{user_id}"
elsif buyer_id
@checked_items = CartItem.default_where(buyer_id: buyer_id, myself: myself).pending.checked
puts "-----> Checked Buyer: #{buyer_id}"
elsif session_id
@checked_items = CartItem.default_where(session_id: session_id, myself: myself).pending.checked
puts "-----> Checked Session: #{session_id}"
else
@checked_items = CartItem.none
puts "-----> Checked None!"
end
SummaryService.new(@checked_items, buyer_id: buyer_id, extra: extra)
end
路径:app/models/concerns/summary_service.rb
def compute_serve
@serve_charges = []
QuantityServe.total.overall.each do |serve|
charge = serve.compute_price(total_quantity, extra)
@serve_charges << charge
end
@serve_price = checked_items.sum { |cart_item| cart_item.serve_price }
@total_serve_price = serve_charges.sum { |i| i.subtotal }
end
路径:app/models/serve.rb
def compute_price(amount, extra_hash = {})
extra_hash.stringify_keys!
if self.contain_max
range = { 'min-lte': amount.to_d, 'max-gte': amount.to_d }
else
range = { 'min-lte': amount.to_d, 'max-gt': amount.to_d }
end
query = range.merge(extra_hash.slice(*extra))
charge = self.charges.default_where(query).first
if charge && !(amount.to_d == 0 && self.id == 5)
charge.subtotal = charge.final_price(amount)
charge.default_subtotal = charge.subtotal
else
charge = self.charges.build
charge.subtotal = 0
end
charge
end
路径:app/models/orders/order_item.rb
# 子订单服务费在order_items创建时回调
cart_item.serve_charges.each do |serve_charge|
op = self.order_serves.build(serve_charge_id: serve_charge.id, serve_id: serve_charge.serve_id, amount: serve_charge.subtotal)
op.order = self.order
end
分享到:
相关推荐
系统还会自动计算购物车内的总金额,并结合选定的配送方式和服务费计算出最终消费总额。此外,购物子系统还需确保数据的有效校验、确认和存档,以及与支付网关的接口对接,以实现在线支付。购物车不仅要支持不同商店...
4)用户选择商品加入购物车,选择完毕结算下单,运费根据管理员设置自动计算 5)用户订单管理功能,支持订单打印、订单状态处理、无效订单删除 6)订单投诉功能:用户如果遇到未收到货、货物有问题,可以在线投诉 ...
1. **配送设置**:商家需要在后台管理系统中配置配送方式,包括启用或禁用、设置默认配送、设定费用计算规则等。 2. **地区管理**:为了实现按地区计算运费,Opencart需要有完善的地区数据库,以便识别和区分不同...
该软件系统是为北京信息科技大学计算机学院计算中心设计的,旨在构建一个校园二手交易平台,利用B/S模式提供服务,促进校园内的二手商品交易,提高信息交流效率,推动资源的合理利用。 **1.4 定义与缩写** - EJ:...
(6)重要提示和说明:积分只可兑换商品,但交易产生的运费、保价费、手续费(网上支付)等必须现金支付。 六、 功能说明之网络团购 参与团购的形式 1)发起团购:如果想要团购的商品不在团购活动中,或上次的团购...
4)用户选择商品加入购物车,选择完毕结算下单,运费根据管理员设置自动计算 5)用户订单管理功能,支持订单打印、订单状态处理、无效订单删除 6)订单投诉功能:用户如果遇到未收到货、货物有问题,可以在线投诉 ...
4)用户选择商品加入购物车,选择完毕结算下单,运费根据管理员设置自动计算 5)用户订单管理功能,支持订单打印、订单状态处理、无效订单删除 6)订单投诉功能:用户如果遇到未收到货、货物有问题,可以在线投诉 ...
4)用户选择商品加入购物车,选择完毕结算下单,运费根据管理员设置自动计算 5)用户订单管理功能,支持订单打印、订单状态处理、无效订单删除 6)订单投诉功能:用户如果遇到未收到货、货物有问题,可以在线投诉 ...
8. **物业管理系统**:管理业主信息、物业费缴纳、报修服务等,需处理多用户并发访问和数据安全性问题。 9. **邮件过滤系统**:涉及邮件接收、发送、垃圾邮件过滤,可能需要集成SMTP/POP3协议,使用JavaMail API。 ...
本项目涉及的"computeShipping"函数就是一个基于JavaScript实现的功能,它专门用于计算包裹的运费,根据输入的重量和目的地,模拟了法国邮政服务(La Poste)的定价规则。 1. **JavaScript基础知识**: - ...
这意味着企业客户可以集成快钱的支付接口,使得消费者在购买商品或服务时能够直接通过网银转账完成支付,提高支付效率和交易安全性。 2. **自助接入条件**: - **独立网站和ICP备案**:企业必须拥有自己的官方网站...
3. 收费计算:根据停车时长计算费用,可能需要复杂的计费规则。这涉及到SQL查询和业务逻辑处理。 4. 出口管理:自动扣费放行,与入口管理类似,但需处理费用结算。可能需要用到Oracle数据库进行事务处理,确保收费...
- 按照模板设定规则计算运费。 - 若商品数量不足以构成续件或续重,则仍按照续件或续重的标准计算。 **3. 不同商品设置不同运费模板** - **方案一:** 分别计算每个商品的运费,再累加得到总运费。 - 例如,商品A...
`mode_id`、`mode_name`和`calculation_rule`(计算规则)是关键字段。 12. **Postage(A12)表**:邮费表记录具体的运费信息,如`postage_id`、`mode_id`、`region`(地区)、`cost`(费用)等。 13. **Picture(A13...
7. **退款与改签**:提供退款和改签服务,需要处理复杂的业务逻辑,如退款规则、手续费计算等。 8. **异常处理**:例如网络中断、支付失败等情况,系统需要有相应的错误提示和重试机制。 在实现这些功能时,**...