using cylsg.Model.ECTEModel;
using cylsg.Model.utilityViewModel;
using ECTESTOA;
using Furion.LinqBuilder;
using Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.UnionShopTargetAddPlanRequest.Types;
namespace cylsg.Application.CyOS
{
///
/// 财务报销控制器
///
[Authorize]
[ApiDescriptionSettings("CYOA")]
public class CyOSBaoXiaoCaiWuController: IDynamicApiController
{
private static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1);
private readonly IOAServices _OAServices;
private readonly ISqlSugarClient _SugarClient;
private ECTESTOAPermissions Permissions;
public CyOSBaoXiaoCaiWuController(IOAServices oaservices, ISqlSugarClient sugarClient)
{
_OAServices = oaservices;
_SugarClient = sugarClient.AsTenant().GetConnection("ECTESTOADB");
}
///
/// 查询
///
[HttpPost]
public async Task getplanelist(SearchOaWorekPlan param)
{
if (!await CheckRols())
{
throw Oops.Oh("没有权限");
}
Expression> SearchList = (x) => true;
SearchList = SearchList.And(x => x.ApprovalStatus != PlanStatusType.Uncommitted);
//川印工作单
SearchList = SearchList.And(x => x.MemberId == _OAServices.firmId);
SearchList = SearchList.And(x => x.PlanType == 3);
SearchList = SearchList.And(x => x.PlanDataType == 17);
//必须是审批完成后的单
SearchList = SearchList.And(x=>x.ApprovalStatus== PlanStatusType.Yes);
if (!string.IsNullOrEmpty(param.StaffName))
{
SearchList = SearchList.And(x => x.SentStaff.Name.Contains(param.StaffName));
}
if (param.StaffMemberIdId != null)
{
SearchList = SearchList.And(x => x.SentStaffId == param.StaffMemberIdId);
}
if (param.PlanDataType > 0)
{
SearchList = SearchList.And(x => x.PlanDataType == param.PlanDataType);
}
if (param.PlanStartTimeStart != null)
{
SearchList = SearchList.And(x => x.PlanStartTime > param.PlanStartTimeStart);
}
if (param.PlanStartTimeEnd != null)
{
SearchList = SearchList.And(x => x.PlanStartTime <= param.PlanStartTimeEnd.Value.AddDays(1));
}
////审批状态
//if (param.ApprovalStatus != null)
//{
// SearchList = SearchList.And(x => x.ApprovalStatus == param.ApprovalStatus);
//}
//报销状态
if (param.EvaluationStatus != null)
{
SearchList = SearchList.And(x => x.EvaluationStatus == param.EvaluationStatus);
}
//强制增加员工过滤
RefAsync totle = 0;
var data = await _SugarClient.Queryable().Includes(x => x.OaWorkPlanShenpis).Includes(x=>x.SentStaff)
.Where(SearchList).OrderByDescending(x => x.MemberId).ToPageListAsync(param.page.PageIndex, param.page.PageSize, totle);
param.page.TotalCount = totle;
var sum = await _SugarClient.Queryable()
.Where(SearchList).SumAsync(x => x.PlanMoney);
return new WorekPlandto
{
list = data,
page = param.page,
TotalMoney = sum ?? 0
};
}
///
/// 获取报销单详情
///
///
///
[HttpGet]
public async Task GetPlanInfo(int id)
{
if (!await CheckRols())
{
throw Oops.Oh("没有权限");
}
return await _SugarClient.Queryable().Includes(x => x.OaWorkPlanShenpis,y=>y.ApprovalStaff).Includes(x => x.SentStaff).Includes(x => x.Depart).Includes(x=>x.WorkPlanAttachments).Where(x => x.Keyid == id).FirstAsync();
}
///
/// 报销
///
///
[HttpPost]
public async Task ApprovalPlan(OaWorkPlan plan)
{
// 等待信号量
await _semaphore.WaitAsync();
try
{
if (plan.Keyid == 0)
throw Oops.Oh("ID错误");
if (plan.FirmAccountId == null)
throw Oops.Oh("必须选择银行账号");
if (!await CheckRols())
{
throw Oops.Oh("没有权限");
}
var FirmAccount = await _SugarClient.Queryable().Where(x => x.FirmId == _OAServices.firmId && x.Keyid == plan.FirmAccountId && x.Status == true).FirstAsync();
if (FirmAccount == null)
throw Oops.Oh("账号错误");
var data = await _SugarClient.Queryable().Includes(x => x.SentStaff).Where(x => x.Keyid == plan.Keyid).FirstAsync();
if (data == null)
throw Oops.Oh("没有找到报销单");
if (data.ApprovalStatus != PlanStatusType.Yes)
throw Oops.Oh("未审批完成,不可报销");
if (data.EvaluationStatus != BaoxiaoStausType.Reimbursed)
{
await _SugarClient.AsTenant().BeginTranAsync();
try
{
data.EvaluationStatus = BaoxiaoStausType.Reimbursed;
//data.PlanContent = plan.PlanContent;
data.LastUpdateTime = DateTime.Now;
await _SugarClient.Updateable(data).ExecuteCommandAsync();
FirmAccount.LastUpdateTime = DateTime.Now;
FirmAccount.Balance -= (Math.Round(data.PlanMoney ?? 0, 2));
FirmAccount.AllExpenses += (Math.Round(data.PlanMoney ?? 0, 2));
await _SugarClient.Updateable(FirmAccount).ExecuteCommandAsync();
OA_FirmAccountRecord rec = new OA_FirmAccountRecord
{
AccountId = FirmAccount.Keyid,
Money = data.PlanMoney ?? 0,
LastUpdateTime = DateTime.Now,
Department = data.PlanContent,
RecordTypeId = 2,
SubjectId = 3,//报销必须为3
Operator = Permissions.Name,
PaymentUnit = data.SentStaff.Name,
ResidualAmount = FirmAccount.Balance,
OperationalMatters = data.PlanContent,
};
await _SugarClient.Insertable(rec).ExecuteCommandAsync();
await _SugarClient.Updateable(data).ExecuteCommandAsync();
await _SugarClient.AsTenant().CommitTranAsync();
return true;
}
catch (Exception)
{
await _SugarClient.AsTenant().RollbackTranAsync();
throw;
}
}
return true;
}
catch(Exception e)
{
throw;
}
finally
{
// 释放信号量
_semaphore.Release();
}
}
///
/// 获取账户列表
///
///
[HttpGet]
public async Task> GetFirmAccountList()
{
return await _SugarClient.Queryable().Where(x => x.Status == true && x.FirmId == _OAServices.firmId).Select(x => new OA_FirmAccount
{
AccountName = x.AccountName,
AccountType = x.AccountType,
UserName = x.UserName,
Keyid=x.Keyid,
}).WithCache(3600).ToListAsync();
}
///
/// 判断是否具有权限
///
///
private async Task CheckRols()
{
var pr = await _OAServices.GetOAPermissions();
Permissions = pr;
if (pr != null && pr.MemberId != null)
{
if (pr.BF_IsCaiWu)
return true;
else return false;
}
else
return false;
}
}
}