using cylsg.Application.Orders.Dtos;
using cylsg.Application.Users.Dtos;
using cylsg.Core;
using cylsg.Model.OrderModel;
using cylsg.Model.UserModel;
using Furion.LinqBuilder;
using MapsterMapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinAccountGetAccountBasicInfoResponse.Types;
namespace cylsg.Application.Orders
{
///
/// 订单公司接口
///
public class OrderCompanyAppService : IDynamicApiController
{
private readonly ISystemService _systemService;
private ISqlSugarClient _sqlSugarClient;
private IMapper _mapper;
public OrderCompanyAppService(ISystemService systemService, ISqlSugarClient sqlSugarClient, IMapper mapper)
{
_systemService = systemService;
_sqlSugarClient = sqlSugarClient;
_mapper = mapper;
}
///
/// 查询公司已经发布的招工订单
///
///
///
[Authorize]
[HttpPost]
public async Task> PostMyListPage(OrderPageSearch page)
{
var UserID = App.User?.FindFirstValue("UserID");
int userid = 0;
if (!string.IsNullOrEmpty(UserID))
{
userid = int.Parse(UserID);
}
PageResult result = new PageResult();
var orderRepository = new BaseRepository();
var userCompanyRes = new BaseRepository();
//查询公司的所有员工的所有招工订单
var userCompany = await userCompanyRes.GetFirstAsync(x => x.UserId == userid && x.IsEn == true && x.IsDeleted == false);
if (userCompany == null)
{
throw Oops.Oh("你没有公司!");
}
var userCompanies = await userCompanyRes.GetListAsync(x => x.Suppliercode == userCompany.Suppliercode && x.IsEn == true && x.IsDeleted == false);
var userids = userCompanies.Select(x => x.UserId).ToList();
Expression> expression = t => true;
expression = expression.And(t => t.IsDeleted == false && t.IsEn == true
&& userids.Contains(t.OrderUserId)); //t.OrderUserId == userid
if (!string.IsNullOrEmpty(page.OrderName))
{
expression = expression.And(t => t.OrderName.Contains(page.OrderName));
}
if (page.WordStartTime.HasValue)
{
expression = expression.And(t => t.WordStartTime >= page.WordStartTime);
}
if (page.WordEndTime.HasValue)
{
expression = expression.And(t => t.WordStartTime <= page.WordEndTime);
}
RefAsync total = 0;
var orderBiddingRepository = new BaseRepository();
var data = await orderRepository.Context.Queryable()
.Where(expression)
.OrderByDescending(c => c.WordStartTime)
.ToPageListAsync(page.PageIndex, page.PageSize, total);
var datadto = _mapper.Map>(data);
if (datadto != null && datadto.Count > 0)
{
foreach (var orderDto in datadto)
{
switch (orderDto.OrderStatus)
{
case (int)OrderStatuses.fabu: orderDto.OrderStatusName = "发布"; break;
case (int)OrderStatuses.zhaogongwanbi: orderDto.OrderStatusName = "招工完毕"; break;
case (int)OrderStatuses.jiesuanwanbi: orderDto.OrderStatusName = "结算完毕"; break;
default: break;
}
var orderBiddings = await orderBiddingRepository.CountAsync(x => x.OrderId == orderDto.Id && x.IsSelected == true && x.IsEn == true && x.IsDeleted == false);
orderDto.WorderCounted = orderBiddings;
}
}
result.Items = datadto;
result.PageIndex = page.PageIndex;
result.PageSize = page.PageSize;
result.TotalCount = total;
return result;
}
///
/// 保存招工信息(新增/修改)
///
///
[Authorize]
[HttpPost]
public async Task saveOrder(OrderDto orderDto)
{
var UserID = App.User?.FindFirstValue("UserID");
int userid = 0;
string NickName = App.User?.FindFirstValue("NickName");
if (!string.IsNullOrEmpty(UserID))
{
userid = int.Parse(UserID);
}
if (!string.IsNullOrEmpty(orderDto.OrderName) && orderDto.OrderName.Length > 100)
{
throw Oops.Oh("招工名称长度过长!");
}
if (!string.IsNullOrEmpty(orderDto.Demand) && orderDto.Demand.Length > 2000)
{
throw Oops.Oh("需求长度过长!");
}
if (!string.IsNullOrEmpty(orderDto.WorderAddress) && orderDto.WorderAddress.Length > 500)
{
throw Oops.Oh("工作地点长度过长!");
}
if (!string.IsNullOrEmpty(orderDto.ContactPhone) && orderDto.ContactPhone.Length > 30)
{
throw Oops.Oh("联系电话长度过长!");
}
var userCompanyRes = new BaseRepository();
var userCompany = await userCompanyRes.GetFirstAsync(p => p.UserId == userid && p.IsEn == true && p.IsDeleted == false);
if (userCompany == null || string.IsNullOrEmpty(userCompany.BusinessLicense))
{
throw Oops.Oh("请先完成公司认证才能发布招工!");
}
var orderRes = new BaseRepository();
bool res;
if (orderDto.Id > 0)
{
var order = await orderRes.GetByIdAsync(orderDto.Id);
if (order.OrderStatus > 0)
{
throw Oops.Oh("招工已经结束不能修改!");
}
var orderBiddingRes = new BaseRepository();
var count = await orderBiddingRes.CountAsync(x=>x.OrderId == orderDto.Id && x.IsEn == true && x.IsDeleted == true && x.IsSelected == true);
if (count > 0)
{
throw Oops.Oh("已经确认招工人员,不能修改!");
}
order.OrderName = orderDto.OrderName;
order.WordStartTime = orderDto.WordStartTime;
order.WordEndTime = orderDto.WordEndTime;
order.StartTime = orderDto.StartTime;
order.EndTime = orderDto.EndTime;
order.Demand = orderDto.Demand;
order.WorderCount = orderDto.WorderCount;
order.WorderAddress = orderDto.WorderAddress;
order.ContactPhone = orderDto.ContactPhone;
order.WorkerType = orderDto.WorkerType;
order.WorkPrice = orderDto.WorkPrice;
order.UpDataBy = NickName;
order.UpDataTime = DateTime.Now;
res = await orderRes.UpdateAsync(order);
}
else
{
var order = _mapper.Map(orderDto);
order.UpDataBy = NickName;
order.UpDataTime = DateTime.Now;
order.CreateBy = NickName;
order.CreateTime = DateTime.Now;
order.OrderStatus = 0;
order.OrderUserId = userid;
res = await orderRes.InsertAsync(order);
}
return res;
}
///
/// 公司选择工人
///
///
[Authorize]
[HttpPost]
public async Task saveQueRen(QueRenDto queRenDto)
{
var UserID = App.User?.FindFirstValue("UserID");
int userid = 0;
string NickName = App.User?.FindFirstValue("NickName");
if (!string.IsNullOrEmpty(UserID))
{
userid = int.Parse(UserID);
}
var orderBiddingRes = new BaseRepository();
var orderRes = new BaseRepository();
var orderBidding = await orderBiddingRes.GetByIdAsync(queRenDto.OrderBiddingId);
if (orderBidding == null || orderBidding.IsEn != true || orderBidding.IsDeleted == true )
{
throw Oops.Oh("该投递已经无效!");
}
if(orderBidding.IsSelected == true)
{
throw Oops.Oh("该投递已经确认,不能重复确认!");
}
var order = await orderRes.GetByIdAsync(orderBidding.OrderId);
if (order == null || order.OrderStatus > 0)
{
throw Oops.Oh("该招工状态已经无法投递!");
}
var orderBiddings = await orderBiddingRes.CountAsync(x => x.OrderId == orderBidding.OrderId && x.IsSelected == true && x.IsDeleted == false && x.IsEn == true);
if (orderBiddings >= order.WorderCount)
{
throw Oops.Oh("招工人数已经满了,不能报名!");
}
bool res;
orderBidding.IsSelected = true;
orderBidding.Selectedtime = DateTime.Now;
orderBidding.UpDataBy = NickName;
orderBidding.UpDataTime = DateTime.Now;
res = await orderBiddingRes.UpdateAsync(orderBidding);
if(order.WorderCount == (orderBiddings + 1))
{
order.OrderStatus = 1;
res = await orderRes.UpdateAsync(order);
}
return res;
}
///
/// 公司取消选择工人
///
///
[Authorize]
[HttpPost]
public async Task saveQuXiao(QueRenDto queRenDto)
{
var UserID = App.User?.FindFirstValue("UserID");
int userid = 0;
string NickName = App.User?.FindFirstValue("NickName");
if (!string.IsNullOrEmpty(UserID))
{
userid = int.Parse(UserID);
}
var orderBiddingRes = new BaseRepository();
var orderRes = new BaseRepository();
var orderBiddingDetailRes = new BaseRepository();
var orderBidding = await orderBiddingRes.GetByIdAsync(queRenDto.OrderBiddingId);
if (orderBidding == null || orderBidding.IsEn != true || orderBidding.IsDeleted == true)
{
throw Oops.Oh("该投递已经无效!");
}
if (orderBidding.IsSelected != true)
{
throw Oops.Oh("该投递没有确认,不能取消!");
}
var count = await orderBiddingDetailRes.CountAsync(x => x.OrderBiddingId == orderBidding.Id && x.IsEn == true && x.IsDeleted == false);
if (count>0)
{
throw Oops.Oh("该工人已有打卡信息,不能取消招工!");
}
var order = await orderRes.GetByIdAsync(orderBidding.OrderId);
bool res;
orderBidding.IsSelected = false;
orderBidding.Selectedtime = null;
orderBidding.UpDataBy = NickName;
orderBidding.UpDataTime = DateTime.Now;
res = await orderBiddingRes.UpdateAsync(orderBidding);
if (!res)
{
throw Oops.Oh("取消工人招工失败!");
}
order.OrderStatus = 0;
res = await orderRes.UpdateAsync(order);
return res;
}
///
/// 查询公司下工人的打卡记录
///
///
///
[Authorize]
[HttpPost]
public async Task> PostMyComDakaListPage(OrderDakaPageSearch page)
{
var UserID = App.User?.FindFirstValue("UserID");
int userid = 0;
if (!string.IsNullOrEmpty(UserID))
{
userid = int.Parse(UserID);
}
PageResult result = new PageResult();
var orderRepository = new BaseRepository();
var userCompanyRes = new BaseRepository();
//查询公司的所有员工的所有招工订单
var userCompany = await userCompanyRes.GetFirstAsync(x => x.UserId == userid && x.IsEn == true && x.IsDeleted == false);
if (userCompany == null)
{
throw Oops.Oh("你没有公司!");
}
var userCompanies = await userCompanyRes.GetListAsync(x => x.Suppliercode == userCompany.Suppliercode && x.IsEn == true && x.IsDeleted == false);
var userids = userCompanies.Select(x => x.UserId).ToList();
RefAsync total = 0;
var orderBiddingDetailCheckRepository = new BaseRepository();
var userWorkerRes = new BaseRepository();
var data = await orderRepository.Context.Queryable((a, b, c) =>
new JoinQueryInfos(JoinType.Inner, a.Id == b.OrderId,
JoinType.Inner, b.Id == c.OrderBiddingId
))
.Where((a, b, c) => a.IsEn == true && a.IsDeleted == false && b.IsEn == true && b.IsDeleted == false && c.IsEn == true && c.IsDeleted == false
&& b.IsSelected == true && userids.Contains(a.OrderUserId)) //a.OrderUserId == userid
.WhereIF(page.WordDate.HasValue, (a, b, c) => (c.WorkDate == page.WordDate))
.WhereIF(page.IsJieSuan.HasValue && page.IsJieSuan == true, (a, b, c) => (c.IsShenPi == 2))
.WhereIF(page.IsJieSuan.HasValue && page.IsJieSuan == false, (a, b, c) => (c.IsShenPi < 2))
.OrderByDescending((a,b,c) => c.WorkDate)
.Select((a, b, c) => new OrderDakaDto
{
OrderBiddingDetailId = c.Id,
OrderName = a.OrderName,
WorkDate = c.WorkDate,
WorkTime = c.WorkTime,
WorkerType = a.WorkerType,
WorkPrice = a.WorkPrice,
TodaySalary = c.TodaySalary,
IsShenPi = c.IsShenPi,
WorkCount = c.WorkCount,
WorkerUserId = b.WorkerUserId,
})
.ToPageListAsync(page.PageIndex, page.PageSize, total);
if (data != null && data.Count > 0)
{
foreach (var dakaDto in data)
{
int hours = 0;
int minutes = 0;
var orderBiddingDetailChecks = await orderBiddingDetailCheckRepository.GetListAsync(x => x.OrderBiddingDetailId == dakaDto.OrderBiddingDetailId && x.IsEn == true && x.IsDeleted == false);
string DakaMingxi = "";
for (int i = 0; i < orderBiddingDetailChecks.Count; i++)
{
if (i != orderBiddingDetailChecks.Count - 1)
{
DakaMingxi += orderBiddingDetailChecks[i].Checktime.Value.ToString("HH:mm") + "-";
}
else
{
DakaMingxi += orderBiddingDetailChecks[i].Checktime.Value.ToString("HH:mm");
}
if (i == 1 || i == 3 || i == 5 || i == 7 || i == 9 || i == 11 || i == 13 || i == 15 || i == 17 || i == 19)
{
var timeDifference = orderBiddingDetailChecks[i].Checktime.Value - orderBiddingDetailChecks[i - 1].Checktime.Value;
hours += timeDifference.Hours;
minutes += timeDifference.Minutes;
}
}
//如果当天还没有填写申请,则计算工作时间和工资
if (dakaDto.IsShenPi == 0)
{
dakaDto.WorkTime = hours + (minutes / 60);
if (dakaDto.WorkerType == 0)
{
dakaDto.TodaySalary = dakaDto.WorkTime * dakaDto.WorkPrice;
}
else
{
var WorkCount = dakaDto.WorkCount ?? 0;
dakaDto.TodaySalary = WorkCount * dakaDto.WorkPrice;
}
}
switch (dakaDto.IsShenPi)
{
case (int)IsShenPis.baocun: dakaDto.IsShenPiName = "未结算"; break;
case (int)IsShenPis.tijiao: dakaDto.IsShenPiName = "未结算"; break;
case (int)IsShenPis.yishenpi: dakaDto.IsShenPiName = "已结算"; break;
default: break;
}
switch (dakaDto.WorkerType)
{
case (int)WorkerTypes.time: dakaDto.WorkerTypeName = "计时"; break;
case (int)WorkerTypes.count: dakaDto.WorkerTypeName = "计价"; break;
default: break;
}
dakaDto.DakaMingxi = DakaMingxi;
var userWorker = await userWorkerRes.GetFirstAsync(x => x.UserId == dakaDto.WorkerUserId && x.IsEn == true && x.IsDeleted == false );
if (userWorker != null)
{
dakaDto.WorkerUserName = userWorker.name;
}
}
}
result.Items = data;
result.PageIndex = page.PageIndex;
result.PageSize = page.PageSize;
result.TotalCount = total;
return result;
}
///
/// 公司确认工人当天打卡详情
///
///
[Authorize]
[HttpPost]
public async Task saveDakaDetail(DakaQuerenDetailDto dakaDto)
{
var UserID = App.User?.FindFirstValue("UserID");
int userid = 0;
string NickName = App.User?.FindFirstValue("NickName");
if (!string.IsNullOrEmpty(UserID))
{
userid = int.Parse(UserID);
}
var orderBiddingRes = new BaseRepository();
var orderRes = new BaseRepository();
var orderBiddingDetailRes = new BaseRepository();
var userTiXianDetailRes = new BaseRepository();
//var OrderBiddingDetailCheckRes = new BaseRepository();
var userWorkerRes = new BaseRepository();
var userCompanyRes = new BaseRepository();
var orderBiddingDetail = await orderBiddingDetailRes.GetByIdAsync(dakaDto.OrderBiddingDetailId);
var orderBidding = await orderBiddingRes.GetByIdAsync(orderBiddingDetail.OrderBiddingId);
var order = await orderRes.GetByIdAsync(orderBidding.OrderId);
if (orderBidding == null || orderBidding.IsDeleted == true || orderBidding.IsEn == false || orderBidding.IsSelected != true)
{
throw Oops.Oh("该投递状态无法打卡确认!");
}
//if (order == null || order.OrderStatus > 1)
//{
// throw Oops.Oh("该招工状态已无法打卡确认!");
//}
var res = false;
try
{
var TodaySalary = orderBiddingDetail.TodaySalary.HasValue? orderBiddingDetail.TodaySalary.Value:0;
if(orderBiddingDetail.IsShenPi == (int)IsShenPis.yishenpi)
{
TodaySalary = dakaDto.TodaySalary.Value - TodaySalary;
}
else
{
TodaySalary = dakaDto.TodaySalary.Value;
}
orderRes.Context.Ado.BeginTran();
orderBiddingDetail.WorkTime = dakaDto.WorkTime;
orderBiddingDetail.WorkCount = dakaDto.WorkCount;
orderBiddingDetail.TodaySalary = dakaDto.TodaySalary;
orderBiddingDetail.IsShenPi = (int)IsShenPis.yishenpi;
orderBiddingDetail.ShenPitime = DateTime.Now;
orderBiddingDetail.UpDataBy = NickName;
orderBiddingDetail.UpDataTime = DateTime.Now;
orderBiddingDetail.IsTiXian = true;
orderBiddingDetail.TiXiantime = DateTime.Now;
//orderBiddingDetail.CreateBy = NickName;
//orderBiddingDetail.CreateTime = DateTime.Now;
res = await orderBiddingDetailRes.UpdateAsync(orderBiddingDetail);
if (!res)
{
orderRes.Context.Ado.RollbackTran();
throw Oops.Oh("结算失败!");
}
var userCompany = await userCompanyRes.GetFirstAsync(x => x.UserId == order.OrderUserId);
if (userCompany!=null )
{
var userCompanies = await userCompanyRes.CountAsync(x => x.Suppliercode == userCompany.Suppliercode && x.IsEn == true && x.IsDeleted == false && x.IsTiXian == true);
if (userCompanies > 0)
{
//插入用户的结算金额
UserTiXianDetail userTiXianDetail = new UserTiXianDetail();
userTiXianDetail.UserId = orderBidding.WorkerUserId;
userTiXianDetail.YiTiXianJine = TodaySalary;
userTiXianDetail.ZhiChuShouRu = (int)ZhiChuShouRus.shouru;
userTiXianDetail.Remark = userCompany.Suppliername + " " + orderBiddingDetail.WorkDate.Value.ToString("yyyy-MM-dd");
userTiXianDetail.UpDataBy = NickName;
userTiXianDetail.UpDataTime = DateTime.Now;
userTiXianDetail.CreateBy = NickName;
userTiXianDetail.CreateTime = DateTime.Now;
res = await userTiXianDetailRes.InsertAsync(userTiXianDetail);
if (!res)
{
orderRes.Context.Ado.RollbackTran();
throw Oops.Oh("结算失败!");
}
var userWorker = await userWorkerRes.GetFirstAsync(x => x.UserId == orderBidding.WorkerUserId);
if (userWorker != null)
{
var TiXianZonge = userWorker.TiXianZonge ?? 0;
userWorker.TiXianZonge = TiXianZonge + TodaySalary;
res = await userWorkerRes.UpdateAsync(userWorker);
if (!res)
{
orderRes.Context.Ado.RollbackTran();
throw Oops.Oh("结算失败!");
}
}
}
}
//判断订单是否可以修改为结算状态
if (order.WordEndTime <= DateTime.Now)
{
var sss = await orderBiddingRes.GetListAsync(x => x.OrderId == order.Id && x.IsEn == true && x.IsDeleted == false && x.IsSelected == true);
var bbb =sss.Select(x => x.Id).ToList();
var oCount = await orderBiddingDetailRes.CountAsync(x => bbb.Contains(x.OrderBiddingId) && x.IsEn == true && x.IsDeleted == false && x.IsShenPi != (int)IsShenPis.yishenpi);
if (oCount == 0)
{
order.OrderStatus = (int)OrderStatuses.jiesuanwanbi;
res = await orderRes.UpdateAsync(order);
if (!res)
{
orderRes.Context.Ado.RollbackTran();
throw Oops.Oh("结算失败!");
}
}
}
orderRes.Context.Ado.CommitTran();
}
catch (Exception ex )
{
orderRes.Context.Ado.RollbackTran();
throw Oops.Oh(ex.Message);
}
return res;
}
///
/// 查询公司下所有员工
///
///
///
[Authorize]
[HttpPost]
public async Task> PostMystaffList()
{
var UserID = App.User?.FindFirstValue("UserID");
int userid = 0;
if (!string.IsNullOrEmpty(UserID))
{
userid = int.Parse(UserID);
}
var userCompanyRes = new BaseRepository();
var userRes = new BaseRepository();
var userCompany = await userCompanyRes.GetFirstAsync(x => x.UserId == userid && x.IsEn == true && x.IsDeleted == false);
if (userCompany == null)
{
throw Oops.Oh("你没有公司!");
}
var userCompanies = await userCompanyRes.GetListAsync(x => x.Suppliercode == userCompany.Suppliercode && x.IsEn == true && x.IsDeleted == false);
var datadtos = _mapper.Map>(userCompanies);
foreach (var datadto in datadtos)
{
var user = await userRes.GetByIdAsync(datadto.UserId);
datadto.Nickname = user.Nickname;
}
return datadtos;
}
///
/// 保存公司下所有员工是否管理员
///
///
///
[Authorize]
[HttpPost]
public async Task SaveStaffAdmin(StaffAdminDto staffAdminDto)
{
var UserID = App.User?.FindFirstValue("UserID");
int userid = 0;
string NickName = App.User?.FindFirstValue("NickName");
if (!string.IsNullOrEmpty(UserID))
{
userid = int.Parse(UserID);
}
var userCompanyRes = new BaseRepository();
var res = false;
var userCompany = await userCompanyRes.GetByIdAsync(staffAdminDto.ComId);
if(staffAdminDto.IsAdmin == false)
{
var userCompanies = await userCompanyRes.CountAsync(x => x.Suppliercode == userCompany.Suppliercode && x.Id != userCompany.Id && x.IsAdmin == true && x.IsEn == true && x.IsDeleted == false);
if (userCompanies <= 0)
{
throw Oops.Oh("一个公司必须至少一个管理员!");
}
}
if (userCompany != null)
{
userCompany.IsAdmin = staffAdminDto.IsAdmin;
userCompany.UpDataBy = NickName;
userCompany.UpDataTime = DateTime.Now;
res = await userCompanyRes.UpdateAsync(userCompany);
}
return res;
}
}
}