分类 K3Cloud 下的文章

学习目标

完成本单元学习后,您将能够:

  • 了解返工生产的业务背景

  • 掌握返工生产的成本逻辑

什么是返工生产业务

当您由于生产工艺原因,导致某些产品不合格,需要退回到产线上进行返修,达到合格状态后再次入库,您可以使用返工生产业务流程,业务流程操作步骤您可以参考超实用的生产流程:返工生产

返工生产成本计算逻辑

返工生产流程,成本计算主要涉及到两个单据,返工生产领料单和返工生产入库单。如果您返工过程需要额外领用其他配件,可以通过调整生产用料清单增加新材料后续生产领料,也可参与成本计算。本单元将主要通过返工生产领料单和返工生产入库单来给您介绍返工业务,返工生产入库单材料成本取决于返工生产领料单,返工生产领料单的成本计算有两种方式,成本暂估和循环计算,取决于您的成本管理系统参数设置,如图1所示。

image.png

图1

此参数默认不可见,可以从BOS中参数可见性放出来,如图2所示。

image.png

图2

接下来我将为您具体介绍两种参数对应的成本计算逻辑。

  1. 成本暂估,是指返工生产领料单按照您零成本自动取价参数的规则来暂估成本,如图3所示。

    image.png

    图3

    您成本计算后,返工生产领料单的成本来源会显示为返工暂估,并显示具体的成本暂估来源,如图4所示。

    image.png

    图4

  2. 循环计算

    上文介绍的返工计算为成本暂估,是根据零成本自动取价取数,但是可能暂估的价格并不是您实际需要的价格,您如果需要实现返工领料单的出库单价尽可能贴近正常出库单据的加权平均价,您可以设置返工计算参数为循环计算,同时需要设置循环计算次数和差异率,如图5所示。

    image.png

    图5

    启用循环计算的目的是为了让您的返工生产领料单最大程度接近您的当期加权平均价,减少由于返工业务导致的成本误差。您设置的循环次数越大,成本计算耗时就会越长。

    循环差异率=|上一次计算的返工领料单的成本-当期新计算的返工领料单的成本| /上一次正常出库成本

    您的差异率设置的越小,代表您对成本精确程度要求更高,未达到您设置的差异率范围内,系统会继续循环计算,但是最大循环计算的次数不会超过您设置的最大循环次数。也就是说,循环次数达到您设置的最大循环次数系统就跳出循环,不管此时差异率有没有达到您设置的差异率。

    下面通过案例来具体理解计算逻辑。

    案例:物料A期初库存为1个,成本价为3元,本期采购入库1个,单价为4元,本月发生一笔返工生产业务,当期领料,当期入库了;发生一笔正常生产领料业务;差异率设置为0,最大循环次数为7。

    第一次循环:是为了暂估单价,计算结果如图6所示,第一次返工生产领料按照期初加权价格进行暂估。

    image.png

    图6

    第二次循环:计算结果如图7所示,本次返工生产领料单的成本,取第一次循环计算出来的正常加权成本。

    image.png

    图7

    差异率=|3-3.33| / 3.33=9.91%

    第三次循环计算:计算结果如图8所示,本次返工生产领料单的成本,取第二次循环计算出来的正常加权成本。


    image.png

    图8

    差异率=|3.33-3.44| / 3.44=3.20%

    第四次循环计算:计算结果如图9所示,本次返工生产领料单的成本,取第三次循环计算出来的正常加权成本。

    image.png

    图9

    差异率=|3.44-3.48| / 3.48=4%

    第五次循环计算:计算结果如图10所示,本次返工生产领料单的成本,取第四次循环计算出来的正常加权成本。


    image.png


    图10

    差异率=|3.48-3.49| / 3.49=0.29%

    第六次循环计算:计算结果结果如图11所示,本次返工生产领料单的成本,取第五次循环计算出来的正常加权成本。

    image.png

    图11

    差异率=|3.4938-3.4979| / 3.4979=0.12%

    第七次循环计算:计算结果如图12所示,本次返工生产领料单的成本,取第六次循环计算出来的正常加权成本。

    image.png

    图12

    差异率=|3.4979-3.4993| / 3.4993=0.04%

    此时已达到最大循环次数,跳出循环,由上述计算过程可见,每循环一次,差异就会变小一点,循环次数越大,差异越小,但是需要考虑到系统性能,不建议循环次数设置的过大。

    理论上您成本计算时间=返工计算选择成本暂估所耗费用的时间*最大循环次数

通过本单元学习,相信您对返工业务的成本逻辑已经有初步了解,更多相关知识可参考如下进行巩固学习。

  1. 返工计算启用循环计算说明


本文描述了一个使用Python和SQL Server存储过程实现金蝶软件简单报表的过程。步骤包括新建账表和过滤框、修改过滤窗口标识、注册插件。Python代码涉及初始化报表属性、获取过滤条件、构建取数SQL和临时表、动态构建报表列和标题、展示数据。SQL存储过程负责查询和构建报表数据。

有用

反馈

第一步 新建一个简单账表加上表头标签

第一步 新建一个简单账表加上表头标签.png

第二步 新建一个过滤框

第二步 新建一个过滤框.png

第三步 修改过滤窗口标识

第三步 修改过滤窗口标识.png

第四步 注册插件

第四步 注册插件.png

python代码实现

import clr
clr.AddReference("System")
clr.AddReference("System.Core")
clr.AddReference("Kingdee.BOS") 
clr.AddReference("Kingdee.BOS.App")
clr.AddReference("Kingdee.BOS.Core")
clr.AddReference("Kingdee.BOS.Contracts")
clr.AddReference("Kingdee.BOS.DataEntity")#引入命名空间from Kingdee.BOS import *from Kingdee.BOS.App import *from Kingdee.BOS.App.Data import *from Kingdee.BOS.Contracts import *from Kingdee.BOS.Contracts.Report import *from Kingdee.BOS.Core.Report.PlugIn import *from Kingdee.BOS.Core.Report import *from Kingdee.BOS.Orm.DataEntity import *from Kingdee.BOS.Util import *from System import *#import datetime#全局变量global sBillDataTempTable;
sBillDataTempTable = "";global _dtDateFrom; #存放开始日期数据global _dtDateTo;#存放结束日期数据global _matter;#存放物料标识数据def Initialize():
   this.ReportProperty.ReportType = ReportType.REPORTTYPE_NORMAL;
   this.ReportProperty.ReportName = LocaleValue("老李头的简单报表示例Python", this.Context.UserLocale.LCID);
   this.ReportProperty.IsGroupSummary = False; #合计分组
   this.ReportProperty.IsUIDesignerColumns = False;   

#获取过滤条件  用于数据源过滤def GetFilter(filter):
  dyFilter = filter.FilterParameter.CustomFilter;  global _dtDateFrom;  global _dtDateTo;  global _matter;  #获取过滤框里的数据
  #GetBaseDataByKey 单选基础资料取值
  #GetMulBaseDataByKey 多选基础资料
  #GetDataByKey 文本,日期 取值
  _dtDateFrom = GetDataByKey(dyFilter, "FBeginDate").ToString() if GetDataByKey(dyFilter, "FBeginDate") != "" else "";
  _dtDateTo = GetDataByKey(dyFilter, "FEndDate").ToString() if GetDataByKey(dyFilter, "FEndDate") != ""  else "";
  _matter = GetBaseDataByKey(dyFilter,"F_MATTER","Id") if GetBaseDataByKey(dyFilter,"F_MATTER","Id") != ""  else "";  return dyFilter;#构造取数Sql,取数据填充到临时表:tableNamedef BuilderReportSqlAndTempTable(filter,tableName):
  dyFilter = GetFilter(filter);  global sBillDataTempTable
  sBillDataTempTable = tableName;
  CreatBillDataTempTable();
  SetDataToRptTable(filter); 
#创建【动态构建列存储过程】数据临时表def CreatBillDataTempTable():
  sql = "";  #数据源设置 使用存储过程后期可以不需要修改代码直接修改存储过程实现动态列展示
  #使用存储过程获取数据参数:临时表名称,开始时间,结束时间,物料标识
  sql =("/*dialect*/ EXEC MindeeSimpleTable '{0}','{1}','{2}','{3}'").format(sBillDataTempTable,_dtDateFrom,_dtDateTo,_matter); 
  #使用SQL语句获取数据
  #sql =("""/*dialect*/SELECT T1.FBILLNO 单据号 ,T2.FQTY 数量 ,T3.FNUMBER 物料代码  ,T4.FNAME 物料名称 ,T4.FDESCRIPTION 描述  ,ROW_NUMBER() OVER(ORDER BY T1.FID,T2.FENTRYID)  FIDENTITYID into {0} FROM  T_PUR_POORDER t1 INNER JOIN T_PUR_POORDERentry t2 ON T2.FID=T1.FID INNER JOIN T_BD_MATERIAL T3 ON T3.FMATERIALID=T2.FMATERIALID INNER JOIN T_BD_MATERIAL_L T4 ON T4.FMATERIALID=T3.FMASTERID WHERE 1=1 AND 1 = CASE WHEN ISNULL('{1}','') = '' THEN 1 ELSE CASE WHEN ISNULL(T1.FDATE,'')  >=  '{1}' THEN 1 ELSE 0 END END AND 1 = CASE WHEN ISNULL('{2}','') = '' THEN 1 ELSE CASE WHEN ISNULL(T1.FDATE,'')  <=  '{2}' THEN 1 ELSE 0 END END""").format(sBillDataTempTable,_dtDateFrom,_dtDateTo);
  DBUtils.ExecuteDynamicObject(this.Context, sql);#动态构建列def GetReportHeaders(filter):
  header = ReportHeader();
  localEid=this.Context.UserLocale.LCID; 
  sql = ("""SELECT T1.system_type_id as FDateTypeId , t3.name AS FDateType,t1.name AS FName FROM sys.columns t1   INNER JOIN sys.objects t2 ON t2.object_id = t1.object_id INNER JOIN sys.types t3 ON t3.user_type_id=t1.user_type_id  WHERE t2.name='{0}' AND  t2.type='u' """).format(sBillDataTempTable);
  RecordData = DBUtils.ExecuteDynamicObject(this.Context, sql);  for item in RecordData:    #隐藏不显示这个字段 FIDENTITYID
    #不知为什么报表格式会显示格式是  FIDENTITYID,FIDENTITYID (求解答)
    if item["FName"].ToString() == str("FIDENTITYID"):      continue
    header.AddChild(item["FName"].ToString(),LocaleValue(item["FName"].ToString(), localEid), GetEnumByValue(SqlStorageType,item["FDateTypeId"].ToString()), True);  return header;#设置报表头def GetReportTitles(filter):
  titles = ReportTitles();  #把过滤框的日期放到报表头
  titles.AddTitle("FBeginDate", str(filter.FilterParameter.CustomFilter["FBeginDate"]));
  titles.AddTitle("FEndDate", str(filter.FilterParameter.CustomFilter["FEndDate"]));  return titles;#展示数据表到前台def SetDataToRptTable(filter):
  sqlstr=("SELECT * FROM {0}").format(sBillDataTempTable);
  sqlstr2=("SELECT COUNT(*) AS Frow FROM sys.objects WHERE name='{0}' AND type='u'").format(sBillDataTempTable);
  ROWS = DBUtils.ExecuteDynamicObject(this.Context,sqlstr2);  if str(ROWS[0]["Frow"]) != "0":
     DBUtils.Execute(this.Context, sqlstr); 

#获取DynamicObject数据包中指定key的值def GetDataByKey(doFilter, sKey):
  sReturnValue = "";  if doFilter is not None and doFilter[sKey] is not None and len(str(doFilter[sKey])) > 0:
    sReturnValue = doFilter[sKey].ToString();  return sReturnValue;#获取DynamicObject数据包中指定key的基础资料的指定属性的值def GetBaseDataByKey(doFilter,sKey,sItem):
  sReturnValue="";  if doFilter is not None and doFilter[sKey] is not None and len(str(doFilter[sKey])) > 0:
    doTemp = doFilter[sKey];
    sReturnValue = doTemp[sItem].ToString();  return sReturnValue;#获取DynamicObject数据包中指定key的基础资料的指定属性的值def GetMulBaseDataByKey(doFilter,sKey,sItem):
  sReturnValue = "";  if doFilter is not None and doFilter[sKey] is not None and len(str(doFilter[sKey])) > 0:    for item in doFilter[sKey]:      if len(str(GetBaseDataByKey(item,sKey,sItem)))>0:
        sReturnValue = "{0}{1}".format(sReturnValue, GetBaseDataByKey(item,sKey,sItem)+",");  return sReturnValue.TrimEnd(',') #replace()代替C# TrimEnd(',')函数#枚举操作def GetEnumByValue(enumType,value):
  return Enum.Parse(enumType, value);

SQLSERVER 存储过程

-- =============================================-- Author:		敏蝶老李头-- Create date: 2023-04-11-- Description:	简单报表演示-- =============================================ALTER PROCEDURE [dbo].[MindeeSimpleTable]	-- Add the parameters for the stored procedure here
	@TableName varchar(50),
	@FBeginDate varchar(50),
	@FEndDate varchar(50),
	@Matter intASBEGIN 

	SELECT T1.FBILLNO 单据号 ,T2.FQTY 数量 ,T3.FNUMBER 物料代码  ,T4.FNAME 物料名称 ,T4.FDESCRIPTION 描述  
	,ROW_NUMBER() OVER(ORDER BY T1.FID,T2.FENTRYID)  FIDENTITYID 
	INTO #DATA FROM  T_PUR_POORDER t1 
	INNER JOIN T_PUR_POORDERentry t2 ON T2.FID=T1.FID 
	INNER JOIN T_BD_MATERIAL T3 ON T3.FMATERIALID=T2.FMATERIALID 
	INNER JOIN T_BD_MATERIAL_L T4 ON T4.FMATERIALID=T3.FMASTERID 
	WHERE 1=1 
	AND 1 = CASE WHEN ISNULL(@FBeginDate,'') = '' THEN 1 ELSE CASE WHEN ISNULL(T1.FDATE,'')  >=  @FBeginDate THEN 1 ELSE 0 END END 
	AND 1 = CASE WHEN ISNULL(@FEndDate,'') = '' THEN 1 ELSE CASE WHEN ISNULL(T1.FDATE,'')  <=  @FEndDate THEN 1 ELSE 0 END END
	AND 1 = CASE WHEN ISNULL(@Matter,0) = 0 THEN 1 ELSE CASE WHEN ISNULL(T3.FMATERIALID,'')  =  @Matter THEN 1 ELSE 0 END END--多选基础资料参考--AND 1 = CASE WHEN ISNULL(@Matter,'') = '' THEN 1 ELSE CASE WHEN T3.FMATERIALID in ( select FID from  dbo.fn_StrSplit(@Matter, ',')   )THEN 1 ELSE 0 END END 
	 IF OBJECT_ID(@TableName,N'U') is  null
 BEGIN
 --不存在 新增表
 DECLARE @NEWTABLESQL VARCHAR(100)=N'SELECT * INTO '+@TableName+' FROM #DATA'
 EXEC(@NEWTABLESQL) END
 ELSE
 BEGIN
 --存在 删除数据表重新插入
 EXEC(N'DROP TABLE '+ @TableName+'') DECLARE @UPDATESQL VARCHAR(100)=N'SELECT * INTO '+@TableName+' FROM #DATA'
 EXEC(@UPDATESQL) 
 END
 SELECT * FROM #DATADROP TABLE #DATAEND

功能实现截图

image.png


https://vip.kingdee.com/article/433709738048508160?productLineId=1&lang=zh-CN

金蝶作为中大型企业信息化管理的ERP管理软件,其特点在于对于服务器配置要求较高,作为针对性的云计算服务厂商我会讲解一下K3cloud高并发如何部署在阿里云上。
做项目的都知道,小客户比较关注的是成本,大客户关注的是价值和服务。高并发客户一般都会有专业的IT运维人员,会非常关心软件运行的稳定性和安全性,用一台云服务器做部署是很难满足客户的需求的而且会带来很大的安全隐患。
这里我们会用到集群部署方式,这种方式的好处就是能确保多台云服务器同时为业务提供服务,一台服务器即使出了问题,还会有其他云服务器可以分担用户请求。除非是所有应用服务器同时出问题。
否则业务就不会被中断,那么留给我们进行售后处理问题的时间就非常充裕,同时也大大降低了服务商的服务成本。
在描述部署方案之前,我这边先大概介绍一下项目的情况:这里我就以A客户来描述
A公司2018年12月份购买了金蝶K3CLOUD7.2版本 用户数300.


客户诉求:
1.曾经有业务系统中过勒索病毒,要确保软件的高可用和数据安全。
2.三家工厂和多个分公司分布在全国各地,需确保网络稳定和数据传输的安全性。
3.数据库要做容灾,最好有异地备份容灾,可以实现秒级恢复。
4.实现VPC专有网络,实现不同业务系统之间二层隔离。
5.实现云后台账号管控和权限组管理,分职权进行人员和云上资产管理。


01—架构设计

方案特点:

高可用性:
1、通过SLB负载均衡,将用户请求分发至多台应用服务器确保业务不中断,任意一台服务器出现问题,都不会影响软件的正常使用。
2、数据库采用阿里云RDS SQLSEVER 2012 双机,一主一备实现高可用,
两台数据库数据库实时同步,主机宕机备用立刻实现无缝切换。

安全性:
1、应用服务器通过安骑士进行基础防护,可以实现病毒木马查杀,同时提供系统漏洞修复。
2、OSS备份存储可为应用服务器提供磁盘备份及镜像功能,可设置自动备份策略及回滚恢复。
3、DBS数据库备份可为RDS数据库提供备份,可设置备份策略及秒级恢复。
4、通过智能接入网关或VPN网关可实现业务系统同时存在于异地网络和云上机房。基于阿里云VPC搭建不同的业务模块,构建完全隔离的云上环境,通过公网进行业务交互安全可靠。
5、WEB应用防火墙可防御SQL注入、XSS跨站脚本、服务器插件漏洞、木马上传、非授权核心资源访问等OWASP常见攻击,过滤海量恶意CC攻击,避免您的数据泄露,保障业务的安全与可用性。

02—产品清单:
阿里云ECS服务器
一台管理中心服务器,两台应用服务器,用来部署金蝶K3CLOUD应用程序及客户端程序

阿里云RDS云数据库
SQL SEVER 2012高可用版一主一备的经典高可用架构本地SSD存储提供最佳性能,各方面表现均衡,适用于大中型企业的生产数据库

阿里云OSS对象存储
提供应用服务器程序及磁盘数据备份服务,可设置自动备份策略
此产品非常适合金蝶ERP的使用,
举例自动策略设置为每天12:00和24:00进行磁盘数据备份。
如果服务器出现问题,例如可以直接回滚到之前的正常状态。

阿里云DBS数据库备份
功能如同OSS,只是该功能是专门针对阿里云RDS数据库使用。

负载均衡SLB
为用户提供请求分发服务,将300用户的操作请求按照权重分发给不同的应用服务器处理是实现集群部署和高可用的必须用到的产品。


专有网络VPC
将阿里云上的资源(包括服务器,数据库等产品)实现专有网络部署和其他资源进行二次隔离,确保业务之间的独立性和安全性。


智能接入网关
通过直接接入网关可以实现Internet就近加密接入,类似VPN和高速通道,将各个区域与阿里云组成局域网络获得更加智能、更加可靠、更加安全的上云体验。


web应用防火墙
Web应用攻击防护,通过防御SQL注入、XSS跨站脚本、常见Web服务器插件漏洞、木马上传、非授权核心资源访问等OWASP常见攻击,过滤海量恶意CC攻击,避免您的网站资产数据泄露,保障网站的安全与可用性。

安骑士
安骑士是一款经受百万级主机稳定性考验的主机安全加固产品,拥有自动化实时入侵威胁检测、病毒查杀、漏洞智能修复、基线一键核查等功能,是构建主机安全防线的统一管理平台。

这里大致说一下安骑士和web应用防火墙的差别
安骑士是针对服务器的安全进行防护的,类似于防护杀毒软件,同时提供windows系统漏洞修复等功能
Web应用防火墙主要是防护网络攻击,SQL注入,恶意挖矿木马的植入上传。
安骑士企业版是可以对勒索病毒进行基础防护的。
当然也会有很多朋友会问这个方案的可行性,所谓我们特意对我们的这个方案做了一个测试。

03—测试结果
K/3Cloud 微软 CCIC 测试
------稳定性和300并发能力测试

硬件环境:


系统环境:

本次进行测试的数据库实体为 26GB(完毕删除),其中一些业务数据量如下:

稳定性测试模拟实际的生产环境场景,并发数 300 个
包拪基础,财务和供应链领域,连续运行 24 小时。测试结果如下:
事务总体情况

平均响应时间:

整个过程非常平稳。平均响应时间绝大部分在4 秒内完成

点击率在 63 左右,整个过程也非常稳定,未出现大的波动。
SQL Server

SQL Server 服务器的 CPU 占用率为 95/4=27.5%,说明在 370 并发的情况下,需要CPU资源并不高。并且整个过程表现的非常稳定。SQL Server 缓存的命中率几乎为100%,说明需要的数据都可以从缓存中获取。

App Server

App Server 的 CPU 占用率大概为 10%左右,说明在 300 并发的情况下,需要的 CPU 资源并不高。从内存来看,整个过程表现非常平稳。从 GC 来看,其大小相对稳定,能够有效的回收资源。
说明 App Serve 是稳定和可靠的。

通过测试,此云上架构方案完全符合K3CLOUD使用环境

客户价值
1.以同样方式进行线下部署,云上部署IT综合成本更低,运维更加方便。
2.在较低投入成本的情况下实现了业务系统的高可用,同时确保了业务系统的安全性和实用性。
3.客户体验性更好。

软件服务商价值
1.云上部署比线下部署更加方便,大大降低了实施服务人工成本。缩短了实施周期,项目可控性更高
以上架构适用于300并发及更高并发量的K3CLOUD用户。

发布于 2020-07-09 15:29


金蝶K/3 Cloud架构理念:
(1)开放型
动态构建的多核算体系与业务流程设计模型,为企业提供了适应其动态发展的开放性管理平台;
B/S、多端支持、跨数据库支持、SOA架构,为企业提供了开放的信息化整合平台;
开放的ERP开发云平台,为伙伴、客户提供完整的ERP服务生态圈;
(2)标准型
标准的管理模式:100万家客户管理最佳实践;
标准的业务架构:多会计准则、多币别、多地点、多组织、多税制应用框架;
标准的业务建模:应用独创的cloud核心技术——动态领域模型;
(3)社交化
深度集成金蝶“云之家”,构筑企业用户高效、协同的社交门户;
面向角色的移动应用,为企业及用户搭建跨越空间、时间限制的工作环境;
面向群组、责任人的社交化流程驱动应用,将互联网技术完美融入管理中。 K/3 Cloud技术架构开放性
开放的ERP生态链N层差量化开发模型,实现标准、行业、伙伴、客户定制开发成果的隔离及特性应用组合。
K/3 Cloud技术平台标准性
独创的动态领域模型,抽象了28种标准ERP领域模型、624种模型元素、12167种模型元素属性组合,133个业务
服务构件,通过90%标准配置+10% 开发即可实现快速交付
K/3 Cloud技术平台动态性---变化多“端”
基于开放的界面服务接口开发的不同的前端,实现一次设计多“端”运行;设计时即运行时,界面元素、操作、逻辑
配置的变动实时动态运行
K/3 Cloud技术平台易用性
面向业务人员的建模体系使各种角色都能对业务功能进行配置性开发
金蝶K/3 Cloud架构价值
基于K/3 Cloud技术架构开放性、动态性、标准性和易用性特点,从而能够满足快速配置、快速实施、快速应用、
快速见效的要求,利于打造开放的生态链协同开发云,实现企业管理解决方案快速社会化规模交付。
动态领域模型是K/3 Cloud的核心技术
转载
文章目录
金蝶K/3 Cloud架构理念
动态领域模型是K/3 Clou
动态领域模型类型实例
K/3 Cloud BOS 开发过程
每日
签到

意见
反馈
训练营





排行

精品课
程
免费资

软考题

搜索文章、作者  写文章 创作中心
动态领域模型类型实例
文章目录
金蝶K/3 Cloud架构理念
动态领域模型是K/3 Clou
动态领域模型类型实例
K/3 Cloud BOS 开发过程
意见
反馈
训练营





排行

精品课
程
免费资

软考题

写文章 创作中心
K/3 Cloud BOS 开发过程图