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 Microsoft.OpenApi.Validations; using Nest; using Newtonsoft.Json; using NPOI.HPSF; 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 System.Xml.Linq; 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.ComponentTCBBatchCreateContainerServiceVersionRequest.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.WxaSecOrderUploadCombinedShippingInfoRequest.Types.SubOrder.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:"; /// /// 司机订单开始后锁单key /// const string LockFilshDeliverOderKey = "LockFilshDeliverOderKey:"; const string LockFilshDeliverOderString = "GOODLuck:"; /// /// 是否拥有川印教育局订单管理 /// const string IsSchoolID = "IsShoodsID:"; const string IsSchoolMangerID = "IsSchoolManger:"; const string IsDeliverManageKey = "IsDeliverManageKey:"; private readonly ISqlSugarClient _CyDbClient; private readonly IHttpContextUser _User; private readonly ICoreCmsUserServices _coreCmsUserServices; private readonly IRedisOperationRepository _redisOperationRepository; private readonly string _UserMoble; private string? _DriveName { get; set; } /// /// 学校管理员ID,有则是,没有则不是 /// private Guid? _SchoolManagerKeyId { get; set; } = null; public CyinOAService(IUnitOfWork unitOfWork, IHttpContextUser contextUser, ICoreCmsUserServices coreCmsUserServices, IRedisOperationRepository redisOperationRepository, ICoreCmsUserServices coreCmsUser) { _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.shipMobile == user.mobile&&x.isdelete==false).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 IsSchoolManger() { if (_User?.ID == null) { throw new Exception("登录信息错误,请重新登录"); } var user = _coreCmsUserServices.QueryById(_User.ID); if (user == null) { throw new Exception("登录信息错误,请重新登录"); } var isdrive = await _redisOperationRepository.Get(IsSchoolMangerID + user.mobile); if (string.IsNullOrEmpty(isdrive)) { //没有键值 var data = await _CyDbClient.Queryable().Where(x => x.CompanyPhone == user.mobile).FirstAsync(); if (data != null) { _SchoolManagerKeyId = data.Keyid; isdrive = _SchoolManagerKeyId.ToString(); } else isdrive = "false"; await _redisOperationRepository.StringSetAsync(IsSchoolMangerID + user.mobile, isdrive, TimeSpan.FromMinutes(1)); } else { Guid keyid; if( Guid.TryParse(isdrive,out keyid)) { _SchoolManagerKeyId = keyid; } else { var data = await _CyDbClient.Queryable().Where(x => x.CompanyPhone == user.mobile).FirstAsync(); if (data != null) { _SchoolManagerKeyId = data.Keyid; isdrive = _SchoolManagerKeyId.ToString(); } else isdrive = "false"; await _redisOperationRepository.StringSetAsync(IsSchoolMangerID + 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 != "false") { 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 学校端列表 public async Task GetOderListOfSchoolManager(FMPageByWhereOrder entity) { var rt = await IsSchoolManger(); //var rt2 = await IsSchooler(); if (rt == false) { return new WebApiCallBack { status = false, msg = "你没有权限操作" }; } var user = await _coreCmsUserServices.QueryByIdAsync(_User.ID); if (user == null) { return new WebApiCallBack { status = false, msg = "你没有权限操作" }; } var where = PredicateBuilder.True(); where = where.And(p => p.isdelete == false); 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 => p.pianqu.Contains(pianqu)); } if (!string.IsNullOrWhiteSpace(obj.shipAddress)) { var shipAddress = obj.shipAddress; where = where.And(p => p.shipAddress.Contains(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); //whereManger = whereManger.And(p => p.DeliverState == result); where = where.And(p => p.isdelete == false); RefAsync totalNumbe = 0; //var listSchool = _CyDbClient.Queryable().Where(where).OrderBy(p => p.quxianId).Select(p => new CoreCmsPlanOrderListDto(), true); //var listSchoolManger = _CyDbClient.Queryable().Where(where).OrderBy(p => p.quxianId).Select(p => new CoreCmsPlanOrderListDto(), true); var list = await _CyDbClient.Queryable().Where(where). LeftJoin((p, or) => p.orderkeyid == or.Keyid) .LeftJoin((p, or, cus) => or.BuyerId == cus.Keyid) .Where((p, or, cus) => cus.Keyid == _SchoolManagerKeyId) .OrderBy((p, or, cus) => p.quxianId).Select((p, or, cus) => p, true).MergeTable().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, } }; } /// /// 获取学校账号端的School /// /// /// public async Task GetOderListOfSchool(FMPageByWhereOrder entity) { var rt = await IsSchooler(); var rt2 = await IsSchoolManger(); if (rt == false && rt2 == false) { return new WebApiCallBack { status = false, msg = "你没有权限操作" }; } var user = await _coreCmsUserServices.QueryByIdAsync(_User.ID); if (user == null) { return new WebApiCallBack { status = false, msg = "你没有权限操作" }; } var where = PredicateBuilder.True(); where= where.And(p => p.isdelete == false); 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 => p.pianqu.Contains(pianqu)); } if (!string.IsNullOrWhiteSpace(obj.shipAddress)) { var shipAddress = obj.shipAddress; where = where.And(p => p.shipAddress.Contains(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); //whereManger = whereManger.And(p => p.DeliverState == result); where = where.And(p => p.isdelete == false); RefAsync totalNumbe = 0; var listSchool = _CyDbClient.Queryable().Where(where).Where(p => user.mobile == p.shipMobile).Select(p => new CoreCmsPlanOrderListDto(), true); var listmager = _CyDbClient.Queryable().Where(where). LeftJoin((p, or) => p.orderkeyid == or.Keyid) .LeftJoin((p, or, cus) => or.BuyerId == cus.Keyid) .Where((p, or, cus) => cus.Keyid == _SchoolManagerKeyId) .Select((p, or, cus) => p, true).Select(p => new CoreCmsPlanOrderListDto(), true); List list = new List(); if (rt && rt2) list = await _CyDbClient.Union(listSchool, listmager).OrderBy(p => p.quxianId).ToPageListAsync(entity.page, entity.limit, totalNumbe); else if (rt) list = await listSchool.OrderBy(p => p.quxianId).ToPageListAsync(entity.page, entity.limit, totalNumbe); else if (rt2) list = await listmager.OrderBy(p => p.quxianId).ToPageListAsync(entity.page, entity.limit, totalNumbe); //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(); var rt2 = await IsSchoolManger(); if (rt == false && rt2 == false && rt2 == false) { return new WebApiCallBack { status = false, msg = "你没有权限操作" }; } if (rt == false && rtb == false) { return new WebApiCallBack { status = false, msg = "你没有权限操作" }; } 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(); var rt2 = await IsSchoolManger(); if (rt == false && rt2 == false) { return new WebApiCallBack { status = false, msg = "你没有权限操作" }; } if (string.IsNullOrEmpty(planOrderInfoDto.shipMobile) || !planOrderInfoDto.shipMobile.IsPhoneNumberValid()) 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 = "已经锁单" }; } if (oldOder.isdelete == true) 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.userMobile = 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(); var rt2 = await IsSchoolManger(); if (rt == false && rt2 == false) { return new WebApiCallBack { status = false, msg = "你没有权限操作" }; } 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) { var rt = await IsSchooler(); var rt2 = await IsSchoolManger(); if (rt == false && rt2 == false) { return new WebApiCallBack { status = false, 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(); var rt2 = await IsSchoolManger(); if (rt == false && rt2 == false) { return new WebApiCallBack { status = false, msg = "你没有权限操作" }; } var data = await _CyDbClient.Queryable().Where(x => x.OrderID == new Guid(entity.id)).OrderByDescending(x=>x.CreateTime) .ToListAsync(); return new WebApiCallBack() { status = true, data = data }; } public async Task GetDriverPhoneOfSchool(FMStringId entity) { var rt = await IsSchooler(); var rt2 = await IsSchoolManger(); if (rt == false && rt2 == false) { return new WebApiCallBack { status = false, msg = "你没有权限操作" }; } 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) //.Where(n => n.isdelete ==false) .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(), 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).OrderBy(n=>n.MakeTime).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", x.DeliverState }).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 = "", DeliveryMoble="", }); if(!string.IsNullOrEmpty(obj.DeliveryMoble)) { where = where.And(n => n.DeliveryMoble == obj.DeliveryMoble); } 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), DeliveryMoble = 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.DeliveryMoble) } , true ).MergeTable().Where(where).OrderBy(x=>x.MakeTime).ToPageListAsync(entity.page, entity.limit, totalNumbe); 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 { totalNumbe, data = dlist.Select(x => new { id = x.id.ToString(), x.shipAddress, x.quxian, x.pianqu, x.deliverOrder, x.DeliverState, x.DeliveryMoble }).ToList(), deliveryList } }; } 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 = data.DeliverOrderItems.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, Number = DeliveredCount, 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 = "你没有权限操作" }; bool isallZone = true; foreach (var item in entity.items) { if (item.Number != 0) isallZone = false; } if (isallZone) { return new WebApiCallBack { status = false, msg = "配送货物为0" }; } 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.Number) { item.Number = newitem.Number ?? 0; 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.Number ?? 0, 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 }; } public async Task GetSchoolInventory(FMIntId entity) { var rt = await IsDeliverManage(); if (rt == false) { return new WebApiCallBack { status = false, msg = "你没有权限操作" }; } var data = await _CyDbClient.Queryable().Includes(x => x.items).Includes(x => x.DeliverOrderItems, de => de.items).Where(x => x.isdelete == false && x.id == entity.id).FirstAsync(); if (data == null) { return new WebApiCallBack { status = false, msg = "订单已失效" }; } var DataCountlist = await CountLessCount(data.DeliverOrderItems); List datalist = new List(); foreach (var item in data.items) { var overCount = DataCountlist.Where(x => x.name == item.name && x.Specification == item.specification).Select(x => x.OverCount).FirstOrDefault(0); datalist.Add(new CoreCmsPlanOrderItemDto() { amount = item.amount, nums = item.nums, name=item.name, specification=item.specification, price= item.price, DeliveredCount = overCount, unDeliveredCount = item.nums - overCount, LessNumber = DataCountlist.Where(x => x.name == item.name && x.Specification == item.specification).Select(x => x.LessCount).FirstOrDefault(0), Inventory=0 }); } return new WebApiCallBack { status = true, data = new { data.shipAddress, data.shipMobile, data.shipName, data.shouhuoAddress, data.status, data.DeliverState, data.DeliverRemark, data.keYongAmount, items = datalist, } }; } public async Task MakeMultiDeliveryOderOfDeliveryManage(MakeMultiDeliveryOrderDto entity) { var oder = await _CyDbClient.Queryable().Where(x => entity.ids.Contains(x.id) && x.isdelete == false).Select(x => new CoreCmsPlanOrder() { deliverOrder = SqlFunc.Subqueryable().Where(y => y.OrderId == x.id && y.OrderState != CoreDeliverOrderType.Completed).First() } ).ToListAsync(); if (oder == null || oder.Count == 0) return new WebApiCallBack() { status = true, data = true }; //检验 foreach (var item in oder) { if (item.deliverOrder != null && item.deliverOrder.OrderState != CoreDeliverOrderType.UnStart) return new WebApiCallBack() { status = false, msg = $"学校:{item.shipAddress} 订单已经在送货中,不能安排送货" }; }; //安排送货 await _CyDbClient.AsTenant().BeginTranAsync(); try { foreach (var item in oder) { if (item.deliverOrder != null && item.deliverOrder.OrderState == CoreDeliverOrderType.UnStart) { if (item.deliverOrder.MakeTime != entity.Time || item.deliverOrder.DeliveryMoble != entity.DeliveryMoble) { item.deliverOrder.MakeTime = entity.Time; item.deliverOrder.DeliveryMoble = entity.DeliveryMoble; item.deliverOrder.UpDataBy = _UserMoble; item.deliverOrder.UpdataTime = DateTime.Now; await _CyDbClient.Updateable(item.deliverOrder).ExecuteCommandAsync(); } } else if (item.deliverOrder == null) { var oderold = await _CyDbClient.Queryable().Includes(x => x.items).Includes(x => x.DeliverOrderItems, devs => devs.items).Where(x => x.id == item.id).FirstAsync(); //创建新表 var deliverOrder = await CreatDeliverItem(oderold); deliverOrder.MakeTime = DateTime.Now; deliverOrder.DeliveryMoble = entity.DeliveryMoble; await _CyDbClient.InsertNav(deliverOrder).Include(x => x.items).ExecuteCommandAsync(); } } await _CyDbClient.AsTenant().CommitTranAsync(); return new WebApiCallBack { status = true, data = true, }; } catch (Exception) { await _CyDbClient.AsTenant().RollbackTranAsync(); return new WebApiCallBack { status = false, msg = "系统处理失败" }; } } #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.OverTime < date.EndDate && n.OverTime > date.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); where = where.And(n => n.OrderState == CoreDeliverOrderType.Completed); RefAsync totalNumbe = 0; var data = await _CyDbClient.Queryable().Includes(n => n.Oreder).Where(where).Where(x=>x.Oreder.isdelete==false).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 finish = await _redisOperationRepository.Get(LockFilshDeliverOderKey + data.id); var CanFinishOrder = true; if (data.OrderState != CoreDeliverOrderType.Start) { CanFinishOrder = false; } else CanFinishOrder = true; if (finish == LockFilshDeliverOderString) CanFinishOrder = false; var ret = new DeliveryOrderDto() { MakeTime = data.MakeTime, DeliveryMoble = data.DeliveryMoble, OrderState = data.OrderState, Remarke= data.Remarke, 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, }, CanFinishOrder=CanFinishOrder, 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(); _redisOperationRepository.StringSet(LockFilshDeliverOderKey + data.id, LockFilshDeliverOderString, TimeSpan.FromMinutes(5)); return new WebApiCallBack() { status = true }; } public async Task SetDeliverOrdeOfDrver(DeliveryOrderDto entity) { if (!await IsDrive()) return new WebApiCallBack { status = false, msg = "没有权限操作" }; bool isallZone = true; foreach (var item in entity.items) { if (item.Number != 0) isallZone = false; } if (isallZone) { return new WebApiCallBack { status = false, msg = "配送货物为0" }; } 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; // } //} if (entity.Remarke != data.Remarke) { data.Remarke = entity.Remarke; data.UpDataBy = _UserMoble; data.UpdataTime = DateTime.Now; } 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 lockflg = await _redisOperationRepository.Get(LockFilshDeliverOderKey + data.id.ToString()); if (lockflg != null&&lockflg== LockFilshDeliverOderString) { return new WebApiCallBack { status = false, msg = "开始配送后5分钟之内不能完成订单操作" }; } 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 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(), OrderState= CoreDeliverOrderType.UnStart, }; 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 ).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> 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), lessCount = x.Sum(x => x.LessNumber) }).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), lessCount = x.Sum(x => x.LessNumber) }).ToList(); var retlist = new List(); var countlist = overlist; //这一句是防止没有已完成订单造成的空轮询 if (countlist.Count == 0) countlist = inglist; foreach (var item in countlist) { retlist.Add(new SendCountDto { name = item.name, Specification = item.Specification, OverCount = overlist.Where(x => x.name == item.name && x.Specification == item.Specification).Select(x => x.num).FirstOrDefault(0), IngCount = inglist.Where(x => x.name == item.name && x.Specification == item.Specification).Select(x => x.num).FirstOrDefault(0), LessCount = overlist.Where(x => x.name == item.name && x.Specification == item.Specification).Select(x => x.lessCount).FirstOrDefault(0) }); } return retlist; } /// /// 解析xml图片 /// /// /// private List ParseXml( string xmlstr) { // 解析 XML 字符串 XDocument doc = XDocument.Parse(xmlstr); // 提取 InquiryWorkBookList 中的数据 var inquiryWorkBookList = doc.Descendants("InquiryWorkBookModel"); // 转换为 List List inquiryWorkBookModels = new List(); foreach (var item in inquiryWorkBookList) { var model = new InquiryWorkBookModel { WorkBookName = item.Element("WorkBookName")?.Value ?? "", WorkBookNameTxt = item.Element("WorkBookNameTxt")?.Value ?? "", WorkBookSize = item.Element("WorkBookSize")?.Value ?? "", WorkBookSizeTxt = item.Element("WorkBookSizeTxt")?.Value ?? "", WorkBookCount = item.Element("WorkBookCount")?.Value ?? "", ysUnit = item.Element("ysUnit")?.Value ?? "", ysUnitTxt = item.Element("ysUnitTxt")?.Value ?? "", WorkBookPrice = item.Element("WorkBookPrice")?.Value ?? "", WorkBookMoney = item.Element("WorkBookMoney")?.Value ?? "", WorkBookFengMian = item.Element("WorkBookFengMian")?.Value ?? "", WorkBookFengMianTxt = item.Element("WorkBookFengMianTxt")?.Value ?? "", FengMianYaoqiu = item.Element("FengMianYaoqiu")?.Value ?? "", FengMianYaoqiuTxt = item.Element("FengMianYaoqiuTxt")?.Value ?? "", WorkBookNeiXing = item.Element("WorkBookNeiXing")?.Value ?? "", WorkBookNeiXingTxt = item.Element("WorkBookNeiXingTxt")?.Value ?? "", NeiXingYaoqiu = item.Element("NeiXingYaoqiu")?.Value ?? "", NeiXingYaoqiuTxt = item.Element("NeiXingYaoqiuTxt")?.Value ?? "", WorkBookpageNum = item.Element("WorkBookpageNum")?.Value ?? "", fengmian = item.Element("fengmian")?.Value ?? "", neiye = item.Element("neiye")?.Value ?? "" }; inquiryWorkBookModels.Add(model); } return inquiryWorkBookModels; } #endregion #region 学校管理端 /// /// 获取新建订单学校订单列表 /// /// /// /// public async Task CreatSchoolOfSchoolManage(CoreCmsPlanOrderInfoDto entity) { if (!await IsDeliverManage()) return new WebApiCallBack { status = false, msg = "你没有权限操作" }; if(entity.orderkeyid==null||entity.orderkeyid==0) { return new WebApiCallBack { status = false, msg = "没有对应订单" }; } if(string.IsNullOrEmpty(entity.shipAddress)) { return new WebApiCallBack { status = false, msg = "学校地址必填" }; } if (string.IsNullOrEmpty(entity.shipMobile)&&(!entity.shipMobile.IsPhoneNumberValid())) { return new WebApiCallBack { status = false, msg = "学校联系人电话必填且必须是电话号码" }; } if (string.IsNullOrEmpty(entity.shipName)) { return new WebApiCallBack { status = false, msg = "联系人必填" }; } if (string.IsNullOrEmpty(entity.pianqu)) { return new WebApiCallBack { status = false, msg = "片区必填" }; } var Oder = await _CyDbClient.Queryable().Where(x => x.Keyid == entity.orderkeyid&&x.OrderState>0).FirstAsync(); if(Oder==null) { return new WebApiCallBack { status = false, msg = $"订单失效或者已经完结" }; } var Oderxml= await _CyDbClient.Queryable().Where(x => x.OrderId == entity.orderkeyid).Select(x => x.PrintParameter).FirstAsync(); if(string.IsNullOrEmpty(Oderxml)) { return new WebApiCallBack { status = false, msg = "订单错误(0)" }; } var custinfo = await _CyDbClient.Queryable().Where(x => x.CompanyPhone == _UserMoble).FirstAsync(); if(custinfo ==null) { return new WebApiCallBack { status = false, msg = "操作用户没有绑定省市区" }; } var xmlist= ParseXml(Oderxml); if ( entity.items.Count>0) { var data = new CoreCmsPlanOrder { orderkeyid = entity.orderkeyid, items = new List(), createBy = _UserMoble, createTime = DateTime.Now, huaFeiAmount = 0, DeliverState = DeliverStateType.NoDelivery, keYongAmount = 0, pianqu = entity.pianqu, quxianId = entity.quxianId, sheng = custinfo.Province, quxian = custinfo.County, shengId = entity.shengId, shi = custinfo.City, shiId = entity.shiId, shipAddress = entity.shipAddress, shipMobile = entity.shipMobile, shipName = entity.shipName, shouhuoAddress = entity.shipAddress, status = 1, isdelete = false, userMobile = entity.shipMobile, FirmId = Oder.SellerId.ToString() }; foreach (var item in entity.items) { var inxml = xmlist.Where(x => x.WorkBookNameTxt == item.name && x.WorkBookSizeTxt == item.specification).FirstOrDefault(); decimal price = 0m; decimal.TryParse(inxml.WorkBookPrice, out price); data.items.Add(new CoreCmsPlanOrderItem { isOld=false, amount = item.nums*price, createBy = _UserMoble, createTime=DateTime.Now, fengmian=inxml.fengmian, neiye=inxml.neiye, price=price, name=item.name, specification=item.specification, nums=item.nums, }); } data.orderAmount= data.items.Sum(x => x.amount); data.oldOrderAmount = data.items.Sum(x => x.amount); await _CyDbClient.InsertNav(data).Include(x => x.items).ExecuteCommandAsync(); await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.CyDeliverOAjisuanjine, entity.orderkeyid?.ToString()); return new WebApiCallBack { status = true, data = true, }; } else { return new WebApiCallBack { status = false, msg = "没有作业本详情表" }; } } public async Task GetCreatSchoolOfSchoolManage() { if (!await IsSchoolManger()) return new WebApiCallBack { status = false, msg = "你没有权限操作" }; if(_SchoolManagerKeyId==null) return new WebApiCallBack { status = false, msg = "你没有权限操作" }; var listmager = await _CyDbClient.Queryable(). LeftJoin((p, or) => p.orderkeyid == or.Keyid) .LeftJoin((p, or, cus) => or.BuyerId == cus.Keyid) .Where((p, or, cus) => cus.Keyid == _SchoolManagerKeyId) .Select((p, or, cus) => p, true).ToListAsync(); if(listmager == null||listmager.Count==0) { return new WebApiCallBack { status = false, msg = "未找拥有订单" }; } var ListZoneKeyID = listmager.GroupBy(x => x.orderkeyid).Select(x => new { keyid = x.Key.Value, count = x.Count(), }).ToList(); if(ListZoneKeyID.Count==0) { return new WebApiCallBack { status = false, msg = "未找拥有订单" }; } //订单详情列表 var ZoneOderList = await _CyDbClient.Queryable().In(ListZoneKeyID.Select(y=>y.keyid).ToList()).Select(x => new zongoderinfo { Keyid = x.Keyid, DocumentName= x.DocumentName, WorkBooksxmlstr= SqlFunc.Subqueryable().Where(pa=>pa.OrderId==x.Keyid).Select(pa=>pa.PrintParameter) }).Mapper(x=> { x.WorkBooks= ParseXml(x.WorkBooksxmlstr); x.WorkBooksxmlstr = null; }).ToListAsync(); return new WebApiCallBack { status = true, data = ZoneOderList, }; } public async Task DelSchoolOfSchoolManage(FMIntId entity) { if (!await IsSchoolManger()) return new WebApiCallBack { status = false, msg = "你没有权限操作" }; if(entity.id==0) return new WebApiCallBack { status = false, msg = "id无效" }; var data= await _CyDbClient.Queryable((core, order) => new JoinQueryInfos( JoinType.Left, core.orderkeyid == order.Keyid ) ).Where((core, order) => order.BuyerId == _SchoolManagerKeyId&&core.id==entity.id).Select((core, order)=>core).FirstAsync(); if(data!=null) { data.isdelete = true; data.upDataBy = _UserMoble; data.upDataTime = data.upDataTime; await _CyDbClient.Updateable(data).ExecuteCommandAsync(); await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.CyDeliverOAjisuanjine, data.orderkeyid?.ToString()); return new WebApiCallBack { status = true, data =true }; } else { return new WebApiCallBack { status = false, msg = "没有权限删除该订单" }; } } #endregion } class SendCountDto { /// /// 名称 /// public string name { get; set; } /// /// 开本 /// public string Specification { get; set; } /// /// 已完成配送 /// public int OverCount { get; set; } /// /// 已设置或者未完成 /// public int IngCount { get; set; } /// /// 节约数量 /// public int LessCount { get; set; } } /// /// 订单参数列表 /// public class zongoderinfo { public int Keyid { get; set; } public string DocumentName { get; set; } public List WorkBooks { get; set; } public string WorkBooksxmlstr { get; set; } } public class InquiryWorkBookModel { public string WorkBookName { get; set; } public string WorkBookNameTxt { get; set; } public string WorkBookSize { get; set; } public string WorkBookSizeTxt { get; set; } public string WorkBookCount { get; set; } public string ysUnit { get; set; } public string ysUnitTxt { get; set; } public string WorkBookPrice { get; set; } public string WorkBookMoney { get; set; } public string WorkBookFengMian { get; set; } public string WorkBookFengMianTxt { get; set; } public string FengMianYaoqiu { get; set; } public string FengMianYaoqiuTxt { get; set; } public string WorkBookNeiXing { get; set; } public string WorkBookNeiXingTxt { get; set; } public string NeiXingYaoqiu { get; set; } public string NeiXingYaoqiuTxt { get; set; } public string WorkBookpageNum { get; set; } public string fengmian { get; set; } public string neiye { get; set; } } }