using CoreCms.Net.Auth.HttpContextUser;
using CoreCms.Net.Caching.AutoMate.RedisCache;
using CoreCms.Net.Configuration;
using CoreCms.Net.DTO.WeChatShipping;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.IServices.CYOAServices;
using CoreCms.Net.Model.Entities.Expression;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Extensions;
using EC_SeckillInfo;
using EnumsNET;
using Essensoft.Paylink.Alipay.Domain;
using Nest;
using Newtonsoft.Json;
using NPOI.SS.Formula.Functions;
using SqlSugar;
using SqlSugar.Extensions;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinExpressDeliveryOpenMessageGetDeliveryListResponse.Types;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinGetCurrentSelfMenuInfoResponse.Types;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinQrcodeCreateRequest.Types.Action.Types;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinTagsMembersGetBlackListResponse.Types;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinUserInfoBatchGetRequest.Types;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.ScanProductAddV2Request.Types.Product.Types;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.SemanticSemproxySearchResponse.Types;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.WxaServiceMarketServiceGetServiceBuyerListResponse.Types.Buyer.Types;
namespace CoreCms.Net.Services.CYOAServices
{
///
/// 川印相关服务
///
public class CyinOAService: ICyinOAService
{
///
/// 是否是司机key
///
const string IsCYDbDbKey = "IsCYDbDbKey:";
///
/// 是否拥有川印教育局订单管理
///
const string IsSchoolID = "IsShoodsID:";
const string IsDeliverManageKey = "IsDeliverManageKey:";
private readonly ISqlSugarClient _CyDbClient;
private readonly IUnitOfWork _UnitOfWork;
private readonly IHttpContextUser _User;
private readonly ICoreCmsUserServices _coreCmsUserServices;
private readonly IRedisOperationRepository _redisOperationRepository;
private readonly string _UserMoble;
private string? _DriveName { get; set; }
public CyinOAService( IUnitOfWork unitOfWork,IHttpContextUser contextUser,ICoreCmsUserServices coreCmsUserServices,
IRedisOperationRepository redisOperationRepository,ICoreCmsUserServices coreCmsUser) {
_UnitOfWork = unitOfWork;
_CyDbClient = unitOfWork.GetDbClient().GetConnection(AppSettingsConstVars.CYDbDbID);
_User = contextUser;
_coreCmsUserServices = coreCmsUserServices;
_redisOperationRepository = redisOperationRepository;
_coreCmsUserServices= coreCmsUserServices;
_UserMoble = _coreCmsUserServices.QueryById(_User.ID).mobile??"没有找到用户";
}
///
/// 是否是学校方
///
///
public async Task IsSchooler()
{
if (_User?.ID == null)
{
throw new Exception("登录信息错误,请重新登录");
}
var user = _coreCmsUserServices.QueryById(_User.ID);
if (user == null)
{
throw new Exception("登录信息错误,请重新登录");
}
var isdrive = await _redisOperationRepository.Get(IsSchoolID + user.mobile);
if (string.IsNullOrEmpty(isdrive))
{
//没有键值
var data = await _CyDbClient.Queryable().Where(x => x.userMobile == user.mobile).FirstAsync();
if (data != null)
{
isdrive = "true";
}
else
isdrive = "false";
await _redisOperationRepository.StringSetAsync(IsSchoolID + user.mobile, isdrive, TimeSpan.FromMinutes(1));
}
//db.DbFirst.IsCreateAttribute().CreateClassFile("c:\\Demo\\5", "EC_SeckillInfo"); ;
//var data= db.Queryable().ToList();
//ret.data= data;
if (isdrive == "true")
{
return true;
}
else
{
return false;
}
}
///
/// 是否是送货管理员
///
///
///
public async Task IsDeliverManage()
{
var ret = new WebApiCallBack();
if (_User?.ID == null)
{
throw new Exception("登录信息错误,请重新登录");
}
var user = _coreCmsUserServices.QueryById(_User.ID);
if (user == null)
{
throw new Exception("登录信息错误,请重新登录");
}
var isdrive = await _redisOperationRepository.Get(IsDeliverManageKey + user.mobile);
if (string.IsNullOrEmpty(isdrive))
{
var FirmIds = AppSettingsConstVars.CyOsFirmIds;
var firmidlist = FirmIds?.Split(",")?.Select(x => new Guid(x));
var data = await _CyDbClient.Queryable().Where(x => x.Status == "在职" && x.MobieNum == user.mobile && x.BF_IsDeliverManage == true).FirstAsync();
if (data != null)
{
isdrive = "true";
}
else
isdrive = "false";
await _redisOperationRepository.StringSetAsync(IsDeliverManageKey + user.mobile, isdrive, TimeSpan.FromMinutes(1));
}
//db.DbFirst.IsCreateAttribute().CreateClassFile("c:\\Demo\\5", "EC_SeckillInfo"); ;
//var data= db.Queryable().ToList();
//ret.data= data;
if (isdrive == "true")
{
return true;
}
else
{
return false;
}
}
///
/// 是否是司机
///
///
public async Task IsDrive()
{
var ret = new WebApiCallBack();
if (_User?.ID == null)
{
throw new Exception("登录信息错误,请重新登录");
}
var user = _coreCmsUserServices.QueryById(_User.ID);
if (user == null)
{
throw new Exception("登录信息错误,请重新登录");
}
var isdrive = await _redisOperationRepository.Get(IsCYDbDbKey + user.mobile);
if (string.IsNullOrEmpty(isdrive))
{
var FirmIds = AppSettingsConstVars.CyOsFirmIds;
var firmidlist = FirmIds?.Split(",")?.Select(x => new Guid(x));
var data = await _CyDbClient.Queryable().Where(x => x.Status == "在职" && x.MobieNum == user.mobile && x.BF_IsDriver==true).FirstAsync();
if (data != null)
{
_DriveName = data.Name;
isdrive = "true";
}
else
{
_DriveName =null;
isdrive = "false";
}
await _redisOperationRepository.StringSetAsync(IsCYDbDbKey + user.mobile, isdrive, TimeSpan.FromMinutes(1));
}
//db.DbFirst.IsCreateAttribute().CreateClassFile("c:\\Demo\\5", "EC_SeckillInfo"); ;
//var data= db.Queryable().ToList();
//ret.data= data;
if (isdrive == "true")
{
return true;
}
else
{
return false;
}
}
#region 学校端列表
///
/// 获取学校账号端的School
///
///
///
public async Task GetOderListOfSchool(FMPageByWhereOrder entity)
{
var rt = await IsSchooler();
if (rt == false)
{
throw new Exception("没有权限访问");
}
var user = await _coreCmsUserServices.QueryByIdAsync(_User.ID);
if (user == null)
{
throw new Exception("没有权限访问");
}
var where = PredicateBuilder.True();
if (!string.IsNullOrWhiteSpace(entity.where))
{
var obj = JsonConvert.DeserializeAnonymousType(entity.where, new
{
quxianId = "",
sheng = "",
shi="",
quxian="",
pianqu = "",
shipAddress = "",
DeliverState = ""
});
if (!string.IsNullOrWhiteSpace(obj.sheng))
{
where = where.And(p => p.sheng == obj.sheng);
}
if (!string.IsNullOrWhiteSpace(obj.shi))
{
where = where.And(p => p.shi == obj.shi);
}
if (!string.IsNullOrWhiteSpace(obj.quxian))
{
where = where.And(p => p.quxian == obj.quxian);
}
if (!string.IsNullOrWhiteSpace(obj.quxianId))
{
var quxianId = obj.quxianId.ObjToInt(0);
if (quxianId >= 0)
{
where = where.And(p => p.quxianId == quxianId);
}
}
if (!string.IsNullOrWhiteSpace(obj.pianqu))
{
var pianqu = obj.pianqu;
where = where.And(p => pianqu.Contains(p.pianqu));
}
if (!string.IsNullOrWhiteSpace(obj.shipAddress))
{
var shipAddress = obj.shipAddress;
where = where.And(p => shipAddress.Contains(p.shipAddress));
}
if (!string.IsNullOrWhiteSpace(obj.DeliverState))
{
if (Enum.TryParse(obj.DeliverState, out DeliverStateType result))
{
where = where.And(p => p.DeliverState == result);
}
}
}
where = where.And(p => user.mobile == p.userMobile);
where = where.And(n => n.isdelete == false);
RefAsync totalNumbe = 0;
var list = await _CyDbClient.Queryable().Where(where).OrderBy(p => p.quxianId).Select(p => new CoreCmsPlanOrderListDto(), true).ToPageListAsync(entity.page, entity.limit, totalNumbe);
//.QueryPageByDTOAsync(where, entity.page, entity.limit, true);
return new WebApiCallBack()
{
status = true,
data = new
{
list,
entity.page,
totalNumbe,
entity.limit,
entity.where,
}
};
}
///
/// 获取订单详情
///
///
///
public async Task GetOderInfo(FMIntId entity)
{
var rt = await IsSchooler();
var rtb = await IsDrive();
if (rt == false && rtb == false)
{
throw new Exception("没有权限访问");
}
var list = await _CyDbClient.Queryable().Includes(x=>x.items)
.Includes(x=>x.DeliverOrderItems,o=>o.items)
.Where(x => x.id == entity.id)
.Mapper(x=>
{
x.deliverOrder = x.DeliverOrderItems.OrderByDescending(de=>de.CreateTime).FirstOrDefault();
}).FirstAsync();
var countList = await CountLessCount(list.DeliverOrderItems);
foreach (var item in list.items)
{
item.DeliveredCount = countList.Where(x => x.name == item.name && x.Specification == item.specification).Select(x => x.OverCount).FirstOrDefault(0);
if (item.nums - item.DeliveredCount > 0)
item.unDeliveredCount = item.nums - item.DeliveredCount;
else
item.unDeliveredCount = 0;
}
return
new WebApiCallBack()
{
status = true,
data = list,
};
}
public async Task SetOderOfSchool(CoreCmsPlanOrderInfoDto planOrderInfoDto)
{
var rt = await IsSchooler();
if (rt == false)
{
return new WebApiCallBack
{
status = false,
msg = "你没有权限操作"
};
}
var oldOder = await _CyDbClient.Queryable().Includes(x => x.items).Where(x => x.id == planOrderInfoDto.id).FirstAsync();
if(oldOder.status==2)
{
return new WebApiCallBack
{
status = false,
msg = "已经锁单"
};
}
decimal auturo = 0;
foreach (var item in oldOder.items)
{
item.nums = planOrderInfoDto.items.Where(x => x.id == item.id).FirstOrDefault().nums;
item.amount = item.price * item.nums;
auturo += item.amount;
}
oldOder.shipMobile = planOrderInfoDto.shipMobile;
oldOder.shipName = planOrderInfoDto.shipName;
oldOder.orderAmount = auturo;
await _CyDbClient.AsTenant().BeginTranAsync();
try
{
await _CyDbClient.Updateable(oldOder).ExecuteCommandAsync();
await _CyDbClient.Updateable(oldOder.items).ExecuteCommandAsync();
await _CyDbClient.AsTenant().CommitTranAsync();
}
catch (Exception )
{
await _CyDbClient.AsTenant().RollbackTranAsync();
throw ;
}
//await _CyDbClient.UpdateNav(oldOder).Include(x => x.items,new UpdateNavOptions
//{
// OneToOneSaveByPrimaryKey=true,
//}).ExecuteCommandAsync();
await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.CyDeliverOAjisuanjine,oldOder.orderkeyid?.ToString());
return new WebApiCallBack()
{
status = true,
data = true
};
}
public async Task GetDeliveryOrderInfoOfSchool(FMStringId entity)
{
var rt = await IsSchooler();
if (rt == false)
{
throw new Exception("没有权限访问");
}
var data = _CyDbClient.Queryable()
.Where(x=>x.id==new Guid(entity.id))
.Includes(x => x.items)
.Includes(x => x.tracks)
.Includes(x=>x.Oreder,o=>o.items)
.Includes(x => x.Oreder, o => o.DeliverOrderItems)
.Select(x => new CoreDeliverOrder()
{
DeliveryMoble = "",
}, true).Mapper(x=>
{
}).FirstAsync();
return new WebApiCallBack()
{
status = true,
data = data
};
}
public async Task SetDeliveryDataOfschool(SetDeliveryDataDto entity)
{
if(await IsSchooler()==false)
{
return new WebApiCallBack()
{
status = true,
msg = "无权限"
};
}
var olddata= await _CyDbClient.Queryable()
.Includes(x=>x.items)
.Includes(x=>x.DeliverOrderItems,de=>de.items)
. Where(x => x.id == entity.PlanOrderId)
.Mapper(x=>x.deliverOrder= x.DeliverOrderItems.Where(y=>y.OrderState== CoreDeliverOrderType.UnStart).FirstOrDefault())
.FirstAsync();
if(olddata==null)
{
return new WebApiCallBack()
{
status = false,
msg = "没有找到相关订单"
};
}
if(olddata.DeliverState == DeliverStateType.CompletedDelivery)
{
return new WebApiCallBack()
{
status = false,
msg = "已经完成配送不可修改"
};
}
var user = await _coreCmsUserServices.QueryByIdAsync(_User.ID);
await _CyDbClient.AsTenant().BeginTranAsync();
try
{
if (entity.MakeTime != null)
{
if(olddata.deliverOrder==null)
{
//没有配送单 新建
olddata.deliverOrder = await CreatDeliverItem(olddata);
olddata.deliverOrder.MakeTime=entity.MakeTime;
await _CyDbClient.InsertNav(olddata.deliverOrder).Include(x => x.items).ExecuteCommandAsync();
}
else
{
if (olddata.deliverOrder.MakeTime != entity.MakeTime)
{ //有配送单
olddata.deliverOrder.MakeTime = entity.MakeTime;
olddata.upDataBy = _UserMoble;
olddata.upDataTime = DateTime.Now;
await _CyDbClient.Updateable(olddata.deliverOrder).ExecuteCommandAsync();
}
}
}
if (olddata.DeliverRemark != entity.DeliverRemark)
{
olddata.DeliverRemark = entity.DeliverRemark;
olddata.upDataBy=_UserMoble;
olddata.upDataTime= DateTime.Now;
await _CyDbClient.Updateable(olddata).ExecuteCommandAsync();
}
await _CyDbClient.AsTenant().CommitTranAsync();
return new WebApiCallBack()
{
status = true,
};
}
catch (Exception)
{
await _CyDbClient.AsTenant().RollbackTranAsync();
throw;
}
}
public async Task GetDeliveryTracksOfSchool(FMStringId entity)
{
var rt = await IsSchooler();
if (rt == false)
{
throw new Exception("没有权限访问");
}
var data = await _CyDbClient.Queryable().Where(x => x.OrderID == new Guid(entity.id)).ToListAsync();
return new WebApiCallBack()
{
status = true,
data = data
};
}
public async Task GetDriverPhoneOfSchool(FMStringId entity)
{
if (!Guid.TryParse(entity.id, out Guid guid))
{
return new WebApiCallBack
{
status = false,
msg = "id格式错误"
};
}
var data = await _CyDbClient.Queryable().Where(x => x.id == guid).FirstAsync();
if (data != null && !string.IsNullOrEmpty(data.DeliveryMoble))
{
return new WebApiCallBack
{
status = true,
data = data.DeliveryMoble
};
}
else
{
return new WebApiCallBack
{
status = false,
msg = "没有找到联系电话"
};
}
}
#endregion
#region 送货管理相关
public async Task GetOderListOfDeliveryManage(FMPageByWhereOrder entity)
{
if (!await IsDeliverManage())
return new WebApiCallBack
{
status = false,
msg = "你没有权限操作"
};
var where = PredicateBuilder.True();
if (!string.IsNullOrWhiteSpace(entity.where))
{
var obj = JsonConvert.DeserializeAnonymousType(entity.where, new
{
quxianId = "",
pianqu = "",
shipAddress = "",
isScheduled = "",
sheng = "",
shi = "",
quxian = "",
});
if (!string.IsNullOrWhiteSpace(obj.sheng))
{
where = where.And(n => n.sheng == obj.sheng);
}
if (!string.IsNullOrWhiteSpace(obj.shi))
{
where = where.And(n => n.shi == obj.shi);
}
if (!string.IsNullOrWhiteSpace(obj.quxian))
{
where = where.And(n => n.quxian == obj.quxian);
}
if (!string.IsNullOrEmpty(obj.isScheduled))
{
if (obj.isScheduled == "1")
where = where.And(n => n.IngDeliverOrderID != null);
else
where = where.And(n => n.IngDeliverOrderID == null);
}
if (!string.IsNullOrEmpty(obj.quxianId))
{
var ad = obj.quxianId.ToInt32OrDefault(0);
if (ad > 0)
{
where = where.And(n => n.quxianId == ad);
}
}
if (!string.IsNullOrEmpty(obj.pianqu))
{
where = where.And(n => n.pianqu.Contains(obj.pianqu));
}
if (!string.IsNullOrEmpty(obj.shipAddress))
{
where = where.And(n => n.shipAddress.Contains(obj.shipAddress));
}
}
where = where.And(n => n.isdelete == false);
RefAsync totalNumbe = 0;
var dlist = await _CyDbClient.Queryable().Where(n => n.DeliverState != DeliverStateType.CompletedDelivery)
.Select((n) => new CoreCmsPlanOrder
{
IngDeliverOrderID = SqlFunc.Subqueryable().Where(x => x.OrderId == n.id
&& x.OrderState != CoreDeliverOrderType.Faile
&& x.OrderState != CoreDeliverOrderType.Completed
&& (x.DeliveryMoble != "" || x.DeliveryMoble != null)).OrderByDesc(x => x.CreateTime).Select(x=>x.id),
deliverOrder = SqlFunc.Subqueryable().Where(x => x.OrderId == n.id
&& x.OrderState != CoreDeliverOrderType.Faile
&& x.OrderState != CoreDeliverOrderType.Completed
&& (x.DeliveryMoble != "" || x.DeliveryMoble != null)).OrderByDesc(x => x.CreateTime).First()
},
true
).MergeTable().Where(where).ToPageListAsync(entity.page, entity.limit, totalNumbe);
var data = dlist.Select(x => new
{
id = x.id,
MakeTime = x.deliverOrder?.MakeTime,
shipAddress = x.shipAddress,
isScheduled = x.deliverOrder != null ? "1" : "0",
}).ToList();
return new WebApiCallBack
{
status = true,
data= new
{
totalNumbe,
data,
}
};
}
public async Task GetSendDeliveryOderListOfDeliveryManage(FMPageByWhereOrder entity)
{
if (!await IsDeliverManage())
return new WebApiCallBack
{
status = false,
msg = "你没有权限操作"
};
var where = PredicateBuilder.True();
if (!string.IsNullOrWhiteSpace(entity.where))
{
var obj = JsonConvert.DeserializeAnonymousType(entity.where, new
{
quxianId = "",
pianqu = "",
shipAddress = "",
MakeTime = "",
sheng = "",
shi = "",
quxian = "",
});
if (!string.IsNullOrWhiteSpace(obj.sheng))
{
where = where.And(n => n.sheng == obj.sheng);
}
if (!string.IsNullOrWhiteSpace(obj.shi))
{
where = where.And(n => n.shi == obj.shi);
}
if (!string.IsNullOrWhiteSpace(obj.quxian))
{
where = where.And(n => n.quxian == obj.quxian);
}
if (!string.IsNullOrEmpty(obj.MakeTime))
{
var date = obj.MakeTime.ParseDateTimeRange();
if (date.StartDate != null && date.EndDate != null)
{
where = where.And(n => n.deliverOrder.MakeTime > date.StartDate && n.deliverOrder.MakeTime < date.EndDate);
}
}
if (!string.IsNullOrEmpty(obj.quxianId))
{
var ad = obj.quxianId.ToInt32OrDefault(0);
if (ad > 0)
{
where = where.And(n => n.quxianId == ad);
}
}
if (!string.IsNullOrEmpty(obj.pianqu))
{
where = where.And(n => n.pianqu.Contains(obj.pianqu));
}
if (!string.IsNullOrEmpty(obj.shipAddress))
{
where = where.And(n => n.shipAddress.Contains(obj.shipAddress));
}
}
where = where.And(n => n.isdelete == false);
RefAsync totalNumbe = 0;
var dlist = await _CyDbClient.Queryable().Where(n => n.DeliverState != DeliverStateType.CompletedDelivery)
.Select((n) => new CoreCmsPlanOrder
{
deliverOrder = SqlFunc.Subqueryable().Where(x => x.OrderId == n.id
&& x.OrderState != CoreDeliverOrderType.Faile
&& x.OrderState != CoreDeliverOrderType.Completed
&& (x.DeliveryMoble != "" || x.DeliveryMoble != null)).OrderByDesc(x => x.CreateTime).First(),
MakeTime= SqlFunc.Subqueryable().Where(x => x.OrderId == n.id
&& x.OrderState != CoreDeliverOrderType.Faile
&& x.OrderState != CoreDeliverOrderType.Completed
&& (x.DeliveryMoble != "" || x.DeliveryMoble != null)).OrderByDesc(x => x.CreateTime).Select(x=>x.MakeTime)
}
,true
).MergeTable().Where(where).ToPageListAsync(entity.page, entity.limit, totalNumbe);
return new WebApiCallBack
{
status = true,
data = new
{
totalNumbe,
data = dlist.Select(x => new
{
id = x.id.ToString(),
x.shipAddress,
x.quxian,
x.pianqu,
x.deliverOrder
}).ToList()
}
};
}
public async Task GetDeliveryOderInfoOfDeliveryManage(FMIntId entity)
{
if (!await IsDeliverManage())
return new WebApiCallBack
{
status = false,
msg = "你没有权限操作"
};
var data= await _CyDbClient.Queryable().Includes(x=>x.items).Includes(x=>x.DeliverOrderItems,itm=>itm.items)
.Where(x=>x.isdelete==false&&x.id==entity.id)
.FirstAsync();
if(data==null)
{
return new WebApiCallBack
{
status = false,
msg = "订单已失效或者不可更改"
};
};
//只统计已经开始配送的,和已经配送完成的订单
var DeliverOrderlist = data.DeliverOrderItems.Where(x => x.OrderState == CoreDeliverOrderType.Start || x.OrderState == CoreDeliverOrderType.Completed).ToList();
var DeliverOrderItemList = new List();
foreach (var Deliveritem in DeliverOrderlist)
{
DeliverOrderItemList.AddRange(Deliveritem.items);
}
// 按 ZYBName 和 ZYBSpecification 分组,并统计每个分组的 Number 总和
var groupedItems = DeliverOrderItemList
.GroupBy(item => new { item.ZYBName, item.ZYBSpecification })
.Select(group => new CoreDeliverOrderItem
{
ZYBName = group.Key.ZYBName,
ZYBSpecification = group.Key.ZYBSpecification,
Number = group.Sum(item => item.Number)
})
.ToList();
///有并且未执行配送的订单
var UndoDeliver = DeliverOrderlist.Where(x => x.OrderState == CoreDeliverOrderType.UnStart).FirstOrDefault();
//配送单列表详情
var orderItm = new List();
foreach (var item in data.items)
{
var unDeliver = groupedItems.Where(x => x.ZYBName == item.name && x.ZYBSpecification == item.specification).FirstOrDefault()?.Number ?? 0;
unDeliver = item.nums - unDeliver;
if (unDeliver < 0)
unDeliver = 0;
int DeliveredCount = UndoDeliver?.items.Where(x=>x.ZYBSpecification== item.name&&x.ZYBName==item.name).FirstOrDefault()?.Number??
unDeliver;
orderItm.Add(new CoreCmsPlanOrderItemDto
{
amount = item.amount,
id = item.id,
name = item.name,
nums = item.nums,
price = item.price,
specification = item.specification,
isOld = item.isOld,
unDeliveredCount = unDeliver,
DeliveredCount = DeliveredCount
});
}
var deliveryList = await _CyDbClient.Queryable().Where(x => x.Status == "在职" && x.BF_IsDriver == true).Select(x=>new
{
deliveryMoble= x.MobieNum,
name= x.Name,
}).ToListAsync();
return new WebApiCallBack
{
status = true,
data = new
{
id =UndoDeliver?.id,
OrderId = data.id,
//司机电话
DeliveryMoble = UndoDeliver?.DeliveryMoble,
items = orderItm,
UndoDeliver?.MakeTime,
//司机列表
deliveryList
}
};
}
public async Task SetDeliveryOderOfDeliveryManage(DeliveryOrderDto entity)
{
if (!await IsDeliverManage())
return new WebApiCallBack
{
status = false,
msg = "你没有权限操作"
};
var planOrder= await _CyDbClient.Queryable().Includes(x=>x.items).Where(x => x.id == entity.OrderId).FirstAsync();
if (planOrder == null)
{
return new WebApiCallBack
{
status = false,
msg = "没找到订单",
};
}
if (entity.id!=null)
{
//是修改
var DeliverOrder = await _CyDbClient.Queryable().Includes(x=>x.items).Where(x => x.id == entity.id ).FirstAsync();
if(DeliverOrder== null)
{
return new WebApiCallBack
{
status = false,
msg = "没找到订单",
};
}
if(entity.MakeTime!=null)
DeliverOrder.MakeTime = entity.MakeTime;
if(entity.items!=null&&entity.items.Count>0)
{
foreach (var item in DeliverOrder.items)
{
var newitem= entity.items.Where(x=>x.name==item.ZYBName&&x.specification==item.ZYBSpecification).FirstOrDefault();
if(newitem!=null)
{
if (item.Number != newitem.nums)
{
item.Number = newitem.nums;
item.UpDataBy = _UserMoble;
item.UpdataTime = DateTime.Now;
}
}
}
}
//DeliverOrder.items= entity.items;
if(!string.IsNullOrEmpty( entity.DeliveryMoble))
DeliverOrder.DeliveryMoble = entity.DeliveryMoble;
DeliverOrder.UpDataBy = _coreCmsUserServices.QueryById(_User.ID)?.mobile;
DeliverOrder.UpdataTime = DateTime.Now;
await _CyDbClient.UpdateNav(DeliverOrder).Include(x => x.items).ExecuteCommandAsync();
}
else
{
var olddeliver = await _CyDbClient.Queryable().Includes(x => x.items).Where(x => x.OrderId==entity.OrderId&&x.OrderState== CoreDeliverOrderType.UnStart).FirstAsync();
if (olddeliver != null)
{
return new WebApiCallBack
{
status = false,
msg = "配送单已经改变,请刷新后重新配置新的配送单",
};
}
//新建
var DeliverOrder = new CoreDeliverOrder()
{
MakeTime = entity.MakeTime,
OrderId = entity.OrderId,
CreateTime = DateTime.Now,
CreateBy = _UserMoble,
DeliveryMoble = entity.DeliveryMoble,
id = Guid.NewGuid(),
OrderState = CoreDeliverOrderType.UnStart,
items = new List()
};
if (entity.items != null && entity.items.Count > 0)
{
foreach (var item in entity.items)
{
DeliverOrder.items.Add(new CoreDeliverOrderItem()
{
CreateBy = _UserMoble,
CreateTime = DateTime.Now,
id = Guid.NewGuid(),
Number = item.nums,
OrderID= DeliverOrder.id,
ZYBName= item.name,
ZYBSpecification= item.specification,
});
}
}
await _CyDbClient.InsertNav(DeliverOrder).Include(x => x.items).ExecuteCommandAsync();
}
return new WebApiCallBack()
{
status = true,
data = true
};
}
#endregion
#region 司机端
public async Task GetDeliverOderListOfDrver(FMPageByWhereOrder entity)
{
if (!await IsDrive())
return new WebApiCallBack
{
status = false,
msg = "你没有权限操作"
};
var where = PredicateBuilder.True();
if (!string.IsNullOrWhiteSpace(entity.where))
{
var obj = JsonConvert.DeserializeAnonymousType(entity.where, new
{
quxianId = "",
sheng="",
pianqu = "",
shipAddress = "",
shi = "",
quxian = "",
DeliverState=""
});
if (!string.IsNullOrWhiteSpace(obj.DeliverState))
{
var ad = obj.DeliverState.ToInt32OrDefault(0);
where = where.And(n => n.DeliverState == (DeliverStateType)ad );
}
if (!string.IsNullOrWhiteSpace(obj.sheng))
{
where = where.And(n => n.sheng == obj.sheng);
}
if (!string.IsNullOrWhiteSpace(obj.shi))
{
where = where.And(n => n.shi == obj.shi);
}
if (!string.IsNullOrWhiteSpace(obj.quxian))
{
where = where.And(n => n.quxian == obj.quxian);
}
if (!string.IsNullOrEmpty(obj.quxianId))
{
var ad = obj.quxianId.ToInt32OrDefault(0);
if (ad > 0)
{
where = where.And(n => n.quxianId == ad);
}
}
if (!string.IsNullOrEmpty(obj.pianqu))
{
where = where.And(n => n.pianqu.Contains(obj.pianqu));
}
if (!string.IsNullOrEmpty(obj.shipAddress))
{
where = where.And(n => n.shipAddress.Contains(obj.shipAddress));
}
}
where = where.And(n => n.isdelete == false);
var user = _coreCmsUserServices.QueryById(_User.ID);
if (user == null)
{
return new WebApiCallBack
{
status = false,
msg = "登录信息错误"
};
}
RefAsync totalNumbe = 0;
var lisdata = await _CyDbClient.Queryable().Where(where).Select(n => new CoreCmsPlanOrder
{
IngDeliverOrderID = SqlFunc.Subqueryable().Where(x => x.OrderId == n.id && (x.OrderState == CoreDeliverOrderType.UnStart || x.OrderState == CoreDeliverOrderType.Start)
&& x.DeliveryMoble == user.mobile).Select(x => x.id),
deliverOrder = SqlFunc.Subqueryable().Where(x => x.OrderId == n.id && (x.OrderState == CoreDeliverOrderType.UnStart || x.OrderState == CoreDeliverOrderType.Start)
&& x.DeliveryMoble == user.mobile).First()
}, true).MergeTable().Where(x=>x.IngDeliverOrderID != null).ToPageListAsync( entity.page,entity.limit, totalNumbe);
return new WebApiCallBack
{
status = true,
data = new
{
totalNumbe,
data= lisdata
}
};
}
public async Task ManageDeliverOderListOfDrver(FMPageByWhereOrder entity)
{
if (!await IsDrive())
return new WebApiCallBack
{
status = false,
msg = "你没有权限操作"
};
var where = PredicateBuilder.True();
if (!string.IsNullOrWhiteSpace(entity.where))
{
var obj = JsonConvert.DeserializeAnonymousType(entity.where, new
{
quxianId = "",
sheng = "",
pianqu = "",
shipAddress = "",
shi = "",
quxian = "",
OrderState = "",
StartTimeZone="",
EndTimeStartZone= "",
});
if (!string.IsNullOrWhiteSpace(obj.OrderState))
{
var ad = obj.OrderState.ToInt32OrDefault(0);
where = where.And(n => n.OrderState == (CoreDeliverOrderType)ad);
}
if (!string.IsNullOrWhiteSpace(obj.sheng))
{
where = where.And(n => n.Oreder.sheng == obj.sheng);
}
if (!string.IsNullOrWhiteSpace(obj.shi))
{
where = where.And(n => n.Oreder.shi == obj.shi);
}
if (!string.IsNullOrWhiteSpace(obj.quxian))
{
where = where.And(n => n.Oreder.quxian == obj.quxian);
}
if (!string.IsNullOrEmpty(obj.pianqu))
{
where = where.And(n => n.Oreder.pianqu.Contains(obj.pianqu));
}
if (!string.IsNullOrEmpty(obj.shipAddress))
{
where = where.And(n => n.Oreder.shipAddress.Contains(obj.shipAddress));
}
if (!string.IsNullOrEmpty(obj.EndTimeStartZone))
{
var date = obj.EndTimeStartZone.ParseDateTimeRange();
if (date.StartDate != null && date.EndDate != null)
where = where.And(n => n.OverTimedate.EndDate);
}
if (!string.IsNullOrEmpty(obj.StartTimeZone))
{
var date = obj.StartTimeZone.ParseDateTimeRange();
if (date.StartDate != null && date.EndDate != null)
where = where.And(n => n.StartTime < date.EndDate && n.StartTime > date.EndDate);
}
}
where = where.And(n => n.DeliveryMoble == _UserMoble);
RefAsync totalNumbe = 0;
var data= await _CyDbClient.Queryable().Includes(n=>n.Oreder).Where(where).OrderByDescending(n=>n.StartTime).ToPageListAsync( entity.page,entity.limit, totalNumbe);
//var datalist= await _CyDbClient.Queryable().Includes(x => x.DeliverOrderItems).Where(where).Select(x => new CoreCmsPlanOrder
//{
// IngDeliverOrderID = SqlFunc.Subqueryable().Where(ide => ide.DeliveryMoble == _UserMoble && ide.OrderId == x.id).Select(ide => ide.id)
//},true).MergeTable().Where(x => x.IngDeliverOrderID != null).Mapper(x=>
//{
// x.DeliverOrderItems.Where(x => x.DeliveryMoble == _UserMoble).ToList();
// x.IngDeliverOrderID = null;
//}).ToListAsync();
return new WebApiCallBack()
{
status = true,
data = new
{
list= data,
totalNumbe
}
};
}
public async Task GetDeliverInfoOfDrver(FMStringId entity)
{
if (!Guid.TryParse(entity.id, out Guid guid))
{
return new WebApiCallBack
{
status = false,
msg = "id格式错误"
};
}
var data= await _CyDbClient.Queryable()
.Where(x => x.id == guid && x.OrderState != CoreDeliverOrderType.Faile)
.Includes(x => x.items).Includes(x=>x.Oreder,or=>or.items).FirstAsync();
if(data==null)
{
return new WebApiCallBack
{
status = false,
msg = "没有配送订单可以操作"
};
}
var DeliverOrderlist = await _CyDbClient.Queryable().Where(x => x.OrderId == data.OrderId).ToListAsync();
var lessdata = await CountLessCount(DeliverOrderlist);
var ret = new DeliveryOrderDto()
{
MakeTime = data.MakeTime,
DeliveryMoble = data.DeliveryMoble,
OrderState = data.OrderState,
PlanOrdInfo = new CoreCmsPlanOrderInfoDto()
{
pianqu = data.Oreder.pianqu,
quxianId = data.Oreder.quxianId,
shipMobile = data.Oreder.shipMobile,
shipAddress = data.Oreder.shipAddress,
shouhuoAddress = data.Oreder.shipAddress,
DeliverRemark = data.Oreder.DeliverRemark,
shipName= data.Oreder.shipName,
sheng= data.Oreder.sheng,
shi= data.Oreder.shi,
quxian= data.Oreder.quxian,
DeliveryOderID=data.id,
},
items = new List()
};
foreach (var item in data.Oreder.items)
{
var count = lessdata.Where(x => x.name == item.name && x.Specification == item.specification).Select(x => x.OverCount).FirstOrDefault(0);
var thisNumber = data.items.Where(x => x.ZYBName == item.name && x.ZYBSpecification == item.specification).FirstOrDefault();
ret.items.Add(new CoreCmsPlanOrderItemDto()
{
name = item.name,
specification = item.specification,
nums = item.nums,
DeliveredCount = count,
Number = thisNumber?.Number ?? count,
unDeliveredCount = item.nums > count ? item.nums - count : 0,
LessNumber= thisNumber.LessNumber,
});
}
return new WebApiCallBack()
{
status = true,
data = ret
};
}
public async Task StartDeliverOrderOfDrver(FMStringId entity)
{
if (!Guid.TryParse(entity.id, out Guid guid))
{
return new WebApiCallBack
{
status = false,
msg = "id格式错误"
};
}
var data = await _CyDbClient.Queryable()
.Where(x => x.id == guid && x.OrderState == CoreDeliverOrderType.UnStart )
.FirstAsync();
if (data == null)
return new WebApiCallBack
{
status = false,
msg = "没有数据,或者是没有权限可操作"
};
data.OrderState = CoreDeliverOrderType.Start;
data.UpDataBy = _UserMoble;
data.UpdataTime = DateTime.Now;
data.StartTime = DateTime.Now;
await _CyDbClient.Updateable(data).ExecuteCommandAsync();
return new WebApiCallBack()
{
status = true
};
}
public async Task SetDeliverOrdeOfDrver(DeliveryOrderDto entity)
{
if (!await IsDrive())
return new WebApiCallBack
{
status = false,
msg = "没有权限操作"
};
var data= await _CyDbClient.Queryable().Includes(x=>x.items).Includes(x=>x.Oreder).Where(x => x.id == entity.id && x.OrderState != CoreDeliverOrderType.Faile && x.DeliveryMoble==_UserMoble).FirstAsync();
if(data==null)
{
return new WebApiCallBack()
{
status = false,
msg = "没有权限或者状态已经锁定不可更改"
};
}
var deliverlist = await _CyDbClient.Queryable().Includes(x=>x.items).Where(x => x.OrderId == data.OrderId).ToListAsync();
var countlist = await CountLessCount(deliverlist);
if(!string.IsNullOrEmpty( data.Oreder?.DeliverRemark))
{
if (data.Oreder.DeliverRemark != data.Oreder?.DeliverRemark)
{
data.Oreder.DeliverRemark = data.Oreder?.DeliverRemark;
data.Oreder.upDataTime = DateTime.Now;
data.Oreder.upDataBy = _UserMoble;
}
}
foreach (var item in data.items)
{
var it = entity.items.Where(x => x.name == item.ZYBName && x.specification == item.ZYBSpecification).FirstOrDefault();
if (it?.LessNumber != null)
if (item.LessNumber!=it.LessNumber)
{
item.LessNumber = it.LessNumber??0;
item.UpDataBy = _UserMoble;
item.UpdataTime = DateTime.Now;
}
// 送货数量是否能超过预定数量?
//item.Number- countlist.Where(x=>x.name==item.ZYBName&&x.Specification==item.ZYBSpecification).Select(x=>x.OverCount).FirstOrDefault(0)
if(it?.nums!=null)
if (item.Number!=it.Number )
{
item.Number = it.Number??0;
item.UpDataBy = _UserMoble;
item.UpdataTime = DateTime.Now;
}
}
await _CyDbClient.UpdateNav(data).Include(x => x.Oreder).Include(x => x.items).ExecuteCommandAsync();
return new WebApiCallBack
{
status = true
};
}
public async Task FinishDeliverOrdeOfDrver(FMStringId entity)
{
if (!Guid.TryParse(entity.id, out Guid guid))
{
return new WebApiCallBack
{
status = false,
msg = "id格式错误"
};
}
if (!await IsDrive())
return new WebApiCallBack
{
status = false,
msg = "没有权限操作"
};
var data = await _CyDbClient.Queryable()
.Where(x => x.id == guid && x.OrderState == CoreDeliverOrderType.Start)
.FirstAsync();
if (data == null)
return new WebApiCallBack
{
status = false,
msg = "没有数据,或者是没有权限可操作"
};
var order = await _CyDbClient.Queryable().Where(x => x.id == data.OrderId).Includes(x => x.items)
.Includes(x => x.DeliverOrderItems, deo => deo.items).FirstAsync();
if(order == null)
{
return new WebApiCallBack
{
status = false,
msg = "没有找到订单"
};
}
var countlist = await CountLessCount(order.DeliverOrderItems);
await _CyDbClient.AsTenant().BeginTranAsync();
try
{
if (countlist != null)
{
//修改订单状态
DeliverStateType isOver = DeliverStateType.CompletedDelivery;
for (int i = 0; i < order.items.Count; i++)
{
var dcount = countlist.Where(x => x.name == order.items[i].name && x.Specification == order.items[i].specification).FirstOrDefault();
if (dcount != null)
{
if (order.items[i].nums > (dcount.OverCount + dcount.IngCount))
{
isOver = DeliverStateType.PartialDelivery;
break;
}
}
}
if (countlist.Count == 0)
{
isOver = DeliverStateType.NoDelivery;
}
if (order.DeliverState != isOver)
{
order.DeliverState = isOver;
order.upDataBy = _UserMoble;
order.upDataTime = DateTime.Now;
await _CyDbClient.Updateable(order).ExecuteCommandAsync();
}
}
data.OrderState = CoreDeliverOrderType.Completed;
data.UpDataBy = _UserMoble;
data.UpdataTime = DateTime.Now;
data.OverTime = DateTime.Now;
await _CyDbClient.Updateable(data).ExecuteCommandAsync();
await _CyDbClient.AsTenant().CommitTranAsync();
return new WebApiCallBack()
{
status = true
};
}
catch (Exception)
{
await _CyDbClient.AsTenant().RollbackTranAsync();
throw;
}
}
public async Task SetTarcks(TracksDto entity)
{
if( ! await IsDrive())
{
return new WebApiCallBack()
{
status= false,
msg= "非司机端不集坐标数据",
};
}
entity.Moble = _UserMoble;
await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.CyDeliverOrderTarcks, JsonConvert.SerializeObject(entity));
return new WebApiCallBack()
{
status = true,
};
}
#endregion
#region 其他接口函数
public async Task> GetZoneList(Sys_CitySite cyte = null)
{
if (cyte == null)
return await _CyDbClient.Queryable().Where(x => x.CityLevel == 1 && x.IsDisplay == true && x.ProvinceId == 0&&x.CityId==0).OrderBy(x => x.OrderNum).ToListAsync();
if (cyte.CityLevel == 3)
return new List();
if(cyte.CityLevel==2)
//区
return await _CyDbClient.Queryable().Where(x => x.CityLevel == 3 && x.IsDisplay == true && x.ProvinceId == cyte.ProvinceId && x.CityId == cyte.Keyid).OrderBy(x => x.OrderNum).ToListAsync();
if (cyte.CityLevel == 1)
//查市级
return await _CyDbClient.Queryable().Where(x => x.CityLevel == 2 && x.IsDisplay == true && x.ProvinceId == cyte.Keyid && x.CityId == 0).OrderBy(x => x.OrderNum).ToListAsync();
return new List();
}
public async Task> GetZoneListALL()
{
return await _CyDbClient.Queryable().Where(x => x.IsDisplay == true ).ToListAsync();
}
#endregion
#region 其他函数
///
/// 创建新的配送单列表,会根据当前订单情况创建订单
///
///
///
private async Task< CoreDeliverOrder> CreatDeliverItem( CoreCmsPlanOrder order)
{
if(order.items==null)
order.items= await _CyDbClient.Queryable().Where(x=>x.orderId==order.id).ToListAsync();
if(order.DeliverOrderItems == null)
order.DeliverOrderItems= await _CyDbClient.Queryable().Where(x=>x.OrderId==order.id).Includes(x=>x.items).ToListAsync();
var countlist = await CountLessCount(order.DeliverOrderItems);
var DeliverOrder = new CoreDeliverOrder()
{
CreateBy = _UserMoble,
CreateTime = DateTime.Now,
OrderId = order.id,
id = Guid.NewGuid(),
};
var ret= new List();
foreach (var item in order.items)
{
var Number = item.nums -= countlist.Where(x => x.name == item.name && x.Specification == item.specification).Select(x => x.OverCount + x.IngCount).FirstOrDefault(0);
if(Number<0)
Number = 0;
ret.Add(new CoreDeliverOrderItem()
{
CreateBy = _UserMoble,
CreateTime = DateTime.Now,
Number = Number,
ZYBName = item.name,
ZYBSpecification = item.specification,
id = Guid.NewGuid(),
OrderID= DeliverOrder.id,
});
}
DeliverOrder.items= ret;
return DeliverOrder;
}
///
/// 已配送货物统计
///
///
///
private async Task< List > CountLessCount(List datain)
{
var OverCountlistdata = new List();
//统计已经完结的单
foreach (var item in datain.Where(x=>x.OrderState== CoreDeliverOrderType.Completed).ToList())
{
//先统计已经完结的配送单
if(item.items==null||item.items.Count==0)
{
item.items= await _CyDbClient.Queryable().Where(x=>x.OrderID==item.id).ToListAsync();
}
OverCountlistdata.AddRange(item.items);
}
var overlist= OverCountlistdata.GroupBy(x => new
{
x.ZYBName,
x.ZYBSpecification
}).Select(x => new
{
name = x.Key.ZYBName,
Specification = x.Key.ZYBSpecification,
num = x.Sum(x => x.Number)
}).ToList();
//统计未完成的单
var ingCountlistdata = new List();
foreach (var item in datain.Where(x => x.OrderState == CoreDeliverOrderType.UnStart||x.OrderState== CoreDeliverOrderType.Start).ToList())
{
//先统计已经完结的配送单
if (item.items == null || item.items.Count == 0)
{
item.items = await _CyDbClient.Queryable().Where(x => x.OrderID == item.id).ToListAsync();
}
ingCountlistdata.AddRange(item.items);
}
var inglist= ingCountlistdata.GroupBy(x => new
{
x.ZYBName,
x.ZYBSpecification
}).Select(x => new
{
name = x.Key.ZYBName,
Specification = x.Key.ZYBSpecification,
num = x.Sum(x => x.Number)
}).ToList();
var retlist = new List();
foreach (var item in overlist)
{
retlist.Add(new SendCountDto
{
name = item.name,
Specification = item.Specification,
OverCount = item.num,
IngCount = inglist.Where(x => x.name == item.name && x.Specification == item.Specification).Select(x => x.num).FirstOrDefault(0)
});
}
return retlist;
}
#endregion
}
class SendCountDto
{
///
/// 名称
///
public string name { get; set; }
///
/// 开本
///
public string Specification { get; set; }
///
/// 已完成配送
///
public int OverCount { get; set; }
///
/// 已设置或者未完成
///
public int IngCount { get; set; }
}
}