一组无序的标签匹配有序的标签模板
一组无序的标签匹配有序的标签模板
public void SaveTempRouteProess()
{
//无序标签组
List<Model_DOC_MI_PROCESS_SUB> milist = routeTemplateBLL.GetMIRouteTemplateList(MIId);
//有序模板标签组
List<RouteTemplateModelAndDetail> templist = routeTemplateBLL.GetRouteTemplateDetailByID(RouteId);
foreach (var item in milist)
{
Model_DOC_MI_PROCESS_SUB model = new Model_DOC_MI_PROCESS_SUB();
var frist = list.Find(x => x.PROCESS_SUB_CODE == item.PROCESS_SUB_CODE);
//找到工序模板中对应的工序
if (frist != null)
{
//确认模版中的下一道标签在无序中是存在的
IterationProcess(milist, list, frist.PROCESS_SUB_CODE, frist.Next_Process_Sub_Code, ref modellist);
}
}
//删除无效的下道标签
DelInvalidNextProcess(list, ref modellist);
//保存匹配后的标签
routeTemplateBLL.SaveMIRouteTemplateCode(MIId, modellist);
}
/// <summary>
///
/// </summary>
/// <param name="milist"></param>
/// <param name="templist"></param>
/// <param name="nextprocesscode"></param>
/// <returns></returns>
public void IterationProcess(List<Model_DOC_MI_PROCESS_SUB> milist, List<RouteTemplateModelAndDetail> templist, string processcode, string nextprocesscode, ref List<Model_DOC_MI_PROCESS_SUB> mimodellist)
{
Model_DOC_MI_PROCESS_SUB mimodel = new Model_DOC_MI_PROCESS_SUB();
if (nextprocesscode != null)
{
#region
string[] nextcode = nextprocesscode.Split(',');
ArrayList noExistsMIProcess = new ArrayList();
if (nextcode.Length > 0)
{
string nextcodes = "";
string nextnames = "";
ArrayList noExistsMiProcess = new ArrayList();
var mipro = milist.Find(x => x.PROCESS_SUB_CODE == processcode);
if (mipro != null)//MI如果有再判断下模板中的下一道工序在MI中是否存在
{
var tempmodel = templist.Find(x => x.PROCESS_SUB_CODE == processcode);
for (int i = 0; i < nextcode.Length; i++)
{
var miprolist = milist.Find(x => x.PROCESS_SUB_CODE == nextcode[i]);
if (miprolist != null)//如果MI存在就保存当前工序的下道工序
{
nextcodes += nextcode[i] + ",";
nextnames += miprolist.PROCESS_SUB_NAME + ",";
}
}
nextcodes = nextcodes.TrimEnd(',');
nextnames = nextnames.TrimEnd(',');
//如果存在就保存当前这工序信息
if (!string.IsNullOrEmpty(nextcodes))
{
mimodel.PROCESS_SUB_NAME = mipro.PROCESS_SUB_NAME;
mimodel.PROCESS_SUB_CODE = mipro.PROCESS_SUB_CODE;
mimodel.PROCESS_SUB_ID = mipro.PROCESS_SUB_ID;
mimodel.NEXT_PROCESS_CODE = nextcodes;
mimodel.NEXT_PROCESS = nextnames;
mimodel.PRODUCTROUTING_DESC = tempmodel.Template_Name;
mimodel.PRODUCTROUTING_ID = tempmodel.Template_No;
mimodel.PROCESS_TYPE = tempmodel.PROCESS_TYPE;
mimodel.MI_LIST_ID = mipro.MI_LIST_ID;
mimodel.MI_PROCESS_SUB_ID = mipro.MI_PROCESS_SUB_ID;
mimodellist.Add(mimodel);
}
else //MI中不存在,模板就继续往下找
{
for (int i = 0; i < nextcode.Length; i++)
{
var tempprolist = templist.Find(x => x.PROCESS_SUB_CODE == nextcode[i]);
if (tempprolist != null)
{
GetNextCodeNameInfo(milist, templist, tempprolist.PROCESS_SUB_CODE, tempprolist.Next_Process_Sub_Code, ref nextcodes, ref nextnames);
}
}
string getminextcode = nextcodes.TrimEnd(',');
string getminextname = nextnames.TrimEnd(',');
string[] minextcodestr = getminextcode.Split(',');
string[] minextnamestr = getminextname.Split(',');
ArrayList codelist = new ArrayList();
ArrayList namelist = new ArrayList();
for (int i = 0; i < minextcodestr.Length; i++)
{
if (!codelist.Contains(minextcodestr[i]))
{
codelist.Add(minextcodestr[i]);
}
}
string codestr = String.Join(",", (string[])codelist.ToArray(typeof(string)));
for (int i = 0; i < minextnamestr.Length; i++)
{
if (!namelist.Contains(minextnamestr[i]))
{
namelist.Add(minextnamestr[i]);
}
}
string namestr = String.Join(",", (string[])namelist.ToArray(typeof(string)));
mimodel.PROCESS_SUB_NAME = mipro.PROCESS_SUB_NAME;
mimodel.PROCESS_SUB_CODE = mipro.PROCESS_SUB_CODE;
mimodel.PROCESS_SUB_ID = mipro.PROCESS_SUB_ID;
mimodel.NEXT_PROCESS_CODE = codestr;
mimodel.NEXT_PROCESS = namestr;
mimodel.PRODUCTROUTING_DESC = tempmodel.Template_Name;
mimodel.PRODUCTROUTING_ID = tempmodel.Template_No;
mimodel.PROCESS_TYPE = tempmodel.PROCESS_TYPE;
mimodel.MI_LIST_ID = mipro.MI_LIST_ID;
mimodel.MI_PROCESS_SUB_ID = mipro.MI_PROCESS_SUB_ID;
mimodellist.Add(mimodel);
}
}
}
#endregion
}
else
{
var mipro = milist.Find(x => x.PROCESS_SUB_CODE == processcode);
if (mipro != null)//MI如果有再判断下模板中的下一道工序在MI中是否存在
{
var tempmodel = templist.Find(x => x.PROCESS_SUB_CODE == processcode);
mimodel.PROCESS_SUB_CODE = mipro.PROCESS_SUB_CODE;
mimodel.NEXT_PROCESS_CODE = tempmodel.Next_Process_Sub_Code;
mimodel.NEXT_PROCESS = tempmodel.Next_Process_Sub_Name;
mimodel.PRODUCTROUTING_DESC = tempmodel.Template_Name;
mimodel.PRODUCTROUTING_ID = tempmodel.Template_No;
mimodel.PROCESS_TYPE = tempmodel.PROCESS_TYPE;
mimodel.MI_LIST_ID = mipro.MI_LIST_ID;
mimodel.MI_PROCESS_SUB_ID = mipro.MI_PROCESS_SUB_ID;
mimodellist.Add(mimodel);
}
}
}
public void GetNextCodeNameInfo(List<Model_DOC_MI_PROCESS_SUB> milist, List<RouteTemplateModelAndDetail> templist, string currentprocesscode, string nextprocesscode, ref string minextprocesscode, ref string minextprocessname)
{
if (nextprocesscode != null)
{
string[] nextcode = nextprocesscode.Split(',');
for (int i = 0; i < nextcode.Length; i++)
{
var temppro = templist.Find(x => x.PROCESS_SUB_CODE == nextcode[i]);
if (temppro != null)
{
var minextpro = milist.Find(x => x.PROCESS_SUB_CODE == temppro.PROCESS_SUB_CODE);
if (minextpro != null)//MI中存在的话
{
minextprocesscode += nextcode[i] + ",";
minextprocessname += temppro.PROCESS_SUB_NAME + ",";
}
else
{
GetNextCodeNameInfo(milist, templist, temppro.PROCESS_SUB_CODE, temppro.Next_Process_Sub_Code, ref minextprocesscode, ref minextprocessname);
}
}
}
}
}
/// <summary>
/// 递归遍历判断,下道工序是否存在相交
/// </summary>
/// <param name="milist"></param>
/// <param name="templist"></param>
/// <param name="currentprocesscode"></param>
/// <param name="nextprocesscode"></param>
/// <param name="noExistsNextProcess"></param>
/// <param name="isRe"></param>
/// <param name="reProcess"></param>
public void GetNextCodeIsRe(List<Model_DOC_MI_PROCESS_SUB> milist, string nextProcesscode, string nextReprocesscode, ref string reProcess)
{
if (nextProcesscode != null)
{
var nextProCodeArray = nextProcesscode.Split(',');
foreach (string nextProcess in nextProCodeArray)
{
var temppro = milist.Find(x => x.PROCESS_SUB_CODE == nextProcess);
if (temppro != null)
{
//取父节点对应的下道子节点列表,判断是否相交
if (nextReprocesscode == temppro.PROCESS_SUB_CODE)
{
reProcess += nextReprocesscode + ",";
}
else
{
GetNextCodeIsRe(milist, temppro.NEXT_PROCESS_CODE, nextReprocesscode, ref reProcess);
}
}
}
}
}
public void DelInvalidNextProcess(List<RouteTemplateModelAndDetail> templist, ref List<Model_DOC_MI_PROCESS_SUB> mimodellist)
{
foreach (var miMode in mimodellist)
{
//不判断最后一个工序
if (miMode.NEXT_PROCESS_CODE != null)
{
string currentProcess = miMode.PROCESS_SUB_CODE;
string[] miNextProcess = miMode.NEXT_PROCESS_CODE.Split(',');
//下一道工序数量大于1时
if (miNextProcess.Length > 1)
{
List<string> nextProcessCode = new List<string>();
List<string> nextProcessName = new List<string>();
//遍历出所有下道工序
for (int index = 0; index < miNextProcess.Length; index++)
{
//获取下道工序
var miChildBean = mimodellist.Find(m => m.PROCESS_SUB_CODE == miNextProcess[index]);
if (miChildBean != null)
{
//下道工序的父节点
IEnumerable<Model_DOC_MI_PROCESS_SUB> nextProcessParentList = mimodellist.Where(m => m.NEXT_PROCESS_CODE != null && m.NEXT_PROCESS_CODE.Contains(miNextProcess[index]));
//判断下道工序的父节大于1时
if (nextProcessParentList.Count() > 1)
{
string miNextProcessStr = miNextProcess[index];
//判断该工序和下道工序的连接线在模板工序中是否存在
var miProcess = templist.Find(m => m.PROCESS_SUB_CODE == currentProcess && m.Next_Process_Sub_Code.Contains(miNextProcessStr));
//如果存在则保存,不存在则递归其他路线,查看是否重复
if (miProcess == null)
{
string reProcess = "";
var miProcessTemp = mimodellist.Find(m => m.PROCESS_SUB_CODE == currentProcess);
//循环比较每一条下道工序是否相交
foreach (string nextProcess in miNextProcess)
{
foreach (string nextTwoProcess in miNextProcess)
{
if (nextProcess != nextTwoProcess)
{
GetNextCodeIsRe(mimodellist, nextTwoProcess, nextProcess, ref reProcess);
}
}
}
if (reProcess != "")
{
var miProcessList = miProcessTemp.NEXT_PROCESS_CODE.Split(',');
foreach (string miProcessResult in miProcessList)
{
if (!reProcess.Contains(miProcessResult))
{
if (!nextProcessCode.Contains(miProcessResult))
{
nextProcessCode.Add(miProcessResult);
}
//nextProcessCode += miProcessResult + ",";
var moModleNextProcess = templist.Find(m => m.PROCESS_SUB_CODE == miProcessResult);
if (!nextProcessName.Contains(moModleNextProcess.PROCESS_SUB_NAME))
{
nextProcessName.Add(moModleNextProcess.PROCESS_SUB_NAME);
}
//nextProcessName += moModleNextProcess.PROCESS_SUB_NAME + ",";
}
}
}
}
}
}
}
if (nextProcessCode.Count > 0)
{
miMode.NEXT_PROCESS_CODE = string.Join(",", nextProcessCode);
miMode.NEXT_PROCESS = string.Join(",", nextProcessName);
//miMode.NEXT_PROCESS = nextProcessName.TrimEnd(',');
}
}
}
}
}