准备写一篇工作流的文章,标题就是“数据流代替工作流解决方案”。
如果大家有这方面的格式模板,请给我一个,不胜感激。
在此简单的说下原理:
例如,市场人员因为查看库存没有要的货物,于是填了一张采购申请单,要求某时要货给客户,这时,这张单据状态是未审核,所以,还不能进行采购计划(计划条件一:审核人不为空)。相关部门自动接收采购申请单数据(条件:审核人为空),于是根据实际情况审核。
采购计划人员在制作计划筛选的时候,发现有已审核的采购申请,于是可以实施下一步的工作流程,在制单过程中,数据源为已审核的采购申请数据。
采购计划后,也是根据情况审核...下一步工作...,计划单据审核成功后,采购申请人员可以查看自己申请的货物及计划状态,如果已采购,还可以查看采购到货后分配给自己的数量。
总之,信息管理理的就是数据,一切皆数据,一切皆数据流。
代码:
其实有了这个平台,代码就不用写了,配置就搞定,要写就写SQL,业务逻辑和工作流就体现在这里。
打开配置,就发现申请单的数据显示视图如下:
单据列配置:
No|产品库ID|分类|质量等级|国标代码|片芯型号|规格|型号|需方代码|需方型号|执行标准|品牌型号|品牌|尺寸|组别|电压|容量|端头|引脚|其它特性|最小包装|包装形式|单位|不含税单价|税率|含税单价|数量|不含税金额|含税金额|要求到货日|客户编码|客户名称|客户订单号|紧急程度|扩展一|扩展二|扩展三|扩展四|已计划|待计划|计划状态|小注
主表视图:
Select fcOperator,Convert(nchar(10), fdMakeDate,120) ,fcApplicationNo,fcMemo
From bps_Application
Where fcApplicationNo='@ReceiptNo'
明细表视图:
Select 产品库ID,分类,质量等级,国标代码,国标型号,规格,型号,需方代码,需方型号,执行标准,品牌型号,品牌,
尺寸,组别,电压,容量,端头,引脚,其它特性,最小包装,包装形式,单位,
fnPrice 不含税单价,fnTaxRate 税率,fnTaxPrice 含税单价,fnQuantity 数量,fnAmount 不含税金额,fnTaxAmount 含税金额,
Convert(char(10),fdIntoGoods,120) As 要求到货日,fcCustomerCode 客户编码,I_Customer.fcName 客户名称,
fcCustomerOrderNo 客户订单号,fcExigentFlag 紧急程度,fcExpandA 扩展1,fcExpandB 扩展2,fcExpandC 扩展3,fcExpandD 扩展4,
dbo.GetApplicationQuantityOfPlan(bps_ApplicationDetail.fcApplicationNo,bps_ApplicationDetail.fgProductLibID) As 已计划,
fnQuantity - dbo.GetApplicationQuantityOfPlan(bps_ApplicationDetail.fcApplicationNo,bps_ApplicationDetail.fgProductLibID) As 待计划,
dbo.GetPlanStateForApplication(bps_ApplicationDetail.fcApplicationNo,bps_ApplicationDetail.fgProductLibID) As 计划状态,
fcRemark 小注
From bps_ApplicationDetail
Inner Join uv_ProductLibSelect
On bps_ApplicationDetail.fgProductLibID=uv_ProductLibSelect.产品库ID
--可能不指定客户,因此为左连接
Left Join I_Customer
On bps_ApplicationDetail.fcCustomerCode=I_Customer.fcCode
Where fcApplicationNo='@ReceiptNo'
Order By DetailSn
这样,一张申请单搞定
工作流的下一步主要工作就是采购计划,采购计划数据流来源依据于很多,其中之一就是申请。
单据列配置:
No|产品库ID|分类|质量等级|国标代码|国标型号|规格|型号|需方代码|需方型号|执行标准|品牌型号|品牌|尺寸|组别|电压|容量|端头|引脚|其它特性|最小包装|包装形式|单位|不含税单价|税率|含税单价|计划数量|不含税金额|含税金额|到货日期|申请单号|申请人|申请数量|共计划|计划状态|已采购|小注
主表视图:
Select fcOperator As 制单人,Convert(nchar(10), fdMakeDate,120) As 制单日期,fcPlanNo As 单据编号,fcMemo As 备注
From bps_Plan
Where fcPlanNo='@ReceiptNo'
明细表视图:
Select 产品库ID,分类,质量等级,国标代码,国标型号,规格,型号,需方代码,需方型号,执行标准,品牌型号,品牌,
尺寸,组别,电压,容量,端头,引脚,其它特性,最小包装,包装形式,单位,
bps_PlanDetail.fnPrice 不含税单价,bps_PlanDetail.fnTaxRate 税率,bps_PlanDetail.fnTaxPrice 含税单价,
bps_PlanDetail.fnQuantity 数量,bps_PlanDetail.fnAmount 不含税金额,bps_PlanDetail.fnTaxAmount 含税金额,
Convert(nchar(10),bps_PlanDetail.fdIntoGoods,120) 计划到货日期,bps_PlanDetail.fcApplicationNo 申请单号,bps_Application.fcOperator 申请人,
dbo.GetApplicationQuantity(bps_PlanDetail.fcApplicationNo,bps_PlanDetail.fgProductLibID) As 申请数量,
dbo.GetApplicationQuantityOfPlan(bps_PlanDetail.fcApplicationNo,bps_PlanDetail.fgProductLibID) As 共计划,fcPlanState As 计划状态,
dbo.GetPlanQuantityOfPurchase(bps_PlanDetail.fcPlanNo,bps_PlanDetail.fgProductLibID) As 已采购,
bps_PlanDetail.fcRemark 小注
From bps_PlanDetail
Inner Join uv_ProductLibSelect
On bps_PlanDetail.fgProductLibID=uv_ProductLibSelect.产品库ID
--可能不走申请而直接选产品库,因此为左连接
Left Join bps_Application
On bps_PlanDetail.fcApplicationNo=bps_Application.fcApplicationNo
Where fcPlanNo='@ReceiptNo'
Order By bps_PlanDetail.DetailSn
其实配置的列“国标型号”数据源参照选择配置的是一个存储过程名称“up_bps_PlanSelectApplication”
up_bps_PlanSelectApplication实现如下:
--采购计划中选择申请的产品并且审核有效且未关闭,按产品排序,同一产品按到货日期排,先要到货的先显示
CREATE PROCEDURE up_bps_PlanSelectApplication AS
Select 产品库ID,分类,质量等级,国标代码,国标型号,规格,型号,需方代码,需方型号,执行标准,品牌型号,品牌,
尺寸,组别,电压,容量,端头,引脚,其它特性,最小包装,包装形式,单位,
fnPrice 不含税单价,fnTaxRate 税率,fnTaxPrice 含税单价,fnQuantity 数量,fnAmount 不含税金额,fnTaxAmount 含税金额,
Convert(char(10),fdIntoGoods,120) As 要求到货日,bps_Application.fcApplicationNo 申请单号,bps_Application.fcOperator 申请人,
dbo.GetApplicationQuantityOfPlan(bps_ApplicationDetail.fcApplicationNo,bps_ApplicationDetail.fgProductLibID) As 已计划,
fnQuantity - dbo.GetApplicationQuantityOfPlan(bps_ApplicationDetail.fcApplicationNo,bps_ApplicationDetail.fgProductLibID) As 待计划,
fcRemark 小注
--GetApplicationQuantityOfPlan(申请单号,产品ID),用于返回计划单中响应的申请单中指定产品数量
From bps_ApplicationDetail
Inner Join bps_Application
On bps_ApplicationDetail.fcApplicationNo=bps_Application.fcApplicationNo
Inner Join uv_ProductLibSelect
On bps_ApplicationDetail.fgProductLibID=uv_ProductLibSelect.产品库ID
Left Join I_Customer
On bps_ApplicationDetail.fcCustomerCode=I_Customer.fcCode
--Where fcApplicationNo='@ReceiptNo'
Where Isnull(fcChecker,'') <> '' --首先是审核人不为空,即要审核了的
And Isnull(fbCancel,0) = 0 --其次是本单据没有被取消
And Isnull(fbDefault,1)= 1 --再次,为了扩展加的条件
--以上是固定条件,下面是其它条件
--计划中响应申请的数量小于申请人申请的数量时显示
And dbo.GetApplicationQuantityOfPlan(bps_ApplicationDetail.fcApplicationNo,bps_ApplicationDetail.fgProductLibID) < bps_ApplicationDetail.fnQuantity
--只要计划终止的,不再显示
And dbo.GetPlanStateForApplication(bps_ApplicationDetail.fcApplicationNo,bps_ApplicationDetail.fgProductLibID)<>'关闭'
Order By 产品库ID,fdIntoGoods --按产品排序,同一产品按到货日期排,先要到货的先显示
GO
由存储过程up_bps_PlanSelectApplication可知,逻辑包含在此,并实现工作流其实是采购计划数据流(来流)。
数据库表
S_ReceiptSetup 实现每个业务单据如“采购申请”、“采购计划”的界面配置及一些简单的业务逻辑配置,如标题、子标题、ISO文件号、表顶、表头、表脚、表底、多层表头、明细表列、列宽、有效性、完整性验证、格式、动态计算、合计等。
S_ReceiptSetup还一个作用就是配置审核程序。
如果单据的主表有fcChecker这个字段,你可以不用在S_ReceiptSetup配置审核程序,而是直接在表S_CheckReceiptConfig中填写,如:
采购计划审核(fcCheckName字段) 采购计划(fcReceipName字段)
当然,你也可以自己写审核的逻辑:
如“撤销采购计划审核”的逻辑为:
(fcFilterString字段)
SELECT fcPlanNo + '|' + CONVERT(nchar(10), fdMakeDate, 120) + '|' + fcOperator AS t From bps_Plan Where IsNull(fcChecker,'')<>'' And fcPlanNo Not In (Select fcPlanNo From bps_PurchaseDetail Where bps_PurchaseDetail.fcPlanNo = bps_Plan.fcPlanNo)
(fcUpdateString字段)
Update bps_Plan Set fcChecker='' Where fcPlanNo='@ReceiptNo'
采购申请的审核类同上面的“采购计划审核”。
所以,申请单据填写后(主表明细表有数据),经过授权主管审核(fcChecker不为空了),采购计划的数据源就有了。
工作流:申请--审核申请--计划,而这,就是用数据流做的。