Ejemplo n.º 1
0
        public ActionResult CreateAddress(string data)
        {
            AddressNamePattern pattern = string.IsNullOrWhiteSpace(data) ? null : Newtonsoft.Json.JsonConvert.DeserializeObject <AddressNamePattern>(data, new JsonSerializerSettings
            {
                MissingMemberHandling = MissingMemberHandling.Ignore,
                NullValueHandling     = NullValueHandling.Ignore,
                DefaultValueHandling  = DefaultValueHandling.Ignore
            });

            if (CurrUser.CompanySysNo > 0)
            {
                pattern.CompanySysNo = CurrUser.CompanySysNo;
            }

            string     message   = "";
            bool       isSuccess = CompanyService.CreateAddress(pattern, CurrUser.UserSysNo, CurrUser.UserName, out message);
            AjaxResult result    = new AjaxResult
            {
                Success = isSuccess,
                Message = message,
                Data    = null
            };

            return(Json(result));
        }
 private static void BuildAddSaveChildrenAddress(List <Address> pAddList, AddressNamePattern childPattern, int userSysNo, string userName)
 {
     if (childPattern == null)
     {
         return;
     }
     foreach (var p in pAddList)
     {
         if (p.SysNo < 1)
         {
             continue;
         }
         //p.EditUserName 中暂存了子节点最大的编码
         List <Address> addList = BuildAddress(childPattern, p, p.EditUserName);
         AddressDA.InsertAddress(p.CompanySysNo, p.SysNo, ref addList, userSysNo, userName);
         if (childPattern.ChildPattern != null)
         {
             childPattern.ChildPattern.CompanySysNo = childPattern.CompanySysNo;
         }
         BuildAddSaveChildrenAddress(addList, childPattern.ChildPattern, userSysNo, userName);
     }
 }
        private static List <Address> BuildAddress(AddressNamePattern pattern, Address parent, string beginAddressCode)
        {
            string beginNo      = pattern.BeginNo.Trim().ToUpper();
            string endNo        = pattern.EndNo.Trim().ToUpper();
            string nameTemplate = pattern.PreName + "{0}" + pattern.SufName;

            if (pattern.ParentNoAsPreName)
            {
                nameTemplate = parent.Number + pattern.PreName + "{0}" + pattern.SufName;
            }
            List <Address> addList        = new List <Address>();
            string         code           = null;
            string         parentPathName = parent.PathName;

            if (parent.ParentSysNo.GetValueOrDefault() == 0)
            {
                parentPathName = parent.Name;
            }
            if (pattern.NoType == AddressNameNoType.Digit)
            {
                int bNo = int.Parse(beginNo);
                int eNo = int.Parse(endNo);
                for (int i = bNo; i <= eNo; i++)
                {
                    if (string.IsNullOrWhiteSpace(beginAddressCode))
                    {
                        code = parent.Code + "00";
                    }
                    else
                    {
                        code = GenerateCode(beginAddressCode, beginAddressCode.Length, 3);
                    }
                    beginAddressCode = code;
                    string number = i.ToString().PadLeft(pattern.NoLength, '0');
                    string name   = string.Format(nameTemplate, number);

                    Address add = new Address()
                    {
                        CompanySysNo = pattern.CompanySysNo,
                        Grade        = pattern.Grade,
                        Number       = i.ToString(),
                        Name         = name,
                        ParentSysNo  = parent.SysNo,
                        Code         = code,
                        PathName     = parentPathName + ">" + name,
                    };
                    addList.Add(add);
                }
            }
            else
            {
                char bNo = char.Parse(beginNo);
                char eNo = char.Parse(endNo);
                for (char i = bNo; i <= eNo; i++)
                {
                    if (string.IsNullOrWhiteSpace(beginAddressCode))
                    {
                        code = parent.Code + "00";
                    }
                    else
                    {
                        code = GenerateCode(beginAddressCode, beginAddressCode.Length, 3);
                    }
                    beginAddressCode = code;
                    string  number = i.ToString().PadLeft(pattern.NoLength, 'A');
                    string  name   = string.Format(nameTemplate, number);
                    Address add    = new Address()
                    {
                        CompanySysNo = pattern.CompanySysNo,
                        Grade        = pattern.Grade,
                        Number       = i.ToString(),
                        Name         = name,
                        ParentSysNo  = pattern.ParentSysNo,
                        Code         = code,
                        PathName     = parentPathName + ">" + name,
                    };
                    addList.Add(add);
                }
            }
            return(addList);
        }
        public static bool CreateAddress(AddressNamePattern pattern, int userSysNo, string userName, out string message)
        {
            message = null;
            bool result = CheckAddressPattern(pattern, out message);

            if (!result)
            {
                return(false);
            }
            int companySysNo = pattern.CompanySysNo;

            if (companySysNo <= 0)
            {
                message = "客户信息不存在,请选择客户后再创建地址信息。";
                return(false);
            }

            object locker = GetCompanyAddressCreateLockerByKey(companySysNo);

            lock (locker)
            {
                if (CompanyAddressCreateCount.ContainsKey(companySysNo))
                {
                    CompanyAddressCreateCount[companySysNo] = CompanyAddressCreateCount[companySysNo] + 1;
                }
                else
                {
                    CompanyAddressCreateCount.Add(companySysNo, 1);
                }
                try
                {
                    Address parent = AddressDA.LoadAddress(pattern.ParentSysNo);

                    if (parent == null || parent.CompanySysNo != companySysNo)
                    {
                        message = "按规则创建地址时,请指定父级地址。如果是根地址,则只能单个创建。";
                        return(false);
                    }

                    string beginAddressCode = AddressDA.GetChildrenMaxCode(companySysNo, pattern.ParentSysNo);

                    List <Address> addList = BuildAddress(pattern, parent, beginAddressCode);

                    AddressDA.InsertAddress(companySysNo, pattern.ParentSysNo, ref addList, userSysNo, userName);
                    if (pattern.ChildPattern != null)
                    {
                        pattern.ChildPattern.CompanySysNo = companySysNo;
                    }
                    Task task = new Task(() =>
                    {
                        var aList = addList;
                        var p     = pattern.ChildPattern;
                        var uno   = userSysNo;
                        var uname = userName;
                        BuildAddSaveChildrenAddress(aList, p, uno, uname);
                    });
                    task.Start();
                }
                finally
                {
                    CompanyAddressCreateCount[companySysNo] = CompanyAddressCreateCount[companySysNo] - 1;
                }
            }
            return(true);
        }
        private static bool CheckAddressPattern(AddressNamePattern pattern, out string message)
        {
            message = null;
            if (pattern.NoType == AddressNameNoType.Char)
            {
                string beginNo = pattern.BeginNo == null ? "" : pattern.BeginNo.Trim();
                if (beginNo.Length != 1)
                {
                    message = "起始编号为空或格式不正确,为字母时只能包括一个字母。";
                    return(false);
                }
                string endNo = pattern.EndNo == null ? "" : pattern.EndNo.Trim();
                if (endNo.Length != 1)
                {
                    message = "结束编号为空或格式不正确,为字母时只能包括一个字母。";
                    return(false);
                }


                beginNo         = beginNo.ToUpper();
                pattern.BeginNo = beginNo;
                endNo           = endNo.ToUpper();
                pattern.EndNo   = endNo;
                if (beginNo[0] < 'A' || endNo[0] > 'Z')
                {
                    message = "开始和结束编号为空或格式不正确,为字母时只能包括一个字母。";
                    return(false);
                }
                if (beginNo[0] > endNo[0])
                {
                    message = "结束编号不能大于开始编号。";
                    return(false);
                }
            }
            else
            {
                int beginNo = 0;
                if (!int.TryParse(pattern.BeginNo, out beginNo) || beginNo < 0)
                {
                    message = "起始编号为空或格式不正确,编号为数字且不能小于0。";
                    return(false);
                }
                int endNo = 0;
                if (!int.TryParse(pattern.EndNo, out endNo) || endNo < 0)
                {
                    message = "结束编号为空或格式不正确,编号为数字且不能小于0。";
                    return(false);
                }
                if (beginNo > endNo)
                {
                    message = "结束编号不能大于结束编号。";
                    return(false);
                }
            }
            if (!string.IsNullOrWhiteSpace(pattern.PreName) && pattern.PreName.Length > 10)
            {
                message = pattern.ParentNoAsPreName ? "与父级编号的分隔符长度不能超过10个字符" : "名称前缀不能超过10个字符!";
                return(false);
            }
            if (!string.IsNullOrWhiteSpace(pattern.SufName) && pattern.SufName.Length > 10)
            {
                message = "名称后缀不能超过10个字符!";
                return(false);
            }
            bool result = false;

            if (pattern.ChildPattern != null)
            {
                result = CheckAddressPattern(pattern.ChildPattern, out message);
                if (!result)
                {
                    return(result);
                }
            }
            return(true);
        }