知识点:
在ABP框架中,AppService 等是自带UnitOfWork的。然后其他的例如 后台任务(BackgroundWork)、定时任务(AbpQuartz)等的Excute方法没有自带UnitOfWork特性。2._unitOfWorkManager.Current.SaveChanges() 失效
这里,我想实现的是,在方法执行完之前将数据先入库,使用了_unitOfWorkManager.Current.SaveChanges();似乎没有效果,不知道是否和同步异步有啥关系,后来查了一下,方法上面加上 [UnitOfWork(false)]这个属性就好了,目前还不知道是啥原因。贴上源码有知道的大佬麻烦帮我看一下
/// <summary>
/// 新增
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
[UnitOfWork(false)]
public async Task<MaintenancePlanAndRuleDetailDto> CreateMaintenancePlan(MaintenancePlanAndRuleCreateDto input)
{
string token = _httpContextAccessor.HttpContext.Request.Headers["token"];
MaintenancePlanAndRuleDetailDto result = new MaintenancePlanAndRuleDetailDto();
List<MaintenanceRuleDetailDto> ruleDetailList = new List<MaintenanceRuleDetailDto>();
MaintenancePlanRuleCreateDto perRuleDetail = new MaintenancePlanRuleCreateDto();
List<string> ruleRowGuid = input.RuleRowGuids;
MaintenancePlanCreateDto planCreate = new MaintenancePlanCreateDto();
MaintenancePlanDetailDto planDetail = new MaintenancePlanDetailDto();
planCreate = new MaintenancePlanCreateDto();
planCreate.SystemName = input.SystemName;
planCreate.EquipmentRowGuid = input.EquipmentRowGuid;
planCreate.MaintancePeople = input.MaintancePeople;
planCreate.IsEnable = input.IsEnable;
planCreate.StartDate = input.StartDate;
planCreate.EndDate = input.EndDate;
planCreate.Creater = input.Creater;
var codeDtoStatus = (await _codeItemsAPIService.GetCodeMainByCode("EventStatus", token)).ToObject<ResponseCodeItemDto>().Result;
foreach (var code1 in codeDtoStatus)
{
if (code1.Label == "未开始")
{
planCreate.Status = code1.Value;
break;
}
}
planDetail = _objectMapper.Map<MaintenancePlanDetailDto>(_repository.Insert(_objectMapper.Map<Maintenance_Plan>(planCreate)));
if (ruleRowGuid != null && ruleRowGuid.Count>0) {
Maintenance_Rule ruleDB = _maintenanceRuleRepository.GetAllList().Where(e => e.Id == ruleRowGuid.FirstOrDefault()).FirstOrDefault();
var codeDtoone = (await _codeItemsAPIService.GetCodeMainByCode("System", token)).ToObject<ResponseCodeItemDto>().Result;
string systemName = "";
foreach (var code1 in codeDtoone)
{
if (ruleDB.SystemName == code1.Value)
{
systemName = code1.Label;
break;
}
}
var equipmentDB = _archvieEquipmentRepository.GetAllList().Where(e => e.Id == ruleDB.EquipmentName).FirstOrDefault();
ruleDetailList = _objectMapper.Map<List<MaintenanceRuleDetailDto>>(_maintenanceRuleRepository.GetAllList().Where(e => e.SystemName == ruleDB.SystemName && e.EquipmentName == ruleDB.EquipmentName));
foreach (var perRuleDetailDB in ruleDetailList) {
perRuleDetailDB.Select = false;
}
//result.SystemRuleLabel = systemName + "," + equipmentDB.EquipmentName;
result.SystemRuleLabel = systemName + "," + ruleDB.EquipmentName;
}
foreach (var perRuleId in ruleRowGuid)
{
perRuleDetail.PlanRowGuid = planDetail.Id;
perRuleDetail.RuleRowGuid = perRuleId;
Maintenance_PlanRule planRule= _maintenancePlanRuleRepository.Insert(_objectMapper.Map<Maintenance_PlanRule>(perRuleDetail));
_unitOfWorkManager.Current.SaveChanges();
//如果启用,创建定时job
if (input.IsEnable.Value)
{
var rule = _maintenanceRuleRepository.GetAll().Where(e => e.Id == perRuleId).FirstOrDefault();
var codeDtoone = (await _codeItemsAPIService.GetCodeMainByCode("MaintainType", token)).ToObject<ResponseCodeItemDto>().Result;
string type = "";
foreach (var code1 in codeDtoone)
{
if (rule.MaintainType == code1.Value)
{
type = code1.Label;
break;
}
}
var codeDtotwo = (await _codeItemsAPIService.GetCodeMainByCode("Cycle", token)).ToObject<ResponseCodeItemDto>().Result;
string unitName = "";
foreach (var code2 in codeDtotwo)
{
if (rule.TimeUnit == code2.Value)
{
unitName = code2.Label;
break;
}
}
await _jobService.ScheduleJobByPlan(planRule.Id, input.StartDate.Value, input.EndDate.Value, type, unitName, rule.Cycle.Value, true);
}
foreach (var perPlanRule in ruleDetailList) {
if (perPlanRule.Id == perRuleId) {
perPlanRule.Select = true;
}
}
}
result.SystemName = planDetail.SystemName;
var equipDB = _archvieEquipmentRepository.GetAllList().Where(e => e.Id == planDetail.EquipmentRowGuid).FirstOrDefault();
if (equipDB != null)
{
result.EquipmentName = equipDB.EquipmentName;
}
result.EquipmentRowGuid = planDetail.EquipmentRowGuid;
result.MaintancePeople = planDetail.MaintancePeople;
result.IsEnable = planDetail.IsEnable;
result.StartDate = planDetail.StartDate;
result.EndDate = planDetail.EndDate;
result.Creater = planDetail.Creater;
result.ruleDetail = ruleDetailList;
result.Id = planDetail.Id;
return await Task.FromResult(result);
}