Example #1
0
        /// <summary>
        /// 类型,1-公告,2-订单新审批,3-供应商新订单
        /// </summary>
        /// <param name="type"></param>
        /// <param name="UID"></param>
        /// <param name="ids">mainIds</param>
        public static void Add(short type, string UID, List <int> ids)
        {
            if (type == 3)
            {
                if (!SupplierService.IsExist(o => o.Id == UID))
                {
                    throw new Pharos.Logic.ApiData.Mobile.Exceptions.MessageException("供应商编号不存在!");
                }
            }
            var list = BaseService <Reader> .FindList(o => o.Type == type && ids.Contains(o.MainId));

            var readers = new List <Reader>();

            ids.ForEach(id =>
            {
                if (!list.Any(i => i.MainId == id && i.ReadCode == UID))
                {
                    readers.Add(new Reader()
                    {
                        MainId = id, ReadCode = UID, Type = type
                    });
                }
            });
            if (readers.Any())
            {
                BaseService <Reader> .AddRange(readers);
            }
        }
Example #2
0
        /// <summary>
        /// 后台换货
        /// </summary>
        /// <param name="reason">换货理由(字典值)</param>
        /// <param name="retprice">顾客补价</param>
        /// <param name="returnDetailsStr">换货明细JSON字符串</param>
        /// <param name="insertnewed"></param>
        /// <param name="payno">销售单流水号</param>
        /// <returns>OpResult</returns>
        public static OpResult SaveHuang(int reason, decimal?retprice, string returnDetailsStr, string payno)
        {
            var op   = OpResult.Fail();
            var olds = returnDetailsStr.ToObject <List <TuiHuan> >();

            if (!olds.Any())
            {
                op.Message = "换货商品信息不能为空";
            }
            else
            {
                payno = CommonRules.PaySN;
                var saleObj = new SaleOrders()
                {
                    ApiCode           = "11",
                    MachineSN         = "-1",
                    CreateDT          = DateTime.Now,
                    CreateUID         = Sys.CurrentUser.UID,
                    PaySN             = payno,
                    TotalAmount       = retprice.GetValueOrDefault(),
                    Receive           = retprice.GetValueOrDefault(),
                    PreferentialPrice = 0,
                    StoreId           = Sys.CurrentUser.StoreId,
                    Type      = 1,
                    Reason    = reason,
                    CompanyId = CommonService.CompanyId,
                    Memo      = "后台换货新单"
                };
                var newSaleDetails = new List <SaleDetail>();
                olds.Each(o =>
                {
                    newSaleDetails.Add(new SaleDetail()
                    {
                        ActualPrice     = o.SysPrice,
                        SysPrice        = o.SysPrice,
                        Total           = o.Total,
                        BuyPrice        = 0,
                        Barcode         = o.OldBarcode,
                        ScanBarcode     = o.Barcode,
                        ProductCode     = o.ProductCode,
                        Title           = o.Title,
                        PaySN           = saleObj.PaySN,
                        PurchaseNumber  = o.Number,
                        SalesClassifyId = 0,
                        CompanyId       = saleObj.CompanyId,
                        Memo            = ""
                    });
                });
                BaseService <SaleOrders> .Add(saleObj, false);

                op = BaseService <SaleDetail> .AddRange(newSaleDetails);

                if (op.Successed)
                {
                    dal.UpdateTuiHuanStock();
                }
            }
            return(op);
        }
Example #3
0
        /// <summary>
        /// 发送,草稿,回复,转发
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="httpFiles">附件</param>
        /// <param name="fileId">原存在附件ID</param>
        /// <returns></returns>
        public static OpResult SendMail(SysMailSender obj, System.Web.HttpFileCollectionBase httpFiles, string fileId)
        {
            var op = new OpResult();

            try
            {
                var mailReceives = new List <SysMailReceive>();
                obj.ReceiverCodes.IsNullThrow("收件人不能空!");
                var receiverIds = obj.ReceiverCodes.Split(';');
                var createDate  = DateTime.Now;
                var sendCode    = Sys.CurrentUser.UserName;
                var sendName    = Sys.CurrentUser.FullName;
                foreach (var o in receiverIds)
                {
                    if (o.IsNullOrEmpty())
                    {
                        continue;
                    }
                    string uid = "", uname = "";
                    if (o.Contains("("))
                    {
                        uid   = o.Substring(o.LastIndexOf("(") + 1).TrimEnd(')');
                        uname = o.Substring(0, o.IndexOf("("));
                    }
                    else
                    {
                        var user = GetUser(o);
                        if (user == null)
                        {
                            continue;
                        }
                        uid   = user.UserCode.ToString();
                        uname = user.FullName;
                    }
                    var rece = new SysMailReceive();
                    obj.ToCopyProperty(rece);
                    rece.ReceiveCode = uid;
                    rece.ReceiveName = uname;
                    rece.SenderCode  = sendCode;
                    rece.SenderName  = sendName;
                    rece.State       = 0;
                    rece.Type        = 1;
                    rece.Id          = CommonRules.GUID;
                    rece.CreateDT    = createDate;
                    rece.BatchNo     = createDate.ToString("yyyyMMddHHmmssfff");
                    mailReceives.Add(rece);
                }
                if (!obj.CopytoCodes.IsNullOrEmpty())
                {
                    var copytoIds = obj.CopytoCodes.Split(';');
                    foreach (var o in copytoIds)
                    {
                        if (o.IsNullOrEmpty())
                        {
                            continue;
                        }
                        string uid = "", uname = "";
                        if (o.Contains("("))
                        {
                            uid   = o.Substring(o.LastIndexOf("(") + 1).TrimEnd(')');
                            uname = o.Substring(0, o.IndexOf("("));
                        }
                        else
                        {
                            var user = GetUser(o);
                            if (user == null)
                            {
                                continue;
                            }
                            uid   = user.UserCode.ToString();
                            uname = user.FullName;
                        }
                        var rece = new SysMailReceive();
                        obj.ToCopyProperty(rece);
                        rece.ReceiveCode = uid;
                        rece.ReceiveName = uname;
                        rece.SenderCode  = sendCode;
                        rece.SenderName  = sendName;
                        rece.State       = 0;
                        rece.Type        = 2;
                        rece.Id          = CommonRules.GUID;
                        rece.CreateDT    = createDate;
                        rece.BatchNo     = createDate.ToString("yyyyMMddHHmmssfff");
                        mailReceives.Add(rece);
                    }
                }
                if (obj.State == 1)
                {
                    foreach (var rece in mailReceives)
                    {
                        rece.Attachments = GetAttachs(httpFiles, fileId, obj.Id.IsNullOrEmpty() && !obj.BatchNo.IsNullOrEmpty());
                    }
                }
                obj.Attachments = GetAttachs(httpFiles, fileId, obj.Id.IsNullOrEmpty() && !obj.BatchNo.IsNullOrEmpty());
                obj.CompanyId   = CommonService.CompanyId;
                if (obj.Id.IsNullOrEmpty())
                {
                    obj.BatchNo    = createDate.ToString("yyyyMMddHHmmssfff");
                    obj.Id         = CommonRules.GUID;
                    obj.CreateDT   = createDate;
                    obj.SenderCode = sendCode;
                    obj.SenderName = sendName;
                    if (obj.State == 1)//发送
                    {
                        Add(obj, false);
                        op = BaseService <SysMailReceive> .AddRange(mailReceives, true);
                    }
                    else
                    {
                        op = Add(obj);
                    }

                    #region 写入日志
                    string StateTitle = obj.State == 1 ? "已发送" : "存草稿";
                    string msg        = obj.State == 1 ? "成功发送邮件!" : "成功保存草稿到发件箱!";
                    var    module     = Pharos.Sys.LogModule.邮件管理;
                    if (op.Successed)
                    {
                        string copyCodes = string.IsNullOrEmpty(obj.CopytoCodes) ? "" : (",抄送人=" + obj.CopytoCodes);
                        msg += "<br />Id=" + obj.Id + ",";
                        msg += "<br />收件人=" + obj.ReceiverCodes + copyCodes + ",状态=" + StateTitle + ",主题=" + obj.Title + ",批次=" + obj.BatchNo + "。";
                    }
                    else
                    {
                        msg = obj.State == 1 ? "发送邮件失败!" : "保存草稿到发件箱失败!";
                    }
                    log.WriteInsert(msg, module);
                    #endregion
                }
                else//草稿时
                {
                    var  resour        = CurrentRepository.QueryEntity.Include(o => o.Attachments).SingleOrDefault(o => o.Id == obj.Id);
                    var  isUpdateRec   = obj.ReceiverCodes != resour.ReceiverCodes;
                    var  isUpdateCop   = obj.CopytoCodes != resour.CopytoCodes;
                    var  isUpdateState = obj.State != resour.State;
                    var  isUpdateTitle = obj.Title != resour.Title;
                    var  isUpdateBody  = obj.Body != resour.Body;
                    bool isUpdate      = isUpdateRec || isUpdateCop || isUpdateState || isUpdateTitle || isUpdateBody;
                    obj.ToCopyProperty(resour);
                    foreach (var att in obj.Attachments)
                    {
                        if (!resour.Attachments.Any(o => o.Title == att.Title))
                        {
                            resour.Attachments.Add(att);
                        }
                    }
                    if (obj.State == 1)//发送
                    {
                        Update(resour, false);
                        op = BaseService <SysMailReceive> .AddRange(mailReceives, true);
                    }
                    else
                    {
                        op = Update(resour);
                    }

                    #region 写入日志
                    string StateTitle = obj.State == 1 ? "已发送" : "存草稿";
                    string msg        = obj.State == 1 ? "成功发送邮件!" : "成功修改草稿!";
                    var    module     = Pharos.Sys.LogModule.邮件管理;
                    if (op.Successed)
                    {
                        int n = 0;
                        if (isUpdate)
                        {
                            msg += "<br />Id=" + obj.Id + ",<br />";
                            if (isUpdateState)
                            {
                                msg += "状态由草稿改为已发送";
                                n    = n + 1;
                            }
                            if (isUpdateRec)
                            {
                                msg += n > 0 ? ",收件人=" + obj.ReceiverCodes : "收件人=" + obj.ReceiverCodes;
                                n    = n + 1;
                            }
                            if (isUpdateCop)
                            {
                                msg += n > 0 ? ",抄送人=" + obj.CopytoCodes : "抄送人=" + obj.CopytoCodes;
                                n    = n + 1;
                            }
                            if (isUpdateTitle)
                            {
                                msg += n > 0 ? ",主题=" + obj.Title : "主题=" + obj.Title;
                                n    = n + 1;
                            }
                            if (isUpdateBody)
                            {
                                msg += n > 0 ? ",正文=" + obj.Body : "正文=" + obj.Body;
                            }
                            msg += "。";
                            log.WriteUpdate(msg, module);
                        }
                    }
                    else
                    {
                        msg = obj.State == 1 ? "发送邮件失败(从发件箱的草稿发送)!" : "修改草稿失败!";
                        log.WriteUpdate(msg, module);
                    }
                    #endregion
                }
            }
            catch (Exception ex)
            {
                op.Message = ex.Message;
                Log.WriteError(ex);
            }
            return(op);
        }
Example #4
0
        /// <summary>
        /// 新增或修改
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static OpResult SaveOrUpdate(HouseMove obj)
        {
            var re = new OpResult();

            try
            {
                var details = new List <HouseMoveList>();
                if (!string.IsNullOrWhiteSpace(obj.Inserted))
                {
                    var adds = obj.Inserted.ToObject <List <HouseMoveList> >();
                    if (adds.Any())
                    {
                        details.AddRange(adds.Where(o => !o.Barcode.IsNullOrEmpty() && !o.Title.IsNullOrEmpty()));
                    }
                }
                obj.CompanyId = CommonService.CompanyId;
                if (obj.Id == 0)
                {
                    obj.MoveId = Logic.CommonRules.GUID;
                    details.Each(o =>
                    {
                        o.MoveId   = obj.MoveId;
                        o.StockOut = 0;//todo
                        o.State    = 1;
                    });
                    obj.CreateDT  = DateTime.Now;
                    obj.CreateUID = Sys.CurrentUser.UID;
                    obj.State     = 1;
                    Add(obj, false);

                    re = BaseService <HouseMoveList> .AddRange(details);
                }

                else
                {
                    var sour = STHouseMoveService.FindById(obj.Id);
                    var list = BaseService <HouseMoveList> .FindList(o => o.MoveId == sour.MoveId);

                    var uid    = sour.CreateUID;
                    var create = sour.CreateDT;
                    var state  = sour.State;
                    obj.ToCopyProperty(sour);
                    sour.CreateDT  = create;
                    sour.CreateUID = uid;
                    sour.State     = state;
                    details.Each(o =>
                    {
                        o.MoveId = sour.MoveId;
                        o.State  = sour.State;
                    });
                    if (!string.IsNullOrWhiteSpace(obj.Deleted))
                    {
                        var dels = obj.Deleted.ToObject <List <HouseMoveList> >();
                        if (dels.Any())
                        {
                            var barcodes = dels.Select(o => o.Barcode).ToList();
                            var deletes  = list.Where(o => barcodes.Contains(o.Barcode)).ToList();
                            BaseService <HouseMoveList> .CurrentRepository.RemoveRange(deletes, false);
                        }
                    }
                    if (!string.IsNullOrWhiteSpace(obj.Updated))
                    {
                        var upts = obj.Updated.ToObject <List <HouseMoveList> >();

                        if (upts.Any())
                        {
                            var barcodes = upts.Select(o => o.Barcode).ToList();
                            var deletes  = list.Where(o => barcodes.Contains(o.Barcode)).ToList();

                            BaseService <HouseMoveList> .CurrentRepository.RemoveRange(deletes, false);

                            BaseService <HouseMoveList> .AddRange(upts, false);
                        }
                    }
                    BaseService <HouseMoveList> .AddRange(details, false);

                    re = Update(sour);
                }
            }
            catch (Exception ex)
            {
                re.Message = ex.Message;
            }
            return(re);
        }
Example #5
0
        /// <summary>
        /// 后台退货
        /// </summary>
        /// <param name="reason">换货理由(字典值)</param>
        /// <param name="retprice">顾客补价</param>
        /// <param name="returnDetailsStr">换货明细JSON字符串</param>
        /// <param name="payno">销售单流水号</param>
        /// <returns>OpResult</returns>
        public static OpResult SaveTui(int reason, decimal?retprice, string returnDetailsStr, string payno, bool returnAll = false)
        {
            var op   = OpResult.Fail();
            var olds = returnDetailsStr.ToObject <List <TuiHuan> >();

            if (!olds.Any())
            {
                op.Message = "退货商品信息不能为空";
            }
            else
            {
                if (!payno.IsNullOrEmpty() && returnAll)
                {
                    var obj = BaseService <SaleOrders> .Find(o => o.CompanyId == CommonService.CompanyId && o.PaySN == payno);

                    if (obj == null)
                    {
                        op.Message = "输入流水号不存在!";
                    }
                    else
                    {
                        obj.State          = 1;
                        obj.IsProcess      = false;
                        obj.Receive        = -(Math.Abs(obj.Receive));
                        obj.Reason         = reason;
                        obj.ReturnDT       = DateTime.Now;
                        obj.ReturnOrderUID = CurrentUser.UID;
                        op = BaseService <SaleOrders> .Update(obj);
                    }
                }
                else
                {
                    payno = CommonRules.PaySN;
                    var saleObj = new SaleOrders()
                    {
                        ApiCode           = "11",
                        MachineSN         = "-1",
                        CreateDT          = DateTime.Now,
                        CreateUID         = Sys.CurrentUser.UID,
                        PaySN             = payno,
                        TotalAmount       = retprice.GetValueOrDefault(),
                        Receive           = retprice.GetValueOrDefault(),
                        PreferentialPrice = 0,
                        StoreId           = Sys.CurrentUser.StoreId,
                        Type      = 2,
                        Reason    = reason,
                        CompanyId = CommonService.CompanyId,
                        Memo      = "后台退货新单"
                    };
                    var newSaleDetails = new List <SaleDetail>();
                    olds.Each(o =>
                    {
                        newSaleDetails.Add(new SaleDetail()
                        {
                            ActualPrice     = o.SysPrice,
                            SysPrice        = o.SysPrice,
                            Total           = o.Total,
                            BuyPrice        = 0,
                            Barcode         = o.OldBarcode,
                            ScanBarcode     = o.Barcode,
                            Title           = o.Title,
                            ProductCode     = o.ProductCode,
                            PaySN           = saleObj.PaySN,
                            PurchaseNumber  = o.Number,
                            SalesClassifyId = 0,
                            CompanyId       = saleObj.CompanyId,
                            Memo            = ""
                        });
                    });
                    BaseService <SaleOrders> .Add(saleObj, false);

                    op = BaseService <SaleDetail> .AddRange(newSaleDetails);
                }
                if (op.Successed)
                {
                    dal.UpdateTuiHuanStock();
                }
            }
            return(op);
        }
        public static void SaveStock(string storeId, string checkBatch, string checkUID, Dictionary <string, decimal?> barnums)
        {
            if (string.IsNullOrWhiteSpace(storeId))
            {
                throw new MessageException("门店号为空!");
            }
            if (string.IsNullOrWhiteSpace(checkBatch))
            {
                throw new MessageException("盘点批次为空!");
            }
            if (string.IsNullOrWhiteSpace(checkUID))
            {
                throw new MessageException("盘点员为空!");
            }
            if (!barnums.Any())
            {
                throw new MessageException("盘点内容为空!");
            }

            var barcodes = barnums.Keys.ToList();
            var query    = from a in BaseService <StockTaking> .CurrentRepository.QueryEntity
                           join b in BaseService <TreasuryLocks> .CurrentRepository.QueryEntity on new { a.CheckBatch, a.CompanyId } equals new { b.CheckBatch, b.CompanyId }
            where a.CompanyId == Sys.SysCommonRules.CompanyId && b.LockStoreID == storeId && a.CheckBatch == checkBatch && barcodes.Contains(a.Barcode)
            select new
            {
                a.Barcode,
                a.ActualNumber,
                a.CheckBatch,
                b.State,
                SysPrice = ProductService.CurrentRepository.QueryEntity.Where(o => o.CompanyId == a.CompanyId &&
                                                                              (o.Barcode == a.Barcode || ("," + o.Barcodes + ",").Contains("," + a.Barcode + ","))).Select(o => o.SysPrice).FirstOrDefault()
            };
            var stocks = query.ToList();

            if (!stocks.Any())
            {
                throw new MessageException("批次或条码不存在!");
            }
            if (stocks.Any(o => o.State == 1))
            {
                throw new MessageException("该批次已通过审核,不能再盘点!");
            }
            var user = UserInfoService.Find(o => o.CompanyId == Sys.SysCommonRules.CompanyId && o.UserCode == checkUID);

            if (user == null)
            {
                throw new MessageException("用户编码不存在!");
            }
            var stocklogs = BaseService <StockTakingLog> .FindList(o => o.CompanyId == Sys.SysCommonRules.CompanyId && barcodes.Contains(o.Barcode) && o.CheckBatch == checkBatch && o.State == 1);

            var insertLog = new List <StockTakingLog>();
            var date      = DateTime.Now;

            foreach (var de in barnums)
            {
                var sk = stocks.FirstOrDefault(o => o.Barcode == de.Key);
                if (sk == null)
                {
                    throw new MessageException("条码[" + de.Key + "]不存在!");
                }
                if (stocklogs.Any(o => o.Barcode == de.Key))
                {
                    throw new MessageException("条码[" + de.Key + "]条码已复盘!");
                }
                if (!de.Value.HasValue)
                {
                    continue;
                }
                insertLog.Add(new StockTakingLog()
                {
                    Barcode    = sk.Barcode,
                    CheckBatch = sk.CheckBatch,
                    CheckUID   = user.UID,
                    CreateDT   = date,
                    CreateUID  = user.UID,
                    ActualDate = date,
                    Number     = de.Value.Value,
                    SysPrice   = sk.SysPrice,
                    Source     = 2,
                    CompanyId  = Sys.SysCommonRules.CompanyId
                });
            }
            if (insertLog.Any())
            {
                BaseService <StockTakingLog> .AddRange(insertLog);
            }
        }
        private static void RunIntegral(IIntegralEvent integralEvent, int sourceType)
        {
            if (string.IsNullOrEmpty(integralEvent.MemberId))
            {
                return;
            }
            var member        = MembersService.GetMember(integralEvent.MemberId, integralEvent.CompanyId);
            var rounder       = new IntegralRoundFactory().CreateRounder(integralEvent.CompanyId);
            var ruleProviders = new QuanChengTaoIntegralRuleFactory(integralEvent.CompanyId).CreateRuleProviders(new DefaultIntegralRuleProviderLoader());
            var flower        = new QuanChengTaoIntegralRuleFlowProvider(integralEvent.CompanyId, rounder);
            var integralKV    = new Dictionary <IIntegralRule, decimal>();

            foreach (var ruleProvider in ruleProviders)
            {
                var integrals = flower.DoFlow(integralEvent, ruleProvider, member);
                foreach (var item in integrals)
                {
                    integralKV.Add(item.Key, item.Value);
                }
            }
            var createdt = DateTime.Now;
            //record
            List <IntegralRecords> records = new List <IntegralRecords>();

            foreach (var item in integralKV)
            {
                var integralRecords = new IntegralRecords()
                {
                    CreateDt       = createdt,
                    Id             = Guid.NewGuid().ToString("N"),
                    Integral       = item.Value,
                    IntegralRuleId = Convert.ToInt32(item.Key.Id),
                    Source         = integralEvent.SourceRecordId,
                    SourceType     = sourceType,
                    CompanyId      = integralEvent.CompanyId,
                    MemberId       = integralEvent.MemberId,
                    StoreId        = integralEvent.StoreId,
                    OperatorUid    = integralEvent.OperatorUid
                };
                records.Add(integralRecords);
            }
            if (records.Count == 0)
            {
                return;
            }
            //分期
            QuanChengTaoInstalmentRuleProvider instalmentRuleProvider = new QuanChengTaoInstalmentRuleProvider();
            var integralsForInstalment = records.Select(o => new QuanChengTaoIntegralInstalment()
            {
                IntegralRecordId = o.Id, CompanyId = o.CompanyId, Integral = o.Integral, IntegralRuleId = o.IntegralRuleId
            });
            var instalments       = instalmentRuleProvider.Run(integralsForInstalment);
            var instalmentRecords = new List <InstalmentRecord>();

            foreach (var item in instalments)
            {
                var instalmentR      = item as QuanChengTaoInstalmentItem;
                var instalmentRecord = new InstalmentRecord()
                {
                    IntegralRecordId = instalmentR.IntegralRecordId,
                    CompanyId        = integralEvent.CompanyId,
                    CreateDT         = createdt,
                    InstalmentDT     = instalmentR.InstalmentDT,
                    InstalmentRuleId = Convert.ToInt32(item.InstalmentRuleId),
                    Integral         = item.InstalmentNumber,
                    MemberId         = integralEvent.MemberId
                };
                instalmentRecords.Add(instalmentRecord);
            }
            if (instalmentRecords.Count == 0)
            {
                member.UsableIntegral += records.Sum(o => o.Integral);
                BaseService <IntegralRecords> .AddRange(records);
            }
            else
            {
                var noInstalments = records.Where(o => !instalmentRecords.Any(p => p.IntegralRecordId == o.Id)).ToList();
                member.UsableIntegral += noInstalments.Sum(o => o.Integral);
                BaseService <IntegralRecords> .AddRange(records, false);

                BaseService <InstalmentRecord> .AddRange(instalmentRecords);
            }
        }
Example #8
0
        /// <summary>
        /// 保存或修改
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static OpResult SaveOrUpdate(IndentOrder obj)
        {
            var re = new OpResult();

            try
            {
                var details = new List <IndentOrderList>();
                var gifts   = new List <IndentOrderList>();
                if (!string.IsNullOrWhiteSpace(obj.Inserted))
                {
                    var adds = obj.Inserted.ToObject <List <IndentOrderList> >();
                    if (adds.Any())
                    {
                        details.AddRange(adds.Where(o => !string.IsNullOrWhiteSpace(o.Barcode)));
                        details.Each(o =>
                        {
                            if (!o.Gift.IsNullOrEmpty())
                            {
                                var gfs = o.Gift.Split(',');
                                gfs.Each(i =>
                                {
                                    if (!i.IsNullOrEmpty())
                                    {
                                        gifts.Add(new IndentOrderList()
                                        {
                                            Barcode    = i.Split('~')[0],
                                            IndentNum  = decimal.Parse(i.Split('~')[1]),
                                            Nature     = 1,
                                            ResBarcode = o.Barcode,
                                            Memo       = "赠品"
                                        });
                                    }
                                });
                            }
                        });
                    }
                }
                var gifBars = gifts.Select(o => o.Barcode).ToList();
                if (gifBars.Any())
                {
                    var pros = ProductService.FindList(o => gifBars.Contains(o.Barcode));
                    ProductService.SetSysPrice(obj.StoreId, pros, supplierId: obj.SupplierID);
                    gifts.Each(o =>
                    {
                        var p = pros.FirstOrDefault(i => i.Barcode == o.Barcode);
                        if (p != null)
                        {
                            o.Price    = p.BuyPrice;
                            o.Subtotal = o.Price * o.IndentNum;
                            o.SysPrice = p.SysPrice;
                        }
                    });
                }
                details.AddRange(gifts);
                if (details.Any())
                {
                    var procs = ProductService.FindList(o => !(o.Barcodes == null || o.Barcodes == ""));
                    foreach (var dt in details)
                    {
                        var p = procs.FirstOrDefault(o => ("," + o.Barcodes + ",").Contains("," + dt.Barcode + ","));
                        if (p == null)
                        {
                            continue;
                        }
                        dt.AssistBarcode = dt.Barcode;
                        dt.Barcode       = p.Barcode;
                    }
                }
                obj.CompanyId = CommonService.CompanyId;
                if (obj.Id == 0)
                {
                    obj.IndentOrderId = Logic.CommonRules.OrderSN;
                    details.Each(o =>
                    {
                        o.IndentOrderId = obj.IndentOrderId;
                    });
                    obj.CreateDT  = DateTime.Now;
                    obj.CreateUID = Sys.CurrentUser.UID;
                    Add(obj, false);
                    re = BaseService <IndentOrderList> .AddRange(details);
                }
                else
                {
                    var sour = OrderService.FindById(obj.Id);
                    var list = BaseService <IndentOrderList> .FindList(o => o.IndentOrderId == sour.IndentOrderId);

                    var uid    = sour.CreateUID;
                    var create = sour.CreateDT;
                    obj.ToCopyProperty(sour);
                    sour.CreateDT  = create;
                    sour.CreateUID = uid;
                    details.Each(o =>
                    {
                        o.IndentOrderId = sour.IndentOrderId;
                    });
                    if (!string.IsNullOrWhiteSpace(obj.Deleted))
                    {
                        var dels = obj.Deleted.ToObject <List <IndentOrderList> >();
                        if (dels.Any())
                        {
                            var ids      = dels.Select(o => o.Id).ToList();
                            var mainBars = dels.Select(o => o.Barcode).ToList();
                            var deletes  = list.Where(o => ids.Contains(o.Id)).ToList();
                            deletes.AddRange(list.Where(o => mainBars.Contains(o.ResBarcode)));
                            BaseService <IndentOrderList> .CurrentRepository.RemoveRange(deletes, false);
                        }
                    }
                    if (!string.IsNullOrWhiteSpace(obj.Updated))
                    {
                        var upts = obj.Updated.ToObject <List <IndentOrderList> >();
                        //foreach (var detail in list)
                        //{
                        //    //detail.Subtotal = detail.IndentNum * detail.Price;
                        //    var up = upts.FirstOrDefault(o => o.Id == detail.Id);
                        //    if (up == null) continue;
                        //    detail.IndentNum = up.IndentNum;
                        //    detail.Memo = up.Memo;
                        //}
                        if (upts.Any())
                        {
                            var ids      = upts.Select(o => o.Id).ToList();
                            var mainBars = upts.Select(o => o.Barcode).ToList();
                            var deletes  = list.Where(o => ids.Contains(o.Id)).ToList();
                            deletes.AddRange(list.Where(o => mainBars.Contains(o.ResBarcode)));
                            upts.Each(o =>
                            {
                                if (!o.Gift.IsNullOrEmpty())
                                {
                                    var gfs = o.Gift.Split(',');
                                    gfs.Each(i =>
                                    {
                                        if (!i.IsNullOrEmpty())
                                        {
                                            gifts.Add(new IndentOrderList()
                                            {
                                                IndentOrderId = o.IndentOrderId,
                                                Barcode       = i.Split('~')[0],
                                                IndentNum     = decimal.Parse(i.Split('~')[1]),
                                                Nature        = 1,
                                                ResBarcode    = o.Barcode,
                                                Memo          = "赠品"
                                            });
                                        }
                                    });
                                }
                            });
                            upts.AddRange(gifts);
                            BaseService <IndentOrderList> .CurrentRepository.RemoveRange(deletes, false);

                            BaseService <IndentOrderList> .AddRange(upts, false);

                            #region 操作日志
                            foreach (var item in deletes)
                            {
                                var msg = Pharos.Sys.LogEngine.CompareModelToLog <IndentOrderList>(Sys.LogModule.采购订单, null, item);
                                new Pharos.Sys.LogEngine().WriteDelete(msg, Sys.LogModule.采购订单);
                            }
                            foreach (var item in upts)
                            {
                                var msg = Pharos.Sys.LogEngine.CompareModelToLog <IndentOrderList>(Sys.LogModule.采购订单, item);
                                new Pharos.Sys.LogEngine().WriteInsert(msg, Sys.LogModule.采购订单);
                            }
                            #endregion
                        }
                    }
                    BaseService <IndentOrderList> .AddRange(details, false);

                    foreach (var item in details)
                    {
                        var msg = Pharos.Sys.LogEngine.CompareModelToLog <IndentOrderList>(Sys.LogModule.采购订单, item);
                        new Pharos.Sys.LogEngine().WriteDelete(msg, Sys.LogModule.采购订单);
                    }
                    re = Update(sour);
                }
            }
            catch (Exception ex)
            {
                re.Message = ex.Message;
            }
            return(re);
        }