Exemplo n.º 1
0
        public void SetFlowNumber()
        {
            var gotProps = true;

            if (pvs == null)
            {
                gotProps = false;
                pvs      = vault.ObjectPropertyOperations.GetProperties(objVer, false);
            }

            var flowNumberId        = vault.PropertyDefOperations.GetPropertyDefIDByAlias(flowNumberAlias);
            var flowNumberIntPropId = vault.PropertyDefOperations.GetPropertyDefIDByAlias(flowNumberIntAlias);
            var pv = pvs.SearchForPropertyEx(flowNumberId, true);

            if (pv == null) //无流水号属性
            {
                return;
            }

            var outStr = String.Empty;

            var flowNumberIntProp = pvs.SearchForPropertyEx(flowNumberIntPropId, true);

            if (!pv.Value.IsNULL())                                                //若已存在生成的流水号
            {
                if (flowNumberIntProp == null || flowNumberIntProp.Value.IsNULL()) //若无自定义流水号
                {
                    return;
                }
                var customNumber = Int32.Parse(flowNumberIntProp.GetValueAsLocalizedText());
                var strs         = pv.GetValueAsLocalizedText().Split(FlowNumberObject.Sep.ToArray());
                var oldNumber    = Int32.Parse(strs[strs.Length - 1].TrimStart('0'));
                if (customNumber != oldNumber) //若自定义流水号跟已生成的流水号不一致
                {
                    var num = GetNumberStr(customNumber);
                    outStr = String.Join(FlowNumberObject.Sep, strs.Take(strs.Length - 1).Concat(new[] { num }));
                }
            }
            else //还未生成过流水号
            {
                var objClass  = vault.ClassOperations.GetObjectClass(currentClassId);
                var className = objClass.Name;

                var projPropId    = vault.PropertyDefOperations.GetPropertyDefIDByAlias(projPropAlias);
                var areaPropId    = vault.PropertyDefOperations.GetPropertyDefIDByAlias(areaPropAlias);
                var companyPropId = vault.PropertyDefOperations.GetPropertyDefIDByAlias(companyAlias);


                var stagePropId      = vault.PropertyDefOperations.GetPropertyDefIDByAlias(ProjectStageAlias);
                var specialtyPropId  = vault.PropertyDefOperations.GetPropertyDefIDByAlias(specialtyPropAlias);
                var contractorPropId = vault.PropertyDefOperations.GetPropertyDefIDByAlias(ContractorOrSubcontractorAlias);

                var propReceiveGroupId = vault.PropertyDefOperations.GetPropertyDefIDByAlias(PropDefReceiveGroup);

                var classStr = GetFlowNumber(className);

                var flowNumber   = "";
                var projStr      = "";
                var areaStr      = "";
                var companyStr   = "";
                var stageStr     = "";
                var specialtyStr = "";

                var count = 0;

                //获取项目简称
                var projProp = pvs.SearchForPropertyEx(projPropId, true);
                if (projProp != null && !projProp.Value.IsNULL())
                {
                    projStr = GetFlowNumber(projProp.GetValueAsLocalizedText());
                }

                //获取公司和分区简称
                var receiveGroupPV = pvs.SearchForPropertyEx(propReceiveGroupId, true);
                if (receiveGroupPV != null && !receiveGroupPV.Value.IsNULL()) //从收件单位获取
                {
                    var receiveGroupStr = receiveGroupPV.Value.DisplayValue;
                    var ta = receiveGroupStr.Split(new char[] { FlowSep });
                    companyStr = ta[ta.Length - 1];
                    areaStr    = ta[ta.Length - 2];
                }
                else //从当前用户的用户组获取
                {
                    GetInfoFromGroup(vault, userId, out companyStr, out areaStr);
                }
                //通过公司属性获取公司
                var companyPV = pvs.SearchForPropertyEx(companyPropId, true);
                if (companyPV != null && !companyPV.Value.IsNULL())
                {
                    var cc    = companyPV.GetValueAsLocalizedText();
                    var cStrs = cc.Split(new char[] { FlowSep });
                    companyStr = cStrs[cStrs.Length - 1];
                }
                //从分区属性获取分区
                var areaPV = pvs.SearchForPropertyEx(areaPropId, true);
                if (areaPV != null && !areaPV.Value.IsNULL())
                {
                    var aa    = areaPV.GetValueAsLocalizedText();
                    var aStrs = aa.Split(new char[] { FlowSep });
                    areaStr = aStrs[aStrs.Length - 1];
                }
                //给分区添加总包和分包的信息
                var contractorPV = pvs.SearchForPropertyEx(contractorPropId, true);
                if (contractorPV != null && !contractorPV.Value.IsNULL())
                {
                    var cc    = contractorPV.GetValueAsLocalizedText();
                    var cStrs = cc.Split(new char[] { FlowSep });
                    areaStr += cStrs[cStrs.Length - 1];
                }
                //阶段简称
                var stageProp = pvs.SearchForPropertyEx(stagePropId, true);
                if (stageProp != null && !stageProp.Value.IsNULL())
                {
                    stageStr = GetFlowNumber(stageProp.GetValueAsLocalizedText());
                }
                //专业简称
                var specialtyProp = pvs.SearchForPropertyEx(specialtyPropId, true);
                if (specialtyProp != null && !specialtyProp.Value.IsNULL())
                {
                    specialtyStr = GetFlowNumber(specialtyProp.GetValueAsLocalizedText());
                }

                var flowObj = new FlowNumberObject
                {
                    Project    = projStr,
                    Class      = classStr,
                    Area       = areaStr,
                    Company    = companyStr,
                    Stage      = stageStr,
                    Speciality = specialtyStr
                };

                var numberPattern = flowObj.GetSearchPattern();

                //获取最近的流水号

                if (flowNumberIntProp != null && !flowNumberIntProp.Value.IsNULL())
                {
                    count = Int32.Parse(flowNumberIntProp.GetValueAsLocalizedText());
                }
                else
                {
                    count = GetPreviewsWorkFlowNum(vault, flowNumberId,
                                                   GetHistories(vault, currentClassId, flowNumberId, numberPattern)) + 1;
                }

                flowNumber = GetNumberStr(count);

                flowObj.CustomNumber = flowNumber;

                outStr = flowObj.ToString();
            }


            if (!String.IsNullOrEmpty(outStr))
            {
                var pv0 = new PropertyValue {
                    PropertyDef = flowNumberId
                };
                pv0.Value.SetValue(MFDataType.MFDatatypeText, outStr);
                if (gotProps && (_eventType == MFEventHandlerType.MFEventHandlerBeforeSetProperties ||
                                 _eventType == MFEventHandlerType.MFEventHandlerAfterSetProperties)) //设置属性事件无法设置此属性
                {
                    pvs.SetProperty(pv0);
                }
                else
                {
                    //throw new Exception("set PropertyValue from vault: " + outStr);
                    vault.ObjectPropertyOperations.SetProperty(objVer, pv0); //MFEventHandlerBeforeCreateNewObjectFinalize
                }
            }
        }