Ejemplo n.º 1
0
        /// <summary>
        /// 人工检查记录保存
        /// </summary>
        /// <param name="userCode">系统登录用户号</param>
        /// <param name="agencyLeaf">登录用户的机构叶标识</param>
        /// <param name="productLeaf">产品叶标识</param>
        /// <param name="workUnitLeaf">工位叶标识</param>
        /// <param name="t107EntityID">工位实体标识</param>
        /// <param name="t132LeafID">产品族叶标识</param>
        /// <param name="containerNo">容器号</param>
        /// <param name="functionName">功能名称</param>
        /// <param name="wipInspecting">人工检查实体对象</param>
        /// <param name="confirmTime">检查确认时间</param>
        /// <returns></returns>
        public IRAPJsonResult msp_SaveFact_ManualInspecting(
            int communityID,
            string userCode,
            int agencyLeaf,
            int productLeaf,
            int workUnitLeaf,
            int t107EntityID,
            int t132LeafID,
            string containerNo,
            string functionName,
            Inspecting wipInspecting,
            DateTime confirmTime,
            long sysLogID,
            out int errCode,
            out string errText)
        {
            string strProcedureName = string.Format("{0}.{1}",
                                                    className, MethodBase.GetCurrentMethod().Name);

            WriteLog.Instance.WriteBeginSplitter(strProcedureName);
            try
            {
                WriteLog.Instance.Write(string.Format("CommunityID={0}|UserCode={1}|AgencyLeaf={2}|" +
                                                      "ProductLeaf={3}|WorkUnitLeaf={4}|T107EntityID={5}|T132LeafID={6}|" +
                                                      "ContainerNo={7}|FunctionName={8}|ConfirmTime={9}|SysLogID={10}",
                                                      communityID,
                                                      userCode,
                                                      agencyLeaf,
                                                      productLeaf,
                                                      workUnitLeaf,
                                                      t107EntityID,
                                                      t132LeafID,
                                                      containerNo,
                                                      functionName,
                                                      confirmTime,
                                                      sysLogID),
                                        strProcedureName);

                using (IRAPSQLConnection conn = new IRAPSQLConnection())
                {
                    long transactNo = 0;

                    #region 申请交易号
                    WriteLog.Instance.Write("开始申请交易号", strProcedureName);
                    try
                    {
                        ssp_GetSequenceNo(
                            communityID,
                            "NextTransactNo",
                            1,
                            sysLogID,
                            "-6",
                            "",
                            ref transactNo,
                            out errCode,
                            out errText);
                        WriteLog.Instance.Write(
                            string.Format("({0}){1}", errCode, errText),
                            strProcedureName);
                        if (errCode == 0)
                        {
                            WriteLog.Instance.Write(string.Format("申请到的交易号:{0}", transactNo),
                                                    strProcedureName);
                        }
                        else
                        {
                            errCode = 99001;
                            errText = string.Format("申请交易号出错:{0}", errText);
                            WriteLog.Instance.Write(errText, strProcedureName);
                            return(Json(errCode));
                        }
                    }
                    catch (Exception error)
                    {
                        errCode = 99001;
                        errText = string.Format("申请交易号出错:{0}", error.Message);
                        WriteLog.Instance.Write(errText, strProcedureName);
                        WriteLog.Instance.Write(error.StackTrace, strProcedureName);
                        return(Json(errCode));
                    }
                    #endregion

                    int passByTimes = ufn_GetWIPPassByTimes(
                        communityID, productLeaf, workUnitLeaf, wipInspecting.MainWIPIDCode.WIPCode);
                    long stdcycleTimeOfOperation = ufn_GetStdCycleTimeOfOperation(
                        communityID, productLeaf, workUnitLeaf);
                    long unscheduledPDTofAWorkUnit = ufn_GetUnscheduledPDTofAWorkUnit(
                        communityID,
                        workUnitLeaf,
                        wipInspecting.MainWIPIDCode.MoveInTime,
                        confirmTime,
                        sysLogID);

                    // 开始事务处理
                    conn.BeginTran();

                    foreach (SubWIPIDCodeInfo_Inspecting wip in wipInspecting.SubWIPIDCodes)
                    {
                        long factID              = 0;
                        long partitionPolicy     = 0;
                        long factPartitioningKey = 0;

                        #region 申请事实编号
                        try
                        {
                            factID = IRAPDAL.UTS.Instance.msp_GetSequenceNo("NextFactNo", 1);
                        }
                        catch (Exception error)
                        {
                            errCode = 99001;
                            errText = string.Format("申请事实编号出错:{0}", error.Message);
                            WriteLog.Instance.Write(errText, strProcedureName);
                            WriteLog.Instance.Write(error.StackTrace, strProcedureName);

                            conn.RollBack();

                            return(Json(errCode));
                        }
                        if (factID <= 0)
                        {
                            errCode = 99001;
                            errText = "未申请到事实编号!";
                            WriteLog.Instance.Write(errText, strProcedureName);

                            conn.RollBack();

                            return(Json(errCode));
                        }
                        else
                        {
                            WriteLog.Instance.Write(string.Format("申请到的事实编号:{0}", factID),
                                                    strProcedureName);
                        }
                        #endregion

                        #region 在行集事实表(RSFact_Inspecting)中添加纪录
                        WriteLog.Instance.Write("保存行集事实", strProcedureName);
                        partitionPolicy = Int64.Parse(DateTime.Now.Year.ToString() +
                                                      (100000000L + communityID).ToString().Substring(1, 8) + "0006");

                        wip.GetListFromDataTable();
                        for (int i = 0; i < wip.FailureItems.Count; i++)
                        {
                            RSFact_Inspecting rsFactInspecting = new RSFact_Inspecting()
                            {
                                FactID          = factID,
                                PartitionPolicy = partitionPolicy,
                                WFInstanceID    = wipInspecting.MainWIPIDCode.PWONo,
                                Ordinal         = i + 1,
                                T101LeafID      = wip.FailureItems[i].T101LeafID,
                                T110LeafID      = wip.FailureItems[i].T110LeafID,
                                T118LeafID      = wip.FailureItems[i].T118LeafID,
                                T216LeafID      = wip.FailureItems[i].T216LeafID,
                                T183LeafID      = wip.FailureItems[i].T183LeafID,
                                T184LeafID      = wip.FailureItems[i].T184LeafID,
                                CntDefect       = wip.FailureItems[i].CntDefect,
                            };
                            try
                            {
                                conn.Insert(rsFactInspecting);
                            }
                            catch (Exception error)
                            {
                                errCode = 99002;
                                errText = string.Format("保存行集事实失败:{0}", error.Message);
                                WriteLog.Instance.Write(errText, strProcedureName);
                                WriteLog.Instance.Write(error.StackTrace, strProcedureName);

                                conn.RollBack();

                                return(Json(errCode));
                            }
                        }
                        WriteLog.Instance.Write("行集事实保存完成", strProcedureName);
                        #endregion

                        #region 在辅助事实表(AuxFact_PDC)中添加纪录
                        WriteLog.Instance.Write("保存辅助事实", strProcedureName);
                        partitionPolicy = Int64.Parse(communityID.ToString() +
                                                      (100000000L + t132LeafID).ToString().Substring(1, 8) +
                                                      DateTime.Now.Year.ToString());
                        factPartitioningKey = Int64.Parse(DateTime.Now.Year.ToString() +
                                                          (100000000L + communityID).ToString().Substring(1, 8) + "0006");

                        AuxFact_PDC auxFactPDC = new AuxFact_PDC()
                        {
                            FactID                = factID,
                            PartitioningKey       = partitionPolicy,
                            FactPartitioningKey   = factPartitioningKey,
                            WFInstanceID          = wipInspecting.MainWIPIDCode.PWONo,
                            WIPCode               = wip.SubWIPIDCode,
                            AltWIPCode            = wipInspecting.MainWIPIDCode.AltWIPCode,
                            SerialNumber          = wipInspecting.MainWIPIDCode.SerialNumber,
                            LotNumber             = wipInspecting.MainWIPIDCode.LotNumber,
                            ContainerNo           = containerNo,
                            FakePreventingCode    = "",
                            CustomerAssignedID    = "",
                            ElectronicProductCode = "",
                        };

                        #region 计算 QCStatus 值
                        if (wip.InspectingStatus == 3)
                        {
                            wip.QCStatus = CalculateQCStatus(communityID,
                                                             productLeaf,
                                                             workUnitLeaf,
                                                             wipInspecting.MainWIPIDCode.PWONo,
                                                             wip.QCStatus);
                        }
                        auxFactPDC.QCStatus = wip.QCStatus;
                        #endregion

                        try
                        {
                            conn.Insert(auxFactPDC);
                        }
                        catch (Exception error)
                        {
                            errCode = 99002;
                            errText = string.Format("保存辅助事实表失败:{0}", error.Message);
                            WriteLog.Instance.Write(errText, strProcedureName);
                            WriteLog.Instance.Write(error.StackTrace, strProcedureName);

                            conn.RollBack();

                            return(Json(errCode));
                        }
                        WriteLog.Instance.Write("辅助事实保存完成", strProcedureName);
                        #endregion

                        #region 在主事实表(FixedFact_MES)中添加记录
                        WriteLog.Instance.Write("保存主事实", strProcedureName);
                        partitionPolicy = Int64.Parse(DateTime.Now.Year.ToString() +
                                                      (100000000L + communityID).ToString().Substring(1, 8) + "0006");

                        #region 准备需要保存的数据
                        FixedFact_MES fixedFactMES = new FixedFact_MES()
                        {
                            FactID          = factID,
                            PartitioningKey = partitionPolicy,
                            TransactNo      = transactNo,
                            IsFixed         = 1,
                            OpID            = 6,
                            OpType          = wip.InspectingStatus,
                            BusinessDate    = confirmTime,
                            Code01          = wipInspecting.MainWIPIDCode.T102Code,
                            Code02          = wipInspecting.MainWIPIDCode.T120Code,
                            Code03          = wipInspecting.MainWIPIDCode.T107Code,
                            Code04          = wipInspecting.MainWIPIDCode.T126Code,
                            Code05          = wipInspecting.MainWIPIDCode.T1Code,
                            Code06          = wipInspecting.MainWIPIDCode.T134Code,
                            Code07          = wipInspecting.MainWIPIDCode.T181Code,
                            Code08          = wipInspecting.MainWIPIDCode.T1002Code,
                            Leaf01          = wipInspecting.MainWIPIDCode.T102Leaf,
                            Leaf02          = wipInspecting.MainWIPIDCode.T120Leaf,
                            Leaf03          = wipInspecting.MainWIPIDCode.T107Leaf,
                            Leaf04          = wipInspecting.MainWIPIDCode.T126Leaf,
                            Leaf05          = wipInspecting.MainWIPIDCode.T1Leaf,
                            Leaf06          = wipInspecting.MainWIPIDCode.T134Leaf,
                            Leaf07          = wipInspecting.MainWIPIDCode.T181Leaf,
                            Leaf08          = wipInspecting.MainWIPIDCode.T1002Leaf,
                        };

                        fixedFactMES.AChecksum     = 0;
                        fixedFactMES.CorrelationID = 0;
                        fixedFactMES.Metric01      = 1; // 此处应该由前台传入
                        fixedFactMES.Metric02      = passByTimes;
                        fixedFactMES.Metric03      = 1;

                        fixedFactMES.Metric04 = Int64.Parse((confirmTime -
                                                             wipInspecting.MainWIPIDCode.MoveInTime).TotalMilliseconds.ToString()) /
                                                wipInspecting.MainWIPIDCode.NumOfSubWIPs;
                        fixedFactMES.Metric05 = fixedFactMES.Metric04 + fixedFactMES.Metric02;
                        fixedFactMES.Metric06 = fixedFactMES.Metric04 + fixedFactMES.Metric03;
                        fixedFactMES.Metric07 = stdcycleTimeOfOperation;
                        fixedFactMES.Metric08 = TimeParser.LocalTimeToUnix(confirmTime);
                        fixedFactMES.Metric09 = (long)(wipInspecting.ScanTime -
                                                       wipInspecting.MainWIPIDCode.MoveInTime).TotalMilliseconds;
                        fixedFactMES.Metric10      = unscheduledPDTofAWorkUnit;
                        fixedFactMES.BChecksum     = 0;
                        fixedFactMES.MeasurementID = 0;
                        fixedFactMES.WFInstanceID  = wipInspecting.MainWIPIDCode.PWONo;
                        fixedFactMES.Remark        = functionName;
                        fixedFactMES.LinkedFactID  = 0;
                        #endregion

                        #region 添加记录
                        try
                        {
                            conn.Insert(fixedFactMES);
                        }
                        catch (Exception error)
                        {
                            errCode = 99002;
                            errText = string.Format("保存主事实表失败:{0}", error.Message);
                            WriteLog.Instance.Write(errText, strProcedureName);
                            WriteLog.Instance.Write(error.StackTrace, strProcedureName);

                            conn.RollBack();

                            return(Json(errCode));
                        }
                        #endregion
                        WriteLog.Instance.Write("主事实保存完成", strProcedureName);
                        #endregion
                    }

                    if (NeedRepair(wipInspecting))
                    {
                        #region 调整路由送修(IRAPMES..usp_MarkNGWIP)
                        {
                            WriteLog.Instance.Write("调整路由送修", strProcedureName);
                            WIP wip = new WIP();
                            try
                            {
                                IRAPJsonResult rlt = wip.usp_MarkNGWIP(
                                    communityID,
                                    productLeaf,
                                    wipInspecting.MainWIPIDCode.WIPCode,
                                    wipInspecting.MainWIPIDCode.LotNumber,
                                    containerNo,
                                    wipInspecting.MainWIPIDCode.PWONo,
                                    wipInspecting.MainWIPIDCode.QCStatus,
                                    workUnitLeaf,
                                    0,
                                    sysLogID,
                                    out errCode,
                                    out errText);
                                WriteLog.Instance.Write(string.Format("({0}){1}", errCode, errText),
                                                        strProcedureName);
                                if (errCode != 0)
                                {
                                    conn.RollBack();
                                    return(Json(errCode));
                                }
                            }
                            catch (Exception error)
                            {
                                errCode = 99003;
                                errText = string.Format("调用 usp_MarkNGWIP 失败:{0}", error.Message);
                                WriteLog.Instance.Write(errText, strProcedureName);
                                WriteLog.Instance.Write(error.StackTrace, strProcedureName);

                                conn.RollBack();

                                return(Json(errCode));
                            }
                            WriteLog.Instance.Write("路由送修调整完毕", strProcedureName);
                        }
                        #endregion
                    }
                    else
                    {
                        #region 调整路由(IRAPMES..usp_WIPForward)
                        {
                            WriteLog.Instance.Write("调整路由", strProcedureName);
                            WIP wip = new WIP();
                            try
                            {
                                IRAPJsonResult rlt = wip.usp_WIPForward(
                                    communityID,
                                    productLeaf,
                                    wipInspecting.MainWIPIDCode.WIPPattern,
                                    wipInspecting.MainWIPIDCode.LotNumber,
                                    containerNo,
                                    wipInspecting.MainWIPIDCode.PWONo,
                                    wipInspecting.MainWIPIDCode.QCStatus,
                                    workUnitLeaf,
                                    0,
                                    sysLogID,
                                    out errCode,
                                    out errText);
                                WriteLog.Instance.Write(string.Format("({0}){1}", errCode, errText),
                                                        strProcedureName);
                                if (errCode != 0)
                                {
                                    conn.RollBack();

                                    return(Json(errCode));
                                }
                            }
                            catch (Exception error)
                            {
                                errCode = 99003;
                                errText = string.Format("调用 usp_WIPForward 失败:{0}", error.Message);
                                WriteLog.Instance.Write(errText, strProcedureName);
                                WriteLog.Instance.Write(error.StackTrace, strProcedureName);

                                conn.RollBack();

                                return(Json(errCode));
                            }
                            WriteLog.Instance.Write("路由调整完成", strProcedureName);
                        }
                        #endregion
                    }

                    #region 更新工位的第二个瞬态属性(IRAPMDM..stb060)
                    {
                        WriteLog.Instance.Write("更新工位第二个瞬态属性", strProcedureName);
                        int partitioningKey             = Int32.Parse(communityID.ToString() + "0107");
                        List <IDataParameter> paramList = new List <IDataParameter>();
                        paramList.Add(new IRAPProcParameter("@Statistic02", DbType.Int64, TimeParser.LocalTimeToUnix(confirmTime)));
                        paramList.Add(new IRAPProcParameter("@PartitioningKey", DbType.Int64, partitioningKey));
                        paramList.Add(new IRAPProcParameter("@T107EntityID", DbType.Int32, t107EntityID));
                        try
                        {
                            conn.Update("UPDATE IRAPMDM..stb060 SET Statistic02 = @Statistic02 " +
                                        "WHERE PartitioningKey = @PartitioningKey AND EntityID = @T107EntityID",
                                        paramList);
                        }
                        catch (Exception error)
                        {
                            errCode = 99004;
                            errText = string.Format("更新工位(IRAPMDM..stb060)的第二个瞬态属性失败:{0}", error.Message);
                            WriteLog.Instance.Write(errText, strProcedureName);
                            WriteLog.Instance.Write(error.StackTrace, strProcedureName);

                            conn.RollBack();

                            return(Json(errCode));
                        }
                        WriteLog.Instance.Write("工位第二个瞬态属性更新完成", strProcedureName);
                    }
                    #endregion

                    #region 交易复核(IRAPMES..stb010)
                    {
                        WriteLog.Instance.Write("交易复核", strProcedureName);
                        long partitionPolicy = Int64.Parse(confirmTime.Year.ToString() +
                                                           (100000000L + communityID).ToString().Substring(1, 8));
                        List <IDataParameter> paramList = new List <IDataParameter>();
                        paramList.Add(new IRAPProcParameter("@OkayTime", DbType.DateTime2, confirmTime));
                        paramList.Add(new IRAPProcParameter("@AgencyLeaf2", DbType.Int32, agencyLeaf));
                        paramList.Add(new IRAPProcParameter("@Checked", DbType.String, userCode));
                        paramList.Add(new IRAPProcParameter("@TransactNo", DbType.Int64, transactNo));
                        paramList.Add(new IRAPProcParameter("@PartitioningKey", DbType.Int64, partitionPolicy));
                        try
                        {
                            conn.Update("UPDATE IRAPMES..stb010 SET OkayTime = @OkayTime, " +
                                        "AgencyLeaf2 = @AgencyLeaf2, Checked = @Checked, " +
                                        "Status = 5 WHERE TransactNo = @TransactNo AND " +
                                        "PartitioningKey = @PartitioningKey",
                                        paramList);
                        }
                        catch (Exception error)
                        {
                            errCode = 99004;
                            errText = string.Format("交易复核(IRAPMES..stb010)失败:{0}", error.Message);
                            WriteLog.Instance.Write(errText, strProcedureName);
                            WriteLog.Instance.Write(error.StackTrace, strProcedureName);

                            conn.RollBack();

                            return(Json(errCode));
                        }
                        WriteLog.Instance.Write("交易复核完成", strProcedureName);
                    }
                    #endregion

                    conn.Commit();

                    errCode = 0;
                    errText = "保存成功";

                    return(Json(errCode));
                }
            }
            finally
            {
                WriteLog.Instance.WriteEndSplitter(strProcedureName);
            }
        }