跳过导航链接。
nodejs引擎
U9>工程配置>产品配置>用户操作: http://ugis.zhut.cn/KM/Help.aspx?ID=532
创建时间:2016-04-11  创建人:杨利森_E01313  修改时间:2017-07-10  修改人:杨利森_E01313  

一、说明:采用nodejs开发,主要目的是提升运算性能、增强配置功能,简化配置。

二、语法:标准的js语法,区分大小写,支持自定义变量、自定义函数。

三、上下文:

1)当前产品信息行_P,_P类型为pClass。产品配置生成出货清单时是按着工程配置产品信息行一行行的运算分解的。

function pClass(){
    this.ID = -1;
    this.GroupSymbol='';
    this.Item=-1;
    this.ItemCode='';
    this.ItemMasterFate=-1;
    this.ItemName='';
    this.ProductInfo = -1;
    this.ProductCode='';
    this.ProductName='';
    this.Qty=0;
    this.Spec='';
    this.WH=-1;
    this.WHCode='';
    this.WHName='';
    this.ConfigModel= '';
    this.ConfigType = -1;
    this.ChildBomMaster = -1; //子BOM母件的ID
    this.ChildBomWHCode = '';//对应子BOM母件的存储地点
    this.ChildBomTransfer = false; //对应子BOM母件是否调拨
    this.Info = { Usage: { Value: -1 } };//0是备品,1是工程
    this.CS = [];
}

 当前产品_curP,_curP类型为pClass, _curP与_P的区别是_curP在多级虚拟包中,指的是虚拟包本身。

2)所有产品信息行_PS:

{
  Items:[] //pClass数组
  ,Count:function(){ }
  ,Sum:function(){ }
  ,IsExists:function(){ }
  ,Find:function(filter,sort){ }
 }

3)当前产品所有参数_CS:

类型cClass定义如下:

function cClass(){
    this.Code='';
    this.Name='';
    this.Value='';
    this.ValueName='';
}

_CS定义如下:

{
  Items:[] //cClass数组
  ,Count:function(){ }
  ,Sum:function(){ }
  ,IsExists:function(){ }
  ,Find:function(filter,sort){ }
 }

4)全局参数调用$:

      获取全局参数,产品参数,产品数量的函数。

      $('G.XSQY')              //全局参数:返回字符串或字符串数组,如 'a'或['JOYO-YS','JOYO-B44']
      $('P.UT-0362.I/0KR')     //产品参数:按参数类型返回值,可以是字符串、布尔、数字中的一种。      
      $('C.MNP_AJQ.AJQ4')      //产品数量:返回数量

 

5)当前料品_I,对应于工程配置料品信息行。

{
    this.Item = -1;
    this.ItemCode = '';
    this.ItemName = '';
    this.Qty = 0;//数量
    this.WH = '';//存储地点编码
    this.Transfer = false;//调拨
    this.ID = -1;//产品配置料品信息行ID
    this.Key = -1;//唯一ID
    this.ProjectProductInfoID = -1;
    this.ItemMasterInfo = -1;
    this.ProductInfoRowno = -1;
    this.IsPublic = false;
    this.IsSecond = false;
}

6)当前运算结果:_IS,运算过程中,数量大于零的料品信息行被添加到全集合。_IS.Item指的是所有运算结果,_IS.CurItems指的是当前产品信息行的结果。

function isClass() {
    this.CurProductInfoID = -1;
    this.curKeyIndex = 0;
    this.Items = [];
    this.CurItems = [];
    this.Add = function (item) {};
    this.Remove = function (item) {};
    this.ResetCurItems = function () {};
    
}

注意:没有特别情况下,请不要修改该集合,会影响运算结果。
7)虚拟包参数:_VP

8)产品运算前预处理:

9)产品运算后处理:

四、功能:

1)虚拟包传参:
       在料品表达式中设置参数

   _I._VP.Paras={para1:'10A',para2:10};

       在虚拟包中调用参数

  var p1 = _curP._VP.Paras.para1;

        建议在虚拟包的产品预处理表达式初始化参数:

  _curP._VP.Paras = applyIf(_curP._VP.Paras,{
       para1:'20A' /*默认值10A*/
       ,para2:10   /*默认值10*/
       ,para3:8
  });


五、兼容性预置函数:

  • String.in

       字符串是否在参数内。参数可以是字符串,也可以是字符串数组,返回布尔值。

 console.log( 'a'.in('a','b') );  //true
 console.log( 'a'.in(['a','c'], 'b') );  //true
 console.log( 'a'.in(['d','c'], 'b') );  //false
  • String.notin

    用法参照String.in, 等于!String.in

  • String.like

     字符串匹配函数。符号%表示模糊匹配,%在左边表示左匹配,右边表示右匹配,在中间不匹配。返回布尔值。

console.log( 'abc'.like('a') );  //false
console.log( 'abc'.like('%a%') );  //true
console.log( 'abc'.like('%h%') );  //false
console.log( 'abc'.like('%a') );  //false
console.log( 'abc'.like('%bc') );  //true
console.log( 'abc'.like('bc%') );  //false
console.log( 'abc'.like('%bc%') );  //true

 

  • Number.in

     数字是否在参数内。参数可以是数字,也可以是数字数组。返回布尔值。

     var num = 1;
     console.log(num.in(1, 3, 4) ); //true
     console.log(num.in([1, 3], 4) ); //true     
     console.log(num.in([2, 3], 1) );  //true     
     console.log(num.in([2, 3], 4)  ); //false

  注意:不能直接写4.in(1,4) ,否则会报语法错误。

  • Number.notin

     用法参照Number.in,等于! Number.in

     

  • _Help.Write

     

  • GetPC

     

  • Round,round

     

  • Floor,floor

     

  • Ceiling,ceiling

     

  • Contains,contains

  • Mod

     

 

 

六、生成出货清单计算过程:
GCConfig Flow.png

 

nodejs引擎调试
U9>工程配置>产品配置>用户操作: http://ugis.zhut.cn/KM/Help.aspx?ID=650
创建时间:2016-07-20  创建人:杨利森_E01313  修改时间:2016-07-20  修改人:杨利森_E01313  

生成出货清单调试
路径:工程配置-小工具-测试公式(调试)
测试模式正常模式的差别是测试时会调用测试脚本,虚拟包数量为0时还会继续往下一阶分解。

UEditor_snapScreen_tmp.jpg

注入测试脚本
可以通过共享目录直接修改proconfig_debugger.jsproconfig_debugger_E0XXXX.js注入调试脚本,当共享目录中存在有与当前用户匹配的调试文件是,nodejs引擎调用用户文件进行调试,如果没有则调用proconfig_debugger.js调试,建议每个配置工程师配置一个调试文件。nodejs引擎在调试模式下每次都会重新装载调试文件,所以修改调试文件后无需重启nodejs服务。

共享目录路径
正式环境:\\utisapp4\GC_Debugger  
测试环境:\\u9demo\GC_Debugger

注入测试脚本
调试文件主要结构如下图所示,请不要修改调试文件的结构、函数名称。nodejs引擎在装载调试文件时,如果调试文件编译有错误,则抛出异常;nodejs在调用调试文件时,如果发生错误也会抛出异常。
BeforeItemMasterInfoJs 在料品配置js运行前调用,AfterItemMasterInfoJs则在运行后调用。
可以通过tool.debugger方法将调试信息输出到共享目录下的日志文件,然后打开日志文件查看内容。
对于虚拟包来说,调试过程变得相当复杂,_I._GetTraceInfo(_curP, 'full')方法可以让你获得整个虚拟包的层级信息,包括表达式内容。

this.BeforeItemMasterInfoJs = function () {
        eval(this._Context);
        //你可以在这里通过输出信息到控制台或日志文件进行调试
        tool.debugger('[%s] _GetTraceInfo:%s', userCode, _I._GetTraceInfo(_curP, 'full'));
    };
this.AfterItemMasterInfoJs  = function () {

        eval(this._Context);
        //你可以在这里通过输出信息到控制台或日志文件进行调试
        tool.debugger('[%s] _GetTraceInfo:%s', userCode, _I._GetTraceInfo(_curP, 'full'));
 };







上下文_Help
U9>工程配置>产品配置>用户操作: http://ugis.zhut.cn/KM/Help.aspx?ID=43
创建时间:2015-03-10  创建人:杨利森  修改时间:2019-07-16  修改人:杨利森_E01313  

_Help功能如下:

方法

public bool Write(string format)

public bool Write(int i)

public bool Write(long i)

public bool Write(bool  b)

public RefDTO GetRef(IUIRecord record,string fieldName,string refCode)

public EnumDTO GetEnum(IUIRecord record, string fieldName, long EnumValue)

public RefDTO GetValueSet(string SetName, string Code)

public int ToInt(long i)

返回类型

public class RefDTO
{
        public string Code; 
        public string Name; 
        public long ID;
       
}


public class EnumDTO
{
        public string Code; 
        public string Name; 
        public int Value;
}


方法使用介绍

Write

输出调试信息到调试板。

示例:_Help.Write({P.ZJXTPZ.ZJXTBB})

 

ToInt

64位整数转化为32位。一般用来处理枚举值。

示例:_Item.InvInfo.ReserveMode=_Help.ToInt(1);

 

GetRef

获取参照信息,返回一个含属性ID,Code,NameRefDTO对象。

示例:_Help.GetRef(_Item.InvInfo,"Warehouse","CK02");

 

GetEnum

获取枚举信息,返回一个含属性Value,Code,NameEnumDTO对象。这个方法使用频度应该不会很高的,一般都会用ToInt替代。

示例:_Help.GetEnum(_Item.InvInfo,"ReserveMode",1)

 

GetValueSet

获取值集信息,返回一个含属性ID,Code,NameRefDTO对象。

示例: var valueSet =  _Help.GetValueSet("UtPartType","10");

 

原因上,这些方法可以应用于整个工程配置的表达式,但GetRef,GetEnum,GetValue主要是应用是料品默认值设置。

 

料品默认值设置应用表达式示例

注:条件表达式结合林奕松新增的功能;运算表达式独立使用,可以在表达式中写条件、声明变量、增加注释等,示例代码如下。

//这一行是注释

if(_Item.Main.IsBuildEnable==true)//条件

{

var whRef =   _Help.GetRef(_Item.InvInfo,"Warehouse","CK02");//声明变量,同时赋值

_Item.InvInfo.Warehouse=whRef.ID;

_Item.InvInfo.Warehouse_Code=whRef.Code;

_Item.InvInfo.Warehouse_Name=whRef.Name;

}

//设置枚举

_Item.InvInfo.ReserveMode=_Help.GetEnum(_Item.InvInfo,"ReserveMode",1).Value;

 

//同样是设置枚举,这个方法更简单

_Item.InvInfo.ReserveMode=_Help.ToInt(1);

 

//设置集值

var valueSet =    _Help.GetValueSet("UtPartType","10");

_Item.Main.UtPartType=valueSet.ID;

_Item.Main.UtPartType_Code=valueSet.Code;

_Item.Main.UtPartType_Name=valueSet.Name;

 

//输出调试信息

_Help.Write(_Item.Main.UtPartType)