本文以版本PT-146926 [8.0.0.20220922]为背景书写,销售订单审核后,默认是除了表头备注字段外,其它所有字段都不能编辑,如果要编辑则可通过销售订单新变更单来完成(通版认为审核后的销售订单不会在编辑界面上修改,只会通过变更单来变相实现修改),因此如果订单正在由账号A变更,那么另一用户B打开销售订单时不会提示有诸如'销售订单正在变更中'的提示,这种控制符合大多数客户的需求。
但是有客户提单反馈在销售订单二开的某些字段配置了审核后可编辑,部门A下的操作员会在销售订单审核后编辑某些二开字段,而部门B的人会通过销售订单新订单变更进行变更,部门A和部门B的人可能会修改同一字段,这种情况下就可能存在冲突,此时客户肯定希望能有相关提示信息。本文将演示如何用Python插件二开处理此需求。
首先,打开BOS IDE,扩展销售订单,在表单插件中注册一个Python表单插件
Python脚本代码如下:(注:请使用附件中的代码,不要直接在论坛上复制以下脚本)
# -*- coding: utf-8 -*- #销售订单单据插件试例 import clr clr.AddReference('System') clr.AddReference('Kingdee.BOS.Core') clr.AddReference('Kingdee.BOS') clr.AddReference('Kingdee.BOS.App') from Kingdee.BOS.Core import * from System import * from Kingdee.BOS.Core.DynamicForm import * from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel import * from System.Collections.Generic import * from Kingdee.BOS.App.Data import * def AfterBindData(e): docStatus = Convert.ToString(this.View.Model.GetValue("FDocumentStatus")); if docStatus == 'C': id = Convert.ToInt64(this.View.Model.GetPKValue()); strSQL = "SELECT USR.FNAME FROM T_BAS_NETWORKCTRLRECORDS CTL INNER JOIN T_SEC_USER USR ON CTL.FUSERID = USR.FUSERID WHERE CTL.FINTERID = {0} AND CTL.FNETCTRLID = 'TBLISTORDERCHANGE' AND USR.FUSERID <> {1} "; strSQL = strSQL + " UNION SELECT USR.FNAME FROM T_SAL_XORDER O INNER JOIN T_SAL_XORDERFIN OFIN ON O.FID = OFIN.FID INNER JOIN T_SEC_USER USR ON O.FCREATORID = USR.FUSERID WHERE O.FPKIDX = {0} AND USR.FUSERID <> {1} AND OFIN.FISACTIVE = 'A' AND O.FCANCELSTATUS = 'A'"; strSQL = String.format(strSQL, id, this.Context.UserId); name = DBUtils.ExecuteScalar[String](this.Context, strSQL, String.Empty); if name is not None and name != '': this.View.ShowWarnningMessage(name + " 正在变更单据,请勿修改!"); def BeforeDoOperation(e): opName = e.Operation.FormOperation.Operation.ToUpperInvariant(); if opName == "ORDERCHANGE": docStatus = Convert.ToString(this.View.Model.GetValue("FDocumentStatus")); if docStatus == 'C': id = Convert.ToInt64(this.View.Model.GetPKValue()); strSQL = "SELECT USR.FNAME FROM T_BAS_NETWORKCTRLRECORDS CTL INNER JOIN T_SEC_USER USR ON CTL.FUSERID = USR.FUSERID WHERE CTL.FINTERID = {0} AND CTL.FNETCTRLID = '9b5297218b5f41bcaeab09e57949ea6e' AND USR.FUSERID <> {1}"; strSQL = String.format(strSQL, id, this.Context.UserId); name = DBUtils.ExecuteScalar[String](this.Context, strSQL, String.Empty); if name is not None and name != '': this.View.ShowWarnningMessage("单据已被用户 " + name + " 打开,请勿变更!"); e.Cancel = True;
上文在AfterBindData方法中的Sql脚本通过UNION语句从网控记录表和销售订单新变更单表中查询数据,这里作个简单说明,如果有另一用户点变更操作跳转进销售订单新变更编辑界面,但没有保存此时会TBLISTORDERCHANGE 网控(这是通版通过插件添加的固定的网控标识),如果暂存变更单了,则除了有 TBLISTORDERCHANGE 网控外,在表 T_SAL_XORDER 中还有对应的记录,如果是保存了,则 TBLISTORDERCHANGE 网控消失(通版通过插件自动移除的)。只要销售订单新变更单没有生效且没有作废,都认为有人在变更数据。
其次,在扩展的销售订单的列表插件中注册一个Python列表插件
Python脚本代码如下:(注:请使用附件中的代码,不要直接在论坛上复制以下脚本)
# -*- coding: utf-8 -*- #销售订单列表插件试例 import clr clr.AddReference('System') clr.AddReference('Kingdee.BOS.Core') clr.AddReference('Kingdee.BOS') clr.AddReference('Kingdee.BOS.App') from Kingdee.BOS.Core import * from System import * from Kingdee.BOS.Core.DynamicForm import * from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel import * from System.Collections.Generic import * from Kingdee.BOS.App.Data import * def BeforeDoOperation(e): opName = e.Operation.FormOperation.Operation.ToUpperInvariant(); if opName == "ORDERCHANGE": pkIds = this.ListView.SelectedRowsInfo.GetPrimaryKeyValues(); if len(pkIds) > 0: id = Convert.ToInt64(pkIds[0]); strSQL = "SELECT USR.FNAME FROM T_BAS_NETWORKCTRLRECORDS CTL INNER JOIN T_SEC_USER USR ON CTL.FUSERID = USR.FUSERID WHERE CTL.FINTERID = {0} AND CTL.FNETCTRLID = '9b5297218b5f41bcaeab09e57949ea6e' AND USR.FUSERID <> {1}"; strSQL = String.format(strSQL, id, this.Context.UserId); name = DBUtils.ExecuteScalar[String](this.Context, strSQL, String.Empty); if name is not None and name != '': this.View.ShowWarnningMessage("单据已被用户 " + name + " 打开,请勿变更!"); e.Cancel = True;
BOSIDE保存扩展后(如果Python插件保存时提示某些程序集未能加载,可忽略此提示点继续保存),先用一个账号登录打开某个销售订单单据,再用另一个账号登录系统,分别在列表和单据上变更,提示如下图2-1和图2-2所示(如果是用同一账号打开某个单据后,再在列表或单据上变更,则不提示):
如果某个销售订单单据正在被某一个账号A变更(注意进行销售订单变更的账号不要打开单据编辑界面,请直接在列表上点变更,如果某一账号打开了一个单据,另一个账号稍后也打开同一单据,则会先提示编辑网控的冲突),用另一个账号B登录后打开此销售订单则显示‘XX 正在变更单据,请勿修改!