TempImportService.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. using DapperORMCore.Context.DataContext;
  2. using DapperORMCore.Dapper.BaseModel;
  3. using DapperORMCore.Model.CoreModel;
  4. using DapperORMCore.Repository.IRepositorys;
  5. using DapperORMCore.String.Consts;
  6. using Microsoft.Extensions.Configuration;
  7. using NXWMS.Code.Serialize;
  8. using NXWMS.DataAccess.Entity;
  9. using NXWMS.IService.NXWMS.Common;
  10. using NXWMS.Model.AppModels.Condition.Common;
  11. using NXWMS.Model.AppModels.Result;
  12. using NXWMS.Model.AppModels.Result.Common;
  13. using NXWMS.Model.AppModels.View.Common;
  14. using NXWMS.Model.Common;
  15. using NXWMS.String.Enums;
  16. using Org.BouncyCastle.Asn1.Crmf;
  17. using Org.BouncyCastle.Asn1.Mozilla;
  18. using System;
  19. using System.Collections.Generic;
  20. using System.Data;
  21. using System.Linq;
  22. using System.Text;
  23. using System.Threading.Tasks;
  24. using WestDistance.DapperORM.Repository.Repositorys;
  25. namespace NXWMS.Service.NXWMS.Common
  26. {
  27. /// <summary>
  28. /// 临时导入服务
  29. /// </summary>
  30. [AutoInject(typeof(ITempImportService), InjectType.Scope)]
  31. public class TempImportService : ServiceBase, ITempImportService
  32. {
  33. /// <summary>
  34. /// 系统操作仓储中转
  35. /// </summary>
  36. private IDataRepositoryContext _dataContext;
  37. /// <summary>
  38. /// SQL节点仓储
  39. /// </summary>
  40. private ISQLNodeRepository _iSQLNodeRepository;
  41. /// <summary>
  42. /// 配置
  43. /// </summary>
  44. private IConfiguration _configuration;
  45. public TempImportService(IDataRepositoryContext dataRepositoryContext, IConfiguration configuration, ISQLNodeRepository iSQLNodeRepository)
  46. {
  47. this._dataContext = dataRepositoryContext;
  48. this._configuration = configuration;
  49. this._iSQLNodeRepository = iSQLNodeRepository;
  50. }
  51. public OperateResultInfo Add(TempImportCondition info)
  52. {
  53. var now = DateTime.Now;
  54. int affectedRows = 0;
  55. try
  56. {
  57. _dataContext.BeginTran();
  58. foreach (var item in info.DetailList)
  59. {
  60. if (new DataRepository<TEMP_IMPORT_DATA>(_dataContext).Query("BATCH_NO", item.BatchNo).FirstOrDefault() != null)
  61. {
  62. continue;
  63. }
  64. var entity = new TEMP_IMPORT_DATA
  65. {
  66. CREATE_BY = info.OperationUserId,
  67. CREATE_TIME = now,
  68. UPDATE_BY = info.OperationUserId,
  69. UPDATE_TIME = now,
  70. IMPORT_DATA_JSON = item.DataJson.ToJson(),
  71. DESCRIBE = item.Describe,
  72. IMPORT_DATA_NUMBER = item.DataJson.Rows.Count,
  73. IMPORT_TEMPLATE_ID = item.ImportTemplateId,
  74. USED_FLAG = 1,
  75. BATCH_NO = item.BatchNo,
  76. IMPORT_STATUS = (int)TempImportStatus.Init,
  77. DEL_FLAG = 0,
  78. };
  79. affectedRows = affectedRows + new DataRepository<TEMP_IMPORT_DATA>(_dataContext).Add(entity);
  80. }
  81. }
  82. catch (Exception ex)
  83. {
  84. _dataContext.Rollback();
  85. return FailStatus(ex.Message);
  86. }
  87. _dataContext.Commit();
  88. return SuccessStatus();
  89. }
  90. public OperateResultInfo Exec(TempImportExecCondition info)
  91. {
  92. if (string.IsNullOrWhiteSpace(info.BatchNo))
  93. {
  94. return FailStatus("参数错误!");
  95. }
  96. //每次只能执行一个批次数据
  97. try
  98. {
  99. var sql = string.Empty;
  100. var now = DateTime.Now;
  101. var affectedRows = 0;
  102. _dataContext.BeginTran();
  103. var importDataesult = new DataRepository<TEMP_IMPORT_DATA>(_dataContext).Query("BATCH_NO", info.BatchNo);
  104. //导入数据遍历
  105. foreach (var item in importDataesult)
  106. {
  107. switch (info.TempImportExecType)
  108. {
  109. case TempImportExecType.Check:
  110. if (item.IMPORT_STATUS == (int)TempImportStatus.Init || item.IMPORT_STATUS == (int)TempImportStatus.CheckFail)
  111. {
  112. //导入前将状态改成检查中...
  113. var updateEntity = new TEMP_IMPORT_DATA
  114. {
  115. TEMP_IMPORT_DATA_ID = item.TEMP_IMPORT_DATA_ID,
  116. IMPORT_STATUS = (int)TempImportStatus.Checking,
  117. UPDATE_BY = info.OperationUserId,
  118. UPDATE_TIME = now,
  119. };
  120. affectedRows = affectedRows + new DataRepository<TEMP_IMPORT_DATA>(_dataContext).Update(updateEntity, "TEMP_IMPORT_DATA_ID", "NEWID");
  121. sql = string.Format(sql, item.TEMP_IMPORT_DATA_ID);
  122. var mainResult = new DataRepository<BAS_IMPORT_TEMPLATE>(_dataContext).Query("IMPORT_TEMPLATE_ID", item.IMPORT_TEMPLATE_ID.ToString()).FirstOrDefault();
  123. var detailList = new DataRepository<BAS_IMPORT_TEMPLATE_DTL>(_dataContext).Query("IMPORT_TEMPLATE_ID", item.IMPORT_TEMPLATE_ID.ToString());
  124. var data = item.IMPORT_DATA_JSON.ToObject<DataTable>();
  125. data.PrimaryKey = new DataColumn[] { data.Columns[0] };
  126. var result = ImportData(detailList.ToList(), mainResult, data, TempImportExecType.Check);
  127. if (result.Status == OperateStatus.Success)
  128. {
  129. item.IMPORT_STATUS = (int)TempImportStatus.CheckSuccess;
  130. }
  131. else
  132. {
  133. item.IMPORT_STATUS = (int)TempImportStatus.CheckFail;
  134. }
  135. item.UPDATE_BY = info.OperationUserId;
  136. item.UPDATE_TIME = now;
  137. item.LAST_CHECK_TIME = now;
  138. item.LAST_CHECK_MESSAGE = result.Message;
  139. affectedRows = affectedRows + new DataRepository<TEMP_IMPORT_DATA>(_dataContext).Update(item, "TEMP_IMPORT_DATA_ID", "NEWID");
  140. }
  141. break;
  142. case TempImportExecType.Import:
  143. if (item.IMPORT_STATUS == (int)TempImportStatus.CheckSuccess)
  144. {
  145. //导入前将状态改成检查中...
  146. var updateEntity = new TEMP_IMPORT_DATA
  147. {
  148. TEMP_IMPORT_DATA_ID = item.TEMP_IMPORT_DATA_ID,
  149. IMPORT_STATUS = (int)TempImportStatus.Importing,
  150. UPDATE_BY = info.OperationUserId,
  151. UPDATE_TIME = now,
  152. };
  153. affectedRows = affectedRows + new DataRepository<TEMP_IMPORT_DATA>(_dataContext).Update(item, "TEMP_IMPORT_DATA_ID", "NEWID");
  154. sql = string.Format(sql, item.TEMP_IMPORT_DATA_ID);
  155. var printTemplateList = new DataRepository<ImportTemplateView>(_dataContext).Query(sql);
  156. var mainResult = new DataRepository<BAS_IMPORT_TEMPLATE>(_dataContext).Query("IMPORT_TEMPLATE_ID", item.IMPORT_TEMPLATE_ID.ToString()).FirstOrDefault();
  157. var detailList = new DataRepository<BAS_IMPORT_TEMPLATE_DTL>(_dataContext).Query("IMPORT_TEMPLATE_ID", item.IMPORT_TEMPLATE_ID.ToString());
  158. var data = item.IMPORT_DATA_JSON.ToObject<DataTable>();
  159. data.PrimaryKey = new DataColumn[] { data.Columns[0] };
  160. var result = ImportData(detailList.ToList(), mainResult, data, TempImportExecType.Import);
  161. if (result.Status == OperateStatus.Success)
  162. {
  163. item.IMPORT_STATUS = (int)TempImportStatus.ImportSuccess;
  164. }
  165. else
  166. {
  167. item.IMPORT_STATUS = (int)TempImportStatus.ImportFail;
  168. }
  169. item.UPDATE_BY = info.OperationUserId;
  170. item.UPDATE_TIME = now;
  171. item.LAST_IMPORT_TIME = now;
  172. item.LAST_IMPORT_MESSAGE = result.Message;
  173. affectedRows = affectedRows + new DataRepository<TEMP_IMPORT_DATA>(_dataContext).Update(item, "TEMP_IMPORT_DATA_ID", "NEWID");
  174. }
  175. break;
  176. }
  177. }
  178. }
  179. catch (Exception ex)
  180. {
  181. _dataContext.Rollback();
  182. return FailMessageStatus(ex.Message);
  183. }
  184. _dataContext.Commit();
  185. return SuccessStatus();
  186. }
  187. /// <summary>
  188. /// 执行逻辑
  189. /// </summary>
  190. /// <param name="printTemplateDetailList">导入模版明细</param>
  191. /// <param name="printTemplateMain">导入模版主</param>
  192. /// <param name="data">数据</param>
  193. /// <param name="importExecType">执行类型</param>
  194. /// <returns></returns>
  195. public OperateResultInfo ImportData(List<BAS_IMPORT_TEMPLATE_DTL> printTemplateDetailList,
  196. BAS_IMPORT_TEMPLATE printTemplateMain, DataTable data, TempImportExecType importExecType)
  197. {
  198. switch (importExecType)
  199. {
  200. //检查
  201. case TempImportExecType.Check:
  202. var messageList = new List<string>();
  203. //必填验证
  204. foreach (var configItem in printTemplateDetailList)
  205. {
  206. if (configItem.TARGET_REQUIRED_FLAG == (int)RequiredFlag.YES)
  207. {
  208. if (!data.Rows.Contains(configItem.SOURCE_NAME))
  209. {
  210. if (string.IsNullOrWhiteSpace(data.Rows[0][configItem.SOURCE_NAME].ToString()))
  211. {
  212. messageList.Add(configItem.TARGET_NAME + "要求必须填写!");
  213. }
  214. }
  215. }
  216. }
  217. if (messageList.Any())
  218. {
  219. return FailMessageStatus(string.Join(",", messageList));
  220. }
  221. //数据验证
  222. messageList = new List<string>();
  223. for (int i = 0; i < data.Rows.Count; i++)
  224. {
  225. messageList = new List<string>();
  226. foreach (var configItem in printTemplateDetailList)
  227. {
  228. var value = data.Rows[i][configItem.SOURCE_NAME].ToString();
  229. //长度
  230. if (configItem.TARGET_LENGTH != null)
  231. {
  232. if (configItem.TARGET_LENGTH > 0)
  233. {
  234. if (value.Length > configItem.TARGET_LENGTH.Value)
  235. {
  236. messageList.Add($"第{i + 1}行数据,{configItem.SOURCE_NAME}长度要求<={configItem.TARGET_LENGTH.Value}!");
  237. }
  238. }
  239. }
  240. //类型
  241. try
  242. {
  243. switch (configItem.TARGET_TYPE)
  244. {
  245. case "Int":
  246. Convert.ToInt32(data.Rows[i][configItem.SOURCE_NAME]);
  247. break;
  248. case "Numeric":
  249. Convert.ToDouble(data.Rows[i][configItem.SOURCE_NAME]);
  250. break;
  251. case "Boolean":
  252. Convert.ToBoolean(data.Rows[i][configItem.SOURCE_NAME]);
  253. break;
  254. case "DateTime":
  255. Convert.ToDateTime(data.Rows[i][configItem.SOURCE_NAME]);
  256. break;
  257. }
  258. }
  259. catch (Exception ex)
  260. {
  261. messageList.Add($"第{i + 1}行数据,{configItem.SOURCE_NAME}无法转换成设定的数据类型!");
  262. }
  263. //关联
  264. if (configItem.TARGET_RELATION_TYPE == ImportTemplateRelationType.ForeignKey.ToString())
  265. {
  266. var sql = $"SELECT TOP 1 KEY,VALUE FROM ({configItem.TARGET_RELATION_CONTENT}) TEMP WHERE " +
  267. $"TEMP.KEY ='{value}' OR TEMP.NAME='{value}'";
  268. var keyValue = new DataRepository<KeyValueView>(_dataContext).Query(sql).FirstOrDefault();
  269. if (keyValue == null)
  270. {
  271. messageList.Add($"第{i + 1}行数据,{configItem.SOURCE_NAME}不满足关联类型外键!");
  272. }
  273. }
  274. }
  275. }
  276. //存在错误消息
  277. if (messageList.Any())
  278. {
  279. return FailMessageStatus(string.Join(",", messageList));
  280. }
  281. return SuccessStatus();
  282. //导入
  283. case TempImportExecType.Import:
  284. try
  285. {
  286. var fieldList = new List<string>();
  287. foreach (var configItem in printTemplateDetailList)
  288. {
  289. if (data.Columns.Contains(configItem.SOURCE_CODE))
  290. {
  291. fieldList.Add(configItem.TARGET_CODE);
  292. }
  293. }
  294. var affectedRows = 0;
  295. for (int i = 0; i < data.Rows.Count; i++)
  296. {
  297. var valueList = new List<string>();
  298. foreach (var configItem in printTemplateDetailList)
  299. {
  300. if (data.Columns.Contains(configItem.SOURCE_CODE))
  301. {
  302. switch (configItem.TARGET_TYPE)
  303. {
  304. case "Int":
  305. case "Numeric":
  306. case "Boolean":
  307. valueList.Add(configItem.TARGET_CODE);
  308. break;
  309. default:
  310. valueList.Add("'" + configItem.TARGET_CODE + "'");
  311. break;
  312. }
  313. }
  314. }
  315. var sql = $"INSERT INTO {printTemplateMain.TARGET_OBJECT_CODE}({fieldList}) Value({valueList})";
  316. affectedRows = affectedRows + new DataRepository<object>(_dataContext).Execute(sql);
  317. }
  318. if (affectedRows != data.Rows.Count)
  319. {
  320. return GetStatus(affectedRows, data.Rows.Count);
  321. }
  322. return SuccessStatus();
  323. }
  324. catch (Exception ex)
  325. {
  326. return FailMessageStatus(ex.Message);
  327. }
  328. }
  329. return FailMessageStatus("参数错误!");
  330. }
  331. public OperateResultInfo<PageQueryResultInfo<TempImportResult>> GetList(TempImportSearchCondition info)
  332. {
  333. var sqlAndBuilder = new StringBuilder();
  334. var sqlOrBuilder = new StringBuilder();
  335. var sql = $@"SELECT
  336. CreateName = (SELECT USER_NAME FROM SYS_USER A WHERE A.USER_ID=CREATE_BY),
  337. UpdateName = (SELECT USER_NAME FROM SYS_USER B WHERE B.USER_ID=UPDATE_BY),
  338. ImportMode = BAS_IMPORT_TEMPLATE.IMPORT_MODE,
  339. ImportModeName = {_iSQLNodeRepository.GetEnumIntCaseString<ImportTemplateMode>("IMPORT_MODE")},
  340. ImportStatusName = {_iSQLNodeRepository.GetEnumIntCaseString<TempImportStatus>("IMPORT_STATUS")},
  341. ImportTemplateCode = BAS_IMPORT_TEMPLATE.IMPORT_TEMPLATE_CODE,
  342. ImportTemplateName = BAS_IMPORT_TEMPLATE.IMPORT_TEMPLATE_NAME,
  343. TargetObjectName = BAS_IMPORT_TEMPLATE.TARGET_OBJECT_NAME,
  344. TargetObjectCode = BAS_IMPORT_TEMPLATE.TARGET_OBJECT_CODE,
  345. TargetObjectType = BAS_IMPORT_TEMPLATE.TARGET_OBJECT_TYPE,
  346. TargetObjectTypeName = {_iSQLNodeRepository.GetEnumIntCaseString<SourceObjectType>("TARGET_OBJECT_TYPE")},
  347. TEMP_IMPORT_DATA.* FROM TEMP_IMPORT_DATA
  348. JOIN BAS_IMPORT_TEMPLATE ON BAS_IMPORT_TEMPLATE.IMPORT_TEMPLATE_ID=TEMP_IMPORT_DATA.IMPORT_TEMPLATE_ID
  349. WHERE 1=1 AND TEMP_IMPORT_DATA.DEL_FLAG = 0";
  350. sqlAndBuilder = string.IsNullOrWhiteSpace(info.BatchNo) ?
  351. sqlAndBuilder :
  352. sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("BATCH_NO", info.BatchNo, DBOperationString._ContainIn));
  353. sqlAndBuilder = info.ImportStatus == null ?
  354. sqlAndBuilder :
  355. sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("IMPORT_STATUS", info.ImportStatus, DBOperationString._ContainIn));
  356. sql = sql + (sqlAndBuilder.Length > 0 ? _iSQLNodeRepository.GetAndString(sqlAndBuilder, false) : "");
  357. //检查时间
  358. sqlOrBuilder = info.CheckBeginTime == null ?
  359. sqlOrBuilder :
  360. sqlOrBuilder.Append(_iSQLNodeRepository.GetOrCondition("LAST_CHECK_TIME", info.CheckBeginTime, DBOperationString._LargeEqual));
  361. sqlOrBuilder = info.CheckEndTime == null ?
  362. sqlOrBuilder :
  363. sqlOrBuilder.Append(_iSQLNodeRepository.GetOrCondition("LAST_CHECK_TIME", info.CheckEndTime, DBOperationString._SmallEqual));
  364. sql = sql + (sqlOrBuilder.Length > 0 ? _iSQLNodeRepository.GetAndString(sqlOrBuilder, false) : "");
  365. //导入时间
  366. sqlOrBuilder = info.ImportBeginTime == null ?
  367. sqlOrBuilder :
  368. sqlOrBuilder.Append(_iSQLNodeRepository.GetOrCondition("LAST_IMPORT_TIME", info.ImportBeginTime, DBOperationString._LargeEqual));
  369. sqlOrBuilder = info.ImportEndTime == null ?
  370. sqlOrBuilder :
  371. sqlOrBuilder.Append(_iSQLNodeRepository.GetOrCondition("LAST_IMPORT_TIME", info.ImportEndTime, DBOperationString._SmallEqual));
  372. sql = sql + (sqlOrBuilder.Length > 0 ? _iSQLNodeRepository.GetAndString(sqlOrBuilder, false) : "");
  373. IEnumerable<TempImportResult> result;
  374. IEnumerable<TempImportResult> totalResult;
  375. totalResult = new DataRepository<TempImportResult>(_dataContext).Query(sql);
  376. if (info.PageIndex == 0 || info.PageSize == 0)
  377. {
  378. result = totalResult.ToList();
  379. }
  380. else
  381. {
  382. result = new DataRepository<TempImportResult>(_dataContext).QueryPage(sql,
  383. "UPDATE_TIME", info.PageSize, info.PageIndex, true);
  384. }
  385. return SuccessStatus(new PageQueryResultInfo<TempImportResult>
  386. {
  387. RowData = result,
  388. PageConditionInfo = info,
  389. TotalCount = totalResult.Count(),
  390. TotalPageCount = (int)Math.Ceiling((double)totalResult.Count() / info.PageSize)
  391. });
  392. }
  393. }
  394. }