`

购物车商品服务费计算规则

阅读更多
购物车商品服务费计算规则:
总服务费 = 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
分享到:
评论

相关推荐

    购物车数据库分析.doc

    系统还会自动计算购物车内的总金额,并结合选定的配送方式和服务费计算出最终消费总额。此外,购物子系统还需确保数据的有效校验、确认和存档,以及与支付网关的接口对接,以实现在线支付。购物车不仅要支持不同商店...

    仿京东商城购物系统正式版

    4)用户选择商品加入购物车,选择完毕结算下单,运费根据管理员设置自动计算 5)用户订单管理功能,支持订单打印、订单状态处理、无效订单删除 6)订单投诉功能:用户如果遇到未收到货、货物有问题,可以在线投诉 ...

    opencart 配送管理模块 平邮 及 快递 模块

    1. **配送设置**:商家需要在后台管理系统中配置配送方式,包括启用或禁用、设置默认配送、设定费用计算规则等。 2. **地区管理**:为了实现按地区计算运费,Opencart需要有完善的地区数据库,以便识别和区分不同...

    软件需求说明书_2改稿1

    该软件系统是为北京信息科技大学计算机学院计算中心设计的,旨在构建一个校园二手交易平台,利用B/S模式提供服务,促进校园内的二手商品交易,提高信息交流效率,推动资源的合理利用。 **1.4 定义与缩写** - EJ:...

    电子商务商城网站代码

    (6)重要提示和说明:积分只可兑换商品,但交易产生的运费、保价费、手续费(网上支付)等必须现金支付。 六、 功能说明之网络团购 参与团购的形式 1)发起团购:如果想要团购的商品不在团购活动中,或上次的团购...

    超漂亮的网上购物系统 2012 v1.0 正式版

    4)用户选择商品加入购物车,选择完毕结算下单,运费根据管理员设置自动计算 5)用户订单管理功能,支持订单打印、订单状态处理、无效订单删除 6)订单投诉功能:用户如果遇到未收到货、货物有问题,可以在线投诉 ...

    ASP网上购物系统旗舰版

    4)用户选择商品加入购物车,选择完毕结算下单,运费根据管理员设置自动计算 5)用户订单管理功能,支持订单打印、订单状态处理、无效订单删除 6)订单投诉功能:用户如果遇到未收到货、货物有问题,可以在线投诉 ...

    环平网上购物系统2012 V1.0版

    4)用户选择商品加入购物车,选择完毕结算下单,运费根据管理员设置自动计算 5)用户订单管理功能,支持订单打印、订单状态处理、无效订单删除 6)订单投诉功能:用户如果遇到未收到货、货物有问题,可以在线投诉 ...

    JSP类计算机专业毕业设计题目.docx

    8. **物业管理系统**:管理业主信息、物业费缴纳、报修服务等,需处理多用户并发访问和数据安全性问题。 9. **邮件过滤系统**:涉及邮件接收、发送、垃圾邮件过滤,可能需要集成SMTP/POP3协议,使用JavaMail API。 ...

    computeShipping:Javascript函数可根据重量和目的地计算运费

    本项目涉及的"computeShipping"函数就是一个基于JavaScript实现的功能,它专门用于计算包裹的运费,根据输入的重量和目的地,模拟了法国邮政服务(La Poste)的定价规则。 1. **JavaScript基础知识**: - ...

    快钱企业自助接入

    这意味着企业客户可以集成快钱的支付接口,使得消费者在购买商品或服务时能够直接通过网银转账完成支付,提高支付效率和交易安全性。 2. **自助接入条件**: - **独立网站和ICP备案**:企业必须拥有自己的官方网站...

    停车场系统和网上购物系统(毕业设计)

    3. 收费计算:根据停车时长计算费用,可能需要复杂的计费规则。这涉及到SQL查询和业务逻辑处理。 4. 出口管理:自动扣费放行,与入口管理类似,但需处理费用结算。可能需要用到Oracle数据库进行事务处理,确保收费...

    移动电商中的运费体系设计方案.docx

    - 按照模板设定规则计算运费。 - 若商品数量不足以构成续件或续重,则仍按照续件或续重的标准计算。 **3. 不同商品设置不同运费模板** - **方案一:** 分别计算每个商品的运费,再累加得到总运费。 - 例如,商品A...

    数据字典表4131

    `mode_id`、`mode_name`和`calculation_rule`(计算规则)是关键字段。 12. **Postage(A12)表**:邮费表记录具体的运费信息,如`postage_id`、`mode_id`、`region`(地区)、`cost`(费用)等。 13. **Picture(A13...

    ticket-booking-system:网上订票系统。 包括身份验证和预订模块

    7. **退款与改签**:提供退款和改签服务,需要处理复杂的业务逻辑,如退款规则、手续费计算等。 8. **异常处理**:例如网络中断、支付失败等情况,系统需要有相应的错误提示和重试机制。 在实现这些功能时,**...

Global site tag (gtag.js) - Google Analytics