using System; using System.Collections.Generic; using System.Linq; using System.Text; using QMFrameWork.Data; using QMAPP.FJC.DAL.QT; using QMAPP.FJC.Entity.QT; using QMAPP.FJC.TRACING.DAInterface; using QMAPP.FJC.DAL.Produce; using QMAPP.FJC.DAL.Basic; using QMAPP.FJC.Entity.Operation; using QMAPP.FJC.DAL.Operation; using QMAPP.FJC.Entity.Basic; using QMAPP.MD.Entity; using QMAPP.MD.DAL; using QMAPP.MD.Entity.View; namespace QMAPP.FJC.TRACING.StateActions { /// /// 回滚数据 /// public class RollbackData_4UF:IStateAction { /// /// 执行 /// /// public void Execute(DAObject data) { foreach (var processcodeda in data.WorkLocState.DataCache.Where(p => p.ISPROCESSCODE == "1" && !string.IsNullOrEmpty(p.DA_VALUE))) { List dagroup = new List(); dagroup.Add(processcodeda); dagroup.AddRange(data.WorkLocState.DataCache.Where(p => p.ISPROCESSCODE != "1")); //搜索确认产品物料号 SearchMaterial(data, dagroup); var product = GetProduct(data,dagroup); if (product != null) //如果存在产品信息 { if (data.WorkLocState.DataCache.FirstOrDefault(p => p.MATERIAL_CODE == product.MATERIAL_CODE) == null) //产品为新生成的物料 { product.IsDelete = true; } else { product.WORKLOC_CODE = ""; } data.AddToPersistentList(product, product.PID); DeleteProcessRecord(product, data); foreach (var dai in dagroup) { if (dai.SAVED.Contains(data.MouldCode) && !string.IsNullOrWhiteSpace(dai.DA_VALUE)) //过滤已保存过的和采集值为空值的 { switch (dai.DATA_TYPE) { case "SN": //零件序列号 case "BN": //零件批次号 { DeleteProductStructure(product, dai, data); break; } case "MN": //模具编号 { DeleteProcessParam(product, dai, data); break; } case "PARM": //加工参数 { DeleteProcessParam(product, dai, data); break; } } dai.SAVED = dai.SAVED.Replace(data.MouldCode, ""); } } //删除参数的指令 var cmdDelParm = new SQLCommand("DELETE T_QT_PROCESSPARAMETERS WHERE PRODUCT_PID=@productid AND WORKCELL_CODE=@workcell" , new DataParameter("productid", product.PID) , new DataParameter("workcell", data.WorkLocState.WORKCELL_CODE)); data.SQLCommands.Add(cmdDelParm); //删除产品组成的指令 //var cmdDelStruct = new SQLCommand("DELETE T_QT_PRODUCT_STRUCTURE WHERE PRODUCT_PID=@productid" // , new DataParameter("productid", product.PID)); //data.SQLCommands.Add(cmdDelStruct); } } } /// /// 删除产品组成信息 /// /// 产品 /// /// private void DeleteProductStructure(Product product, DAICache dai, DAObject data) { if (!dai.MATERIAL_CODE.Equals(product.MATERIAL_CODE)) //如果采集的物料号于产品物料号一直则不修改产品组成 { QMAPP.FJC.DAL.Produce.ProductDAL proddal = new QMAPP.FJC.DAL.Produce.ProductDAL(); Product part = null; part= data.GetPersistentEntity(dai.OBJ_PID); if (part == null) { part = proddal.GetByPID(dai.OBJ_PID, data.DataSession); } part.USINGCOUNT = part.USINGCOUNT - 1; part.USINGSTATE = part.USINGCOUNT == 0 ? "0" : "1"; //part.UPDATEDATE = DateTime.Now; part.UPDATEUSER=data.UserID; data.AddToPersistentList(part, dai.OBJ_PID); ProductStructureDAL psdal = new ProductStructureDAL(); var structure= psdal.GetStructure(product.PID,part.PID); if (structure != null) { structure.IsDelete = true; data.AddToPersistentList(structure, structure.PID); } } } /// /// 删除加工参数 /// /// /// private void DeleteProcessParam(Product product, DAICache dai,DAObject data) { } /// /// 删除加工记录 /// private void DeleteProcessRecord(Product product, DAObject data) { ProcessRecordDAL prdal = new ProcessRecordDAL(); ProcessRecord record = null; record = data.GetPersistentEntity(product.PID);//加工记录的ID使用PRODUCT的ID代替 if (record == null) { record = prdal.Get(product.PID, data.WorkLocState.WORKCELL_CODE, data.DataSession); } if (record != null) { record.IsDelete = true; data.AddToPersistentList(record, product.PID);//加工记录的ID使用PRODUCT的ID代替 //prdal.Update(record, data.DataSession); } } /// /// 获取产品信息 /// /// /// private Product GetProduct(DAObject data,List dagroup) { QMAPP.FJC.DAL.Produce.ProductDAL dal = new QMAPP.FJC.DAL.Produce.ProductDAL(); Product product=null; string sn = (from da in dagroup where string.Equals(da.ISPROCESSCODE, "1") select da.DA_VALUE).FirstOrDefault(); product = dal.GetByCode(sn, data.WorkLocState.CurrentState.MATERIAL_CODE, data.DataSession); return product; } /// /// 搜索确定加工后的产品物料号及加工消耗的物料号 /// /// /// 返回加工消耗物料 private string[] SearchMaterial(DAObject data, List dagroup) { var materials = (from da in dagroup where !string.IsNullOrWhiteSpace(da.MATERIAL_CODE) select da.MATERIAL_CODE).ToArray(); if (materials.Length == 1) //单一物料加工 { data.WorkLocState.CurrentState.MATERIAL_CODE = materials[0]; var dai = dagroup.FirstOrDefault(p => p.MATERIAL_CODE == materials[0]); data.WorkLocState.CurrentState.PROCESS_CODE = dai.DA_VALUE; //data.WorkLocState.CurrentState.PRODUCT_PID = dai.OBJ_PID; } else //多物料组成 { var bomlocation = GetBomLocation(materials.Distinct().ToArray()); if (bomlocation == null) //未定位到 { materials = (from da in dagroup where !string.IsNullOrWhiteSpace(da.MATERIAL_CODE) && !string.Equals(da.DA_MODE, "2") //过滤掉可省略的采集点 select da.MATERIAL_CODE).ToArray(); bomlocation = GetBomLocation(materials.Distinct().ToArray()); if (bomlocation == null) //仍未定位到BOM信息 抛出异常 { throw new Exception("采集数据有误,无法确定生产BOM,请检查采集点配置和BOM配置!"); } } string upperlevelmaterial = ""; if (bomlocation.ItemNo > 0) //如果Bom定位为明细项 { PbomDAL pbidal = new PbomDAL(); var bomitem = pbidal.GetByLocate(bomlocation); if (bomitem != null) { upperlevelmaterial = bomitem.MATERIAL_CODE; } } else //如果Bom定位为Bom头 { var bom = new PbomDAL().GetByCode(bomlocation.BOMCode); if (bom != null) { upperlevelmaterial = bom.MATERIAL_CODE; } } data.WorkLocState.CurrentState.MATERIAL_CODE = upperlevelmaterial; //取得产品物料号 } return materials.Distinct().ToArray(); } /// /// 根据物料组获取上层物料号 /// /// /// private BomLocation GetBomLocation(params string[] materials) { PbomDAL pbidal = new PbomDAL(); var bomlocations = pbidal.LocateBom(materials); //确定物料组成数量一致 var bomlocation = bomlocations.FirstOrDefault(p => p.SubCount == materials.Length); return bomlocation; } } }