新增查询条件(货物状态)

修改同步方法
optimize
jianghaiqing 1 year ago
parent cd3af958ca
commit cf5eccc1ae

@ -411,6 +411,7 @@ namespace Myshipping.Application
.WhereIF(!string.IsNullOrWhiteSpace(input.DZRemark), u => u.DZRemark.Contains(input.DZRemark)) .WhereIF(!string.IsNullOrWhiteSpace(input.DZRemark), u => u.DZRemark.Contains(input.DZRemark))
.WhereIF(!string.IsNullOrWhiteSpace(input.CZRemark), u => u.CZRemark.Contains(input.CZRemark)) .WhereIF(!string.IsNullOrWhiteSpace(input.CZRemark), u => u.CZRemark.Contains(input.CZRemark))
.WhereIF(!string.IsNullOrWhiteSpace(input.ZhanCangFlag), u => u.ZhanCangFlag == input.ZhanCangFlag) .WhereIF(!string.IsNullOrWhiteSpace(input.ZhanCangFlag), u => u.ZhanCangFlag == input.ZhanCangFlag)
.WhereIF(!string.IsNullOrWhiteSpace(input.BSSTATUSNAME), u => u.BSSTATUSNAME == input.BSSTATUSNAME)
.WhereIF(saleUserList != null && saleUserList.Count > 0, o => saleUserList.Contains(o.SALEID)) .WhereIF(saleUserList != null && saleUserList.Count > 0, o => saleUserList.Contains(o.SALEID))
.WhereIF(opUserList != null && opUserList.Count > 0, o => opUserList.Contains(o.OPID)) .WhereIF(opUserList != null && opUserList.Count > 0, o => opUserList.Contains(o.OPID))
.WhereIF(userlist != null && userlist.Count() > 0, u => userlist.Contains((long)u.CreatedUserId) .WhereIF(userlist != null && userlist.Count() > 0, u => userlist.Contains((long)u.CreatedUserId)
@ -428,9 +429,20 @@ namespace Myshipping.Application
{ {
query = query.OrderBy(PageInputOrder.MultiOrderBuilder(input.MultiSort)); query = query.OrderBy(PageInputOrder.MultiOrderBuilder(input.MultiSort));
} }
#endregion
/*
//标识没有台账查询
bool isHasBKOrderQuery = query.QueryBuilder.WhereInfos.Any(a => !Regex.IsMatch(a, "`?\\bTenantId\\b`?\\s?\\=\\s?\\@\\bTenantId")
&& !Regex.IsMatch(a, "`?\\bIsDeleted\\b`\\s?\\=\\s?\\@\\bIsDeleted")
&& !Regex.IsMatch(a, "`?ParentId\\b`\\s?\\=\\s?\\@[a-zA-Z]+.*`?ParentId\\b`\\s\\bIS\\b\\s\\bNULL\\b"));
if(!isHasBKOrderQuery)
{
//如果没有台账查询条件,需要先取近一个月的
}
*/
#endregion
var entities = await query.ToPagedListAsync(input.PageNo, input.PageSize); var entities = await query.ToPagedListAsync(input.PageNo, input.PageSize);
if (traceTime) if (traceTime)

@ -833,6 +833,11 @@ namespace Myshipping.Application
/// 操作部门 /// 操作部门
/// </summary> /// </summary>
public long? OrgOp { get; set; } public long? OrgOp { get; set; }
/// <summary>
/// 业务状态名称
/// </summary>
public string BSSTATUSNAME { get; set; }
} }
public class SaveBookingOrderInput : BookingOrderDto public class SaveBookingOrderInput : BookingOrderDto

@ -1,8 +1,16 @@
using Furion; using Furion;
using Furion.DatabaseAccessor; using Furion.DatabaseAccessor;
using Furion.DependencyInjection;
using Furion.DistributedIDGenerator;
using Furion.FriendlyException;
using Furion.JsonSerialization;
using Furion.RemoteRequest.Extensions;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using ServiceProjectSyncWin; using ServiceProjectSyncWin;
using SqlSugar; using SqlSugar;
using System.Text;
using static System.Net.Mime.MediaTypeNames;
Serve.RunGeneric(additional: services => Serve.RunGeneric(additional: services =>
{ {
@ -13,91 +21,333 @@ Serve.RunGeneric(additional: services =>
}, true, true); }, true, true);
Console.WriteLine("开始准备同步历史服务状态数据"); Console.WriteLine("开始准备同步历史服务状态数据");
var service1 = App.GetService<ISyncHisRecord>();
service1.SyncServiceProjectRecord();
Console.ReadKey(); Console.ReadKey();
public interface ISyncHisRecord
{
void SyncServiceProjectRecord();
}
public class SyncHisRecord public class SyncHisRecord: ISyncHisRecord,ITransient
{ {
SqlSugar.ISqlSugarClient _db; SqlSugar.ISqlSugarClient _db;
private readonly ILogger<SyncHisRecord> _logger;
public SyncHisRecord(ISqlSugarClient db) public SyncHisRecord(ISqlSugarClient db, ILogger<SyncHisRecord> logger)
{ {
_db = db; _db = db;
_logger = logger;
} }
public void SyncServiceProjectRecord() public void SyncServiceProjectRecord()
{ {
/* int totalSyncNum = 0;
//_db.Queryable<Order>() int succSyncNum = 0;
var tenantInfo = _sysTenantRepository.AsQueryable().Filter(null, true).First(a => a.Id == tenantId);
/* long maxId = 0;
1
2
3
4
maxId = _serviceStatusBookingSyncHisInfoRepository.AsQueryable().Max(a => a.ORG_STATUS_ID); //349708986646597/中集世联达领鲜物流科技(山东)有限公司
long tenantId = 349708986646597;
_logger.LogInformation("批次={no} 获取最后同步服务状态的ID={maxId}", batchNo, maxId); string batchNo = Guid.NewGuid().ToString();
int takeNum = 1000; _logger.LogInformation("批次={no} 触发同步货物状态 tenantId={tenantId}", batchNo, tenantId);
while (true) try
{ {
var takeList = _bookingGoodsStatusRepository.AsQueryable().Filter(null, true) var tenantInfo = _db.Queryable<SysTenant>().First(a => a.Id == tenantId);
.InnerJoin<BookingGoodsStatusConfig>((gs, cfg) => gs.ConfigId == cfg.Id) /*
.InnerJoin<BookingOrder>((gs, cfg, bk) => gs.bookingId == bk.Id) 1
.Where((gs, cfg, bk) => 2
gs.FinishTime.HasValue && gs.TenantId == tenantId 3
&& !bk.IsDeleted && gs.FinishUserId != 142307070910551 4
&& (maxId == 0 || gs.Id > maxId)) */
.OrderBy((gs, cfg, bk) => gs.Id) maxId = _db.Queryable<ServiceStatusBookingSyncHisInfo>().Max(a => a.ORG_STATUS_ID);
.Select((gs, cfg, bk) => new { GS = gs, CFG = cfg, BK = bk })
.Take(takeNum).ToList();
totalSyncNum += takeList.Count; _logger.LogInformation("批次={no} 获取最后同步服务状态的ID={maxId}", batchNo, maxId);
_logger.LogInformation("批次={no} 同步待处理任务 totalSyncNum={totalSyncNum}", batchNo, totalSyncNum); int takeNum = 1000;
//没有记录跳出循环 while (true)
if (takeList.Count == 0) {
break; var takeList = _db.Queryable<BookingGoodsStatus>()
.InnerJoin<BookingGoodsStatusConfig>((gs, cfg) => gs.ConfigId == cfg.Id)
.InnerJoin<BookingOrder>((gs, cfg, bk) => gs.bookingId == bk.Id)
.Where((gs, cfg, bk) =>
gs.FinishTime.HasValue && gs.TenantId == tenantId
&& !bk.IsDeleted && gs.FinishUserId != 142307070910551
&& (maxId == 0 || gs.Id > maxId))
.OrderBy((gs, cfg, bk) => gs.Id)
.Select((gs, cfg, bk) => new { GS = gs, CFG = cfg, BK = bk })
.Take(takeNum).ToList();
maxId = takeList.Max(a => a.GS.Id); totalSyncNum += takeList.Count;
_logger.LogInformation("批次={no} 获取最后同步服务状态的 maxId={maxId}", batchNo, maxId); Console.WriteLine($"批次={batchNo} 同步待处理任务 totalSyncNum={totalSyncNum}");
//写入记录表 _logger.LogInformation("批次={no} 同步待处理任务 totalSyncNum={totalSyncNum}", batchNo, totalSyncNum);
takeList.ForEach(async record => {
var entity = new ServiceStatusBookingSyncHisInfo //没有记录跳出循环
if (takeList.Count == 0)
{ {
PK_ID = IDGen.NextID().ToString(), Console.WriteLine($"没有记录跳出循环 total={succSyncNum}");
ORG_STATUS_ID = record.GS.Id, break;
BOOKING_ID = record.BK.Id, }
FINISH_TIME = record.GS.FinishTime.Value,
FINISH_USER_ID = record.GS.FinishUserId.Value, maxId = takeList.Max(a => a.GS.Id);
FINISH_USER_NAME = record.GS.FinishUser,
MBL_NO = record.BK.MBLNO, _logger.LogInformation("批次={no} 获取最后同步服务状态的 maxId={maxId}", batchNo, maxId);
SORT_NO = record.CFG.Sort,
STATUS_SKU_CODE = record.CFG.SystemCode, //写入记录表
STATUS_SKU_NAME = record.CFG.StatusName, takeList.ForEach(async record =>
STATUS_REMARK = record.GS.Remark, {
STATUS_VAL = record.GS.ExtData, var entity = new ServiceStatusBookingSyncHisInfo
TENANT_ID = record.GS.TenantId.Value, {
TENANT_NAME = tenantInfo.Name, PK_ID = Guid.NewGuid().ToString(),
VESSEL = record.BK.VESSEL, ORG_STATUS_ID = record.GS.Id,
VOYNO = record.BK.VOYNO, BOOKING_ID = record.BK.Id,
FINISH_TIME = record.GS.FinishTime.Value,
}; FINISH_USER_ID = record.GS.FinishUserId.Value,
FINISH_USER_NAME = record.GS.FinishUser,
await _serviceStatusBookingSyncHisInfoRepository.InsertAsync(entity); MBL_NO = record.BK.MBLNO,
SORT_NO = record.CFG.Sort,
succSyncNum++; STATUS_SKU_CODE = record.CFG.SystemCode,
}); STATUS_SKU_NAME = record.CFG.StatusName,
STATUS_REMARK = record.GS.Remark,
Thread.Sleep(500); STATUS_VAL = record.GS.ExtData,
TENANT_ID = record.GS.TenantId.Value,
TENANT_NAME = tenantInfo.Name,
VESSEL = record.BK.VESSEL,
VOYNO = record.BK.VOYNO,
};
_db.Insertable<ServiceStatusBookingSyncHisInfo>(entity).ExecuteCommand();
//await _serviceStatusBookingSyncHisInfoRepository.InsertAsync(entity);
succSyncNum++;
Console.WriteLine($"ORG_STATUS_ID={record.GS.Id} 写入成功 total={succSyncNum}");
Thread.Sleep(300);
});
Console.WriteLine($"等待500毫秒");
Thread.Sleep(500);
}
//停用的状态(接受委托、放箱指令、已发账单、账单确认、账单已回传)
string[] deletedStatusCodeArg = new string[] { "JSWTUO", "FXZLING", "YFZD", "ZDQR", "ZDYHC" };
/*
1null100
2
3PUSH
4
*/
Console.WriteLine($"开始推送记录 succ={succSyncNum}");
while (true)
{
var bookingList = _db.Queryable<ServiceStatusBookingSyncHisInfo>()
.Where(a => a.TENANT_ID == tenantId && a.STATUS == null)
.Take(100).Select(a => a.BOOKING_ID).Distinct().ToList();
//无数据跳出
if (bookingList.Count == 0)
{
Console.WriteLine($"没有待推送记录跳出循环 succ={succSyncNum}");
break;
}
var taskList = _db.Queryable<ServiceStatusBookingSyncHisInfo>()
.Where(a => a.TENANT_ID == tenantId && bookingList.Contains(a.BOOKING_ID)).ToList();
taskList.GroupBy(a => a.BOOKING_ID).ToList().ForEach(a =>
{
DateTime currDate = DateTime.Now;
var currStatusList = a.ToList();
var groupCheckList = currStatusList
.Where(b => !deletedStatusCodeArg.Contains(b.STATUS_SKU_CODE))
.GroupBy(b => b.STATUS_SKU_CODE).Select(b =>
{
var currList = b.ToList();
if (currList.Count == 1)
return currList.FirstOrDefault();
return currList.OrderByDescending(c => c.ORG_STATUS_ID).FirstOrDefault();
}).ToList();
if (groupCheckList.Count > 0)
{
var firstInfo = groupCheckList.FirstOrDefault();
TrackingMessageInfo msgInfo = new TrackingMessageInfo
{
Head = new TrackingMessageHeadInfo
{
GID = IDGen.NextID().ToString(),
MessageType = "PROJECT",
ReceiverId = "ServiceProjectStatus",
ReceiverName = "服务项目和状态",
SenderId = "BookingOrder",
SenderName = "海运订舱",
RequestDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"),
Version = "2.0",
RequestAction = "AddOrModify",
},
Main = new TrackingMessageMainInfo
{
BusiId = firstInfo.BOOKING_ID.ToString(),
BusiSystemCode = "BOOKING_ORDER",
MBlNo = firstInfo.MBL_NO,
VesselVoyno = $"{firstInfo.VESSEL}/{firstInfo.VOYNO}",
OrderNo = "",
PushType = TrackingPushTypeEnum.Status,
OperTenantId = firstInfo.TENANT_ID,
OperTenantName = firstInfo.TENANT_NAME,
OpertType = TrackingOperTypeEnum.AUTO,
OperUserId = firstInfo.FINISH_USER_ID.ToString(),
OperUserName = firstInfo.FINISH_USER_NAME,
SourceType = TrackingSourceTypeEnum.AUTO,
StatusList = groupCheckList.Select(a => new TrackingMessageMainStatusInfo
{
StatusCode = a.STATUS_SKU_CODE,
StatusDate = a.FINISH_TIME,
StatusVal = a.STATUS_VAL,
Remark = a.STATUS_REMARK
}).ToList()
}
};
Console.WriteLine($"准备PUSH状态 msg={JSON.Serialize(msgInfo.Main)}");
//推送状态
var pushRlt = PushStatus(msgInfo).GetAwaiter().GetResult();
Console.WriteLine($"PUSH返回结果 rlt={JSON.Serialize(pushRlt)}");
groupCheckList.ForEach(async t => {
t.STATUS = pushRlt.succ ? "SUCC" : "FAILURE";
t.SYNC_TIME = currDate;
t.SYNC_RESULT = pushRlt.msg;
if (deletedStatusCodeArg.Contains(t.STATUS_SKU_CODE))
{
t.STATUS = "FAILURE";
t.SYNC_RESULT = "状态已取消不再同步";
}
await _db.Updateable<ServiceStatusBookingSyncHisInfo>(t)
.UpdateColumns(it => new
{
it.STATUS,
it.SYNC_TIME,
it.SYNC_RESULT
}).ExecuteCommandAsync();
});
var undoList = currStatusList.GroupJoin(groupCheckList, l => l.ORG_STATUS_ID,
r => r.ORG_STATUS_ID, (l, r) =>
{
var currList = r.ToList();
if (currList.Count == 0)
return new { IsUpdate = true, Obj = l };
return new { IsUpdate = false, Obj = l };
}).Where(c => c.IsUpdate)
.Select(c => c.Obj).ToList();
if (undoList.Count > 0)
{
undoList.ForEach(async t => {
t.STATUS = "FAILURE";
t.SYNC_RESULT = "状态已取最后触发记录";
t.SYNC_TIME = currDate;
if (deletedStatusCodeArg.Contains(t.STATUS_SKU_CODE))
{
t.SYNC_RESULT = "状态已取消不再同步";
}
await _db.Updateable<ServiceStatusBookingSyncHisInfo>(t)
.UpdateColumns(it => new
{
it.STATUS,
it.SYNC_TIME,
it.SYNC_RESULT
}).ExecuteCommandAsync();
});
}
Console.WriteLine($"更新表结束");
}
else
{
Console.WriteLine($"没有可用记录");
}
Thread.Sleep(300);
});
Thread.Sleep(500);
}
}
catch(Exception ex)
{
_logger.LogInformation("批次={no} 同步异常ex={ex}", batchNo, maxId);
}
}
public async Task<TaskManageOrderResultDto> PushStatus(TrackingMessageInfo info)
{
TaskManageOrderResultDto model = null;
/*
1URL
2JSON
3POST
4
*/
var url = App.Configuration["ServiceStatusPushUrl"];
try
{
var res = await url.SetHttpMethod(HttpMethod.Post)
.SetBody(JSON.Serialize(info), "application/json")
.SetContentEncoding(Encoding.UTF8)
.PostAsync();
_logger.LogInformation("批次={no} 对应请求报文完成 res={res}", info.Head.GID, JSON.Serialize(res));
if (res.StatusCode == System.Net.HttpStatusCode.OK)
{
var userResult = await res.Content.ReadAsStringAsync();
var cmRlt = JSON.Deserialize<CommonRlt>(userResult);
if(cmRlt.success)
model = JSON.Deserialize<TaskManageOrderResultDto>(JSON.Serialize(cmRlt.data));
}
}
catch (Exception ex)
{
//写日志
if (ex is HttpRequestException)
throw Oops.Oh(10000002);
} }
*/ return model;
} }
} }

@ -1,5 +1,6 @@
{ {
"ConnectionStrings": { "ConnectionStrings": {
"db_master": "Data Source=60.209.125.238;Database=booking_hechuan_dev;User ID=root;Password=Djy@Mysql.test;pooling=true;port=32006;sslmode=none;CharSet=utf8mb4;Convert Zero Datetime=True;Allow Zero Datetime=True;" "db_master": "Data Source=rm-m5e0s0o35bo87087b3o.mysql.rds.aliyuncs.com;Database=booking_hechuan;User ID=hechuan;Password=HcDjy@123;pooling=true;port=3306;sslmode=none;CharSet=utf8mb4;Convert Zero Datetime=True;Allow Zero Datetime=True;"
} },
"ServiceStatusPushUrl": "http://47.104.85.216:12345/api/ServiceWorkFlowManage/PushStatus"
} }
Loading…
Cancel
Save