using APT.BaseData.Domain.Entities;
using APT.BaseData.Domain.Entities.FM;
using APT.BaseData.Domain.Entities.PF;
using APT.BaseData.Domain.Enums;
using APT.BaseData.Domain.IServices.OP;
using APT.Infrastructure.Core;
using APT.Migrations;
using APT.MS.Domain.Entities.BS;
using APT.MS.Domain.Entities.HM;
using APT.MS.Domain.Entities.PF;
using APT.MS.Domain.Entities.SC;
using APT.MS.Domain.Enums;
using APT.Utility;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Transactions;
namespace APT.PF.WebApi.Controllers.Api
{
///
/// 审批角色
///
[Route("api/PF/PFApprovalRole")]
public partial class ApprovalRoleController : AuthorizeApiController
{
IOPTenantDBConnService OPTenantDBConnService { get; set; }
public ApprovalRoleController(IOPTenantDBConnService opTenantDBConnService)
{
OPTenantDBConnService = opTenantDBConnService;
}
///
/// 更新或新增数据
///
/// 对象实体
///
[HttpPost, Route("FullUpdate")]
public JsonActionResult FullUpdate([FromBody] T_PF_APPROVAL_ROLE entity)
{
return SafeExecute(() =>
{
var isHead = HeadHelper.GetIsHead(this.Request.Headers);
if (entity.ISHEAD && !isHead)
{
throw new Exception("子公司不能修改总公司角色信息!");
}
var orgId = APT.Infrastructure.Api.AppContext.CurrentSession.OrgId;
//var roleCodes = this.GetEntities(t => true, new BaseFilter(orgId)).Select(x => x.NAME).ToList();
//if (roleCodes.Contains(entity.NAME))
// throw new Exception("系统已存在审批角色编码为" + entity.NAME + "的数据,请勿重复!");
var departs = entity.Nav_ApproveDeparts;
entity.Nav_ApproveDeparts = null;
if (departs != null && departs.Any())
{
departs = departs.Where(t => !t.IS_DELETED).ToList();
}
if (departs != null && departs.Any())
{
departs.ForEach(t =>
{
t.ORG_ID = orgId;
t.APPROVAL_ROLE_ID = entity.ID;
t.Nav_Department = null;
});
}
List listRoles = new List();
var roles = entity.Nav_ApproveRoles;
entity.Nav_ApproveRoles = null;
if (roles == null)
{
var approveRole = this.GetEntity(t => t.ENABLE_STATUS == 0 && t.NAME.Contains("负责人"));
if (approveRole != null)
{
var role = new T_PF_APPROVE_OPERATION_ROLE();
role.ORG_ID = orgId;
role.APPROVAL_ROLE_ID = entity.ID;
role.ROLE_ID = approveRole.ID;
listRoles.Add(role);
}
}
List deleteIds = new List();
if (entity.ROLE_ID != null)
{
var datas = this.GetEntities(t => t.APPROVAL_ROLE_ID == entity.ID, new BaseFilter(orgId));
if (datas.Any())
{
var ids = datas.Select(t => t.ID).ToList();
deleteIds.AddRange(ids);
}
var role = new T_PF_APPROVE_OPERATION_ROLE();
role.ORG_ID = orgId;
role.APPROVAL_ROLE_ID = entity.ID;
role.ROLE_ID = entity.ROLE_ID;
listRoles.Add(role);
}
if (listRoles.Any())
{
listRoles = listRoles.Distinct(t => t.ROLE_ID).ToList();
}
Dictionary dicConn = null;
if (isHead)
{
dicConn = OPTenantDBConnService.GetConnDictionary(entity.ORG_ID);
if (dicConn == null)
{
throw new Exception("获取子公司链接失败,请关闭页面刷新后再试");
}
}
UnifiedCommit(() =>
{
if (entity != null)
UpdateEntityNoCommit(entity); //保存主表
if (departs != null && departs.Any())
BantchSaveEntityNoCommit(departs); //保存子表
if (listRoles != null && listRoles.Any())
BantchSaveEntityNoCommit(listRoles); //保存子表
if (deleteIds != null && deleteIds.Any())
BantchDeleteEntityNoCommit(deleteIds); //保存子表
});
//如果是总部 同时同步到各个子公司
if (isHead)
{
entity.ISHEAD = true;
entity.ROLE_ID = null;
entity.Nav_Role = null;
entity.Nav_ApproveRoles = null;
int EditC = 0;
//using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
//{
// try
// {
foreach (var item in dicConn)
{
try
{
entity.ORG_ID = item.Key;
using (var context = new MigrationContext(item.Value))
{
EditC = context.GetCount(e => e.ID == entity.ID);
if (EditC > 0)
{
context.UpdateEntity(entity);
context.SaveChanges();
//context.SaveChangesAsync();
}
else
{
context.AddEntity(entity);
context.SaveChanges();
//context.AddAsync(entity);
//context.SaveChangesAsync();
}
}
}
catch (Exception ex)
{
}
}
// //// 所有操作成功,提交事务
// scope.Complete();
// }
// catch (Exception ex)
// {
// // 发生异常,自动回滚(无需手动调用,scope 释放时未 Complete 则回滚)
// throw;
// }
//}
}
return true;
});
}
///
/// 批量添加节点
///
/// 参数
///
[HttpPost, Route("AddApproveRoles")]
public JsonActionResult AddApproveRoles([FromBody] KeywordFilter keywordFilter)
{
return base.SafeExecute(() =>
{
if (string.IsNullOrEmpty(keywordFilter.Parameter1))
throw new Exception("当前节点未选择!");
if (string.IsNullOrEmpty(keywordFilter.Parameter2) && string.IsNullOrEmpty(keywordFilter.Parameter3))
throw new Exception("上一节点和下一节点至少选择一个");
List detailNews = new List();
Guid newID = new Guid(keywordFilter.Parameter1);
var approveDetailTemps = this.GetEntities(t => !t.IS_DELETED, new BaseFilter(keywordFilter.OrgId));
var approveIds = approveDetailTemps.Select(t => t.APPROVE_ID).Distinct().ToList();
Guid? preID = null;
var approvalRole = this.GetEntity(t => t.ID == newID);
if (!string.IsNullOrEmpty(keywordFilter.Parameter2))
{
preID = new Guid(keywordFilter.Parameter2);
if (newID == preID)
{
throw new Exception("当前节点和上一节点不能相同");
}
}
Guid? nextID = null;
if (!string.IsNullOrEmpty(keywordFilter.Parameter3))
{
nextID = new Guid(keywordFilter.Parameter3);
if (newID == preID)
{
throw new Exception("当前节点和下一节点不能相同");
}
}
if (preID != null && nextID != null && preID == nextID)
{
throw new Exception("上一节点和下一节点不能相同");
}
if (approveIds != null && approveIds.Any())
{
foreach (var item in approveIds)
{
var temps = approveDetailTemps.Where(t => t.APPROVE_ID == item).OrderBy(m => m.NUM).ToList();
if (temps.Any())
{
var isExiest = temps.FirstOrDefault(t => t.APPROVE_ROLE_ID == newID);
if (isExiest == null)
{
if (preID != null && nextID != null)
{
var pre = temps.FirstOrDefault(t => t.APPROVE_ROLE_ID == preID);
var next = temps.FirstOrDefault(t => t.APPROVE_ROLE_ID == nextID);
if (pre != null && next != null)
{
var nextTemp = temps.Where(m => m.NUM > pre.NUM).OrderBy(t => t.NUM).FirstOrDefault();
if (next.NUM == nextTemp.NUM)
{
T_PF_APPROVE_TEMP_DETAIL detailNew = new T_PF_APPROVE_TEMP_DETAIL();
detailNew.ID = Guid.NewGuid();
detailNew.ORG_ID = keywordFilter.OrgId;
detailNew.APPROVE_ID = item;
detailNew.APPROVE_ROLE_ID = newID;
detailNew.NUM = next.NUM;
detailNew.DEPARTMENT_TYPE = approvalRole.DEPARTMENT_TYPE;
detailNew.NAME = approvalRole.NAME;
temps.Add(detailNew);
temps.Where(t => t.NUM >= detailNew.NUM && t.APPROVE_ROLE_ID != newID).ForEach(m => { m.NUM = m.NUM + 1; });
detailNews.AddRange(temps);
}
}
}
else if (preID != null && nextID == null)
{
var pre = temps.FirstOrDefault(t => t.APPROVE_ROLE_ID == preID);
if (pre != null)
{
T_PF_APPROVE_TEMP_DETAIL detailNew = new T_PF_APPROVE_TEMP_DETAIL();
detailNew.ID = Guid.NewGuid();
detailNew.ORG_ID = keywordFilter.OrgId;
detailNew.APPROVE_ID = item;
detailNew.APPROVE_ROLE_ID = newID;
detailNew.NUM = pre.NUM + 1;
detailNew.DEPARTMENT_TYPE = approvalRole.DEPARTMENT_TYPE;
detailNew.NAME = approvalRole.NAME;
temps.Add(detailNew);
temps.Where(t => t.NUM >= detailNew.NUM && t.APPROVE_ROLE_ID != newID).ForEach(m => { m.NUM = m.NUM + 1; });
detailNews.AddRange(temps);
}
}
else if (preID == null && nextID != null)
{
var next = temps.FirstOrDefault(t => t.APPROVE_ROLE_ID == nextID);
if (next != null)
{
T_PF_APPROVE_TEMP_DETAIL detailNew = new T_PF_APPROVE_TEMP_DETAIL();
detailNew.ID = Guid.NewGuid();
detailNew.ORG_ID = keywordFilter.OrgId;
detailNew.APPROVE_ID = item;
detailNew.APPROVE_ROLE_ID = newID;
detailNew.NUM = next.NUM;
detailNew.DEPARTMENT_TYPE = approvalRole.DEPARTMENT_TYPE;
detailNew.NAME = approvalRole.NAME;
temps.Add(detailNew);
temps.Where(t => t.NUM >= detailNew.NUM && t.APPROVE_ROLE_ID != newID).ForEach(m => { m.NUM = m.NUM + 1; });
detailNews.AddRange(temps);
}
}
}
}
}
}
UnifiedCommit(() =>
{
if (detailNews != null && detailNews.Any())
this.BantchSaveEntityNoCommit(detailNews);
});
return true;
});
}
}
}