コード例 #1
0
        /// <summary>
        /// 格式化过虑条件,针对MC字段特殊处理
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public string BuilderFilter(string tableName, string filter)
        {
            if (string.IsNullOrWhiteSpace(filter))
            {
                return("");
            }
            StringBuilder           sqlBuilder = new StringBuilder();
            IEnumerable <FapColumn> cols       = _dbContext.Columns(tableName);

            if (filter.IsPresent())
            {
                JObject jsono = JObject.Parse(filter);
                if (jsono == null)
                {
                    return("");
                }
                string parentGroup = jsono.GetValue("groupOp").ToString();//AND、OR

                List <JObject> root = new List <JObject>();
                root.Add(jsono);
                RecurseFilter(parentGroup, tableName, root, cols, sqlBuilder);
            }

            string result = sqlBuilder.ToString();

            result = result.Trim().TrimEnd("AND".ToArray()).TrimEnd("OR".ToArray());
            return(result);
        }
コード例 #2
0
ファイル: FormModelBinder.cs プロジェクト: egman77/FapCore3.0
        private (FapDynamicObject mainData, Dictionary <string, IEnumerable <FapDynamicObject> > childsData) BuilderData(string tableName, FormValueProvider formValueProviders)
        {
            var columnList = _dbContext.Columns(tableName);
            var mainDic    = formValueProviders.GetKeysFromPrefix("mainData");
            FapDynamicObject mainObject = new FapDynamicObject(columnList);

            foreach (var cell in mainDic)
            {
                mainObject.SetValue(cell.Key, formValueProviders.GetValue(cell.Value).FirstValue);
            }
            var childDicList = formValueProviders.GetKeysFromPrefix("childDataList");
            Dictionary <string, IEnumerable <FapDynamicObject> > childDataDic = null;

            childDataDic = new Dictionary <string, IEnumerable <FapDynamicObject> >();
            foreach (var row in childDicList)
            {
                IList <FapDynamicObject> list = new List <FapDynamicObject>();
                var tables = formValueProviders.GetKeysFromPrefix(row.Value);

                string tn      = formValueProviders.GetValue(tables["tn"]).FirstValue;
                var    dicData = formValueProviders.GetKeysFromPrefix(tables["data"]);
                foreach (var data in dicData)
                {
                    FapDynamicObject cData = new FapDynamicObject(_dbContext.Columns(tn));
                    foreach (var dataDic in formValueProviders.GetKeysFromPrefix(data.Value))
                    {
                        cData.SetValue(dataDic.Key, formValueProviders.GetValue(dataDic.Value).FirstValue);
                    }
                    list.Add(cData);
                }
                childDataDic.TryAdd(tn, list);
            }
            return(mainObject, childDataDic);
        }
コード例 #3
0
        public bool DeleteDynamicLogic()
        {
            var     emp  = _dbContext.Get("FapUser", 31);
            dynamic empd = new FapDynamicObject(_dbContext.Columns("FapUser"));

            empd.Id = emp.Id;
            empd.Ts = emp.Ts;
            return(_dbContext.DeleteDynamicData(empd));
        }
コード例 #4
0
ファイル: PayrollService.cs プロジェクト: zeroyou/FapCore3.0
        public void AddPayItem(string caseUid, string[] payItems)
        {
            if (payItems == null || payItems.Length < 1 || caseUid.IsMissing())
            {
                return;
            }
            DynamicParameters param = new DynamicParameters();

            param.Add("CaseUid", caseUid);
            var payCase = _dbContext.Get <PayCase>(caseUid);

            if (payCase.Unchanged == 1)
            {
                throw new FapException("已经存在发放记录,不能再调整薪资项");
            }
            var             items = _dbContext.Columns(PAYROLLCENTER).Where(f => f.ColProperty.EqualsWithIgnoreCase("3") || payItems.Contains(f.Fid));
            IList <PayItem> list  = new List <PayItem>();

            foreach (var item in items)
            {
                list.Add(new PayItem {
                    CaseUid = caseUid, ColumnUid = item.Fid, ItemSort = item.ColOrder, ShowAble = 1, ShowCard = 0, TransEnable = 0
                });
            }
            _dbContext.DeleteExec(nameof(PayItem), "CaseUid=@CaseUid", param);
            _dbContext.InsertBatchSql <PayItem>(list);
        }
コード例 #5
0
        public void InsertDynamic()
        {
            dynamic emp = new FapDynamicObject(_dbContext.Columns("FapUser"));

            emp.UserName     = "******";
            emp.UserCode     = "jeke zhang";
            emp.UserEmail    = "*****@*****.**";
            emp.UserPassword = "******";
            long id = _dbContext.InsertDynamicData(emp);

            Assert.Equal(id, emp.Id);
        }
コード例 #6
0
        public static string ParsingFormulaMappingSql(IEnumerable <CfgEntityMapping> entityMappingList, string tableName, string colName, string sqlDesc, IDbContext dbContext)
        {
            sqlDesc = sqlDesc.ReplaceIgnoreCase("[引用]", "").TrimStart('(').TrimEnd(')');
            string aimsTable     = sqlDesc.Substring(0, sqlDesc.IndexOf("["));
            string field         = sqlDesc.Substring(sqlDesc.IndexOf("[") + 1).TrimEnd(']');
            var    entityMapping = entityMappingList.FirstOrDefault(m => m.AimsEntityMC == aimsTable);

            if (entityMapping != null)
            {
                var fieldCol = dbContext.Columns(entityMapping.AimsEntity).FirstOrDefault(c => c.ColComment == field);
                IEnumerable <Associate> associates = JsonConvert.DeserializeObject <IEnumerable <Associate> >(entityMapping.Associate);
                List <string> where = new List <string>();
                foreach (var associate in associates)
                {
                    where.Add($"{tableName}.{associate.OriCol}={entityMapping.AimsEntity}.{associate.AimsCol}");
                }
                string innerJoin = $" inner join  {entityMapping.AimsEntity} on {string.Join(" and ", where)}";
                if (dbContext.DatabaseDialect == DatabaseDialectEnum.MSSQL)
                {
                    return($"update {tableName} set {tableName}.{colName}={entityMapping.AimsEntity}.{fieldCol.ColName} from {tableName} {innerJoin} and {ValidWhere(entityMapping.AimsEntity)}");
                }
                else if (dbContext.DatabaseDialect == DatabaseDialectEnum.MYSQL)
                {
                    return($"update {tableName} {innerJoin} and {ValidWhere(entityMapping.AimsEntity)} set {tableName}.{colName}={entityMapping.AimsEntity}.{fieldCol.ColName}");
                }
                return(string.Empty);
            }
            return(string.Empty);
        }
コード例 #7
0
        public string JobGroupOperation(string operation, string id, string parent, string text)
        {
            string result = "0";

            if (operation == TreeNodeOper.DELETE_NODE)
            {
                int c = _dbContext.Count("FapJob", "JobGroup=@JobGroup", new DynamicParameters(new { JobGroup = id }));
                if (c == 0)
                {
                    result = "" + _dbContext.Execute("delete from FapJobGroup where Fid=@Fid", new DynamicParameters(new { Fid = id }));
                }
            }
            else if (operation == TreeNodeOper.CREATE_NODE)
            {
                dynamic fdo = new FapDynamicObject(_dbContext.Columns("FapJobGroup"));
                fdo.Pid          = id;
                fdo.JobGroupName = text;
                long rv = _dbContext.InsertDynamicData(fdo);
                result = fdo.Fid;
            }
            else if (operation == TreeNodeOper.RENAME_NODE)
            {
                result = "" + _dbContext.Execute("update FapJobGroup set JobGroupName=@JobGroupName where Fid=@Id", new DynamicParameters(new { JobGroupName = text, Id = id }));
            }
            else if (operation == TreeNodeOper.MOVE_NODE)
            {
                result = "" + _dbContext.Execute("update FapJobGroup set Pid=@Pid where Id=@Id", new DynamicParameters(new { Pid = parent, Id = id }));
            }
            else if (operation == "copy_node")
            {
            }

            return(result);
        }
コード例 #8
0
        public IEnumerable <FapColumn> GetMultiLanguageColumns(string tableName)
        {
            var fapColumns = _dbContext.Columns(tableName);

            foreach (var column in fapColumns)
            {
                column.ColComment = GetMultiLangValue(MultiLanguageOriginEnum.FapColumn, $"{column.TableName}_{column.ColName}");
            }
            return(fapColumns);
        }
コード例 #9
0
        public PageDataResultView QueryPageDataResultView(JqGridPostData jqGridPostData)
        {
            Pageable pageable = AnalysisPostData(jqGridPostData);
            //queryOption.Where = AnalysisWhere(queryOption.Where);
            PageDataResultView result = QueryPagedDynamicData();

            return(result);

            PageDataResultView QueryPagedDynamicData()
            {
                try
                {
                    IEnumerable <FapColumn> fapColumns = _dbContext.Columns(jqGridPostData.QuerySet.TableName);
                    PageInfo <dynamic>      pi         = _dbContext.QueryPage(pageable);

                    //组装成DataResultView对象
                    PageDataResultView dataResultView = new PageDataResultView();
                    dataResultView.Data = pi.Items.ToFapDynamicObjectList(fapColumns);
                    //当未获取数据的时候才获取默认值
                    //if (!dataObject.Data.Any())
                    //{
                    //wyf表单应用,表格暂时不用取默认值
                    //dataResultView.DefaultData = queryOption.Wraper.GetDefaultData();
                    //}
                    dataResultView.DataJson          = JsonConvert.SerializeObject(pi.Items);
                    dataResultView.TotalCount        = pi.TotalCount;
                    dataResultView.CurrentPage       = pi.CurrentPage;
                    dataResultView.OrginData         = pi.Items;
                    dataResultView.DataListForJqGrid = pi.Items;// as IEnumerable<IDictionary<string, object>>;
                    dataResultView.PageSize          = pi.PageSize;
                    //统计字段
                    dataResultView.StatFieldData     = pi.StatFieldData;
                    dataResultView.StatFieldDataJson = JsonConvert.SerializeObject(pi.StatFieldData);

                    return(dataResultView);
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }
コード例 #10
0
ファイル: TimeService.cs プロジェクト: zeroyou/FapCore3.0
        public void AnnualLeaveInit(string year, string startDate, string endDate)
        {
            DynamicParameters param = new DynamicParameters();

            param.Add("Year", year);
            param.Add("StartDate", startDate);
            param.Add("EndDate", endDate);
            int isExist = _dbContext.Count(nameof(TmAnnualLeave), $"{nameof(TmAnnualLeave.Annual)}=@Year", param);

            if (isExist > 0)
            {
                Guard.Against.FapBusiness("已存在该年度年假,不能再生成!");
            }
            //查找年假规则
            var rules = _dbContext.QueryAll <TmAnnualLeaveRule>();

            if (!rules.Any())
            {
                Guard.Against.FapBusiness("没有找到年假生成规则,请在菜单[基础设置-年假规则]中设置年假规则");
            }
            var cols = _dbContext.Columns("Employee");
            IList <TmAnnualLeave> annualLeaveList = new List <TmAnnualLeave>();

            foreach (var rule in rules)
            {
                if (rule.EmpConditionDesc.IsMissing())
                {
                    continue;
                }
                string sql  = $"select {rule.Days} Days,Fid,DeptUid from Employee where {SqlUtils.ParsingSql(cols, rule.EmpConditionDesc, _dbContext.DatabaseDialect)}";
                var    emps = _dbContext.Query(sql);
                foreach (var emp in emps)
                {
                    TmAnnualLeave annualLeave = new TmAnnualLeave()
                    {
                        Annual       = year,
                        EmpUid       = emp.Fid,
                        DeptUid      = emp.DeptUid,
                        StartDate    = startDate,
                        EndDate      = endDate,
                        CurrYearNum  = emp.Days,
                        LastYearLeft = 0,
                        CurrRealNum  = emp.Days,
                        UsedNum      = 0,
                        RemainderNum = emp.Days,
                        IsHandle     = 0
                    };
                    annualLeaveList.Add(annualLeave);
                }
            }
            _dbContext.InsertBatchSql(annualLeaveList);
        }
コード例 #11
0
        public BaseForm SetQueryOption(QuerySet querySet)
        {
            _fapTable = _dbContext.Table(querySet.TableName);
            DynamicParameters parameters = new DynamicParameters();

            querySet.Parameters.ForEach(q => parameters.Add(q.ParamKey, q.ParamValue));
            var frmData = _dbContext.QueryFirstOrDefault(querySet.ToString(), parameters, true);

            _fapColumns = _dbContext.Columns(querySet.TableName);
            if (!querySet.QueryCols.EqualsWithIgnoreCase("*"))
            {
                var queryColList = querySet.QueryCols.ToLower().SplitComma();
                _fapColumns = _dbContext.Columns(querySet.TableName).Where(c => queryColList.Contains(c.ColName.ToLower()));
            }
            if (frmData != null)
            {
                FormData = (frmData as IDictionary <string, object>).ToFapDynamicObject(_fapColumns);
                if (_formStatus != FormStatus.View)
                {
                    _formStatus = FormStatus.Edit;
                }
            }
            else
            {
                FormData    = _dbContext.GetDefualtData(querySet.TableName);
                _formStatus = FormStatus.Add;
            }
            if (_fapTable.TableFeature != null && _fapTable.TableFeature.Contains("BillFeature"))
            {
                IsDocument = true;
            }
            FidValue = FormData.Get("Fid").ToString();
            if (_fapColumns.Any())
            {
                SetFapClumns(querySet);
            }
            return(this);
        }
コード例 #12
0
ファイル: ProcessModel.cs プロジェクト: zeroyou/FapCore3.0
        private bool CheckTansitionCondition(ProcessEntity processEntity, string condition)
        {
            dynamic bizData = processEntity.BizData;
            IDictionary <string, object> data = bizData as IDictionary <string, object>;

            string sql = SqlUtils.ParsingConditionSql(_dataAccessor.Columns(processEntity.BillTable), data, condition, _dataAccessor.DatabaseDialect);

            var o = _dataAccessor.QueryOriSql(sql);

            if (o.Any())
            {
                return(true);
            }
            return(false);
        }
コード例 #13
0
        public XEditableForm SetQueryOption(QuerySet qs)
        {
            TableName = qs.TableName;
            DynamicParameters parameters = new DynamicParameters();

            qs.Parameters.ForEach(q => parameters.Add(q.ParamKey, q.ParamValue));
            FormData = _dbContext.QueryFirstOrDefault(qs.ToString(), parameters);

            _pkValue = FormData.Get("Fid");
            var queryColList = qs.QueryCols.Split(',');
            IEnumerable <FapColumn> fapColumns = _dbContext.Columns(qs.TableName).Where(c => queryColList.Contains(c.ColName));

            if (fapColumns.Any())
            {
                SetFapClumns(fapColumns);
            }
            return(this);
        }
コード例 #14
0
        public IEnumerable <FapColumn> GetMultiLanguageColumns(string tableName)
        {
            var fapColumns = _dbContext.Columns(tableName);

            foreach (var column in fapColumns)
            {
                string label = GetMultiLangValue(MultiLanguageOriginEnum.FapColumn, $"{column.TableName}_{column.ColName}");
                if (label.IsPresent())
                {
                    column.ColComment = label;
                }
                else
                {
                    column.ColComment = column.ColComment;
                }
            }
            return(fapColumns);
        }
コード例 #15
0
ファイル: MessageManager.cs プロジェクト: zeroyou/FapCore3.0
        /// <summary>
        /// 根据邮件模板生成邮件内容
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        private string BuildeMessageContent(WfProcessInstance processInstance, string content)
        {
            if (content.Contains("${业务名称}"))
            {
                content = content.Replace("${业务名称}", processInstance.ProcessName);
            }

            if (content.Contains("${业务申请人}"))
            {
                content = content.Replace("${业务申请人}", processInstance.AppEmpName);
            }

            if (content.Contains("${业务申请时间}"))
            {
                content = content.Replace("${业务申请时间}", processInstance.StartTime);
            }

            dynamic bizData = _dataAccessor.Get(processInstance.BillTable, processInstance.BillUid, true);
            if (bizData == null)
            {
                return content;
            }

            IDictionary<string, object> dicBizData = bizData as IDictionary<string, object>;
            var bizCols = _dataAccessor.Columns(processInstance.BillTable);
            Regex regex = new Regex(FapPlatformConstants.VariablePattern, RegexOptions.IgnoreCase);
            var mat = regex.Matches(content);
            foreach (Match item in mat)
            {
                string fieldName = item.ToString().Substring(2, item.ToString().Length - 3);
                var col = bizCols.FirstOrDefault(c => c.ColComment == fieldName);
                if (col == null)
                    continue;
                if (col.RefTable.IsPresent())
                {
                    content = content.Replace(item.ToString(), dicBizData[col.ColName + "MC"].ToStringOrEmpty());
                }
                else
                {
                    content = content.Replace(item.ToString(), dicBizData[col.ColName].ToStringOrEmpty());
                }
            }
            return content;
        }
コード例 #16
0
ファイル: GridModelBinder.cs プロジェクト: zeroyou/FapCore3.0
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            if (bindingContext == null)
            {
                throw new ArgumentNullException(nameof(bindingContext));
            }

            // Try to fetch the value of the argument by name
            var valueProviderResult =
                bindingContext.ValueProvider.GetValue("tableName");

            if (valueProviderResult == ValueProviderResult.None)
            {
                return(Task.CompletedTask);
            }
            IEnumerable <IValueProvider> valueProviders = bindingContext.ValueProvider as IEnumerable <IValueProvider>;

            var formValueProviders = valueProviders.OfType <FormValueProvider>();

            if (formValueProviders == null)
            {
                return(Task.CompletedTask);
            }
            bindingContext.ModelState.SetModelValue("TableName",
                                                    valueProviderResult);

            var value = valueProviderResult.FirstValue;

            // Check if the argument value is null or empty
            if (string.IsNullOrEmpty(value))
            {
                return(Task.CompletedTask);
            }

            GridModel model = new GridModel();

            model.TableName = value;
            IEnumerable <FapDynamicObject> RowList = new List <FapDynamicObject>();
            var formValueProvider = formValueProviders.First();

            model.Rows            = GetRows(formValueProvider, _dbContext.Columns(value));
            bindingContext.Result = ModelBindingResult.Success(model);
            return(Task.CompletedTask);
        }
コード例 #17
0
ファイル: GridFormService.cs プロジェクト: zeroyou/FapCore3.0
        public PageDataResultView QueryPageDataResultView(JqGridPostData jqGridPostData)
        {
            Pageable pageable = AnalysisPostData(jqGridPostData);
            //queryOption.Where = AnalysisWhere(queryOption.Where);
            PageDataResultView result = QueryPagedDynamicData();

            return(result);

            PageDataResultView QueryPagedDynamicData()
            {
                try
                {
                    IEnumerable <FapColumn> fapColumns = _dbContext.Columns(jqGridPostData.QuerySet.TableName);
                    PageInfo <dynamic>      pi         = _dbContext.QueryPage(pageable);

                    //组装成DataResultView对象
                    PageDataResultView dataResultView = new PageDataResultView();
                    dataResultView.Data = pi.Items.ToFapDynamicObjectList(fapColumns);

                    dataResultView.DataJson          = JsonConvert.SerializeObject(pi.Items);
                    dataResultView.TotalCount        = pi.TotalCount;
                    dataResultView.CurrentPage       = pi.CurrentPage;
                    dataResultView.OrginData         = pi.Items;
                    dataResultView.DataListForJqGrid = pi.Items;//暂不启用加密设置 GetEncryptData(jqGridPostData.QuerySet.TableName, pi.Items as IEnumerable<IDictionary<string, object>>);
                    dataResultView.PageSize          = pi.PageSize;
                    //统计字段
                    dataResultView.StatFieldData     = pi.StatFieldData;
                    dataResultView.StatFieldDataJson = JsonConvert.SerializeObject(pi.StatFieldData);

                    return(dataResultView);
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }
コード例 #18
0
        public void UseInsPending(InsToDo insToDo)
        {
            //保险组
            InsCase insCase = _dbContext.Get <InsCase>(insToDo.CaseUid);
            //员工
            Employee employee = _dbContext.Get <Employee>(insToDo.EmpUid);
            //检查员工是否在保险组
            var caseEmployee = _dbContext.QueryFirstOrDefault($"select * from {insCase.TableName} where EmpUid=@EmpUid", new DynamicParameters(new { EmpUid = employee.Fid }));

            if (caseEmployee != null)
            {
                if (employee.EmpStatus == EmployeeStatus.Former)
                {
                    DeleteEmployeeFromInsCase();
                }
                else
                {
                    UpdateEmployeeToInsCase();
                }
            }
            else if (employee.EmpStatus == EmployeeStatus.Current)
            {
                AddEmployeeToInsCase();
            }
            MarkInsTodo();
            void MarkInsTodo()
            {
                insToDo.OperDate   = DateTimeUtils.CurrentDateTimeStr;
                insToDo.OperEmpUid = _applicationContext.EmpUid;
                insToDo.OperFlag   = "1";
                _dbContext.Update(insToDo);
            }

            void DeleteEmployeeFromInsCase()
            {
                string sql = $"delete from {insCase.TableName} where Fid=@Fid";

                _dbContext.ExecuteOriginal(sql, new DynamicParameters(new { Fid = caseEmployee.Fid }));
            }

            void UpdateEmployeeToInsCase()
            {
                string sql = $"update {insCase.TableName} set EmpCode='{employee.EmpCode}',EmpCategory='{employee.EmpCategory}',DeptUid='{employee.DeptUid}' where Fid=@Fid";

                _dbContext.ExecuteOriginal(sql, new DynamicParameters(new { Fid = caseEmployee.Fid }));
            }

            void AddEmployeeToInsCase()
            {
                FapDynamicObject caseEmp = new FapDynamicObject(_dbContext.Columns(insCase.TableName));

                //将此人的放入薪资套
                caseEmp.SetValue("EmpUid", employee.Fid);
                caseEmp.SetValue("EmpCode", employee.EmpCode);
                caseEmp.SetValue("EmpCategory", employee.EmpCategory);
                caseEmp.SetValue("DeptUid", employee.DeptUid);
                caseEmp.SetValue("InsCaseUid", insCase.Fid);
                caseEmp.SetValue("InsmentTimes", 1);
                caseEmp.SetValue("InsConfirm", 0);

                if (insCase.InsYM.IsPresent())
                {
                    caseEmp.SetValue("InsYM", insCase.InsYM);
                }
                else
                {
                    caseEmp.SetValue("InsYM", insCase.InitYM);
                }
                _dbContext.InsertDynamicData(caseEmp);
            }
        }
コード例 #19
0
        /// <summary>
        /// 根据配置,执行单据回写业务表
        /// </summary>
        /// <param name="tableName">单据表</param>
        /// <param name="fid">单据数据Fid</param>
        public void WriteBackToBusiness(string tableName, string fid)
        {
            //单据实体
            IDictionary <string, object> billData = _dbContext.Get(tableName, fid, true) as IDictionary <string, object>;
            //业务实体 只有设置了映射才会有
            FapDynamicObject             fapBizData = null;
            IDictionary <string, object> dicBizData = null;
            string bizTableName = string.Empty;

            billData.TryGetValue("EffectiveTime", out object effectiveTime);
            if (effectiveTime != null && effectiveTime.ToString().IsPresent())
            {
                DateTime effTime;
                if (DateTime.TryParse(effectiveTime.ToString(), out effTime))
                {
                    //生效时间大于当前时间
                    if (effTime > DateTime.Now)
                    {
                        return;
                    }
                }
            }
            if (billData.ContainsKey("EffectiveState"))
            {
                //设置生效状态
                billData["EffectiveState"] = 1;
            }
            var fapBillData = billData.ToFapDynamicObject(_dbContext.Columns(tableName));

            if (billData.ContainsKey("EffectiveState"))
            {
                _dbContext.UpdateDynamicData(fapBillData);
            }
            DynamicParameters param = new DynamicParameters();

            param.Add("TableName", tableName);
            IEnumerable <CfgBillWriteBackRule> rules = _dbContext.QueryWhere <CfgBillWriteBackRule>("DocEntityUid=@TableName", param);

            if (rules != null && rules.Any())
            {
                foreach (var rule in rules)
                {
                    bizTableName = rule.BizEntityUid;
                    //获取单据实体数据
                    //没有关联字段,就是新增
                    if (rule.Association.IsMissing() && rule.FieldMapping.IsPresent())
                    {
                        //获取mapping
                        JArray mappings = JArray.Parse(rule.FieldMapping);
                        if (mappings != null && mappings.Any())
                        {
                            FapDynamicObject fdo = new FapDynamicObject(_dbContext.Columns(bizTableName));

                            foreach (JObject map in mappings)
                            {
                                //id存放字段的映射,billtablename.colname,biztablename.colname
                                string   id      = map.GetValue("id").ToString();
                                string[] arryMap = id.Split(',');
                                string   billCol = arryMap[0].Split('.')[1];

                                string bizCol = arryMap[1].Split('.')[1];
                                billData.TryGetValue(billCol, out object bo);
                                fdo.SetValue(bizCol, bo ?? "");
                            }
                            //insert
                            _dbContext.InsertDynamicData(fdo);
                            //提醒到工资保险
                            NotifyPayroll(rule, fapBillData, fdo);
                            NotifyInsurance(rule, fapBillData, fdo);
                        }
                    }
                    else
                    {
                        //更新
                        string association = rule.Association;
                        //获取关联字段值,这个是更新业务表的条件
                        billData.TryGetValue(association, out object fidValue);
                        if (fidValue != null && rule.FieldMapping.IsPresent())
                        {
                            JArray mappings = JArray.Parse(rule.FieldMapping);
                            if (mappings != null && mappings.Any())
                            {
                                //根据关联值获取业务值
                                dicBizData = _dbContext.Get(bizTableName, fidValue.ToString()) as IDictionary <string, object>;
                                if (dicBizData != null)
                                {
                                    fapBizData = dicBizData.ToFapDynamicObject(_dbContext.Columns(bizTableName));
                                    //更新业务对象
                                    foreach (JObject map in mappings)
                                    {
                                        //id存放字段的映射,billtablename.colname,biztablename.colname
                                        string   id      = map.GetValue("id").ToString();
                                        string[] arryMap = id.Split(',');
                                        string   billCol = arryMap[0].Split('.')[1];

                                        string bizCol = arryMap[1].Split('.')[1];
                                        billData.TryGetValue(billCol, out object bo);
                                        fapBizData.SetValue(bizCol, bo ?? "");
                                    }
                                    //bizData.TableName = bizTableName;
                                    //update
                                    _dbContext.UpdateDynamicData(fapBizData);
                                    //提醒到工资保险
                                    NotifyPayroll(rule, fapBillData, fapBizData);
                                    NotifyInsurance(rule, fapBillData, fapBizData);
                                }
                                else
                                {
                                    //新增业务对象
                                    FapDynamicObject fdo = new FapDynamicObject(_dbContext.Columns(bizTableName));

                                    foreach (JObject map in mappings)
                                    {
                                        //id存放字段的映射,billtablename.colname,biztablename.colname
                                        string   id      = map.GetValue("id").ToString();
                                        string[] arryMap = id.Split(',');
                                        string   billCol = arryMap[0].Split('.')[1];

                                        string bizCol = arryMap[1].Split('.')[1];
                                        billData.TryGetValue(billCol, out object bo);
                                        fdo.SetValue(bizCol, bo ?? "");
                                    }
                                    fdo.SetValue(FapDbConstants.FAPCOLUMN_FIELD_Fid, UUIDUtils.Fid);

                                    //insert
                                    _dbContext.InsertDynamicData(fdo);
                                    dicBizData = _dbContext.Get(bizTableName, fdo.Get(FapDbConstants.FAPCOLUMN_FIELD_Fid).ToString()) as IDictionary <string, object>;
                                    fapBizData = billData.ToFapDynamicObject(_dbContext.Columns(bizTableName));
                                    //提醒到工资保险
                                    NotifyPayroll(rule, fapBillData, fapBizData);
                                    NotifyInsurance(rule, fapBillData, fapBizData);
                                }
                            }
                        }
                    }
                    //执行自定义update sql
                    if (rule.CustomSql.IsPresent())
                    {
                        string sql = GetFillSql(rule.CustomSql, billData, dicBizData, tableName, bizTableName);

                        _dbContext.Execute(sql);
                    }

                    //回调类
                    if (rule.CallBackClass.IsPresent())
                    {
                        try
                        {
                            Type type = System.Type.GetType(rule.CallBackClass);
                            if (type != null && type.GetInterface("IBillWritebackService") != null)
                            {
                                IBillWritebackService wb = (IBillWritebackService)ActivatorUtilities.GetServiceOrCreateInstance(_serviceProvider, type);
                                wb.Exec(fapBillData, fapBizData);
                            }
                        }
                        catch (Exception ex)
                        {
                            _logger.LogError(ex.Message);
                        }
                    }
                }
            }
        }