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; } } }