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)); //} }
/// <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); }
/// <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); }
/// <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); }
/// <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> >()); }
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); }
/// <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); } }
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") }; })); }
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)); } }
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; } } }
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)); }
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}¤tTenantId={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(); } }
public ProcessTaskManagerTests() { store = new ProcessTaskStore(); manager = new ProcessTaskManager(store); }
/// <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); } }