通过外挂程序实现SBO中的价格控制策略

简介:
写在前面
竟然做起了基于SBO的开发。
SBO 2004 2B是一个轻型的企业业务管理软件,结构和框架设计的很不错,也很灵活。但是毕竟是国外产品,进入到中国,还是要有水土适应期。
本来,SBO是提供软件开发接口的,但是SBO的软件供应商没有进行很好的交接,这些资料完全没有,不过在网上看到更多的是,SBO的开发版SDK是需要Money的。
既然没有更多的资料,也只能凭借自身的经验和对SBO软件的浅薄理解做一些力所能力的开发了。
 
开发需求
对全省各个门店实行商品的价格控制,价格控制方案为:
1、缺省情况下对公司经营的所有商品进行价格控制。
2、根据销售量、销售趋势、毛利润、厂家政策、季节因素、经营性质(经销、代销)商品动态定义产品的价格控制类型为常规、主流、主推、特价等10个价格控制类型。
3、不同品类的不同价格类型的具有不同的价格控制参数(就是说:销售价格必须不低于成本价*(1+r),其中r是价格控制参数)。
4、支持按照以下方式进行价格策略排除:
    A、某门店或者某几个门店的所有商品不参加价格控制
    B、某品类或者某几个品类商品不参加价格控制
    C、某门店或者某几个门店的某个品类或者某几个品类在某个时段内不参加价格控制
    D、某门店的某种或者某些单品在某个时段内不参加价格控制
 
程序实现
在SBO 2004 2B中无法直接实现上述的价格控制,需要二次开发。开发方案如下:
1、数据结构
为了完成以上的价格控制策略,需要对SBO的数据结构进行如下修改。
1.1、加入用户表:u_SHOP,用于定义门店属性,其中包括字段ShopID, ShopName。为了对价格控制予以支持,还有字段:bNoPCtrl,bit, 不参加价格控制标志,缺省为0;SDATE, EDATE,不参加价格控制的时段。
1.2、对门店仓库进行属性扩展,加入门店属性,字段为u_ShopID。
1.3、对操作员进行门店属性扩展,每个操作员特别的销售人员门店位置化,加入门店属性,字段为u_ShopID。
1.4、对采销发票信息、明细列表门店化,加入门店属性,字段为u_ShopID。
1.5、对商品主文件表加入价格控制级别字段:u_CPriType char(1),支持62个类别(0-9, a-z, A-Z)。 
1.6、加入用户表:u_MPCList,用于定义品类价格控制参数,主要字段:itmsGrpCod 商品品类, CPriType 价格控制类型, cRate 价格控制参数,CFlag 是否启用此价格控制方案, DFlag 是否按照时段进行价控, SDate, EDate,如果按照时段价控的起止时间。如果不启用此价控方案,按照时段进行价控及其时段参数都将无效。
1.7、加入用户表:u_NPCList,用于定义门店价控排除的品类,主要字段:ShopID 门店, itmsGrpCod 品类, CFlag 是否启用此价控排除方案, DFlag 是否按照时段进行价控排除, SDate, EDate,如果按照时段价控排除的起止时间。如果不启用此价控排除方案,按照时段进行价控排除及其时段参数都将无效。
1.8、加入用户表:u_NPCItems,用于定义门店价控排除的单品,主要字段:ShopID 门店, itmCode 品类, CFlag 是否启用此价控排除方案, SDate, EDate,价控排除的起止时间。
 
2、商品价控类别
因为可能涉及到公司经营机密,价格控制类别的算法略。价格控制类别动态完成之后,可以通过UI界面进行维护和调整。
应该说,上述数据结构通过UI界面进行增加删除修改的操作,也是很容易实现的。以下显示的是商品价格控制排除维护界面,更多的实现界面略。(可以使用不同的语言来实现,VS.NET 2005是非常好的开发平台,推荐一下
3、价格控制
上面的数据结构实现了,价格控制其实就很简单了。在销售存盘的时候通过以下SQL为主体的存储过程进行销售价格控制校验即可。
if Exists(select top 1 1 from u_sysparm where SPID='PriCtrlPalicy' and PARM='YES!')
begin
   declare @shopid nvarchar(20)
   select @shopid=u_part from oinv where docEntry=@nEntry
   if not exists (select top 1 1 from u_shop a where a.u_shopid=@shopid and isnull(a.u_bNoPCtrl,0)=1)
   begin
    --价格控制
    if exists( select top 1 1 from
     (select a.itemcode, b.itemName, a.Price, c.sRate from inv1 a, oitm b, u_mpcList c where a.docentry=@nEntry and a.itemcode=b.itemcode and b.u_priCType=c.priCType and b.itmsgrpcod=c.itmsgrpcod and isNull(uFlag,0)=1 and isNUll(dFlag,0)=0 and b.itmsgrpcod not in (select itmsGrpCod from uv_npclist where  shopid=@shopid) and a.itemcode not in (select distinct itemcode from uv_npcitems u where shopid=@shopid and a.whscode=u.whscode and (getdate() between sdate and edate) and isnull(cFlag,0)=1 )
      union all
      select a.itemcode, b.itemName, a.Price, c.sRate from inv1 a, oitm b, u_mpcList c, oinv d where a.docentry=@nEntry and a.itemcode=b.itemcode and a.docEntry=d.docEntry and b.u_priCType=c.priCType and b.itmsgrpcod=c.itmsgrpcod and isNull(uFlag,0)=1 and isNUll(dFlag,0)=1 and a.docDate>=c.sdate and a.docDate<=c.edate
and b.itmsgrpcod not in (select itmsGrpCod from uv_npclist where  shopid=@shopid) and a.itemcode not in (select distinct itemcode from uv_npcitems u where shopid=@shopid and a.whscode=u.whscode and (getdate() between sdate and edate) and isnull(cFlag,0)=1 ) ) a,
(select inv1.itemcode, case p1.price when 0 then oitw.avgprice*1.17 else p1.price end avgprice  from inv1 inner join oitw on inv1.itemcode=oitw.itemcode and inv1.whscode=oitw.whscode inner join oitm on inv1.itemcode=oitm.itemcode left join itm1 p1 on inv1.itemcode=p1.itemcode and p1.pricelist=2  where inv1.docentry=@nEntry
and oitm.itmsgrpcod not in (select itmsGrpCod from uv_npclist where  shopid=@shopid) and inv1.itemcode not in (select distinct itemcode from uv_npcitems u where shopid=@shopid and inv1.whscode=u.whscode and (getdate() between sdate and edate) and isnull(cFlag,0)=1 ) ) b
     where a.itemcode=b.itemcode and cast(Price as numeric(20,0))<cast(avgprice*(1+sRate/100) as numeric(20,0)) )
    begin
     select '您所销售的商品低于最低限价, 销售被拒绝!'
     return -1
    end
   
    select ''
    return 0
end


本文转自foresun  51CTO博客,原文链接:http://blog.51cto.com/foresun/40490,如需转载请自行联系原作者
相关文章
|
Shell Python
miniconda使用体验
## 简介 miniconda是什么呢? 这里简单用一个公式来说明 miniconda = virtualenv + pyenv + pypi源 通过miniconda可以实现创建隔离的python包环境,下载特定的python包版本,使用conda源上编译好的whl包。可以说一应俱全。 ## 安装 miniconda在Mac可以直接用Brew安装,一行命令 `brew install mini
1244 0
|
3月前
|
负载均衡 安全 Cloud Native
Service Mesh:原则、挑战和演变
服务网格作为云原生架构中的关键组件,旨在解决微服务间通信的复杂性。它通过提供服务发现、负载均衡、安全控制和可观测性等功能,帮助开发者更高效地管理分布式系统。本文探讨了服务网格的起源、核心功能、在多云环境中的应用及其未来发展趋势,展示了其在现代软件架构中的重要价值。
167 10
Service Mesh:原则、挑战和演变
|
Windows
windows 技术篇 - uispy 工具获取和使用,windows窗口属性快捷查看工具
windows 技术篇 - uispy 工具获取和使用,windows窗口属性快捷查看工具
2434 0
windows 技术篇 - uispy 工具获取和使用,windows窗口属性快捷查看工具
|
5月前
免费图片在线压缩工具
在线图片压缩,快速减小图片大小,不损失太多画质
879 0
|
2月前
|
人工智能 监控 数据可视化
智慧工地一体化信息管理平台源码
智慧工地一体化平台融合大数据、AI、物联网等技术,构建覆盖人、机、料、法、环的数字化管理体系,实现施工全过程可视化、智能化管理,提升效率,推动建筑产业信息化升级。
307 4
|
6月前
|
人工智能 搜索推荐 API
“电商API数据赋能:实时分析,优化营销策略”
电商API通过实时数据交互赋能企业,优化营销策略与运营效率。其核心价值体现在动态定价、个性化推荐及促销效果追踪等场景,助力企业快速响应市场变化。技术上依赖数据聚合、实时计算框架与A/B测试,同时需应对数据延迟、接口稳定性及合规性挑战。未来,AI与API深度融合将推动预测性分析和智能决策,为企业带来更大竞争优势。
171 1
|
6月前
|
机器学习/深度学习 数据可视化 Python
Scanpy 分析 3k PBMCs:寻找 marker 基因
Scanpy 分析 3k PBMCs:寻找 marker 基因
Scanpy 分析 3k PBMCs:寻找 marker 基因
|
5月前
|
SQL 人工智能 Rust
Java 开发中Stream的toMap与Map 使用技巧
本文深入解析了 Java 中 `toMap()` 方法的三大问题:重复键抛出异常、`null` 值带来的风险以及并行流中的性能陷阱,并提供了多种替代方案,如使用 `groupingBy`、`toConcurrentMap` 及自定义收集器,帮助开发者更安全高效地进行数据处理。
249 0
|
6月前
|
Java 定位技术
陌陌动态留联系方式怎么防止被检测到?只需要插件
本资源提供一种通过技术手段(如hook或对接第三方地图)规避陌陌联系方式被和谐的方法,同时包含一份地图名称生成器的Java代码示例。
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
《鸿蒙Next的AI声音修复功能:多类型音频处理的卓越表现》
鸿蒙Next的AI声音修复功能针对不同类型的音频文件提供卓越的处理效果。对于语音类音频,它能显著提升发音清晰度和可懂度,改善交流质量;音乐类音频则通过优化音质和增强细节,还原原始情感;环境音类音频中,AI有效去除背景噪音,提取纯净自然声音;对特殊格式如MIDI,先转换为实际音频再进行优化。总体而言,该功能根据不同音频特点进行针对性修复,全面提升用户体验。
789 62