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

修改同步方法
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.CZRemark), u => u.CZRemark.Contains(input.CZRemark))
.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(opUserList != null && opUserList.Count > 0, o => opUserList.Contains(o.OPID))
.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));
}
#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);
if (traceTime)

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

@ -1,8 +1,16 @@
using Furion;
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.Logging;
using ServiceProjectSyncWin;
using SqlSugar;
using System.Text;
using static System.Net.Mime.MediaTypeNames;
Serve.RunGeneric(additional: services =>
{
@ -13,30 +21,52 @@ Serve.RunGeneric(additional: services =>
}, true, true);
Console.WriteLine("开始准备同步历史服务状态数据");
var service1 = App.GetService<ISyncHisRecord>();
service1.SyncServiceProjectRecord();
Console.ReadKey();
public interface ISyncHisRecord
{
void SyncServiceProjectRecord();
}
public class SyncHisRecord
public class SyncHisRecord: ISyncHisRecord,ITransient
{
SqlSugar.ISqlSugarClient _db;
private readonly ILogger<SyncHisRecord> _logger;
public SyncHisRecord(ISqlSugarClient db)
public SyncHisRecord(ISqlSugarClient db, ILogger<SyncHisRecord> logger)
{
_db = db;
_logger = logger;
}
public void SyncServiceProjectRecord()
{
/*
//_db.Queryable<Order>()
var tenantInfo = _sysTenantRepository.AsQueryable().Filter(null, true).First(a => a.Id == tenantId);
int totalSyncNum = 0;
int succSyncNum = 0;
long maxId = 0;
//349708986646597/中集世联达领鲜物流科技(山东)有限公司
long tenantId = 349708986646597;
string batchNo = Guid.NewGuid().ToString();
_logger.LogInformation("批次={no} 触发同步货物状态 tenantId={tenantId}", batchNo, tenantId);
try
{
var tenantInfo = _db.Queryable<SysTenant>().First(a => a.Id == tenantId);
/*
1
2
3
4
maxId = _serviceStatusBookingSyncHisInfoRepository.AsQueryable().Max(a => a.ORG_STATUS_ID);
*/
maxId = _db.Queryable<ServiceStatusBookingSyncHisInfo>().Max(a => a.ORG_STATUS_ID);
_logger.LogInformation("批次={no} 获取最后同步服务状态的ID={maxId}", batchNo, maxId);
@ -44,7 +74,7 @@ public class SyncHisRecord
while (true)
{
var takeList = _bookingGoodsStatusRepository.AsQueryable().Filter(null, true)
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) =>
@ -57,21 +87,27 @@ public class SyncHisRecord
totalSyncNum += takeList.Count;
Console.WriteLine($"批次={batchNo} 同步待处理任务 totalSyncNum={totalSyncNum}");
_logger.LogInformation("批次={no} 同步待处理任务 totalSyncNum={totalSyncNum}", batchNo, totalSyncNum);
//没有记录跳出循环
if (takeList.Count == 0)
{
Console.WriteLine($"没有记录跳出循环 total={succSyncNum}");
break;
}
maxId = takeList.Max(a => a.GS.Id);
_logger.LogInformation("批次={no} 获取最后同步服务状态的 maxId={maxId}", batchNo, maxId);
//写入记录表
takeList.ForEach(async record => {
takeList.ForEach(async record =>
{
var entity = new ServiceStatusBookingSyncHisInfo
{
PK_ID = IDGen.NextID().ToString(),
PK_ID = Guid.NewGuid().ToString(),
ORG_STATUS_ID = record.GS.Id,
BOOKING_ID = record.BK.Id,
FINISH_TIME = record.GS.FinishTime.Value,
@ -90,14 +126,228 @@ public class SyncHisRecord
};
await _serviceStatusBookingSyncHisInfoRepository.InsertAsync(entity);
_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": {
"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