Example #1
0
        public async Task <ActionResult> CountingView(string ids, string partUrl, string signUrl)
        {
            //using (CurrentUnitOfWork.DisableFilter(AbpDataFilters.MustHaveTenant))
            //{
            var jssdkUiPackage = JSSDKHelper.GetJsSdkUiPackage(appId, appSecret, Request.AbsoluteUri().Split('#')[0]);

            ViewBag.Ids = ids;
            String srcArray = "";

            foreach (var id in ids.Split(','))
            {
                Logger.Error("\r\n\r\nid" + id);
                var path = await ProcessTaskManager.GetTaskPicSrc(Convert.ToInt32(id));

                srcArray += path + ",";
            }
            srcArray.Substring(0, srcArray.Length - 1);
            Logger.Error("\r\n\r\nSrcArr" + srcArray);
            //var path = await ProcessTaskManager.GetTaskSheetImagePath(id);
            ViewBag.ImgPath  = partUrl;
            ViewBag.SignUrl  = signUrl;
            ViewBag.TaskUrls = srcArray;
            return(View("WeChat/process/CountingView", jssdkUiPackage));
            //}
        }
Example #2
0
        /// <summary>
        /// 通过工序获取加工点信息,开单数量多的排序在前
        /// </summary>
        /// <param name="processTypeName"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public virtual async Task <List <UnitDto> > GetAllUnitByProcessTypeName(string processTypeName, string key)
        {
            var units = await(Manager as UnitManager).GetAll().Include(o => o.UnitType).Where(o => o.UnitNature == UnitNature.供应商 || o.UnitNature == UnitNature.客户及供应商).Where(o => o.SupplierType != null && o.SupplierType.Contains("加工")).WhereIf(!string.IsNullOrEmpty(key), o => o.UnitName.Contains(key)).ToListAsync();

            if (string.IsNullOrEmpty(processTypeName))
            {
                //Logger.Error(Newtonsoft.Json.JsonConvert.SerializeObject(units));
                return(units.MapTo <List <UnitDto> >());
            }
            var processType = await ProcessTypeManager.GetAll().Where(o => o.ProcessTypeName == processTypeName).FirstOrDefaultAsync();

            if (processType == null)
            {
                return(units.MapTo <List <UnitDto> >());
            }
            var taskedSupplierDtos = await ProcessTaskManager.GetAll().Where(o => o.ProcessTypeId == processType.Id && o.SupplierId != null).GroupBy(o => o.SupplierId)
                                     .Select(o => new { Id = o.Key, Count = o.Count() }).OrderByDescending(o => o.Count).ToListAsync();

            var result = new List <UnitDto>();

            foreach (var supplier in taskedSupplierDtos)
            {
                var unitDto = units.FirstOrDefault(o => o.Id == supplier.Id);
                if (unitDto != null)
                {
                    result.Add(unitDto.MapTo <UnitDto>());
                }
            }
            result.AddRange(units.Where(o => !taskedSupplierDtos.Exists(t => t.Id == o.Id)).MapTo <List <UnitDto> >());

            return(result);
        }
Example #3
0
        /// <summary>
        /// 获取往来单位中供应商及对应的未核算加工单数
        /// </summary>
        /// <returns></returns>
        public virtual async Task <object> GetAllUnitUnCheckCount()
        {
            var query = Manager.GetAll().Where(o => o.UnitNature == UnitNature.供应商 || o.UnitNature == UnitNature.客户及供应商);
            var units = await query.ToListAsync();

            var mustReturnFile = await SettingManager.GetSettingValueAsync <bool>(MESSettingNames.MustReturnFileBeforeCheck);

            var result = new List <object>();

            foreach (var unit in units)
            {
                var taskQuery = ProcessTaskManager.GetAll().Where(t => t.SupplierId == unit.Id && t.ProcessTaskStatus != ProcessTaskStatus.Inputed && !t.Status.Contains(ProcessTask.Status_Checked));
                if (mustReturnFile)
                {
                    taskQuery = taskQuery.Where(t => t.Status != null && t.Status.Contains(ProcessTask.Status_Verify));
                }
                result.Add(new
                {
                    unit.Id,
                    unit.UnitName,
                    UnCheckTaskCount = taskQuery.Count()
                });
            }



            return(result);
        }
Example #4
0
        /// <summary>
        /// 获取某个加工点一段时间按月的报工报表
        /// </summary>
        /// <param name="year"></param>
        /// <param name="month"></param>
        /// <param name="range"></param>
        /// <param name="unitId"></param>
        /// <returns></returns>
        public virtual async Task <object> GetUnitDateRangeReport(int unitId, int?year, int?month, int?range)
        {
            var startYear  = year ?? DateTime.Now.AddMonths(-12).Year;
            var startMonth = month ?? DateTime.Now.AddMonths(-11).Month;
            var monthRange = range ?? 12;
            var startDate  = DateTime.Parse($"{startYear}-{startMonth}-01");

            var result = new List <object>();

            for (var m = 0; m < monthRange; m++)
            {
                var queryStartDate = startDate.AddMonths(m);
                var queryEndDate   = queryStartDate.AddMonths(1).AddDays(-1);

                var taskBaseQuery = ProcessTaskManager.GetAll()
                                    .Include(o => o.ProcessTaskReports)
                                    .Where(o => o.Status == null || !o.Status.Contains(ProcessTask.Status_Inner))         //非厂内任务
                                    .Where(o => o.SupplierId != null && o.ProcessTaskStatus != ProcessTaskStatus.Inputed) //已选择加工点且已开单
                                    .Where(o => o.KaiDate >= queryStartDate && o.KaiDate <= queryEndDate);

                var report = await GetUnitReport(unitId, taskBaseQuery);

                result.Add(new
                {
                    Date   = $"{queryStartDate.Year}-{queryStartDate.Month}",
                    Report = report,
                });
            }

            return(result);
        }
Example #5
0
        /// <summary>
        /// 获取设备上异常报工任务
        /// </summary>
        /// <param name="equipmentId"></param>
        /// <returns></returns>
        public virtual async Task <IEnumerable <ProcessTaskViewDto> > GetAbnormalReportTasks(int equipmentId)
        {
            var tasks = await ProcessTaskManager.GetAbnormalReportTasks()
                        .Include("Part.Project")
                        .Where(o => o.EquipmentId == equipmentId).ToListAsync();

            return(tasks.MapTo <List <ProcessTaskViewDto> >());
        }
        /// <summary>
        /// 获取已经使用的工序类型
        /// </summary>
        /// <returns></returns>
        public virtual async Task <List <ProcessTypeDto> > GetUsedProcessTypes(int?projectId = null)
        {
            var processTypes = await ProcessTaskManager.GetAll()
                               .WhereIf(projectId.HasValue, o => o.Part.ProjectId == projectId)
                               .Include(o => o.ProcessType).GroupBy(o => o.ProcessType).Select(o => o.Key).OrderBy(o => o.Sort).ToListAsync();

            return(processTypes.MapTo <List <ProcessTypeDto> >());
        }
Example #7
0
 public CheckDelayJobs(AbpTimer timer, ProcessTaskManager processTaskManager, TacticManager tacticManager,
                       IBackgroundJobManager backgroundJobManager)
     : base(timer)
 {
     Timer.Period          = 60 * 1000 * 60 * 2; //2小时执行一次
     _processTaskManager   = processTaskManager;
     _tacticManager        = tacticManager;
     _backgroundJobManager = backgroundJobManager;
 }
        /// <summary>
        /// 获取询价详情
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public virtual async Task <ProcessQuoteDto> GetQuoteInfo(int id)
        {
            var processQuote = await Manager.GetAll()
                               .Include(o => o.ProcessQuoteTasks)
                               .Include("ProcessQuoteBids.Unit").Where(o => o.Id == id).SingleOrDefaultAsync();

            if (processQuote == null)
            {
                throw new UserFriendlyException(L("此询价已被删除"));
            }

            //判断是否流标
            if (processQuote.QuoteStatus == QuoteStatus.询价中 && processQuote.ExpireDate < DateTime.Now)
            {
                if (processQuote.ProcessQuoteBids.Count(p => p.BidType != null) == 0)
                {
                    processQuote.QuoteStatus = QuoteStatus.已流标;
                }
                else
                {
                    processQuote.QuoteStatus = QuoteStatus.已截止;
                }
            }
            foreach (var bid in processQuote.ProcessQuoteBids)
            {
                //如果之前是未加入的,现在对应加工点已加入,则调整显示状态
                if (bid.QuoteBidStatus == QuoteBidStatus.未加入)
                {
                    if (bid.Unit.IsTenantBinded())
                    {
                        bid.QuoteBidStatus = QuoteBidStatus.未发送;
                    }
                }
            }

            var processQuoteDto = processQuote.MapTo <ProcessQuoteDto>();

            //如果是已中标的,则读取询价明细任务对应的单号
            if (processQuote.QuoteStatus == QuoteStatus.已选标)
            {
                foreach (var task in processQuoteDto.ProcessQuoteTasks)
                {
                    if (task.ProcessTaskId.HasValue)
                    {
                        var processSN = await ProcessTaskManager.GetAll().Where(o => o.Id == task.ProcessTaskId.Value)
                                        .Select(o => o.ProcessSN)
                                        .SingleOrDefaultAsync();

                        task.ProcessSN = processSN;
                    }
                }
            }
            return(processQuoteDto);
        }
Example #9
0
        /// <summary>
        /// 对设备上的未完成任务进行重排
        /// </summary>
        /// <param name="equipmentId"></param>
        /// <param name="taskIds"></param>
        /// <returns></returns>
        public virtual async Task ReorderUnFinishedTasks(int[] taskIds)
        {
            throw new UserFriendlyException("此方法未启用");
            var tasks = await ProcessTaskManager.GetListByIdsAsync(taskIds);

            foreach (var task in tasks)
            {
                task.SetPropertyValue("OrderInEquipment", taskIds.ToList().IndexOf(task.Id) + 1);
                await ProcessTaskManager.UpdateAsync(task);
            }
        }
Example #10
0
        public virtual async Task <object> GetEquipmentTimeLineTasks(DateTime from, DateTime to, int?processTypeId)
        {
            var manager = Manager as EquipmentManager;

            var tasks = await ProcessTaskManager
                        .GetTimeLineTasksQuery(from, to)
                        .Include("Part.Project")
                        .Include(o => o.ProcessType)
                        .WhereIf(processTypeId.HasValue, o => o.ProcessTypeId == processTypeId.Value)
                        .Select(o =>
                                new
            {
                o.Id,
                o.StartDate,
                o.EndDate,
                o.Part.Project.ProjectSN,
                o.Part.PartName,
                o.ProcessType.ProcessTypeName,
                o.ArrangeDate,
                o.ArrangeEndDate,
                o.AppointDate,
                o.EquipmentId,
                o.Progress,
                o.EstimateHours,
                o.ProcessTaskStatus,
                o.ActualHours
                //id=o.Id,
                //text=$"{o.Part.Project.ProjectSN}{o.Part.PartName}{o.ProcessType.ProcessTypeName}",
                //
                //start_date =o.StartDate.HasValue?o.StartDate.Value.ToString("yyyy-MM-dd HH:mm"):(o.AppointDate.Value).ToString("yyyy-MM-dd HH:mm"),
                //end_date = (o.ArrangeDate ?? o.AppointDate.Value).AddHours(Convert.ToDouble(o.EstimateHours??0)).ToString("yyyy-MM-dd HH:mm"),
                //equipmentId=o.EquipmentId,
                //progress=o.Progress
            })
                        .ToListAsync();

            //如果已上机取实际上机时间,不然取安排上机时间
            return(tasks.Select(o => {
                var startDate = o.StartDate ?? o.ArrangeDate ?? o.AppointDate ?? DateTime.Now;
                var endDate = o.EndDate ?? o.ArrangeEndDate ?? startDate.AddHours(Convert.ToDouble(o.EstimateHours ?? 0));
                return new
                {
                    id = o.Id,
                    text = $"{o.ProjectSN}{o.PartName}{o.ProcessTypeName}",
                    progress = o.Progress,
                    equipmentId = o.EquipmentId ?? -1,
                    o.ProcessTaskStatus,
                    ActualHours = Math.Round(o.ActualHours ?? 0, 2),
                    o.EstimateHours,
                    start_date = startDate.ToString("yyyy-MM-dd HH:mm"),
                    end_date = endDate.ToString("yyyy-MM-dd HH:mm")
                };
            }));
        }
Example #11
0
        public async Task <ActionResult> OuterTaskView(int id)
        {
            using (CurrentUnitOfWork.DisableFilter(AbpDataFilters.MustHaveTenant))
            {
                var task = await ProcessTaskManager.GetAll().Where(o => o.ToTenantId == AbpSession.TenantId).Where(o => o.Id == id).SingleOrDefaultAsync();

                if (task == null)
                {
                    return(Redirect("/WeiXin/Error?msg=" + "无权查看此任务信息".UrlEncode()));
                }
                //标记任务为加工点已查看状态
                task.SetStatus(MES.ProcessTask.Status_ProcessorReaded);
                var jssdkUiPackage = JSSDKHelper.GetJsSdkUiPackage(appId, appSecret, Request.AbsoluteUri().Split('#')[0]);
                var path           = await ProcessTaskManager.GetTaskSheetImagePath(id);

                ViewBag.ImgPath = path;
                return(View("WeChat/process/TaskView", jssdkUiPackage));
            }
        }
Example #12
0
        public virtual async Task SubmitTimeLineData(EquipmentTimeLineSubmitDto equipmentTimeLineSubmitDto)
        {
            //删除任务
            await ProcessTaskManager.DeleteAsync(equipmentTimeLineSubmitDto.deleteIds);

            foreach (var taskDto in equipmentTimeLineSubmitDto.events)
            {
                var task = await ProcessTaskManager.GetByIdAsync(taskDto.id);

                task.ArrangeDate    = taskDto.start_date;
                task.ArrangeEndDate = taskDto.end_date;
                //task.EstimateHours = Math.Round(Convert.ToDecimal((taskDto.end_date - taskDto.start_date).TotalHours),2);
                task.EquipmentId = taskDto.equipmentId;
                //
                if (task.EquipmentId == -1)
                {
                    task.EquipmentId = null;
                }
            }
        }
Example #13
0
        public async Task <ActionResult> Report(int taskId)
        {
            //return Redirect("/WeiXin/Error?msg=未找到可报工任务");
            if (!await ProcessTaskManager.CanReportAsync(taskId))
            {
                var task = await ProcessTaskManager.GetByIdAsync(taskId);

                if (task != null && task.ProcessTaskStatus == ProcessTaskStatus.Completed)
                {
                    return(Redirect("/MES/PartReportView?id=" + taskId));
                }
                return(Redirect("/WeiXin/Error?msg=" + "任务不存在或已失效".UrlEncode()));
            }
            //todo:临时使用,强制获取token
            //await AccessTokenContainer.GetAccessTokenAsync(appId, true);
            //JsApiTicketContainer.GetJsApiTicket(appId, true);


            var jssdkUiPackage = JSSDKHelper.GetJsSdkUiPackage(appId, appSecret, Request.AbsoluteUri().Split('#')[0]);

            Logger.Info("JSSDKPackage:" + Common.JSONConvert.SerializeCamelCase(jssdkUiPackage));
            ViewBag.ReporterName = WeUser.nickname;
            return(View(jssdkUiPackage));
        }
Example #14
0
        public override void Execute(SendWeiXinMessageJobArgs args)
        {
            Logger.Error("\r\n\r\nstart");
            //JObject jo = (JObject)JsonConvert.DeserializeObject(args.ExtendInfo);
            var tenantId        = args.DataId; //Supplier. tenantId
            var arr             = args.ExtendInfo.Split(new string[] { "test123" }, StringSplitOptions.None);
            var taskIds         = arr[0];
            var currentTenantId = arr[1];
            var totalFee        = arr[2];
            var processSNs      = arr[3];

            var q           = TenantManager.GetAll().Where(o => o.Id == Convert.ToInt32(currentTenantId)).SingleOrDefault();
            var currentUser = q.TenancyName;
            var partUrl     = ProcessTaskManager.SaveAccountingSheetToImage(taskIds, currentTenantId, tenantId.ToString()).GetAwaiter().GetResult();

            partUrl = $"/sheets/{currentTenantId}/CountingPic/{tenantId}/{partUrl}.png";
            var config  = _hostingEnvironment.GetAppConfiguration();
            var baseurl = $"{config["base:url"]}";
            //var url = $"{_hostingEnvironment.GetAppConfiguration()["base:url"]}/MES/CountingView?ids={taskIds}&tenantId={tenantId}&currentTenantId={currentTenantId}&partUrl={partUrl}";
            var url = $"{_hostingEnvironment.GetAppConfiguration()["base:url"]}/MES/CountingView?ids={taskIds}&partUrl={partUrl}&signUrl=";
            //var openids = await MESUnitManager.FindUnitOpenId(tenantId);
            var templateId = "dE83qStBxfAAAFMAnn_0t6EknJ8B97L_A7A03LdiYkk";           //master: B2CWkuQKyZDqE4EreiQHqitAYbfU_Njxelremw546lk

            if (!string.IsNullOrEmpty(config["TemplateId:SendCounting"]))
            {
                templateId = config["TemplateId:SendCounting"];
            }
            //var tenantId = AbpSession.GetTenantId();                             //demo:dE83qStBxfAAAFMAnn_0t6EknJ8B97L_A7A03LdiYkk
            //currentUser = AbpSession.GetTenantId();
            //var q = await TenantManager.GetByIdAsync(AbpSession.GetTenantId());
            //var currentUser = q.TenancyName;
            //var url = "";
            var message = new
            {
                first    = new TemplateDataItem("您好,收到" + currentUser + "发来的核算信息"),
                keyword1 = new TemplateDataItem("核算单号:" + processSNs),
                keyword2 = new TemplateDataItem(DateTime.Now.ToString()),
                keyword3 = new TemplateDataItem(totalFee.ToString()),
                keyword4 = new TemplateDataItem(currentUser),
                remark   = new TemplateDataItem("总核算金额为:" + totalFee.ToString() + "元")
            };
            SendTemplateMessageResult sendResult;

            try
            {
                sendResult = WeiXin.WeiXinHelper.SendTemplateMessage(args.OpenId, templateId, url, message);
            }
            catch (Exception ex)
            {
                sendResult = new SendTemplateMessageResult()
                {
                    errcode = Senparc.Weixin.ReturnCode.系统繁忙此时请开发者稍候再试,
                    errmsg  = ex.Message
                };
            }
            //更新提醒记录状态
            var remindLog = RemindLogManager.GetAll().IgnoreQueryFilters().Where(o => o.Id == args.RemindLogId).SingleOrDefault();

            if (remindLog != null)
            {
                remindLog.Success = sendResult.ErrorCodeValue == 0;
                remindLog.SetPropertyValue("errCode", sendResult.errcode);
                remindLog.SetPropertyValue("errMsg", sendResult.errmsg);
                RemindLogManager.UpdateAsync(remindLog).GetAwaiter().GetResult();
            }
        }
Example #15
0
 public ProcessTaskManagerTests()
 {
     store   = new ProcessTaskStore();
     manager = new ProcessTaskManager(store);
 }
Example #16
0
        /// <summary>
        /// 获取一段时间内加工点的报工数据对比报表
        /// </summary>
        /// <param name="processTypeId"></param>
        /// <param name="startDate"></param>
        /// <param name="endDate"></param>
        /// <returns></returns>
        public virtual async Task <List <MESUnitReportRankDto> > GetUnitRankReport(int?processTypeId, DateTime?startDate, DateTime?endDate)
        {
            var allUnits = await Manager.GetAllList();

            var result = new List <MESUnitReportRankDto>();
            //如果不传入时间,默认查询所有加工单
            var queryStartDate = startDate ?? DateTime.Parse("2018-01-01");
            var queryEndDate   = endDate ?? DateTime.Now;

            var taskBaseQuery = ProcessTaskManager.GetAll()
                                .Include(o => o.ProcessTaskReports)
                                .WhereIf(processTypeId != null, o => o.ProcessTypeId == processTypeId)
                                .Where(o => o.Status == null || !o.Status.Contains(ProcessTask.Status_Inner))         //非厂内任务
                                .Where(o => o.SupplierId != null && o.ProcessTaskStatus != ProcessTaskStatus.Inputed) //已选择加工点且已开单
                                .Where(o => o.KaiDate >= queryStartDate && o.KaiDate <= queryEndDate)
                                                                                                                      //.Where(o => MESDbContext.GetJsonValueString(o.Property, "$.KaiDate") > queryStartDate.ToString("yyyy-MM-dd HH:mm:ss") && MESDbContext.GetJsonValueString(o.Property, "$.KaiDate") < queryEndDate.ToString("yyyy-MM-dd HH:mm:ss"))//开单日期在时间段内
            ;

            var units = (await taskBaseQuery.GroupBy(o => o.SupplierId).Select(o => new { UnitId = o.Key }).ToListAsync())
                        .Where(o => allUnits.Exists(u => u.Id == o.UnitId));

            foreach (var unit in units)
            {
                var reportDto = await GetUnitReport(unit.UnitId.Value, taskBaseQuery);

                reportDto.UnitName = allUnits.Single(a => a.Id == unit.UnitId.Value).UnitName;
                result.Add(reportDto);
                //var taskQueryBySupplier = taskBaseQuery.Where(o => o.SupplierId == unit.UnitId);
                ////总任务数
                //var taskCount = await taskQueryBySupplier.CountAsync();
                ////总报工记录数
                //var reportCount = await taskQueryBySupplier.SelectMany(o => o.ProcessTaskReports).CountAsync();
                ////有报工的任务数
                //var reportTaskCount = await taskQueryBySupplier.Where(o => o.ProcessTaskReports.Count > 0).CountAsync();
                ////todo:完成报工的任务数量的计算方式
                //var completedCount =await taskQueryBySupplier.Where(o => o.EndDate != null).CountAsync();
                ////延期上机任务数
                //var delayStartCount =await taskQueryBySupplier.Where(o => o.AppointDate != null && ((o.StartDate != null && o.StartDate > o.AppointDate) || (o.StartDate == null && DateTime.Now > o.AppointDate))).CountAsync();
                ////延期下机任务数
                //var delayEndCount =await taskQueryBySupplier.Where(o => o.RequireDate != null && ((o.EndDate != null && o.EndDate > o.RequireDate) || (o.EndDate == null && DateTime.Now > o.RequireDate))).CountAsync();
                ////超时任务数
                //var overHourCount=await taskQueryBySupplier.Where(o => o.EstimateHours != null && o.ActualHours != null && o.ActualHours > o.EstimateHours).CountAsync();
                ////不合格任务数
                //var NGCount =await taskQueryBySupplier.Where(o => MESDbContext.GetJsonValueNumber(o.Property, "$.QuanlityType") == (int)QuanlityType.不合格).CountAsync();
                //result.Add(new MESUnitReportRankDto()
                //{
                //    UnitId=unit.UnitId??0,
                //    UnitName=allUnits.Single(a=>a.Id==unit.UnitId.Value).UnitName,
                //    TaskCount= taskCount,
                //    ReportCount= reportCount,
                //    ReportTaskCount= reportTaskCount,
                //    CompletedCount= completedCount,
                //    DelayStartCount= delayStartCount,
                //    DelayEndCount= delayEndCount,
                //    OverHourCount= overHourCount,
                //    NGCount= NGCount
                //});
            }

            return(result);
        }
        /// <summary>
        /// 添加或编辑询价信息
        /// </summary>
        /// <param name="processQuoteSubmitDto"></param>
        /// <param name="isPublish"></param>
        /// <returns></returns>
        public virtual async Task SubmitProcessQuote(ProcessQuoteSubmitDto processQuoteSubmitDto, bool isPublish = false)
        {
            if (string.IsNullOrEmpty(processQuoteSubmitDto.QuoteName))
            {
                throw new UserFriendlyException(L("请输入询价名称"));
            }

            if (processQuoteSubmitDto.ProcessQuoteTasks.Count == 0)
            {
                throw new UserFriendlyException(L("询价明细数量不能为0"));
            }
            if (processQuoteSubmitDto.QuoteScope == QuoteScope.邀请投标 && processQuoteSubmitDto.UnitIds.Count == 0)
            {
                throw new UserFriendlyException(L("邀请投标的请至少选择一个加工点"));
            }


            ProcessQuote processQuote = null;
            var          manager      = Manager as ProcessQuoteManager;

            if (processQuoteSubmitDto.Id == 0)
            {
                #region 添加
                processQuote = processQuoteSubmitDto.MapTo <ProcessQuote>();
                processQuote.ProcessQuoteBids = new List <ProcessQuoteBid>();
                foreach (var addUnitId in processQuoteSubmitDto.UnitIds)
                {
                    var unit = await MESUnitManager.GetByIdFromCacheAsync(addUnitId);

                    var unitTenantBinded = unit.IsTenantBinded();
                    //发布状态下,往来单位必须绑定账号
                    if (isPublish && !unitTenantBinded)
                    {
                        throw new UserFriendlyException($"{unit.UnitName}尚未绑定模来模往账号");
                    }
                    //产生新的投标明细
                    var quoteBid = new ProcessQuoteBid()
                    {
                        UnitId         = addUnitId,
                        ToTenantId     = unit.GetTenantId(),
                        QuoteBidStatus = unitTenantBinded ? QuoteBidStatus.未发送 : QuoteBidStatus.未加入
                    };
                    processQuote.ProcessQuoteBids.Add(quoteBid);
                }
                await manager.InsertAsync(processQuote);

                #endregion
            }
            else
            {
                processQuote = await Manager.GetAll()
                               .Include(o => o.ProcessQuoteTasks)
                               .Include(o => o.ProcessQuoteBids)
                               .Where(o => o.Id == processQuoteSubmitDto.Id).SingleAsync();

                if (processQuote.QuoteStatus != QuoteStatus.草稿)
                {
                    throw new UserFriendlyException(L("只有草稿状态的询价单才能修改"));
                }

                processQuote.QuoteName    = processQuoteSubmitDto.QuoteName;
                processQuote.QuoteScope   = processQuoteSubmitDto.QuoteScope;
                processQuote.QuotePayType = processQuoteSubmitDto.QuotePayType;
                processQuote.ExpireDate   = processQuoteSubmitDto.ExpireDate;
                processQuote.Files        = processQuoteSubmitDto.Files;

                #region 询价明细的保存
                //新增
                var addedTasks = processQuoteSubmitDto.ProcessQuoteTasks.Where(o => o.Id == 0).MapTo <List <ProcessQuoteTask> >();
                foreach (var addTask in addedTasks)
                {
                    processQuote.ProcessQuoteTasks.Add(addTask);
                }
                //修改
                foreach (var oldTask in processQuote.ProcessQuoteTasks.Where(o => processQuoteSubmitDto.ProcessQuoteTasks.Exists(m => m.Id == o.Id)))
                {
                    var newTask = processQuoteSubmitDto.ProcessQuoteTasks.Single(o => o.Id == oldTask.Id);
                    newTask.MapTo(oldTask);
                }
                //删除
                var deletedTaskIds = processQuote.ProcessQuoteTasks.Where(o => !processQuoteSubmitDto.ProcessQuoteTasks.Exists(m => m.Id == o.Id))
                                     .Select(o => o.Id);

                await ProcessQuoteTaskRepository.DeleteAsync(o => deletedTaskIds.Contains(o.Id));

                #endregion

                #region 投标明细的保存
                //新增
                var addedUnitIds = processQuoteSubmitDto.UnitIds.Where(o => processQuote.ProcessQuoteBids.Count(b => b.UnitId == o) < 0);
                foreach (var addUnitId in addedUnitIds)
                {
                    var unit = await MESUnitManager.GetByIdFromCacheAsync(addUnitId);

                    var unitTenantBinded = unit.IsTenantBinded();
                    //发布状态下,往来单位必须绑定账号
                    if (isPublish && !unitTenantBinded)
                    {
                        throw new UserFriendlyException($"{unit.UnitName}尚未绑定模来模往账号");
                    }
                    //产生新的投标明细
                    var quoteBid = new ProcessQuoteBid()
                    {
                        UnitId         = addUnitId,
                        ToTenantId     = unit.GetTenantId(),
                        QuoteBidStatus = unitTenantBinded ? QuoteBidStatus.未发送 : QuoteBidStatus.未加入
                    };
                    processQuote.ProcessQuoteBids.Add(quoteBid);
                }
                //删除
                var deletedBidIds = processQuote.ProcessQuoteBids.Where(o => !processQuoteSubmitDto.UnitIds.Exists(m => m == o.UnitId))
                                    .Select(o => o.Id);
                await ProcessQuoteBidRepository.DeleteAsync(o => deletedBidIds.Contains(o.Id));

                #endregion

                await Manager.UpdateAsync(processQuote);
            }

            await CurrentUnitOfWork.SaveChangesAsync();

            //设置询价中的所有询价任务为“已询价状态"
            var tasks = await ProcessTaskManager.GetAll()
                        .Where(o => processQuote.ProcessQuoteTasks.Where(t => t.ProcessTaskId.HasValue).Select(t => t.ProcessTaskId).Contains(o.Id))
                        .ToListAsync();

            foreach (var task in tasks)
            {
                task.SetStatus(ProcessTask.Status_Quoted);
            }
            //发布
            if (isPublish)
            {
                await manager.Publish(processQuote.Id);
            }
        }