- 浏览: 288773 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
masuweng:
如何给新人机会 -
masuweng:
多sql结果集按列合并新结果报表实现方案 -
Ahe:
赞
坚持长跑方能赢 -
masuweng:
好好好
程序员如何更好的了解自己所做的事情 -
小楠人:
laoguan123 写道楼主好,使用过一些excel导入导出 ...
excell导入导出
一:区间find/call选取(重量范围与运费)
二:eval哈希表获取(金额范围与奖金点数)
# 销售金额毛利
# 毛利奖金
三:基于数据库的模型设计(产品包装范围与报价费用)
#数据库序列化字段记录
四:设计一张整表和序列化字段存储的利弊
序列化字段,便于设置和存储。(需要程序代码反解析)
整表便于统计,和配置追加。(extra方案)
#serves记录费用类型,serve_charges记录费用类型区间
#serve_charges:中的nation/zone/danger等字段用serves的extra序列化字段反解析匹配。
PROFIT = { 0...10 => ->(o){ 50 }, 10...30 => ->(o){ 40 }, 30...50 => ->(o){ o }, 50...200 => ->(o){ o * 0.5 }, 200...1000 => ->(o){ o * 0.4 }, 1000..BigDecimal::INFINITY => ->(o){ o * 0.3 } } def compute_profit_price result = PROFIT.find { |k, _| k.include? import_price } self.profit_price = result[1].call(import_price).to_d.ceil(2) self.save end
二:eval哈希表获取(金额范围与奖金点数)
GROSS_RATE = {"trader_grade_general" => [[" _ < 10000",0], ["10000 <= _ && _ < 15000",0.03], ["15000 <= _ && _ < 20000",0.05], ["20000 <= _ && _ < 25000",0.07], ["25000 <= _ && _ < 30000",0.09], ["30000 <= _ && _< 35000",0.11], ["35000 <= _ && _< 40000",0.13], ["_ >= 40000",0.05,40000]], "trader_grade_high" => [[" _ < 10000",0], ["10000 <= _ && _ < 15000",0.04], ["15000 <= _ && _ < 20000",0.06], ["20000 <= _ && _ < 25000",0.08], ["25000 <= _ && _ < 30000",0.1], ["30000 <= _ && _< 35000",0.12], ["35000 <= _ && _< 40000",0.14], ["40000 <= _ && _< 45000",0.16], ["45000 <= _ && _< 50000",0.18], ["_ >= 50000",0.06,50000]] } AMOUNT_RATE = [["_ < 500",0.01], ["500 <= _ && _ <2000",0.009], ["2000 <= _ && _ <5000",0.008], ["5000 <= _ && _ < 10000",0.007], ["10000 <= _ && _ <50000",0.006], ["50000 <= _ && _ < 100000",0.005], ["100000 <= _ && _ < 500000",0.004], ["_ > 500000",0.003]]
# 销售金额毛利
def self.get_gross_rate(trader_type,amount) return_rtb_rate = 0 base_trpe = GROSS_RATE[trader_type] || GROSS_RATE["trader_grade_general"] base_trpe.each_with_index do |rtb_rate,index| _ = amount if eval(rtb_rate[0]) case_amount = (index + 1 == base_trpe.size) ? (amount - rtb_rate[2]) : (amount % 5000) return_rtb_rate += rtb_rate[1] * case_amount break else return_rtb_rate += rtb_rate[1] * 5000 end end return return_rtb_rate end
# 毛利奖金
def self.get_amount_rate(amount) return_rtb_rate = 0 AMOUNT_RATE.each do |rtb_rate| _ = amount if eval(rtb_rate[0]) return_rtb_rate = amount * rtb_rate[1] break end end return return_rtb_rate end
三:基于数据库的模型设计(产品包装范围与报价费用)
#数据库序列化字段记录
{:levels=>"24.999-49.999,49.999-99.999,99.999-199.999,199.999-499.999,499.999-", :prices=>"48,46,42,41,37", :area_prices=>""} {:levels=>"2.999-99.999,99.999-499.999,499.999-", :prices=>"53,50,46", :area_prices=>"53,50,46"}
def price_of_package(package, package_unit, area = nil) return nil if self.rules.blank? return nil if !eval(self.rules).is_a?(Hash) price = nil #包装单位转化 converted_package = convert_unit(package, package_unit, self.package_unit, self.direct_ship_chemical&.density) return nil if converted_package.nil? arr_levels = eval(self.rules)[:levels].split(',') arr_prices = eval(self.rules)[:prices].split(',') if area.present? && self.areas.present? && self.areas.include?(area) arr_prices = eval(self.rules)[:area_prices].split(',') end #散装包装 if self.bulk_package? arr_levels.each.with_index do |p, i| arr_p = p.split('-') # 10-20 or 500- if converted_package > arr_p[0].to_d && ( (arr_p[1].present? && converted_package <= arr_p[1].to_d) || arr_p[1].blank? ) price = arr_prices[i].to_d and break end # 如果超出所设置的最大包装,则取最大包装的价格 if p == arr_levels.last price = arr_prices[i].to_d and break end end elsif self.buyout_package? #标准包装 ls = arr_levels.sort{|x, y| x.to_f <=> y.to_f } ps = arr_prices.sort{|x, y| x.to_f <=> y.to_f } level_prices = ls.map.with_index{|x, i| [x.to_f, ps[i].to_f]} result = level_prices.select{|p| p[0] >= converted_package } price = result.present? ? result.first[1] : nil else # 1.超过最大包装,且是最大包装整数倍, 取最大包装 * 倍数 # 2.小于最大包装,取区间内最大值的价格 ls = arr_levels.sort{|x, y| x.to_f <=> y.to_f } ps = arr_prices.sort{|x, y| x.to_f <=> y.to_f } level_prices = ls.map.with_index{|x, i| [x.to_f, ps[i].to_f]} min = level_prices.first max = level_prices.last if converted_package > max[0] return nil if max[0] == 0 price = converted_package * (max[1] / max[0]) elsif converted_package < min[0] price = nil else front = level_prices.select{|p| p[0] <= converted_package }.last back = level_prices.select{|p| p[0] >= converted_package }.first if front[0] == back[0] price = front[1] else if converted_package <= (front[0] + back[0]) / 2.to_f price = converted_package * (front[1] / front[0]) else price = converted_package * (back[1] / back[0]) end end end end price end
四:设计一张整表和序列化字段存储的利弊
序列化字段,便于设置和存储。(需要程序代码反解析)
整表便于统计,和配置追加。(extra方案)
serialize :extra, Array 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 charge.subtotal = charge.final_price(amount) charge.default_subtotal = charge.subtotal else charge = self.charges.build charge.subtotal = 0 end charge end
#serves记录费用类型,serve_charges记录费用类型区间
#serve_charges:中的nation/zone/danger等字段用serves的extra序列化字段反解析匹配。
create_table "serve_charges", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| t.bigint "serve_id" t.decimal "min", precision: 12, scale: 4, default: "0.0" t.decimal "max", precision: 12, scale: 4, default: "99999999.9999" t.decimal "price", precision: 10, scale: 2 t.string "type" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "nation" t.string "zone" t.string "danger" t.string "is_use_courier" t.string "good_type" t.string "incoterms" t.decimal "base_price", precision: 10, scale: 2, default: "0.0" t.index ["serve_id"], name: "index_serve_charges_on_serve_id" end create_table "serves", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| t.string "type" t.string "unit" t.string "name" t.string "scope" t.boolean "verified", default: false t.datetime "created_at", null: false t.datetime "updated_at", null: false t.boolean "default", default: false t.boolean "overall", default: true t.string "extra" t.boolean "contain_max", default: false t.string "deal_type" t.bigint "deal_id" t.index ["deal_type", "deal_id"], name: "index_serves_on_deal_type_and_deal_id" end
发表评论
-
git仓库创建
2020-09-04 15:33 653推送现有文件夹 cd existing_folder git ... -
puma高并发
2020-08-19 09:31 441nginx突发大量502报错 top看一下,cpu的占用并不高 ... -
外贸加价算法
2019-04-11 14:28 425usd_price = ( case ... -
searchkick
2019-04-10 11:30 0# 通用查询块(条件) def general_ ... -
导入线下excell业务数据按权重匹配线上数据
2019-03-07 11:00 834业务场景:(系统间还没有接口对调,订单号暂时需要线下处理) 线 ... -
两对象同时映射一对一和一对多
2019-02-20 10:14 761class Kpi::Team < Applicat ... -
ruby一些类加载方式
2018-12-21 10:12 534require_dependency 'order/sco ... -
基于ruby的gem remotipart的异步上传文件
2018-12-21 10:11 498针对某一对象保存实例化之前,异步上传图片保存。 gem ' ... -
基于html2canvas的长图分享
2018-12-21 10:11 1118<span class="ui label ... -
rails处理上传读取excell&生成excell
2018-12-20 14:15 876gem 'spreadsheet' gem 'roo', ... -
基于ruby Mechanize的爬虫
2018-12-20 13:09 602def self.sang_carwler ... -
一些常用加密方式
2018-12-20 13:02 697sign = OpenSSL::Digest::SHA256. ... -
ruby 调用restful接口示例
2018-12-20 12:02 888链接参数中添加token def self.query_p ... -
rails错误日志记录
2018-12-19 14:41 677Rails中对日志的处理采用的是“消息-订阅”机制,各部分组件 ... -
railsAPI接收Base64文件
2018-12-18 11:05 1006tmp_dir = " ... -
ruby 调用savon接口示例
2018-12-18 10:51 945例子一 module Api module Aob ... -
算法运用两例
2018-11-21 13:15 393早晨一女生背着一堆书出了图书馆,结果警 报响了,大妈让女生看看 ... -
关于国际商城现货展示与购物车的费用设计
2018-11-15 18:34 404关于国际商城现货展示 ... -
基于多线程的全局变量
2018-10-31 19:50 1074def current_nation def ... -
hash最小值过滤算法
2018-10-31 09:52 1046[["数量","包装" ...
相关推荐
区间调度算法实现源代码C/C++,有着详细的说明,注释
本文讨论的区间树查询算法,是在平面内线段均与坐标轴平行的理想的情况下,采用几何分析的方法,通过构造空间复杂度为O(n)的便于搜索的区间树,能够在O(log n + k)(k为所有报告出的线段数量)的时间内,完成与坐标轴...
JAVA加密算法实现总结JAVA加密算法实现总结
摘要:全面介绍了区间编码算法的理论基础和实现方式。详细讨论了区间编码原理、正规化操作、区间编码实现、二进制索引树的理论和实现等技术。并给出了一个切实可行的应用程序。
算法导论,在红黑树的基础上扩张出区间树的数据结构,并且构造区间树的重叠区间查找算法。
这是中科大软件学院算法导论的课程设计,是用c++实现的
区间树查找区间算法的实现,VC++实现,自动随机生成区间,查找最小区间和调度区间
算法导论实验:使用c++实现红黑树的建立,插入,旋转,删除,查找全操作以及区间树的全操作。并带有红黑树的可视化展示,采用graphviz工具,需要自行安装graphviz以实现树的可视化功能。
对焦算法实现总结.doc
求解一系列区间并集,目前只支持有限闭区间
常用数据挖掘算法总结及Python实现.pdf常用数据挖掘算法总结及Python实现.pdf常用数据挖掘算法总结及Python实现.pdf常用数据挖掘算法总结及Python实现.pdf
用C++实现的存储器的分配与回收算法,有最先适应法、最佳适应法、最坏适应法三种,虽然程序里能够选择三种中的每一种算法,但是三种算法的实现还是要分别运行一遍,虽然有这点瑕疵,不过功能已经实现。
数学公式-区间比较算法 比较 区间之间的关系 开区间、比区间 ex.(100, 10000); (10, 25] 判断 数值 是否在 区间(ex.(100, 10000))内; 或者判断 区间是否在区间内 更或者判断区间之间是否有交集 常见的使用案例是 ...
PID是一个闭环控制算法。因此要实现PID算法,必须在硬件上具有闭环控制,就是得有反馈。Kp,Ti,Td三个参数的设定是PID控制算法的关键问题,下面来看关于PID控制算法总结。
常用加密算法的java实现总结,常用加密算法的java实现总结,常用加密算法的java实现总结,常用加密算法的java实现总结,常用加密算法的java实现总结
主要是aes-gcm算法实现的code,详细描述gcm算法的各部分实现过程
AR实现算法AR实现算法AR实现算法AR实现算法
用DDA算法中点bresenham算法及bresenham算法实现任意给定两点的直线段的绘制(直线宽度和线型可自定)。 实验步骤: 1、 复习有关算法的基本原理,明确实验目的和要求; 2、 依据算法思想,绘制程序流程图; 3、 ...
区间树上的重叠区间查找算法:构造1000个节点的区间树,查找具有最小低端点的重叠区间。亲测VS可运行,VC不能运行是因为不支持操作符重载。