首页 > 其他分享 >第31篇 实现数据同步的webapi接口

第31篇 实现数据同步的webapi接口

时间:2024-10-10 14:12:49浏览次数:1  
标签:webapi set get 31 await db 接口 entity public

调用接口实现数据同步demo讲解

1.demo整体架构如下

image

2.SynchronizeModel类库

这个类库是主要用于实体对象模型的转换,包括请求参数实体RequestModel,数据库实体DBEntity,响应数据实体ResponseModel等,

2.1 新建一个数据库实体:

/// <summary>
   /// 被测件(雷达)模块信息表
   /// </summary>
[SqlSugar.SugarTable("TestRecordModule")]
public class TestRecordModule:EntityBase
{
    /// <summary>
    /// 被测件
    /// </summary>
    public long TaskTestRecordID { get; set; }

    /// <summary>
    /// 模块编号
    /// </summary>
    public string ModuleNumber { get; set; }

    /// <summary>
    /// 映射位
    /// </summary>
    public int MapPosition { get; set; }

    /// <summary>
    /// 模块状态
    /// </summary>
    public int Status { get; set; }

    /// <summary>
    /// 创建时间
    /// </summary>
    public DateTime CreatedTime { get; set; }

    /// <summary>
    /// 备注
    /// </summary>
    public string Comment { get; set; }

    /// <summary>
    /// 模块型号
    /// </summary>
    public string ModuleType { get; set; }

    /// <summary>
    /// 测试流程控制状态 
    /// </summary>
    public int TestFlowControlStatus { get; set; }

    /// <summary>
    /// 批次数
    /// </summary>
    public int BatchCount { get; set; }

    /// <summary>
    /// 扫码编号
    /// </summary>
    public string ScanCodeNumber { get; set; }

    /// <summary>
    /// 用户ID
    /// </summary>
    public long UserID { get; set; }

    /// <summary>
    /// 是否同步
    /// </summary>
    public SynchronizeStatus IsSynchronize { get; set; }

    /// <summary>
    /// 产线名称
    /// </summary>
    public string ProductLineName { get; set; }
}

2.2 新建响应数据实体:

public class ResultModel
	{
		public bool Success { get; set; }
		public string Message { get; set; }
	}

2.3 业务逻辑的同步状态枚举:

 public enum SynchronizeStatus
	{
		None = 0,
		Synchronizing = 1,
		Synchronized = 2,
	}

3.SynchronizeService类库

主要分几层:
3.1 接口层:IRepository,IService

public interface ISynchronizeRepository
	{
		Task<ResultModel> AddTestRecordModuleAsync(TestRecordModule entity);
		Task<ResultModel> BatchDataSynchronizeAsync(List<TestRecordModule> entities);
	}

public interface ISynchronizeService
	{
		Task<ResultModel> AddTestRecordModuleAsync(TestRecordModule entity);
		Task<ResultModel> BatchDataSynchronizeAsync(List<TestRecordModule> entities);
	}

3.2 业务逻辑实现层:RepositoryImpl,ServiceImpl

 public class BaseRepository<T>
	{
		protected SqlSugarClient db;
		public BaseRepository()
		{
			//string conStr = ConfigurationManager.ConnectionStrings["SQLiteConnectionString"].ConnectionString.ToString();
			string conStr = @"E:\\定时服务\\WebApiService\\WebApiService\\DB\\RDS.DCDC.db3";
			SqliteConnectionStringBuilder stringBuilder = new SqliteConnectionStringBuilder { DataSource = conStr };
			db = new SqlSugarClient(new ConnectionConfig()
			{
				ConnectionString = stringBuilder.ToString(),
				DbType = DbType.Sqlite,
				IsAutoCloseConnection = true,//自动释放
				InitKeyType = InitKeyType.Attribute,
			});
		}
   }


public class SynchronizeRepositoryImpl : BaseRepository<TestRecordModule>, ISynchronizeRepository
	{
		public async Task<ResultModel> AddTestRecordModuleAsync(TestRecordModule entity)
		{
			try
			{
				//先查询是否已同步过,排除同步重复的数据;
				var items = this.db.Queryable<TestRecordModule>().Where(t => t.ScanCodeNumber == entity.ScanCodeNumber && t.IsSynchronize == SynchronizeStatus.Synchronized);
				if (items.Count() > 0)
				{
					return new ResultModel { Success = false, Message = "数据已同步过" };
				}

				//开启事务
				await this.db.BeginTranAsync();
				ResultModel responseModel = new ResultModel();    
				entity.IsSynchronize = SynchronizeStatus.Synchronized;
				if (db.Insertable(entity).ExecuteReturnBigIdentity() > 0)
				{
					responseModel.Success = true;
					responseModel.Message = "成功";
				}
				else
				{
					responseModel.Success = false;
					responseModel.Message = "失败";
				}

				//数据同步完,没有报错,更新IsSynchronize状态

				//entity.IsSynchronize = Entities.SynchronizeStatus.Synchronized;
				//await this.db.Updateable(entity).UpdateColumns(t=>t.IsSynchronize == Entities.SynchronizeStatus.Synchronized)
				//    .WhereColumns(t => t.ScanCodeNumber == entity.ScanCodeNumber).ExecuteCommandAsync();

				// 提交事务
				await this.db.Ado.CommitTranAsync();
				return await Task.FromResult(responseModel);
			}
			catch (Exception ex)
			{
				//事务回滚
				await this.db.Ado.RollbackTranAsync();
				return new ResultModel() { Success = false, Message = "同步失败" };
			}
		}

		public async Task<ResultModel> BatchDataSynchronizeAsync(List<TestRecordModule> entities)
		{
			try
			{
				ResultModel responseModel = new ResultModel();
				foreach (var entity in entities)
				{
					//先查询是否已同步过,排除同步重复的数据;
					var items = this.db.Queryable<TestRecordModule>().Where(t => t.ScanCodeNumber == entity.ScanCodeNumber && t.IsSynchronize == SynchronizeStatus.Synchronized);
					if (items.Count() > 0)
					{
						return new ResultModel { Success = false, Message = "数据已同步过" };
					}

					//开启事务
					await this.db.BeginTranAsync();                   
					entity.IsSynchronize = SynchronizeStatus.Synchronized;
					if (db.Insertable(entity).ExecuteReturnBigIdentity() > 0)
					{
						responseModel.Success = true;
						responseModel.Message = "成功";
					}
					else
					{
						responseModel.Success = false;
						responseModel.Message = "失败";
					}
				}

				//数据同步完,没有报错,更新IsSynchronize状态
				//entity.IsSynchronize = Entities.SynchronizeStatus.Synchronized;
				//await this.db.Updateable(entity).UpdateColumns(t=>t.IsSynchronize == Entities.SynchronizeStatus.Synchronized)
				//    .WhereColumns(t => t.ScanCodeNumber == entity.ScanCodeNumber).ExecuteCommandAsync();

				// 提交事务
				await this.db.Ado.CommitTranAsync();
				return await Task.FromResult(responseModel);
			}
			catch (Exception ex)
			{
				//事务回滚
				await this.db.Ado.RollbackTranAsync();
				return new ResultModel() { Success = false, Message = "同步失败" };
			}
		}
	}


public class SynchronizeServiceImpl : ISynchronizeService
	{
		private readonly ISynchronizeRepository _testRecordModuleRepository;
		public SynchronizeServiceImpl(ISynchronizeRepository testRecordModuleRepository) 
		{
			_testRecordModuleRepository = testRecordModuleRepository;
		}
		public async Task<ResultModel> AddTestRecordModuleAsync(TestRecordModule entity)
		{
			return await _testRecordModuleRepository.AddTestRecordModuleAsync(entity);
		}

		public async Task<ResultModel> BatchDataSynchronizeAsync(List<TestRecordModule> entities)
		{
			return await _testRecordModuleRepository.BatchDataSynchronizeAsync(entities);
		}
	}

4.WebApiService,表现层Controller

[Route("[controller]/[action]")]
	[ApiController]
	public class SynchronizeController : ControllerBase
	{
		private readonly ISynchronizeService _synchronizeService;
		public SynchronizeController(ISynchronizeService synchronizeService ) 
		{
			this._synchronizeService = synchronizeService;
		}

		/// <summary>
		/// 单个数据同步
		/// </summary>
		/// <param name="entity"></param>
		/// <returns></returns>
		[HttpPost]
		public async Task<ResultModel> DataSynchronize(TestRecordModule entity)
		{
			entity.IsSynchronize = SynchronizeStatus.Synchronizing;
			var result = this._synchronizeService.AddTestRecordModuleAsync(entity);
			return await result;
		}


		/// <summary>
		/// 批次数据同步
		/// </summary>
		/// <param name="entity"></param>
		/// <returns></returns>
		[HttpPost]
		public async Task<ResultModel> BatchDataSynchronize(List<TestRecordModule> entities)
		{
			var result = this._synchronizeService.BatchDataSynchronizeAsync(entities);
			return await result;
		}
	}

具体可以访问我的代码库:https://gitee.com/chenshibao/web-api-service.git

标签:webapi,set,get,31,await,db,接口,entity,public
From: https://www.cnblogs.com/chenshibao/p/18456165

相关文章

  • PTA 作业三 继承与多态 JAVA 面向对象程序设计7-1 周长计算器-1分数 30作者 Ma 单位
    7-1周长计算器-1分数30作者 Ma单位 山东科技大学1、定义一个接口Shape用于表示图形,其包含一个doublelength()的方法用于求周长。2、定义三角形类Triangle、长方形类Rectangle、圆形类Circle分别实现接口Shape3、定义测试类ShapeTest并使用Shape接口定义变......
  • PHP语言调用翔云身份证实名认证接口
    身份证实名认证接口是一种用于验证用户身份的在线服务。它通过接收用户提供的身份证号码和姓名,与权威的数据进行比对,以确认用户的身份是否真实有效。使用该接口时,通常需要向服务提供商提供以下信息:用户的姓名用户的身份证号码用户的证件头像用户的现......
  • 淘宝图片搜索商品数据api接口对接详细的描述和解释
    淘宝图片搜索商品数据接口是一项高级的API服务,它允许用户通过上传图片来搜索淘宝上的商品。这一功能依托于先进的图像识别技术,通过复杂的算法对上传的图片进行分析和处理,从而找到与图片相似的商品。以下是对该接口的详细描述和解释:主要功能、特点、优势主要功能:以图搜图......
  • 20222317 2024-2025-1《网络与系统攻防技术》实验一实验报告
    一、实验内容本次实验的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们本次实验将学习两种方法运行这......
  • 深入浅出:API接口的使用方法
    在数字化时代,API接口扮演着越来越重要的角色,它使得不同软件间的数据交换和功能整合变得轻而易举。无论是提升工作效率,还是开发新的应用程序,了解如何使用API接口都是一项宝贵的技能。本文将为您详细介绍API接口的使用方法,无论您是初学者还是有经验的开发者,都能从中获益。一、......
  • 一个免费的 Whois 信息查询接口
    前端查询页面:https://www.librespeed.cn/whoisApi接口:http://whois.librespeed.cn/api?domain=baidu.com {"id":62,"name":"qq.com","owner":"深圳市腾讯计算机系统有限公司","registrar":"MarkMon......
  • 3162. 优质数对的总数 I
    给你两个整数数组nums1和nums2,长度分别为n和m。同时给你一个正整数k。如果nums1[i]可以被nums2[j]*k整除,则称数对(i,j)为优质数对(0<=i<=n-1,0<=j<=m-1)。返回优质数对的总数。示例1:输入:nums1=[1,3,4],nums2=[1,3,4],k=1输出:5解释:5......
  • MT1311-MT1320 码题集 (c 语言详解)
    MT1311·组数c语言实现代码#include<stdio.h>intmain(){intcount=0;//用来记录个数//遍历所有可能的三位数//外层循环:遍历第一位范围是1~9确保第一位不能为0for(inti=1;i<=9;i++){//中层循环:遍历第二位范围是0......
  • .NetCore中下载文件接口指定文件名时中文被替换为下划线(_)的问题
      首先,我这里使用的.net6  比如我有这样一个接口:publicasyncTask<IActionResult>Download(stringname){//省略业务代码...returnFile(stream,"application/octet-stream",name);}  这里下载的文件名时接口参数传进来的,......
  • RabbitMQ目录发送方确认confirm:确认模式2.重复调用接口时,会提示错误所以改进,自己搞一
    目录发送方确认confirm:确认模式2.重复调用接口时,会提示错误所以改进,自己搞一个template,return退回模式:RabbitMQ的可靠性/保证消息不丢失..消息在交换机中无法路由到制定队列:return模式重试机制发送方确认当消息的生产者发送消息以后,怎么知道是否到达服务器呢?......