U9創(chuàng)建OA流程(泛微)

實(shí)現(xiàn)功能

  1. 配置U9字段OA表單對(duì)映關(guān)系
  • 同步U9子表至OA
  • 同步U9附件至OA
  • 通過U9第三方子表至OA
  1. 通過OA審批結(jié)果
  2. 查看OA審批進(jìn)度

1. 創(chuàng)建U9單據(jù)與OA表單的對(duì)應(yīng)關(guān)系

image.png
  • OA審批結(jié)果:使用U9擴(kuò)展字段記錄OA審批成功戴而、審批失敗原因
  • OA流程標(biāo)題:支持靜態(tài)數(shù)據(jù)+動(dòng)態(tài)數(shù)據(jù)(從單據(jù)取數(shù))
  • U9字段取值
    例1:
    應(yīng)收單的私有段1存放的是客戶編碼(DescFlexField.PrivateDescSeg1)揩懒,取客戶的出貨原則名稱;
    Entity:UFIDA.U9.CBO.SCM.Customer.Customer:Code=DescFlexField.PrivateDescSeg1:ShippmentRule.Name
    例2:
    應(yīng)收單的私有段1存放的是客戶主鍵(DescFlexField.PrivateDescSeg1)日月,取客戶的出貨原則名稱陕壹;
    Entity:UFIDA.U9.CBO.SCM.Customer.Customer:ID=DescFlexField.PrivateDescSeg1:ShippmentRule.Name

1.1 同步U9子表數(shù)據(jù)

image.png

2. 新建U9審批流

新建一個(gè)簡單的審批流用于提交U9單據(jù),U9提交時(shí)觸發(fā)任務(wù)插件

3. 任務(wù)插件新建OA單據(jù)

U9單據(jù)提交后觸發(fā)任務(wù)插件

using log4net;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
using UFIDA.U9.Cust.IESLabBE.OAWorkFlowConfigBE;
using UFSoft.UBF.Business;
using UFSoft.UBF.PL;
using UFSoft.UBF.PL.ObjectAccess;
using UFIDA.U9.Cust.IESLabDocBE.OAServiceXML;
using UFIDA.U9.Cust.IESLabBE.OAWorkFlowRecordBE;
using UFIDA.U9.Base.Doc;
using UFIDA.U9.CS.Common.FileStorage;
using UFIDA.U9.Base.Attachment;
using UFIDA.U9.Base;
using UFIDA.U9.Cust.IESLabBP.Util;
using UFSoft.UBF.Util.Context;

namespace UFIDA.U9.Cust.IESLabDocBE.OAService
{
    public class OAWorkflowService
    {
        public const string REQUESTLEVEL_NORMAL = "0";
        public const string REQUESTLEVEL_MAJOR = "1";
        public const string REQUESTLEVEL_URGENT = "2";
        public const string FIELDTYPE_FILE = "base64:";
        public const string PROFILE_APP_IP = "CUST_APP_IP";
        //public const string PROFILE_APP_ENTERPRISE = "CUST_APP_ENTERPRISE";
        public const string PROFILE_ATTACHMENT_DOWNLOAD_USERNAME = "CUST_ATTACHMENT_DOWNLOAD_USERNAME";
        public const string PROFILE_ATTACHMENT_DOWNLOAD_PASSWORD = "CUST_ATTACHMENT_DOWNLOAD_PASSWORD";
        private static readonly ILog log = LogManager.GetLogger(typeof(OAWorkflowService));
        private WorkflowService workflowService = new WorkflowService();
        private WorkflowServiceXml xmlWorkflowService = new WorkflowServiceXml();
        private const int workflowType = 0;
        /// <summary>
        /// 創(chuàng)建、提交工作流
        /// </summary>
        public void createAndSubmitWorkflow(BusinessEntity businessEntity,int oaUserid)
        {
            CompositeValueHandler valueHandlers = new CompositeValueHandler(businessEntity);
            OAWorkFlowConfig oAWorkFlowConfig = OAWorkFlowConfig.Finder.Find("EntityType.FullName='" + businessEntity.MDEntity.FullName + "'");
            if (oAWorkFlowConfig == null)
            {
                throw new Exception("創(chuàng)建OA流程失敗凡伊,請(qǐng)先配置OA流程配置");
            }
            WorkflowRequestInfo workflowRequestInfo = new WorkflowRequestInfo();
            workflowRequestInfo.canView = true;
            workflowRequestInfo.canEdit = true;
            workflowRequestInfo.requestName = valueHandlers.Handler(oAWorkFlowConfig.OARequestName) as string;// 請(qǐng)求標(biāo)題
            workflowRequestInfo.requestLevel = REQUESTLEVEL_NORMAL;
            workflowRequestInfo.creatorId = oaUserid.ToString();
            WorkflowBaseInfo worklfowBaseInfo = new WorkflowBaseInfo();
            worklfowBaseInfo.workflowId = oAWorkFlowConfig.OAWorkFlowId;
            worklfowBaseInfo.workflowName = oAWorkFlowConfig.OAWorkFlowName;
            worklfowBaseInfo.workflowTypeName = oAWorkFlowConfig.OAWorkFlowTypeName;// 流程類型名稱
            workflowRequestInfo.workflowBaseInfo = worklfowBaseInfo;
            workflowRequestInfo.workflowMainTableInfo = createMainTable(businessEntity,oAWorkFlowConfig);
            workflowRequestInfo.workflowDetailTableInfos = createDetailTable(businessEntity, oAWorkFlowConfig);
            string result = null;
            try
            {
                result=xmlWorkflowService.doCreateWorkflowRequest(ObjectToXML(workflowRequestInfo), oaUserid);
                AddOAWorkFlowRecord(businessEntity, Convert.ToInt32(result), oaUserid, oAWorkFlowConfig);
            }
            catch(Exception e)
            {
                throw new Exception("創(chuàng)建OA流程失敗,請(qǐng)稍后重試。" + e.Message);
            }
            if (result != null)
            {
                if (int.Parse(result) <= 0)
                {
                    throw new Exception("創(chuàng)建OA流程失敗窒舟,請(qǐng)聯(lián)系系統(tǒng)管理員系忙,OA返回狀態(tài):"+result);
                }
            }
            else
            {
                throw new Exception("創(chuàng)建OA流程失敗,請(qǐng)聯(lián)系系統(tǒng)管理員惠豺,OA返回狀態(tài):null");
            }
        }
        /// <summary>
        /// 刪除流程
        /// </summary>
        /// <param name="businessEntity"></param>
        /// <param name="oaUserid"></param>
        public void deleteWorkflow(BusinessEntity businessEntity, int oaUserid)
        {
            OAWorkFlowRecord.EntityList workFlowRecords=QueryOAWorkFlowRecords(businessEntity);
            if (workFlowRecords == null)
            {
                return;
            }
            foreach (OAWorkFlowRecord workFlowRecord in workFlowRecords)
            {
                bool result=workflowService.deleteRequest(workFlowRecord.OARequestID, oaUserid);
                if (result)
                {
                    DeleteOAWorkFlowRecord(workFlowRecord);
                }
            }
        }
        /// <summary>
        /// 查詢流程日志
        /// </summary>
        /// <param name="WorkflowID"></param>
        /// <param name="OARequestID"></param>
        /// <param name="OAUserID"></param>
        /// <param name="PageSize"></param>
        /// <param name="EndID"></param>
        /// <returns></returns>
        public WorkflowRequestLog[] GetWorkflowRequestLogs(string WorkflowID,string OARequestID,int OAUserID,int PageSize,int EndID)
        {
            return workflowService.getWorkflowRequestLogs(WorkflowID, OARequestID, OAUserID, PageSize, EndID);
        }
        /// <summary>
        /// 添加OA流程記錄
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="requestID"></param>
        /// <param name="oaUserID"></param>
        /// <param name="oAWorkFlowConfig"></param>
        private void AddOAWorkFlowRecord(BusinessEntity entity,int requestID,int oaUserID, OAWorkFlowConfig oAWorkFlowConfig)
        {
            OAWorkFlowRecord oAWorkFlowRecord = OAWorkFlowRecord.Create();
            oAWorkFlowRecord.EntityID = entity.ID;
            oAWorkFlowRecord.OARequestID = requestID;
            oAWorkFlowRecord.OAUserID = oaUserID;
            oAWorkFlowRecord.WorkflowID = oAWorkFlowConfig.OAWorkFlowId;
            oAWorkFlowRecord.OAWorkFlowName = oAWorkFlowConfig.OAWorkFlowName;
            oAWorkFlowRecord.DocNo = (entity as Doc).DocNo;
            using (ISession session = Session.Open())
            {
                session.InList(oAWorkFlowRecord);
                session.Commit();
            }
        }
        /// <summary>
        /// 按單據(jù)查詢OA流程記錄
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        private OAWorkFlowRecord.EntityList QueryOAWorkFlowRecords(BusinessEntity entity)
        {
            return OAWorkFlowRecord.Finder.FindAll("EntityID=@EntityID", new OqlParam("EntityID", entity.ID));
        }
        /// <summary>
        /// 刪除OA流程記錄
        /// </summary>
        /// <param name="workFlowRecord"></param>
        private void DeleteOAWorkFlowRecord(OAWorkFlowRecord workFlowRecord)
        {
            using (ISession session = Session.Open())
            {
                session.Remove(workFlowRecord);
                session.Commit();
            }
        }
        /// <summary>
        /// 創(chuàng)建主表
        /// </summary>
        /// <param name="businessEntity"></param>
        /// <param name="oAWorkFlowConfig"></param>
        /// <returns></returns>
        private WorkflowMainTableInfo createMainTable(BusinessEntity businessEntity, OAWorkFlowConfig oAWorkFlowConfig)
        {
            WorkflowMainTableInfo workflowMainTableInfo = new WorkflowMainTableInfo();// 主表
            workflowMainTableInfo.requestRecords = new WorkflowRequestTableRecord[] { createMainTableRecord(businessEntity, oAWorkFlowConfig.MainField) };
            return workflowMainTableInfo;
        }
        /// <summary>
        /// 創(chuàng)建明細(xì)表
        /// </summary>
        /// <param name="businessEntity"></param>
        /// <param name="oAWorkFlowConfig"></param>
        /// <returns></returns>
        private WorkflowDetailTableInfo[] createDetailTable(BusinessEntity businessEntity, OAWorkFlowConfig oAWorkFlowConfig)
        {
            List<WorkflowDetailTableInfo> workflowDetailTableInfos = new List<WorkflowDetailTableInfo>();
            List<MainField> detailTableConfig = GetDetailTableConfig(businessEntity,oAWorkFlowConfig);
            CompositeValueHandler handler = new CompositeValueHandler(businessEntity);
            foreach (MainField mainAttribute in detailTableConfig)
            {
                string attributeName = mainAttribute.MField == null ? mainAttribute.U9Field : mainAttribute.MField.Name;
                POList <IPersistableObject> detailEntity = handler.Handler(attributeName) as POList<IPersistableObject>;
                WorkflowDetailTableInfo workflowDetailTableInfo = new WorkflowDetailTableInfo();
                workflowDetailTableInfo.workflowRequestTableRecords = createDetailTableRecord(detailEntity.ToArray(), mainAttribute.DetailField);
                workflowDetailTableInfos.Add(workflowDetailTableInfo);
            }
            if (workflowDetailTableInfos.Count > 0)
            {
                return workflowDetailTableInfos.ToArray();
            }
            else
            {
                return null;
            }
        }
        /// <summary>
        /// 獲取明細(xì)表字段信息
        /// </summary>
        /// <param name="oAWorkFlowConfig"></param>
        /// <param name="businessEntity"></param>
        /// <returns></returns>
        private List<MainField> GetDetailTableConfig(BusinessEntity businessEntity, OAWorkFlowConfig oAWorkFlowConfig)
        {
            //var a=mainFields.Where(mainField => mainField.MFieldKey.GetEntity().IsCollection).OrderBy(item=>item.OAFieldName);
            List<MainField> detailTableConfig = new List<MainField>();
            EntityValueHandler entityValueHandler = new EntityValueHandler(businessEntity);
            foreach (MainField mainField in oAWorkFlowConfig.MainField)
            {
                if ((mainField.MField!=null&&mainField.MField.IsCollection)||
                    (entityValueHandler.Support(mainField.U9Field) &&entityValueHandler.IsEntityies(mainField.U9Field)))
                {
                    detailTableConfig.Add(mainField);
                }
            }
            return detailTableConfig.OrderBy(item => item.OAFieldName).ToList<MainField>();
        }
        /// <summary>
        /// 創(chuàng)建明細(xì)表行
        /// </summary>
        /// <param name="entities"></param>
        /// <param name="detailFields"></param>
        /// <returns></returns>
        private WorkflowRequestTableRecord[] createDetailTableRecord(IPersistableObject[] entities, DetailField.EntityList detailFields)
        {
            List<WorkflowRequestTableRecord> workflowRequestTableRecords = new List<WorkflowRequestTableRecord>();
            if (entities != null)
            {
                foreach (BusinessEntity entity in entities)
                {
                    WorkflowRequestTableRecord record = new WorkflowRequestTableRecord();
                    record.workflowRequestTableFields = createWorkflowRequestTableField(entity, detailFields);
                    workflowRequestTableRecords.Add(record);
                }
            }
            if (workflowRequestTableRecords.Count > 0)
            {
                return workflowRequestTableRecords.ToArray();
            }
            else
            {
                return null;
            }
        }
        /// <summary>
        /// 創(chuàng)建OA主表
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="mainFields"></param>
        /// <returns></returns>
        private WorkflowRequestTableRecord createMainTableRecord(BusinessEntity entity, MainField.EntityList mainFields)
        {
            var workflowRequestTableFields = new List<WorkflowRequestTableField>();// 主表的字段
            foreach (MainField mainField in mainFields)
            {
                if (mainField.MField==null||!mainField.MField.IsCollection)
                {
                    string fieldPath = null;
                    if (mainField.MField != null)
                    {
                        fieldPath = mainField.MField.Name;
                        if (mainField.U9DisplayField!=null)
                        {
                            fieldPath = fieldPath + "." + mainField.U9DisplayField.Name;
                        }
                    }
                    else
                    {
                        fieldPath = mainField.U9Field;
                    }
                    CompositeValueHandler valueHandlers = new CompositeValueHandler(entity);
                    workflowRequestTableFields.Add(createWorkflowRequestTableField(mainField.OAFieldName, valueHandlers.Handler(fieldPath), true, true));// 字段
                }
            }
            WorkflowRequestTableRecord requestTableRecord = new WorkflowRequestTableRecord();
            workflowRequestTableFields.AddRange(CreateFileField("fj", entity.ID));
            requestTableRecord.workflowRequestTableFields = workflowRequestTableFields.ToArray();
            return requestTableRecord;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="U9Field"></param>
        /// <param name="SubU9Field"></param>
        /// <param name="U9Fieldstring"></param>
        /// <returns></returns>
        private string GetFieldPath(UBF.MD.Business.Attribute U9Field, UBF.MD.Business.Attribute SubU9Field,string U9Fieldstring)
        {
            string u9Fields = null;
            if (U9Field != null)
            {
                u9Fields=U9Field.Name;
                if (SubU9Field != null)
                {
                    u9Fields= u9Fields+"."+SubU9Field.Name;
                }
            }
            else
            {
                u9Fields = U9Fieldstring;
            }
            return u9Fields;
        }
        /// <summary>
        /// 創(chuàng)建OA字段并賦值
        /// </summary>
        /// <param name="businessEntity"></param>
        /// <param name="detailFields"></param>
        /// <returns></returns>
        private WorkflowRequestTableField[] createWorkflowRequestTableField(BusinessEntity businessEntity, DetailField.EntityList detailFields)
        {
            List<WorkflowRequestTableField> fields = new List<WorkflowRequestTableField>();
            foreach (DetailField detailField in detailFields)
            {
                if (string.IsNullOrEmpty(detailField.OAFieldName)||(detailField.DField==null&&string.IsNullOrEmpty(detailField.U9Field)))
                {
                    continue;
                }
                CompositeValueHandler valueHandlers = new CompositeValueHandler(businessEntity);
                object fieldValue = valueHandlers.Handler(GetFieldPath(detailField.DField, detailField.U9DisplayField, detailField.U9Field));
                if (fieldValue == null)
                {
                    continue;
                }
                fields.Add(createWorkflowRequestTableField(detailField.OAFieldName,fieldValue,true,true));
            }
            return fields.ToArray();
        }
        /// <summary>
        /// 根據(jù)字段名稱獲取實(shí)體字段值
        /// </summary>
        /// <param name="businessEntity"></param>
        /// <param name="u9Fields">以.連接下層字段</param>
        /// <returns></returns>
        private string GetEntityValue(BusinessEntity businessEntity,string[] u9Fields)
        {
            if (u9Fields == null|| businessEntity==null)
            {
                return null;
            }
            string attributeName = null;
            object value = null;
            BusinessEntity entity = businessEntity;
            for (int i = 0; i < u9Fields.Length; i++ )
            {
                string u9Field = u9Fields[i];
                if (string.IsNullOrEmpty(u9Field))
                {
                    break;
                }
                if (string.IsNullOrEmpty(attributeName))
                {
                    attributeName = u9Field;
                }
                else
                {
                    attributeName = attributeName + "." + u9Field;// 擴(kuò)展字段银还,例如:DescFlexField.PubDescSeg2
                }
                if (!entity.MDEntity.GetHashFlatAttrsMap().Keys.Contains(attributeName))
                {
                    continue;
                }
                value = entity[attributeName];
                if(value != null)
                {
                    if (value is BusinessEntity)
                    {
                        entity = value as BusinessEntity;
                        attributeName = null;
                        continue;
                    }
                }
            }
            return value!=null?value.ToString():null;
        }
        /// <summary>
        /// 創(chuàng)建OA字段并賦值
        /// </summary>
        /// <param name="fieldName"></param>
        /// <param name="fieldValue"></param>
        /// <param name="isView"></param>
        /// <param name="isEdit"></param>
        /// <returns></returns>
        private WorkflowRequestTableField createWorkflowRequestTableField(string fieldName,object fieldValue,bool isView,bool isEdit)
        {
            if (fieldValue == null)
            {
                return null;
            }
            WorkflowRequestTableField field = new WorkflowRequestTableField() {
                fieldName = fieldName,
                fieldValue = fieldValue.ToString(),
                view = isView,
                edit = isEdit
            };
            return field;
        }
        /// <summary>
        /// 查詢可創(chuàng)建工作流程
        /// </summary>
        /// <param name="pageNo">頁數(shù)</param>
        /// <param name="pageSize">每頁大小</param>
        /// <param name="recordCount"></param>
        /// <param name="oaUserid"></param>
        public void getCreateWorkflowList(int pageNo,int pageSize,int recordCount,int oaUserid)
        {
            string[] conditions = new string[] { };
            WorkflowBaseInfo[] workflowBaseInfos = workflowService.getCreateWorkflowList(pageNo, pageSize, recordCount, oaUserid, workflowType, conditions);
            foreach (WorkflowBaseInfo workflowBaseInfo in workflowBaseInfos)
            {
                Console.WriteLine("流程名稱:" + workflowBaseInfo.workflowName);
                Console.WriteLine("流程id:" + workflowBaseInfo.workflowId);
                Console.WriteLine("流程類型:" + workflowBaseInfo.workflowTypeId);
                Console.WriteLine("流程類型名稱:" + workflowBaseInfo.workflowTypeName);
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="entityID"></param>
        /// <returns></returns>
        private Attachment.EntityList GetAttachments(long entityID)
        {
            Attachment.EntityList attachments = Attachment.Finder.FindAll("EntityID=@EntityID",new OqlParam("EntityID", entityID));
            return attachments;
        }
        /// <summary>
        /// 獲取base64格式文件內(nèi)容
        /// </summary>
        /// <param name="attachment"></param>
        /// <returns></returns>
        private string GetAttachmentBase64Content(Attachment attachment)
        {
            Storage storage = new Storage();
            CS.Common.FileDBService.FileInfo file = storage.GetFile(attachment.FileHandler);
            if (file == null)
            {
                return null;
            }
            using (Stream stream = storage.GetFileContent(attachment.FileHandler))
            {
                stream.Seek(0, SeekOrigin.Begin);
                byte[] data = new byte[stream.Length];
                stream.Read(data,0,data.Length);
                return Convert.ToBase64String(data);
            }
        }
        private WorkflowRequestTableField[] CreateFileField(string fieldName, long entityID)
        {
            List<WorkflowRequestTableField> workflowRequestTableFields = new List<WorkflowRequestTableField>();
            Attachment.EntityList attachments = GetAttachments(entityID);
            foreach(Attachment attachment in attachments)
            {
                WorkflowRequestTableField workflowRequestTableField = new WorkflowRequestTableField();
                workflowRequestTableField.fieldName = fieldName;
                // 泛微V8不支持base64格式附件
                workflowRequestTableField.fieldType = FIELDTYPE_FILE + attachment.Title;
                workflowRequestTableField.fieldValue = FIELDTYPE_FILE + GetAttachmentBase64Content(attachment);
                //workflowRequestTableField.fieldType = "http:" + attachment.Title;
                //workflowRequestTableField.fieldValue = GetAutoLoginUrl(GetDownloadfileUrl(attachment));
                workflowRequestTableField.isEdit = true.ToString();
                workflowRequestTableField.isView = true.ToString();
                workflowRequestTableFields.Add(workflowRequestTableField);
            }
            return workflowRequestTableFields.ToArray();
        }
        private string GetAutoLoginUrl(string returnUrl)
        {
            string url = "{0}/u9/api/v1/autologin.aspx?user_code={1}&user_password={2}" +
                "&enterprise_id={3}&organization_id={4}&t=d&return_url={5}";
            return string.Format(url, ProfileUtils.GetProfileValue(PROFILE_APP_IP), 
                ProfileUtils.GetProfileValue(PROFILE_ATTACHMENT_DOWNLOAD_USERNAME), 
                ProfileUtils.GetProfileValue(PROFILE_ATTACHMENT_DOWNLOAD_PASSWORD),
                PlatformContext.ENTERPRISE_ID, 
                Context.LoginOrg.ID,Uri.EscapeDataString(returnUrl));
        }
        private string GetDownloadfileUrl(Attachment attachment)
        {
            string url = "{0}/u9/Common_Downloadfile.aspx?id={1}&handler={2}&viewinbrowser=false";
            return string.Format(url, ProfileUtils.GetProfileValue(PROFILE_APP_IP), attachment.ID, attachment.FileHandler);
        }
        /// <summary>
        /// 對(duì)象轉(zhuǎn)xml string
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        private string ObjectToXML(object obj)
        {
            using (MemoryStream Stream = new MemoryStream())
            {
                XmlSerializer xmlSerializer = new XmlSerializer(obj.GetType());
                XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                ns.Add("", "");
                xmlSerializer.Serialize(Stream, obj, ns);
                Stream.Position = 0;
                StreamReader reader = new StreamReader(Stream);
                return reader.ReadToEnd().Replace("<?xml version=\"1.0\"?>","")
                    .Replace("\r\n", "");
            }
        }
    }
}

4. 中間表記錄OA審批結(jié)果

5.定時(shí)任務(wù)同步OA審批結(jié)果

namespace UFIDA.U9.Cust.IESLabBP.OAServiceBP
{
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Linq;
    using UFIDA.U9.SM.SC;
    using SM.Ship;
    using UFIDA.U9.SM.SO;
    using UFSoft.UBF.AopFrame;
    using UFSoft.UBF.Util.Context;
    using static UFSoft.UBF.Business.Entity;
    using PM.Rcv;
    using SM.SOModify;
    using SM.ShipPlan;
    using PM.PO;
    using QC.MRBBE;
    using CBO.QC.Enums;
    using PR.PurchaseRequest;
    using AP.Payment;
    using CBO.FI.Enums;
    using AR.ARBill;
    using InvDoc.MiscShip;
    using InvDoc.Enums;
    using UFSoft.UBF.Business;
    using UFIDA.U9.Base.Doc;
    using UFSoft.UBF.PL;
    using UFIDA.U9.Cust.IESLabBE.OAWorkFlowConfigBE;
    using UFIDA.U9.Cust.IESLabBE.OAWorkFlowRecordBE;
    using UFIDA.U9.Cust.IESLabBE.OAApproveResultBE;
    using UFIDA.U9.CBO.SCM.Enums;
    using UFIDA.U9.PPR.PurPriceAdjustment;
    using UFSoft.UBF.Util.Log;
    using UFIDA.U9.Base;

    /// <summary>
    /// 同步OA結(jié)果
    /// </summary>  
    public partial class SyncOAApproveResult 
    {   
        internal BaseStrategy Select()
        {
            return new SyncOAApproveResultImpementStrategy();   
        }       
    }
    
    #region  implement strategy 
    /// <summary>
    /// 同步OA結(jié)果
    /// </summary>  
    internal partial class SyncOAApproveResultImpementStrategy : BaseStrategy
    {
        private static readonly ILogger logger = LoggerManager.GetLogger(typeof(SyncOAApproveResultImpementStrategy));
        public SyncOAApproveResultImpementStrategy() { }
        public override object Do(object obj)
        {
            UpdateApproveResult();
            return null;
        }
        /// <summary>
        /// 更新U9審批信息
        /// </summary>
        private void UpdateApproveResult()
        {
            EntityList<OAApproveResult> approveResults = QueryOAApproveResults();
            foreach (OAApproveResult approveResult in approveResults)
            {
                approveResult.IsSync = true;
                approveResult.SyncSuccess = true;
                OAWorkFlowRecord oAWorkFlowRecord = QueryOAWorkFlowRecord(approveResult.OARequestID);
                oAWorkFlowRecord.IsSync = true;
                // U9單據(jù)進(jìn)行了收回,OA未刪除單據(jù)單據(jù)進(jìn)行了歸檔
                if (oAWorkFlowRecord == null)
                {
                    continue;
                }
                OAWorkFlowConfig oAWorkFlowConfig = QueryOAWorkFlowConfig(oAWorkFlowRecord);
                Doc doc = QueryDoc(oAWorkFlowConfig.EntityType.FullName, oAWorkFlowRecord.EntityID);
                //if (doc == null)
                //{
                //    continue;
                //}
                try
                {
                    using (ISession session = Session.Open())
                    {
                        UpdateDocStatus(approveResult, oAWorkFlowRecord, doc);
                        session.InList(doc);
                        session.Commit();// 一個(gè)單據(jù)審批不通過后洁墙,不影響其它單據(jù)的審核
                    }
                }
                catch (Exception e)
                {
                    approveResult.SyncSuccess = false;
                    approveResult.ApproveInfo = e.Message;
                    RollbackDocStatus(doc);
                }
                try
                {
                    using (ISession session = Session.Open())
                    {
                        SetApproveInfo(doc, approveResult.ApproveInfo, oAWorkFlowConfig);
                        session.InList(approveResult);
                        oAWorkFlowRecord.ApproveInfo = approveResult.ApproveInfo;
                        session.Commit();
                    }
                }
                catch(Exception e)
                {
                    using (ISession session = Session.Open())
                    {
                        oAWorkFlowRecord.ApproveInfo = e.Message;
                        session.Commit();
                    }
                    logger.Error(e.Message);
                }
            }
        }
        /// <summary>
        /// 回寫審批結(jié)果信息
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="value"></param>
        /// <param name="oAWorkFlowConfig"></param>
        private void SetApproveInfo(Doc doc, string value, OAWorkFlowConfig oAWorkFlowConfig)
        {
            doc.DescFlexField.SetValue(oAWorkFlowConfig.OAApproveResultField.Name, value);
        }
        /// <summary>
        /// 回寫單據(jù)狀態(tài)
        /// todo 功能放到接口中蛹疯,實(shí)現(xiàn)接口注冊
        /// </summary>
        /// <param name="oAApproveResult"></param>
        /// <param name="oAWorkFlowRecord"></param>
        /// <param name="doc"></param>
        /// <returns></returns>
        private void UpdateDocStatus(OAApproveResult oAApproveResult, OAWorkFlowRecord oAWorkFlowRecord, Doc doc)
        {
            if (oAWorkFlowRecord == null|| doc==null)
            {
                return;
            }
            switch (oAApproveResult.BusinessType.Value)
            {
                case 0:
                    SaleContract saleContract = doc as SaleContract;
                    if (saleContract == null)
                        return;
                    saleContract.Status = oAApproveResult.ApproveSuccess ? SCStatusEnum.Approved : SCStatusEnum.Opened;
                    saleContract.ApproveDate = DateTime.Now;
                    doc = saleContract;
                    break;
                case 1:
                    SO so = doc as SO;
                    if (so == null)
                        return;
                    so.Status = oAApproveResult.ApproveSuccess ? SODocStatusEnum.Approved : SODocStatusEnum.Open;
                    doc = so;
                    break;
                case 2:
                    Ship ship = doc as Ship;
                    if (ship == null)
                        return;
                    ship.Status = oAApproveResult.ApproveSuccess ? ShipStateEnum.Approved : ShipStateEnum.Creates;
                    ship.ApproveDate = DateTime.Now;
                    doc = ship;
                    break;
                case 3:
                    Receivement receivement = doc as Receivement;
                    if (receivement == null)
                        return;
                    receivement.Status = oAApproveResult.ApproveSuccess ? RcvStatusEnum.InStoreConfirmed : RcvStatusEnum.Opened;
                    receivement.ApprovedOn = DateTime.Now;
                    doc = receivement;
                    break;
                case 4:
                    SOModify sOModify= doc as SOModify;
                    if (sOModify == null)
                        return;
                    sOModify.Status = oAApproveResult.ApproveSuccess ? SOModifyStatusEnum.Approved : SOModifyStatusEnum.Openend;
                    sOModify.ApprovedOn = DateTime.Now;
                    doc = sOModify;
                    break;
                case 5:
                    ShipPlan shipplan = doc as ShipPlan;
                    if (shipplan == null)
                        return;
                    shipplan.Status = oAApproveResult.ApproveSuccess ? ShipPlanDocStatusEnum.Posted : ShipPlanDocStatusEnum.Open;
                    shipplan.ApproveDate = DateTime.Now;
                    doc = shipplan;
                    break;
                case 6:
                    PurchaseOrder purorder = doc as PurchaseOrder;
                    if (purorder == null)
                        return;
                    purorder.Status = oAApproveResult.ApproveSuccess ? PODOCStatusEnum.Approved : PODOCStatusEnum.Opened;
                    purorder.ApprovedOn = DateTime.Now;
                    doc = purorder;
                    break;
                case 7:
                    MRB mrb = doc as MRB;
                    if (mrb == null)
                        return;
                    mrb.MRBState = oAApproveResult.ApproveSuccess ? MRBStateEnum.Approved : MRBStateEnum.Opening;
                    mrb.ApproveDate = DateTime.Now;
                    doc = mrb;
                    break;
                case 8:
                    PR pr = doc as PR;
                    if (pr == null)
                        return;
                    pr.Status = oAApproveResult.ApproveSuccess ? PRStatusEnum.Approved : PRStatusEnum.OpenOpen;
                    pr.ApprovedOn = DateTime.Now;
                    pr.ApprovedBy = PlatformContext.Current.UserName;
                    pr.ActivityType = ActivityTypeEnum.UIUpdate;
                    foreach (PRLine line in pr.PRLineList)
                    {
                        line.Status = oAApproveResult.ApproveSuccess ? PRStatusEnum.Approved : PRStatusEnum.OpenOpen;
                        line.ApprovedOn = DateTime.Now;
                        line.ApprovedBy = PlatformContext.Current.UserName;
                        line.ActivityType = ActivityTypeEnum.UIUpdate;
                    }
                    doc = pr;
                    break;
                case 9:
                    ConfirmReqFundHead crfh = doc as ConfirmReqFundHead;
                    if (crfh == null)
                        return;
                    crfh.DocStatus = oAApproveResult.ApproveSuccess ? ReqConfirmDocStatusEnum.BizClose : ReqConfirmDocStatusEnum.Opened;
                    crfh.ApprovedOn = DateTime.Now;
                    doc = crfh;
                    break;
                case 10:
                    ARBillHead arbh = doc as ARBillHead;
                    if (arbh == null)
                        return;
                    arbh.DocStatus = oAApproveResult.ApproveSuccess ? BillStatusEnum.Approved : BillStatusEnum.Opened;
                    arbh.ApprovedOn = DateTime.Now;
                    doc = arbh;
                    break;
                case 11:
                    PayReqFundHead prfh = doc as PayReqFundHead;
                    if (prfh == null)
                        return;
                    prfh.DocStatus = oAApproveResult.ApproveSuccess ? InDirectHandleBillDocStatusEnum.Approved : InDirectHandleBillDocStatusEnum.Open;
                    prfh.ApprovedOn = DateTime.Now;
                    doc = prfh;
                    break;
                case 12:
                    MiscShipment miscship = doc as MiscShipment;
                    if (miscship == null)
                        return;
                    miscship.Status = oAApproveResult.ApproveSuccess ? INVDocStatus.Approved : INVDocStatus.Open;
                    miscship.CurrAction = ActivityEnum.UIUpdate;
                    miscship.ApprovedOn = DateTime.Now;
                    miscship.ApprovedBy = Context.LoginUser;
                    doc = miscship;
                    break;
                case 13:
                    PurPriceAdjustment purPriceAdjustment = doc as PurPriceAdjustment;
                    if (purPriceAdjustment == null)
                        return;
                    purPriceAdjustment.Status = oAApproveResult.ApproveSuccess ? PPR.Enums.Status.Approved : UFIDA.U9.PPR.Enums.Status.Opened;
                    purPriceAdjustment.ApprovedOn = DateTime.Now;
                    doc = purPriceAdjustment;
                    break;
            }
        }
        /// <summary>
        /// 回滾單據(jù)原來狀態(tài)
        /// </summary>
        /// <param name="doc"></param>
        private void RollbackDocStatus(Doc doc)
        {
            if (doc==null)
            {
                return;
            }
            if(doc is PR)
            {
                PR pr = (PR)doc;
                pr.Status = pr.OriginalData.Status;
                pr.ActivityType = pr.OriginalData.ActivityType;
                foreach (PRLine line in pr.PRLineList)
                {
                    line.Status = pr.OriginalData.Status;
                    line.ActivityType = pr.OriginalData.ActivityType;
                }
            }else if (doc is ConfirmReqFundHead|| doc is ARBillHead||
                doc is PayReqFundHead)
            {
                if (doc.MDEntity.GetHashFlatAttrsMap().Keys.Contains("DocStatus"))
                {
                    doc.SetValue("DocStatus", doc.OriginalData.GetValue("DocStatus"));
                }
            }
            else
            {
                if (doc.MDEntity.GetHashFlatAttrsMap().Keys.Contains("Status"))
                {
                    doc.SetValue("Status", doc.OriginalData.GetValue("Status"));
                }
            }
        }
        /// <summary>
        /// 查詢未同步的審批記錄列表
        /// </summary>
        /// <returns></returns>
        private EntityList<OAApproveResult> QueryOAApproveResults()
        {
            return OAApproveResult.Finder.FindAll("IsSync=@IsSync", new OqlParam[] { new OqlParam("IsSync", false) });
        }
        /// <summary>
        /// 查詢U9審批結(jié)果存放字段名
        /// </summary>
        /// <param name="fullName"></param>
        /// <returns></returns>
        private string QueryOAApproveResultField(string fullName)
        {
            OAWorkFlowConfig oAWorkFlowConfig = OAWorkFlowConfig.Finder.Find("EntityType.FullName='" + fullName + "'");
            if (oAWorkFlowConfig == null)
            {
                return null;
            }
            return oAWorkFlowConfig.OAApproveResultField.Name;
        }
        private OAWorkFlowRecord QueryOAWorkFlowRecord(Int32 OARequestID)
        {
            return OAWorkFlowRecord.Finder.Find("OARequestID=@OARequestID", new OqlParam("OARequestID", OARequestID));
        }
        private OAWorkFlowConfig QueryOAWorkFlowConfig(OAWorkFlowRecord oAWorkFlowRecord)
        {
            if (oAWorkFlowRecord == null)
            {
                return null;
            }
            OAWorkFlowConfig oAWorkFlowConfig = OAWorkFlowConfig.Finder.Find("OAWorkFlowId=@OAWorkFlowId",new OqlParam("OAWorkFlowId", oAWorkFlowRecord.WorkflowID));
            return oAWorkFlowConfig;
        }
        private Doc QueryDoc(string entityFullName,long ID)
        {
            EntityFinder finder = new EntityFinder(entityFullName);
            return (Doc)finder.FindByID(ID);
        }
    }
    #endregion
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市热监,隨后出現(xiàn)的幾起案子捺弦,更是在濱河造成了極大的恐慌,老刑警劉巖孝扛,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件列吼,死亡現(xiàn)場離奇詭異,居然都是意外死亡苦始,警方通過查閱死者的電腦和手機(jī)寞钥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盈简,“玉大人凑耻,你說我怎么就攤上這事太示。” “怎么了香浩?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵类缤,是天一觀的道長。 經(jīng)常有香客問我邻吭,道長餐弱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任囱晴,我火速辦了婚禮膏蚓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘畸写。我一直安慰自己驮瞧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布枯芬。 她就那樣靜靜地躺著论笔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪千所。 梳的紋絲不亂的頭發(fā)上狂魔,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音淫痰,去河邊找鬼最楷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛待错,可吹牛的內(nèi)容都是我干的籽孙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼朗鸠,長吁一口氣:“原來是場噩夢啊……” “哼蚯撩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起烛占,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤胎挎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后忆家,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犹菇,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年芽卿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揭芍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卸例,死狀恐怖称杨,靈堂內(nèi)的尸體忽然破棺而出肌毅,到底是詐尸還是另有隱情,我是刑警寧澤姑原,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布悬而,位于F島的核電站,受9級(jí)特大地震影響锭汛,放射性物質(zhì)發(fā)生泄漏笨奠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一唤殴、第九天 我趴在偏房一處隱蔽的房頂上張望般婆。 院中可真熱鬧,春花似錦朵逝、人聲如沸蔚袍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽页响。三九已至篓足,卻和暖如春段誊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背栈拖。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工连舍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涩哟。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓索赏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贴彼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子潜腻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 首先介紹下自己的背景: 我11年左右入市到現(xiàn)在,也差不多有4年時(shí)間,看過一些關(guān)于股票投資的書籍伪货,對(duì)于巴菲特等股神的...
    瞎投資閱讀 5,727評(píng)論 3 8
  • ![Flask](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAW...
    極客學(xué)院Wiki閱讀 7,247評(píng)論 0 3
  • 不知不覺易趣客已經(jīng)在路上走了快一年了轨香,感覺也該讓更多朋友認(rèn)識(shí)知道易趣客忽你,所以就謝了這篇簡介,已做創(chuàng)業(yè)記事臂容。 易趣客...
    Physher閱讀 3,418評(píng)論 1 2
  • 雙胎妊娠有家族遺傳傾向科雳,隨母系遺傳根蟹。有研究表明,如果孕婦本人是雙胎之一糟秘,她生雙胎的機(jī)率為1/58娜亿;若孕婦的父親或母...
    鄴水芙蓉hibiscus閱讀 3,701評(píng)論 0 2