BalanceOperateService.cs 72 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264
  1. using DapperORMCore.Context.DataContext;
  2. using DapperORMCore.Model.BaseModel;
  3. using DapperORMCore.Model.CoreModel;
  4. using DapperORMCore.Repository.IRepositorys;
  5. using DapperORMCore.String.Consts;
  6. using DapperORMCore.String.Enums;
  7. using Microsoft.Extensions.Configuration;
  8. using NXWMS.Code;
  9. using NXWMS.DataAccess.Entity;
  10. using NXWMS.IService.NXWMS.Balance;
  11. using NXWMS.Model.AppModels.Condition.Balance;
  12. using NXWMS.Model.AppModels.Result.Balance;
  13. using NXWMS.Model.AppModels.Result.OutStock;
  14. using NXWMS.Model.Common;
  15. using NXWMS.String.Enums;
  16. using System;
  17. using System.Collections.Generic;
  18. using System.Linq;
  19. using System.Text;
  20. using System.Threading.Tasks;
  21. using WestDistance.DapperORM.Repository.Repositorys;
  22. namespace NXWMS.Service.NXWMS.Balance
  23. {
  24. /// <summary>
  25. /// 库存操作接口
  26. /// </summary>
  27. [AutoInject(typeof(IBalanceOperateService), InjectType.Scope)]
  28. public class BalanceOperateService : ServiceBase, IBalanceOperateService
  29. {
  30. /// <summary>
  31. /// 系统操作仓储中转
  32. /// </summary>
  33. private IDataRepositoryContext _dataContext;
  34. /// <summary>
  35. /// SQL节点仓储
  36. /// </summary>
  37. private ISQLNodeRepository _iSQLNodeRepository;
  38. /// <summary>
  39. /// 配置
  40. /// </summary>
  41. private IConfiguration _configuration;
  42. /// <summary>
  43. /// 库存查询服务
  44. /// </summary>
  45. private IBalanceSearchService _balanceSearchService;
  46. public BalanceOperateService(IDataRepositoryContext dataRepositoryContext,
  47. IConfiguration configuration, ISQLNodeRepository iSQLNodeRepository, IBalanceSearchService balanceSearchService)
  48. {
  49. this._dataContext = dataRepositoryContext;
  50. this._configuration = configuration;
  51. this._iSQLNodeRepository = iSQLNodeRepository;
  52. this._balanceSearchService = balanceSearchService;
  53. }
  54. /// <summary>
  55. /// 库存状态变更
  56. /// </summary>
  57. /// <param name="info"></param>
  58. /// <returns></returns>
  59. public OperateResultInfo BalanceStatusChange(BalanceStatusChangeCondition info)
  60. {
  61. if (info.BalanceId == 0 && string.IsNullOrWhiteSpace(info.BalanceIds))
  62. {
  63. return FailMessageStatus("参数错误!");
  64. }
  65. var sqlAndBuilder = new StringBuilder();
  66. sqlAndBuilder = info.BalanceId != null ?
  67. sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("BALANCE_ID", info.BalanceId, DBOperationString._Equal)) :
  68. sqlAndBuilder;
  69. sqlAndBuilder = string.IsNullOrWhiteSpace(info.BalanceIds) ?
  70. sqlAndBuilder :
  71. sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("BALANCE_ID", info.BalanceIds, DBOperationString._In));
  72. if (sqlAndBuilder.Length == 0)
  73. {
  74. return FailMessageStatus("参数错误!");
  75. }
  76. var now = DateTime.Now;
  77. var sql = $@"UPDATE WMS_STK_BALANCE SET BALANCE_STATUS={(int)info.BalanceStatus},UPDATE_BY={info.OperationUserId},UPDATE_TIME='{now}'
  78. WHERE 1=1 {sqlAndBuilder}";
  79. var affectedRows = new DataRepository<WMS_STK_BALANCE>(_dataContext).Execute(sql);
  80. if (!string.IsNullOrWhiteSpace(info.BalanceIds))
  81. {
  82. return GetStatus(affectedRows, info.BalanceIds.Split(',').Length);
  83. }
  84. if (info.BalanceId != null)
  85. {
  86. return GetStatus(affectedRows, 1);
  87. }
  88. return SuccessStatus();
  89. }
  90. /// <summary>
  91. /// 盘点状态变更
  92. /// </summary>
  93. /// <param name="info"></param>
  94. /// <returns></returns>
  95. public OperateResultInfo InventoryStatusChange(InventoryStatusChangeCondition info)
  96. {
  97. var sqlAndBuilder = new StringBuilder();
  98. sqlAndBuilder = info.Id != null ?
  99. info.Id > 0 ?
  100. sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("INVENTORY_ID", info.Id, DBOperationString._Equal)) :
  101. sqlAndBuilder : sqlAndBuilder;
  102. sqlAndBuilder = string.IsNullOrWhiteSpace(info.InventoryNo) ?
  103. sqlAndBuilder :
  104. sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("INVENTORY_NO", info.InventoryNo, DBOperationString._Equal));
  105. sqlAndBuilder = string.IsNullOrWhiteSpace(info.Ids) ?
  106. sqlAndBuilder :
  107. sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("INVENTORY_ID", info.Ids, DBOperationString._In));
  108. if (sqlAndBuilder.Length == 0)
  109. {
  110. return FailMessageStatus("参数错误!");
  111. }
  112. try
  113. {
  114. _dataContext.BeginTran();
  115. var now = DateTime.Now;
  116. var sql = string.Empty;
  117. int statusBalance;
  118. if (info.InventoryModeMsg == "结束盘点")
  119. {
  120. statusBalance = 55;
  121. }
  122. else if (info.InventoryModeMsg == "正常盘点")
  123. {
  124. statusBalance = 88;
  125. }
  126. else
  127. {
  128. statusBalance = 88;
  129. }
  130. if (info.InventoryModeMsg == "正常盘点" || info.InventoryModeMsg == "结束盘点")
  131. {
  132. sql = $@"UPDATE WMS_STK_INVENTORY SET INVENTORY_STATUS={(int)info.InventoryStatus},
  133. UPDATE_BY={info.OperationUserId},UPDATE_TIME='{now}'
  134. WHERE 1=1 {sqlAndBuilder}";
  135. new DataRepository<WMS_STK_BALANCE>(_dataContext).Execute(sql);
  136. sql = $@"UPDATE WMS_STK_INVENTORY_DTL SET INVENTORY_DTL_STATUS={(int)info.InventoryStatus},
  137. UPDATE_BY={info.OperationUserId},UPDATE_TIME='{now}'
  138. WHERE 1=1 AND EXISTS(SELECT * FROM WMS_STK_INVENTORY WHERE 1=1 {sqlAndBuilder})";
  139. new DataRepository<WMS_STK_BALANCE>(_dataContext).Execute(sql);
  140. }
  141. sql = $"update WMS_STK_BALANCE set BALANCE_STATUS = '{statusBalance}',UPDATE_BY = '{info.OperationUserId}',UPDATE_TIME = getdate(),DATA_VERSION = DATA_VERSION + 1 where TRAY_CODE in (select TRAY_CODE from WMS_STK_INVENTORY_DTL where INVENTORY_ID = '{info.Ids}') and BALANCE_STATUS < 99";
  142. new DataRepository<WMS_STK_BALANCE>(_dataContext).Execute(sql);
  143. sql = $"update WMS_STK_TRAY set TRAY_STATUS = '{statusBalance}',UPDATE_BY = '{info.OperationUserId}',UPDATE_TIME = getdate(),DATA_VERSION = DATA_VERSION + 1 where TRAY_CODE in (select TRAY_CODE from WMS_STK_INVENTORY_DTL where INVENTORY_ID = '{info.Ids}') and TRAY_STATUS < 99";
  144. new DataRepository<WMS_STK_BALANCE>(_dataContext).Execute(sql);
  145. sql = $"update WMS_STK_TRAY_DTL set TRAY_DTL_STATUS = '{statusBalance}',UPDATE_BY = '{info.OperationUserId}',UPDATE_TIME = getdate(),DATA_VERSION = DATA_VERSION + 1 where TRAY_DTL_ID in (select TRAY_DTL_ID from WMS_STK_INVENTORY_DTL where INVENTORY_ID = '{info.Ids}') and TRAY_DTL_STATUS < 99";
  146. new DataRepository<WMS_STK_BALANCE>(_dataContext).Execute(sql);
  147. _dataContext.Commit();
  148. return SuccessStatus();
  149. }
  150. catch (Exception ex)
  151. {
  152. _dataContext.Rollback();
  153. return FailMessageStatus(ex.Message);
  154. }
  155. }
  156. public OperateResultInfo ConfirmInventory(ResultConfirmInventoryCondition info)
  157. {
  158. try
  159. {
  160. _dataContext.BeginTran();
  161. var now = DateTime.Now;
  162. var sql = $@"UPDATE WMS_STK_INVENTORY SET INVENTORY_STATUS={(int)info.InventoryStatus},
  163. UPDATE_BY={info.OperationUserId},UPDATE_TIME='{now}'
  164. WHERE 1=1 AND INVENTORY_NO='{info.InventoryNo}'";
  165. new DataRepository<WMS_STK_INVENTORY>(_dataContext).Execute(sql);
  166. foreach (var item in info.ResultConfirmInventoryDetail)
  167. {
  168. sql = $@"UPDATE WMS_STK_INVENTORY_DTL SET ACTUAL_INVENTORY_QTY={item.ActualInventoryQty},
  169. UPDATE_BY={info.OperationUserId},UPDATE_TIME='{now}'
  170. WHERE 1=1 AND INVENTORY_DTL_ID={item.InventoryDTLId}";
  171. new DataRepository<WMS_STK_INVENTORY_DTL>(_dataContext).Execute(sql);
  172. }
  173. _dataContext.Commit();
  174. return SuccessStatus();
  175. }
  176. catch (Exception ex)
  177. {
  178. _dataContext.Rollback();
  179. return FailMessageStatus(ex.Message);
  180. }
  181. }
  182. /// <summary>
  183. /// 盘点单结果确认
  184. /// </summary>
  185. /// <param name="info"></param>
  186. /// <returns></returns>
  187. public OperateResultInfo ResultConfirmInventory(ResultConfirmInventoryCondition info)
  188. {
  189. //TODO 暂时注释,,减少麻烦...
  190. //var whereList = new List<FieldKeyInfo>()
  191. // .AddFieldKeyInfo(nameof(WMS_STK_INVENTORY.INVENTORY_NO), info.InventoryNo,
  192. // EnumCSharpPropertyType.STRING, DBOperationString._Equal,
  193. // !string.IsNullOrWhiteSpace(info.InventoryNo))
  194. // .AddFieldKeyInfo(nameof(WMS_STK_INVENTORY.RESULT_FLAG), 1,
  195. // EnumCSharpPropertyType.STRING, DBOperationString._NoEqual);
  196. //var result = new DataRepository<WMS_STK_INVENTORY>(_dataContext).Query(whereList).FirstOrDefault();
  197. //if (result == null)
  198. //{
  199. // return FailMessageStatus($"盘点单数据出现变更,请重新刷新数据!");
  200. //}
  201. //if (result.INVENTORY_STATUS != (int)InventoryStatus.FirstInventorComplate
  202. // && result.INVENTORY_STATUS != (int)InventoryStatus.TwoInventorComplate)
  203. //{
  204. // return FailMessageStatus($"盘点单状态不在盘点完成,请重新刷新数据!");
  205. //}
  206. try
  207. {
  208. _dataContext.BeginTran();
  209. var now = DateTime.Now;
  210. var sql = $@"UPDATE WMS_STK_INVENTORY SET RESULT_FLAG=1,
  211. UPDATE_BY={info.OperationUserId},UPDATE_TIME='{now}'
  212. WHERE 1=1 AND INVENTORY_NO='{info.InventoryNo}'";
  213. new DataRepository<WMS_STK_INVENTORY>(_dataContext).Execute(sql);
  214. foreach(var item in info.ResultConfirmInventoryDetail)
  215. {
  216. sql = $@"UPDATE WMS_STK_INVENTORY_DTL SET INVENTORY_RESULT_QTY={item.InventoryResultQTY},
  217. UPDATE_BY={info.OperationUserId},UPDATE_TIME='{now}'
  218. WHERE 1=1 AND INVENTORY_DTL_ID={item.InventoryDTLId}";
  219. new DataRepository<WMS_STK_INVENTORY_DTL>(_dataContext).Execute(sql);
  220. }
  221. sql = $@"update [dbo].[WMS_STK_BALANCE]
  222. set BALANCE_STATUS=55 where PALLET_CODE in (
  223. SELECT PALLET_CODE
  224. FROM [dbo].[WMS_STK_INVENTORY_DTL] ,WMS_STK_INVENTORY where WMS_STK_INVENTORY.INVENTORY_ID=WMS_STK_INVENTORY.INVENTORY_ID
  225. and WMS_STK_INVENTORY.INVENTORY_NO='{info.InventoryNo}'
  226. ) and BALANCE_STATUS={(int)BalanceStatus.Complete}";
  227. new DataRepository<WMS_STK_BALANCE>(_dataContext).Execute(sql);
  228. sql = $@"update WMS_STK_TRAY_DTL set WMS_STK_TRAY_DTL.QTY=tbl2.INVENTORY_RESULT_QTY from WMS_STK_TRAY_DTL,
  229. (select tbl.TRAY_DTL_ID,tbl.MATERIEL_CODE,WMS_STK_INVENTORY_DTL.INVENTORY_RESULT_QTY,WMS_STK_INVENTORY.INVENTORY_NO from WMS_STK_INVENTORY_DTL
  230. left join (
  231. select WMS_STK_TRAY_DTL.TRAY_DTL_ID,WMS_STK_TRAY.TRAY_CODE,WMS_STK_TRAY_DTL.MATERIEL_CODE from WMS_STK_TRAY_DTL
  232. left join WMS_STK_TRAY on WMS_STK_TRAY_DTL.TRAY_ID=WMS_STK_TRAY.TRAY_ID) as tbl on WMS_STK_INVENTORY_DTL.TRAY_CODE=tbl.TRAY_CODE
  233. LEFT JOIN WMS_STK_INVENTORY ON WMS_STK_INVENTORY_DTL.INVENTORY_ID=WMS_STK_INVENTORY.INVENTORY_ID
  234. ) tbl2
  235. where WMS_STK_TRAY_DTL.TRAY_DTL_ID=tbl2.TRAY_DTL_ID and tbl2.INVENTORY_NO='{info.InventoryNo}'";
  236. new DataRepository<WMS_STK_TRAY_DTL>(_dataContext).Execute(sql);
  237. _dataContext.Commit();
  238. return SuccessStatus();
  239. }
  240. catch (Exception ex)
  241. {
  242. _dataContext.Rollback();
  243. return FailMessageStatus(ex.Message);
  244. }
  245. }
  246. /// <summary>
  247. /// 新增盘点单
  248. /// </summary>
  249. /// <param name="info"></param>
  250. /// <returns></returns>
  251. public OperateResultInfo AddInventory(InventoryOperateCondition info)
  252. {
  253. var whereList = new List<FieldKeyInfo>()
  254. .AddFieldKeyInfo(nameof(WMS_STK_BALANCE.BALANCE_ID), string.Join(",", info.InventoryAddDetailList.Select(s => s.BalanceId).ToList()),
  255. EnumCSharpPropertyType.STRING, DBOperationString._In,
  256. info.InventoryAddDetailList.Any())
  257. .AddFieldKeyInfo(nameof(WMS_STK_BALANCE.BALANCE_STATUS), (int)BalanceStatus.InStock,
  258. EnumCSharpPropertyType.STRING, DBOperationString._NoEqual, true);
  259. var result = new DataRepository<WMS_STK_BALANCE>(_dataContext).Query(whereList);
  260. if (result.Any())
  261. {
  262. return FailMessageStatus($"新增的盘点单明细中,【{string.Join(",", result.Select(s => s.BIN_CODE))}】库位均不是在库状态,请检查!");
  263. }
  264. try
  265. {
  266. _dataContext.BeginTran();
  267. var now = DateTime.Now;
  268. int inventoryId = Convert.ToInt32(new DataRepository<object>(_dataContext).GetSequenceMsg("Inventory_Id"));
  269. string InventoryNo = new DataRepository<object>(_dataContext).GetSequenceMsg("Inventory_No");
  270. //盘点主表
  271. var entity = new WMS_STK_INVENTORY
  272. {
  273. NEWID =Guid.NewGuid().ToString(),
  274. RESULT_FLAG = (int)ResultFlag.UnConfirm,
  275. INVENTORY_END_TIME = info.InventoryEndDate,
  276. INVENTORY_MODE = info.InventoryMode,
  277. UPDATE_BY = info.OperationUserId,
  278. CREATE_BY = info.OperationUserId,
  279. UPDATE_TIME = now,
  280. CREATE_TIME = now,
  281. INVENTORY_BEGIN_TIME = info.InventoryBeginDate,
  282. INVENTORY_PERCENTAGE = info.InventoryPercentage,
  283. INVENTORY_STATUS = (int)InventoryStatus.Init,
  284. DESCRIBE = info.Describe,
  285. INVENTORY_NO = InventoryNo,
  286. INVENTORY_TYPE = info.InventoryType,
  287. INVENTORY_ID = inventoryId,
  288. };
  289. new DataRepository<WMS_STK_INVENTORY>(_dataContext).Add(entity);
  290. var balanceList = _balanceSearchService.GetDetailList(new BalanceDetailSearchCondition
  291. {
  292. Ids = string.Join(",", info.InventoryAddDetailList.Select(s => s.BalanceId).ToList())
  293. }).Data.RowData;
  294. if (balanceList.Count() != info.InventoryAddDetailList.Count)
  295. {
  296. if (result.Any())
  297. {
  298. return FailMessageStatus($"当前库存数据出现变更,请重新检查!");
  299. }
  300. }
  301. //盘点明细
  302. foreach (var item in balanceList)
  303. {
  304. int inventoryDtlId = Convert.ToInt32(new DataRepository<object>(_dataContext).GetSequenceMsg("Inventory_Dtl_Id"));
  305. var dtlEntity = new WMS_STK_INVENTORY_DTL
  306. {
  307. BIN_CODE = item.BIN_CODE,
  308. INVENTORY_DTL_ID = inventoryDtlId,
  309. INVENTORY_ID = inventoryId,
  310. INVENTORY_DTL_STATUS = (int)InventoryDTLStatus.Init,
  311. MATERIEL_BARCODE = info.InventoryAddDetailList.Where(s => s.BinCode == item.BIN_CODE).
  312. Select(s => s.MaterielBarCode).FirstOrDefault(),
  313. MATERIEL_CODE = item.MaterielCode,
  314. PACKAGE_CODE = item.PalletCode,
  315. PALLET_CODE = item.PalletCode,
  316. REGION_CODE = item.REGION_CODE,
  317. SUPPLIER_CODE = item.SupplierCode,
  318. TRAY_DTL_ID = item.TrayDtlId,
  319. TRAY_CODE = item.TRAY_CODE,
  320. UNIT_CODE = item.UnitCode,
  321. UPDATE_BY = info.OperationUserId,
  322. CREATE_BY = info.OperationUserId,
  323. UPDATE_TIME = now,
  324. CREATE_TIME = now,
  325. MATERIEL_NAME = item.MaterielName,
  326. BATCH_NO = item.BatchNo,
  327. BIN_NAME = item.BIN_NAME,
  328. SUPPLIER_NAME = item.SupplierName,
  329. MATERIEL_SPEC = item.SpecsModel,
  330. QTY = item.QTY,
  331. REGION_NAME = item.REGION_NAME,
  332. };
  333. new DataRepository<WMS_STK_INVENTORY_DTL>(_dataContext).Add(dtlEntity);
  334. }
  335. #region 20210218 孙亚龙舍弃。这里不需要修改库存。
  336. //更新库存状态
  337. //BalanceStatusChange(new BalanceStatusChangeCondition
  338. //{
  339. // BalanceStatus = BalanceStatus.CheckOutStock,
  340. // BalanceIds = string.Join(",", info.InventoryAddDetailList.Select(s => s.BalanceId).ToList())
  341. //});
  342. #endregion
  343. _dataContext.Commit();
  344. return SuccessStatus();
  345. }
  346. catch (Exception ex)
  347. {
  348. _dataContext.Rollback();
  349. return FailMessageStatus(ex.Message);
  350. }
  351. }
  352. /// <summary>
  353. /// 编辑盘点单
  354. /// </summary>
  355. /// <param name="info"></param>
  356. /// <returns></returns>
  357. public OperateResultInfo EditInventory(InventoryOperateCondition info)
  358. {
  359. if (info.InventoryId == null || string.IsNullOrWhiteSpace(info.InventoryNo))
  360. {
  361. return FailMessageStatus($"参数错误!");
  362. }
  363. var whereList = new List<FieldKeyInfo>()
  364. .AddFieldKeyInfo(nameof(WMS_STK_BALANCE.BALANCE_ID), string.Join(",", info.InventoryAddDetailList.
  365. Where(s => s.BalanceId != null).Select(s => s.BalanceId).ToList()),
  366. EnumCSharpPropertyType.STRING, DBOperationString._In,
  367. string.Join(",", info.InventoryAddDetailList.
  368. Where(s => s.BalanceId != null).Select(s => s.BalanceId).ToList()).Any())
  369. .AddFieldKeyInfo(nameof(WMS_STK_BALANCE.BALANCE_STATUS), (int)BalanceStatus.InStock,
  370. EnumCSharpPropertyType.STRING, DBOperationString._NoEqual, true);
  371. var result = new DataRepository<WMS_STK_BALANCE>(_dataContext).Query(whereList);
  372. if (result.Any())
  373. {
  374. return FailMessageStatus($"编辑的盘点单明细中,【{string.Join(",", result.Select(s => s.BIN_CODE))}】库位均不是在库状态,请检查!");
  375. }
  376. //TODO只做这个验证了..单据中状态验证 后期填补
  377. if (info.InventoryId != null)
  378. {
  379. var inventoryTemp = new DataRepository<WMS_STK_INVENTORY>(_dataContext).
  380. Query("INVENTORY_ID", info.InventoryId.ToString()).FirstOrDefault();
  381. if (inventoryTemp == null)
  382. {
  383. return FailMessageStatus($"参数错误");
  384. }
  385. switch (inventoryTemp.INVENTORY_STATUS)
  386. {
  387. case (int)InventoryStatus.Deleted:
  388. return FailMessageStatus($"盘点单已被删除,无法编辑,请检查!");
  389. //TODO 这里可以填补其他验证
  390. }
  391. }
  392. if (string.IsNullOrWhiteSpace(info.InventoryNo))
  393. {
  394. var inventoryTemp = new DataRepository<WMS_STK_INVENTORY>(_dataContext).
  395. Query("INVENTORY_NO", info.InventoryNo).FirstOrDefault();
  396. if (inventoryTemp == null)
  397. {
  398. return FailMessageStatus($"参数错误");
  399. }
  400. switch (inventoryTemp.INVENTORY_STATUS)
  401. {
  402. case (int)InventoryStatus.Deleted:
  403. return FailMessageStatus($"盘点单明细已被删除,无法编辑,请检查!");
  404. //TODO 这里可以填补其他验证,单据中状态验证 后期填补
  405. }
  406. }
  407. try
  408. {
  409. _dataContext.BeginTran();
  410. var now = DateTime.Now;
  411. var entity = new WMS_STK_INVENTORY();
  412. if (info.InventoryId != null)
  413. {
  414. entity = new DataRepository<WMS_STK_INVENTORY>(_dataContext).
  415. Query("INVENTORY_ID", info.InventoryId.ToString()).FirstOrDefault();
  416. }
  417. else
  418. {
  419. entity = new DataRepository<WMS_STK_INVENTORY>(_dataContext).
  420. Query("INVENTORY_NO", info.InventoryNo).FirstOrDefault();
  421. }
  422. //盘点主表
  423. entity = new WMS_STK_INVENTORY
  424. {
  425. RESULT_FLAG = (int)ResultFlag.UnConfirm,
  426. INVENTORY_END_TIME = info.InventoryEndDate,
  427. INVENTORY_MODE = info.InventoryMode,
  428. UPDATE_BY = info.OperationUserId,
  429. CREATE_BY = info.OperationUserId,
  430. UPDATE_TIME = now,
  431. CREATE_TIME = now,
  432. INVENTORY_BEGIN_TIME = info.InventoryBeginDate,
  433. INVENTORY_PERCENTAGE = info.InventoryPercentage,
  434. //盘点单主表状态不变更
  435. //INVENTORY_STATUS = info.InventoryStatus == null ? (int)InventoryStatus.Init : (int)info.InventoryStatus,
  436. DESCRIBE = info.Describe,
  437. INVENTORY_NO = info.InventoryNo,
  438. INVENTORY_TYPE = info.InventoryType,
  439. INVENTORY_ID = entity.INVENTORY_ID,
  440. };
  441. new DataRepository<WMS_STK_INVENTORY>(_dataContext).Update(entity, "INVENTORY_ID", "NEWID");
  442. if (info.InventoryAddDetailList.Select(s => s.BalanceId).Distinct().Any())
  443. {
  444. var balanceList = _balanceSearchService.GetDetailList(new BalanceDetailSearchCondition
  445. {
  446. Ids = string.Join(",", info.InventoryAddDetailList.Select(s => s.BalanceId).ToList())
  447. }).Data.RowData;
  448. if (balanceList.Count() != info.InventoryAddDetailList.Count)
  449. {
  450. return FailMessageStatus($"当前库存数据出现变更,请检查!");
  451. }
  452. //之前操作的明细更新成删除状态,后面的明细进行产生新的数据
  453. var sql = $@"UPDATE WMS_STK_INVENTORY_DTL SET INVENTORY_DTL_STATUS={((int)InventoryStatus.Deleted).ToString()},
  454. UPDATE_BY={info.OperationUserId},UPDATE_TIME='{now}'
  455. WHERE 1=1 AND EXISTS(SELECT * FROM WMS_STK_INVENTORY WHERE 1=1 INVENTORY_ID={entity.INVENTORY_ID})";
  456. new DataRepository<WMS_STK_BALANCE>(_dataContext).Execute(sql);
  457. //盘点明细
  458. foreach (var item in balanceList)
  459. {
  460. var detailInfo = info.InventoryAddDetailList.Where(s => s.BalanceId == item.BALANCE_ID).FirstOrDefault();
  461. whereList = new List<FieldKeyInfo>()
  462. .AddFieldKeyInfo(nameof(WMS_STK_INVENTORY_DTL.INVENTORY_ID), entity.INVENTORY_ID,
  463. EnumCSharpPropertyType.INT, DBOperationString._Equal)
  464. //TODO 以下三个条件确定 盘点明细表的唯一性
  465. .AddFieldKeyInfo(nameof(WMS_STK_INVENTORY_DTL.BIN_CODE), item.BIN_CODE,
  466. EnumCSharpPropertyType.INT, DBOperationString._Equal, EnumSelectWhereType.And, 1, true)
  467. .AddFieldKeyInfo(nameof(WMS_STK_INVENTORY_DTL.TRAY_CODE), item.TRAY_CODE,
  468. EnumCSharpPropertyType.INT, DBOperationString._Equal, EnumSelectWhereType.And, 1, true)
  469. .AddFieldKeyInfo(nameof(WMS_STK_INVENTORY_DTL.PALLET_CODE), item.PALLET_CODE,
  470. EnumCSharpPropertyType.INT, DBOperationString._Equal, EnumSelectWhereType.And, 1, true);
  471. var detailEntity = new DataRepository<WMS_STK_INVENTORY_DTL>(_dataContext).Query(whereList);
  472. //不存在,说明需要新增
  473. if (detailEntity == null)
  474. {
  475. int inventoryDtlId = Convert.ToInt32(new DataRepository<object>(_dataContext).GetSequenceMsg("Inventory_Dtl_Id"));
  476. var dtlEntity = new WMS_STK_INVENTORY_DTL
  477. {
  478. BIN_CODE = item.BIN_CODE,
  479. INVENTORY_DTL_ID = inventoryDtlId,
  480. INVENTORY_ID = entity.INVENTORY_ID,
  481. INVENTORY_DTL_STATUS = detailInfo.InventoryDTLStatus == null ? (int)InventoryDTLStatus.Init : (int)detailInfo.InventoryDTLStatus,
  482. MATERIEL_BARCODE = info.InventoryAddDetailList.Where(s => s.BinCode == item.BIN_CODE).
  483. Select(s => s.MaterielBarCode).FirstOrDefault(),
  484. MATERIEL_CODE = item.MaterielCode,
  485. PACKAGE_CODE = item.PalletCode,
  486. PALLET_CODE = item.PalletCode,
  487. REGION_CODE = item.REGION_CODE,
  488. SUPPLIER_CODE = item.SupplierCode,
  489. TRAY_CODE = item.TRAY_CODE,
  490. UNIT_CODE = item.UnitCode,
  491. UPDATE_BY = info.OperationUserId,
  492. CREATE_BY = info.OperationUserId,
  493. UPDATE_TIME = now,
  494. CREATE_TIME = now,
  495. MATERIEL_NAME = item.MaterielName,
  496. BATCH_NO = item.BatchNo,
  497. BIN_NAME = item.BIN_NAME,
  498. SUPPLIER_NAME = item.SupplierName,
  499. MATERIEL_SPEC = item.SpecsModel,
  500. QTY = item.QTY,
  501. REGION_NAME = item.REGION_NAME,
  502. };
  503. new DataRepository<WMS_STK_INVENTORY_DTL>(_dataContext).Add(dtlEntity);
  504. }
  505. //存在需要修改
  506. else
  507. {
  508. var dtlEntity = new WMS_STK_INVENTORY_DTL
  509. {
  510. BIN_CODE = item.BIN_CODE,
  511. INVENTORY_DTL_ID = detailInfo.InventoryDTLId.Value,
  512. INVENTORY_ID = entity.INVENTORY_ID,
  513. //盘点单明细表状态不变更
  514. //INVENTORY_DTL_STATUS = detailInfo.InventoryDTLStatus == null ? (int)InventoryDTLStatus.Init : (int)detailInfo.InventoryDTLStatus,
  515. MATERIEL_BARCODE = info.InventoryAddDetailList.Where(s => s.BinCode == item.BIN_CODE).
  516. Select(s => s.MaterielBarCode).FirstOrDefault(),
  517. MATERIEL_CODE = item.MaterielCode,
  518. PACKAGE_CODE = item.PalletCode,
  519. PALLET_CODE = item.PalletCode,
  520. REGION_CODE = item.REGION_CODE,
  521. SUPPLIER_CODE = item.SupplierCode,
  522. TRAY_CODE = item.TRAY_CODE,
  523. UNIT_CODE = item.UnitCode,
  524. UPDATE_BY = info.OperationUserId,
  525. CREATE_BY = info.OperationUserId,
  526. UPDATE_TIME = now,
  527. CREATE_TIME = now,
  528. MATERIEL_NAME = item.MaterielName,
  529. BATCH_NO = item.BatchNo,
  530. BIN_NAME = item.BIN_NAME,
  531. SUPPLIER_NAME = item.SupplierName,
  532. MATERIEL_SPEC = item.SpecsModel,
  533. QTY = item.QTY,
  534. REGION_NAME = item.REGION_NAME,
  535. };
  536. new DataRepository<WMS_STK_INVENTORY_DTL>(_dataContext).Update(entity, "INVENTORY_DTL_ID", "NEWID");
  537. }
  538. }
  539. //更新库存状态
  540. BalanceStatusChange(new BalanceStatusChangeCondition
  541. {
  542. BalanceStatus = BalanceStatus.CheckOutStock,
  543. BalanceIds = string.Join(",", info.InventoryAddDetailList.Select(s => s.BalanceId).ToList())
  544. });
  545. }
  546. _dataContext.Commit();
  547. return SuccessStatus();
  548. }
  549. catch (Exception ex)
  550. {
  551. _dataContext.Rollback();
  552. return FailMessageStatus(ex.Message);
  553. }
  554. }
  555. #region 20210218 孙亚龙新增盘点操作代码
  556. public OperateResultInfo<List<WmsAwitInventoryPalletMd>> GetAwitInventoryPalletLstData(WmsAwitInventoryPalletMdCondition paraMd)
  557. {
  558. try
  559. {
  560. if (paraMd.InventoryModeMsg == "正常盘点")
  561. {
  562. string sql = $@"select * from VW_WMS_STK_NORMAL_INVENTORY_PALLET ORDER BY INVENTORY_ID";
  563. List<WmsAwitInventoryPalletMd> resultList = new DataRepository<WmsAwitInventoryPalletMd>(_dataContext).Query(sql).ToList();
  564. OperateResultInfo<List<WmsAwitInventoryPalletMd>> retDataMsg = SuccessStatus(resultList);
  565. return retDataMsg;
  566. }
  567. else
  568. {
  569. string sql = $@"select * from VW_WMS_STK_DIFFERENCE_INVENTORY_PALLET ORDER BY INVENTORY_ID";
  570. List<WmsAwitInventoryPalletMd> resultList = new DataRepository<WmsAwitInventoryPalletMd>(_dataContext).Query(sql).ToList();
  571. OperateResultInfo<List<WmsAwitInventoryPalletMd>> retDataMsg = SuccessStatus(resultList);
  572. return retDataMsg;
  573. }
  574. }
  575. catch (Exception ex)
  576. {
  577. return FailMessageStatus<List<WmsAwitInventoryPalletMd>>($"获取待盘点托盘数据发生异常!【{ex.Message}】", null);
  578. }
  579. }
  580. public OperateResultInfo CreateInventoryTask(InventoryOperateCondition paraMd)
  581. {
  582. try
  583. {
  584. if (paraMd == null)
  585. {
  586. return FailMessageStatus("传入参数异常!");
  587. }
  588. string[] arrTrayCode = paraMd.Describe.Split(',');
  589. List<string> sqlList = new List<string>();
  590. foreach (string item in arrTrayCode)
  591. {
  592. string sqlQueryBalanceDtl = $@"
  593. SELECT
  594. *
  595. FROM
  596. VW_WMS_STK_BALANCE_DTL
  597. WHERE
  598. TRAY_CODE = '{item}'
  599. ";
  600. List<WmsStkBalanceDtlResult> balanceDtlData = new DataRepository<WmsStkBalanceDtlResult>(_dataContext).Query(sqlQueryBalanceDtl).ToList();
  601. int putdownId = Convert.ToInt32(new DataRepository<object>(_dataContext).GetSequenceMsg("OutPutdown_Id"));
  602. string putdownNo = new DataRepository<object>(_dataContext).GetSequenceMsg("OutPutdown_No");
  603. string sqlAddPutDown = $@"
  604. INSERT INTO [WMS_OUT_PUTDOWN] (
  605. [PUTDOWN_ID],
  606. [PUTDOWN_NO],
  607. [PUTDOWN_TYPE],
  608. [TRAY_CODE],
  609. [PALLET_CODE],
  610. [SBIN_CODE],
  611. [EBIN_CODE],
  612. [PUTDOWN_PRIORITY],
  613. [PUTDOWN_STATUS],
  614. [DESCRIBE],
  615. [CREATE_BY],
  616. [CREATE_TIME],
  617. [UPDATE_BY],
  618. [UPDATE_TIME],
  619. [DATA_VERSION],
  620. [REMARKS1],
  621. [REMARKS2],
  622. [REMARKS3],
  623. [REMARKS4],
  624. [REMARKS5],
  625. [SOURCE_NO]
  626. )
  627. VALUES
  628. (
  629. '{putdownId}',
  630. '{putdownNo}',
  631. '{5}',
  632. '{item}',
  633. '{balanceDtlData[0].PALLET_CODE}',
  634. '{balanceDtlData[0].BIN_CODE}',
  635. NULL,
  636. '{100}',
  637. '{0}',
  638. NULL,
  639. '{paraMd.OperationUserId}',
  640. getdate(),
  641. '{paraMd.OperationUserId}',
  642. getdate(),
  643. 0,
  644. NULL,
  645. NULL,
  646. NULL,
  647. NULL,
  648. NULL,
  649. '{paraMd.InventoryNo}'
  650. );
  651. ";
  652. sqlList.Add(sqlAddPutDown);
  653. string taskNo = new DataRepository<object>(_dataContext).GetSequenceMsg("Task_No");
  654. string sqlInsertWmsTask = $@"
  655. INSERT INTO [dbo].[WMS_TSK_TASK] (
  656. [WAREHOUSE_CODE],
  657. [WAREHOUSE_NAME],
  658. [TASK_NO],
  659. [TRAY_CODE],
  660. [PALLET_CODE],
  661. [TRAY_LOADED_TYPE],
  662. [SLOC_CODE],
  663. [ELOC_CODE],
  664. [CLOC_CODE],
  665. [TASK_TYPE],
  666. [TASK_MSG],
  667. [ERR_FLAG],
  668. [TASK_PRIORITY],
  669. [TASK_STATUS],
  670. [SBIN_CODE],
  671. [EBIN_CODE],
  672. [CMD_NO],
  673. [ROUTE_CODE],
  674. [CREATE_BY],
  675. [CREATE_TIME],
  676. [UPDATE_BY],
  677. [UPDATE_TIME],
  678. [DATA_VERSION],
  679. [REMARKS1],
  680. [REMARKS2],
  681. [REMARKS3],
  682. [REMARKS4],
  683. [REMARKS5]
  684. )
  685. VALUES
  686. (
  687. 'WarehouseTest1',
  688. 'WarehouseTest1',
  689. '{taskNo}',
  690. '{item}',
  691. '{balanceDtlData[0].PALLET_CODE}',
  692. '{1}',
  693. '{1012}',
  694. '{1008}',
  695. '{1012}',
  696. '{8}',
  697. NULL,
  698. '{0}',
  699. '{100}',
  700. '{0}',
  701. NULL,
  702. NULL,
  703. NULL,
  704. '',
  705. '{paraMd.OperationUserId}',
  706. getdate(),
  707. '{paraMd.OperationUserId}',
  708. getdate(),
  709. 0,
  710. NULL,
  711. NULL,
  712. NULL,
  713. NULL,
  714. NULL
  715. );
  716. ";
  717. sqlList.Add(sqlInsertWmsTask);
  718. foreach (WmsStkBalanceDtlResult balanceDtlMd in balanceDtlData)
  719. {
  720. int putdownDtlId = Convert.ToInt32(new DataRepository<object>(_dataContext).GetSequenceMsg("OutPutdown_Dtl_Id"));
  721. string sqlAddPutDownDtl = $@"
  722. INSERT INTO [WMS_OUT_PUTDOWN_DTL] (
  723. [PUTDOWN_DTL_ID],
  724. [PUTDOWN_ID],
  725. [MATERIEL_CODE],
  726. [MATERIEL_NAME],
  727. [MATERIEL_BARCODE],
  728. [MATERIEL_SPEC],
  729. [PACKAGE_CODE],
  730. [UNIT_CODE],
  731. [BATCH_NO],
  732. [SUPPLIER_CODE],
  733. [SUPPLIER_NAME],
  734. [PUTDOWN_QTY],
  735. [PRODUCT_DATE],
  736. [EXP_DATE],
  737. [PUTDOWN_DTL_STATUS],
  738. [INSPECTION_RESULT],
  739. [ITEM_STATUS],
  740. [DESCRIBE],
  741. [CREATE_BY],
  742. [CREATE_TIME],
  743. [UPDATE_BY],
  744. [UPDATE_TIME],
  745. [DATA_VERSION],
  746. [REMARKS1],
  747. [REMARKS2],
  748. [REMARKS3],
  749. [REMARKS4],
  750. [REMARKS5]
  751. )
  752. VALUES
  753. (
  754. '{putdownDtlId}',
  755. '{putdownId}',
  756. '{balanceDtlMd.MATERIEL_CODE}',
  757. '{balanceDtlMd.MATERIEL_NAME}',
  758. '{balanceDtlMd.MATERIEL_BARCODE}',
  759. '{balanceDtlMd.MATERIEL_SPEC}',
  760. '{balanceDtlMd.PACKAGE_CODE}',
  761. '{balanceDtlMd.UNIT_CODE}',
  762. '{balanceDtlMd.BATCH_NO}',
  763. '{balanceDtlMd.SUPPLIER_CODE}',
  764. '{balanceDtlMd.SUPPLIER_NAME}',
  765. '{balanceDtlMd.QTY}',
  766. '{balanceDtlMd.PRODUCT_DATE}',
  767. '{balanceDtlMd.EXP_DATE}',
  768. '{0}',
  769. '{balanceDtlMd.INSPECTION_RESULT}',
  770. '{balanceDtlMd.ITEM_STATUS}',
  771. NULL,
  772. '{paraMd.OperationUserId}',
  773. getdate(),
  774. '{paraMd.OperationUserId}',
  775. getdate(),
  776. 0,
  777. NULL,
  778. NULL,
  779. NULL,
  780. NULL,
  781. NULL
  782. );
  783. ";
  784. sqlList.Add(sqlAddPutDownDtl);
  785. }
  786. }
  787. int row = new DataRepository<object>(_dataContext).ExecSqlListTran(sqlList);
  788. if (row > 0)
  789. {
  790. return SuccessMessageStatus("创建盘点任务成功!", row);
  791. }
  792. else
  793. {
  794. return FailMessageStatus("创建盘点任务失败!", row);
  795. }
  796. }
  797. catch (Exception ex)
  798. {
  799. return FailMessageStatus("创建盘点任务发生异常!" + ex.Message);
  800. }
  801. }
  802. public OperateResultInfo<List<InventoryDetailSearchResult>> GetInventoryPallletOperateData(WmsAwitInventoryPalletMd paraMd)
  803. {
  804. try
  805. {
  806. string sqlQueryWmsOutPutDown = $@"
  807. SELECT
  808. PUTDOWN_ID,
  809. PUTDOWN_NO,
  810. SOURCE_NO,
  811. PUTDOWN_TYPE,
  812. PUTDOWN_TYPE_NAME,
  813. TRAY_CODE,
  814. PALLET_CODE,
  815. SBIN_CODE,
  816. EBIN_CODE,
  817. PUTDOWN_PRIORITY,
  818. PUTDOWN_STATUS,
  819. PUTDOWN_STATUS_NAME,
  820. [DESCRIBE],
  821. CREATE_BY,
  822. CREATE_NAME,
  823. CREATE_TIME,
  824. UPDATE_BY,
  825. UPDATE_NAME,
  826. UPDATE_TIME
  827. FROM
  828. VW_WMS_OUT_PUTDOWN
  829. WHERE
  830. TRAY_CODE = '{paraMd.TRAY_CODE}'
  831. AND PUTDOWN_STATUS < 99
  832. ";
  833. List<WmsOutPutDownResult> resultList = new DataRepository<WmsOutPutDownResult>(_dataContext).Query(sqlQueryWmsOutPutDown).ToList();
  834. WmsOutPutDownResult wmsOutPutDown = resultList[0];
  835. if (resultList.Count > 0)
  836. {
  837. if (wmsOutPutDown.PUTDOWN_STATUS < 55)
  838. {
  839. return FailMessageStatus<List<InventoryDetailSearchResult>>($"托盘号:【{paraMd.PALLET_CODE}】未下架,无法进行盘点操作!", null);
  840. }
  841. }
  842. else
  843. {
  844. return FailMessageStatus<List<InventoryDetailSearchResult>>($"托盘号:【{paraMd.PALLET_CODE}】未生成下架任务,无法进行盘点操作!", null);
  845. }
  846. string sql = $@"SELECT CreateName=(SELECT A.USER_NAME FROM SYS_USER A WHERE A.USER_ID=WMS_STK_INVENTORY.CREATE_BY),
  847. UpdateName=(SELECT B.USER_NAME FROM SYS_USER B WHERE B.USER_ID=WMS_STK_INVENTORY.UPDATE_BY),
  848. WMS_STK_INVENTORY_DTL.MATERIEL_CODE,WMS_STK_INVENTORY_DTL.MATERIEL_NAME,
  849. WMS_STK_INVENTORY_DTL.INVENTORY_DTL_ID,
  850. MaterielTypeCode = BAS_MATERIEL_TYPE.MATERIEL_TYPE_CODE,MaterielTypeName = BAS_MATERIEL_TYPE.MATERIEL_TYPE_NAME,
  851. BAS_SUPPLIER.SUPPLIER_NAME,BATCH_NO,WMS_STK_INVENTORY_DTL.QTY,WMS_STK_INVENTORY_DTL.ACTUAL_INVENTORY_QTY,
  852. WMS_STK_INVENTORY_DTL.INVENTORY_RESULT_QTY,UnitName = BAS_UNIT.UNIT_NAME,WarehouseName = BAS_WAREHOUSE.WAREHOUSE_NAME,WarehouseCode = BAS_WAREHOUSE.WAREHOUSE_CODE,
  853. BAS_BIN.AREA_NAME,
  854. BAS_BIN.BIN_CODE,WMS_STK_INVENTORY_DTL.TRAY_CODE,WMS_STK_INVENTORY_DTL.PALLET_CODE,
  855. InventoryDetailStatusName = {_iSQLNodeRepository.GetEnumIntCaseString<InventoryStatus>("INVENTORY_DTL_STATUS", "WMS_STK_INVENTORY_DTL")},
  856. WMS_STK_INVENTORY_DTL.INVENTORY_DTL_STATUS,
  857. CREATE_TIME=WMS_STK_INVENTORY.CREATE_TIME,UPDATE_TIME=WMS_STK_INVENTORY.UPDATE_TIME
  858. FROM WMS_STK_INVENTORY
  859. left JOIN WMS_STK_INVENTORY_DTL ON WMS_STK_INVENTORY.INVENTORY_ID=WMS_STK_INVENTORY_DTL.INVENTORY_ID
  860. left JOIN BAS_BIN ON BAS_BIN.BIN_CODE=WMS_STK_INVENTORY_DTL.BIN_CODE
  861. left JOIN BAS_WAREHOUSE ON BAS_BIN.WAREHOUSE_CODE=BAS_WAREHOUSE.WAREHOUSE_CODE
  862. left JOIN BAS_AREA ON BAS_AREA.AREA_CODE=BAS_BIN.AREA_CODE
  863. left JOIN BAS_MATERIEL ON BAS_MATERIEL.MATERIEL_CODE=WMS_STK_INVENTORY_DTL.MATERIEL_CODE
  864. left JOIN BAS_MATERIEL_TYPE ON BAS_MATERIEL_TYPE.MATERIEL_TYPE_CODE=BAS_MATERIEL.MATERIEL_TYPE
  865. LEFT JOIN BAS_SUPPLIER ON BAS_SUPPLIER.SUPPLIER_CODE=WMS_STK_INVENTORY_DTL.SUPPLIER_CODE
  866. left JOIN BAS_UNIT ON BAS_UNIT.UNIT_CODE=WMS_STK_INVENTORY_DTL.UNIT_CODE
  867. WHERE 1=1 AND WMS_STK_INVENTORY.INVENTORY_ID = '{paraMd.INVENTORY_ID}' AND WMS_STK_INVENTORY_DTL.TRAY_CODE = '{paraMd.TRAY_CODE}'";
  868. if (paraMd.BIN_NAME == "差异盘点")
  869. {
  870. sql += " AND WMS_STK_INVENTORY_DTL.QTY <> WMS_STK_INVENTORY_DTL.ACTUAL_INVENTORY_QTY";
  871. }
  872. var results = new DataRepository<InventoryDetailSearchResult>(_dataContext).Query(sql);
  873. return SuccessStatus(results.ToList());
  874. }
  875. catch (Exception ex)
  876. {
  877. return FailMessageStatus<List<InventoryDetailSearchResult>>($"获取待盘点托盘明细数据发生异常!【{ex.Message}】", null);
  878. }
  879. }
  880. public OperateResultInfo ConfirmInventoryPalletData(InventoryMainSearchResult paraMd)
  881. {
  882. try
  883. {
  884. List<string> sqlList = new List<string>();
  885. bool isDiff = false;
  886. foreach (var item in paraMd.InventoryDtlLst)
  887. {
  888. string statusDtl = string.Empty;
  889. if (paraMd.InventoryModeName == "正常盘点")
  890. {
  891. statusDtl = "88";
  892. }
  893. else
  894. {
  895. statusDtl = "99";
  896. }
  897. sqlList.Add($"update WMS_STK_INVENTORY_DTL set INVENTORY_DTL_STATUS = '{statusDtl}',ACTUAL_INVENTORY_QTY = '{item.ACTUAL_INVENTORY_QTY}',UPDATE_BY = '{paraMd.UPDATE_BY}',UPDATE_TIME = getdate(),DATA_VERSION = DATA_VERSION + 1 where INVENTORY_DTL_ID = '{item.INVENTORY_DTL_ID}'");
  898. if (item.QTY != item.ACTUAL_INVENTORY_QTY)
  899. {
  900. isDiff = true;
  901. }
  902. }
  903. #region Todo: 修改库存状态为盘点入库占用状态,同时生成大任务数据,同时生成盘点上架单数据。
  904. string sqlUpdatePutDown = $@"
  905. UPDATE WMS_OUT_PUTDOWN
  906. SET PUTDOWN_STATUS = '{99}',
  907. UPDATE_BY = '{paraMd.UPDATE_BY}',
  908. UPDATE_TIME = GETDATE(),
  909. DATA_VERSION = DATA_VERSION + 1
  910. WHERE
  911. TRAY_CODE = '{paraMd.InventoryDtlLst[0].TRAY_CODE}' AND PUTDOWN_STATUS < 99;
  912. ";
  913. sqlList.Add(sqlUpdatePutDown);
  914. string sqlUpdatePutDownDtl = $@"
  915. UPDATE WMS_OUT_PUTDOWN_DTL
  916. SET PUTDOWN_DTL_STATUS = '{99}',
  917. UPDATE_BY = '{paraMd.UPDATE_BY}',
  918. UPDATE_TIME = GETDATE(),
  919. DATA_VERSION = DATA_VERSION + 1
  920. WHERE
  921. PUTDOWN_ID = (select PUTDOWN_ID from WMS_OUT_PUTDOWN where TRAY_CODE = '{paraMd.InventoryDtlLst[0].TRAY_CODE}' AND PUTDOWN_STATUS < 99);
  922. ";
  923. sqlList.Add(sqlUpdatePutDownDtl);
  924. string sqlUpdateWmsTask = $@"
  925. UPDATE WMS_TSK_TASK
  926. SET CLOC_CODE = ELOC_CODE,
  927. UPDATE_BY = '{paraMd.UPDATE_BY}',
  928. UPDATE_TIME = GETDATE(),
  929. DATA_VERSION = DATA_VERSION + 1,
  930. TASK_STATUS = 99,
  931. TASK_MSG = '手动更新WMS大任务为:【任务完成】状态'
  932. WHERE
  933. TRAY_CODE = '{paraMd.InventoryDtlLst[0].TRAY_CODE}'
  934. AND TASK_STATUS < 99
  935. ";
  936. sqlList.Add(sqlUpdateWmsTask);
  937. string sqlQueryBalanceDtl = $@"
  938. SELECT
  939. *
  940. FROM
  941. VW_WMS_STK_BALANCE_DTL
  942. WHERE
  943. TRAY_CODE = '{paraMd.InventoryDtlLst[0].TRAY_CODE}'
  944. ";
  945. List<WmsStkBalanceDtlResult> balanceDtlData = new DataRepository<WmsStkBalanceDtlResult>(_dataContext).Query(sqlQueryBalanceDtl).ToList();
  946. bool isAddPutDownAndWmsTaskData = true;
  947. if (paraMd.InventoryModeName == "正常盘点")
  948. {
  949. if (isDiff)
  950. {
  951. isAddPutDownAndWmsTaskData = false;
  952. }
  953. }
  954. if (isAddPutDownAndWmsTaskData)
  955. {
  956. int putawayId = Convert.ToInt32(new DataRepository<object>(_dataContext).GetSequenceMsg("InPutaway_Id"));
  957. string puawayNo = new DataRepository<object>(_dataContext).GetSequenceMsg("InPutaway_No");
  958. string sqlAddWmsInPutAway = $@"
  959. INSERT INTO [WMS_IN_PUTAWAY] (
  960. [PUTAWAY_ID],
  961. [PUTAWAY_NO],
  962. [SOURCE_NO],
  963. [PUTAWAY_TYPE],
  964. [TRAY_CODE],
  965. [PALLET_CODE],
  966. [EBIN_CODE],
  967. [PUTAWAY_PRIORITY],
  968. [PUTAWAY_STATUS],
  969. [DESCRIBE],
  970. [CREATE_BY],
  971. [CREATE_TIME],
  972. [UPDATE_BY],
  973. [UPDATE_TIME],
  974. [DATA_VERSION],
  975. [REMARKS1],
  976. [REMARKS2],
  977. [REMARKS3],
  978. [REMARKS4],
  979. [REMARKS5]
  980. )
  981. VALUES
  982. (
  983. '{putawayId}',
  984. '{puawayNo}',
  985. '{paraMd.InventoryNo}',
  986. '{6}',
  987. '{paraMd.InventoryDtlLst[0].TRAY_CODE}',
  988. '{paraMd.InventoryDtlLst[0].PALLET_CODE}',
  989. '{paraMd.InventoryDtlLst[0].BIN_CODE}',
  990. '{100}',
  991. '{0}',
  992. NULL,
  993. '{paraMd.UPDATE_BY}',
  994. getdate(),
  995. '{paraMd.UPDATE_BY}',
  996. getdate(),
  997. 0,
  998. NULL,
  999. NULL,
  1000. NULL,
  1001. NULL,
  1002. NULL
  1003. );
  1004. ";
  1005. sqlList.Add(sqlAddWmsInPutAway);
  1006. string taskNo = new DataRepository<object>(_dataContext).GetSequenceMsg("Task_No");
  1007. string sqlInsertWmsTask = $@"
  1008. INSERT INTO [dbo].[WMS_TSK_TASK] (
  1009. [WAREHOUSE_CODE],
  1010. [WAREHOUSE_NAME],
  1011. [TASK_NO],
  1012. [TRAY_CODE],
  1013. [PALLET_CODE],
  1014. [TRAY_LOADED_TYPE],
  1015. [SLOC_CODE],
  1016. [ELOC_CODE],
  1017. [CLOC_CODE],
  1018. [TASK_TYPE],
  1019. [TASK_MSG],
  1020. [ERR_FLAG],
  1021. [TASK_PRIORITY],
  1022. [TASK_STATUS],
  1023. [SBIN_CODE],
  1024. [EBIN_CODE],
  1025. [CMD_NO],
  1026. [ROUTE_CODE],
  1027. [CREATE_BY],
  1028. [CREATE_TIME],
  1029. [UPDATE_BY],
  1030. [UPDATE_TIME],
  1031. [DATA_VERSION],
  1032. [REMARKS1],
  1033. [REMARKS2],
  1034. [REMARKS3],
  1035. [REMARKS4],
  1036. [REMARKS5]
  1037. )
  1038. VALUES
  1039. (
  1040. 'WarehouseTest1',
  1041. 'WarehouseTest1',
  1042. '{taskNo}',
  1043. '{paraMd.InventoryDtlLst[0].TRAY_CODE}',
  1044. '{paraMd.InventoryDtlLst[0].PALLET_CODE}',
  1045. '{1}',
  1046. '{1005}',
  1047. '{1012}',
  1048. '{1005}',
  1049. '{4}',
  1050. NULL,
  1051. '{0}',
  1052. '{100}',
  1053. '{0}',
  1054. NULL,
  1055. NULL,
  1056. NULL,
  1057. '',
  1058. '{paraMd.UPDATE_BY}',
  1059. getdate(),
  1060. '{paraMd.UPDATE_BY}',
  1061. getdate(),
  1062. 0,
  1063. NULL,
  1064. NULL,
  1065. NULL,
  1066. NULL,
  1067. NULL
  1068. );
  1069. ";
  1070. sqlList.Add(sqlInsertWmsTask);
  1071. foreach (var item in balanceDtlData)
  1072. {
  1073. int putawayDtlId = Convert.ToInt32(new DataRepository<object>(_dataContext).GetSequenceMsg("InPutaway_Dtl_Id"));
  1074. string sqlAddWmsInPutAwayDtl = $@"
  1075. INSERT INTO [WMS_IN_PUTAWAY_DTL] (
  1076. [PUTAWAY_DTL_ID],
  1077. [PUTAWAY_ID],
  1078. [MATERIEL_CODE],
  1079. [MATERIEL_NAME],
  1080. [MATERIEL_BARCODE],
  1081. [MATERIEL_SPEC],
  1082. [BATCH_NO],
  1083. [PACKAGE_CODE],
  1084. [UNIT_CODE],
  1085. [PUTAWAY_QTY],
  1086. [SUPPLIER_CODE],
  1087. [SUPPLIER_NAME],
  1088. [PRODUCT_DATE],
  1089. [EXP_DATE],
  1090. [INSPECTION_RESULT],
  1091. [PUTAWAY_DTL_STATUS],
  1092. [ITEM_STATUS],
  1093. [DESCRIBE],
  1094. [CREATE_BY],
  1095. [CREATE_TIME],
  1096. [UPDATE_BY],
  1097. [UPDATE_TIME],
  1098. [DATA_VERSION],
  1099. [REMARKS1],
  1100. [REMARKS2],
  1101. [REMARKS3],
  1102. [REMARKS4],
  1103. [REMARKS5]
  1104. )
  1105. VALUES
  1106. (
  1107. '{putawayDtlId}',
  1108. '{putawayId}',
  1109. '{item.MATERIEL_CODE}',
  1110. '{item.MATERIEL_NAME}',
  1111. '{item.MATERIEL_BARCODE}',
  1112. '{item.MATERIEL_SPEC}',
  1113. '{item.BATCH_NO}',
  1114. '{item.PACKAGE_CODE}',
  1115. '{item.UNIT_CODE}',
  1116. '{item.QTY}',
  1117. '{item.SUPPLIER_CODE}',
  1118. '{item.SUPPLIER_NAME}',
  1119. '{item.PRODUCT_DATE}',
  1120. '{item.EXP_DATE}',
  1121. '{item.INSPECTION_RESULT}',
  1122. '{0}',
  1123. '{item.ITEM_STATUS}',
  1124. '{item.DESCRIBE}',
  1125. '{paraMd.UPDATE_BY}',
  1126. getdate(),
  1127. '{paraMd.UPDATE_BY}',
  1128. getdate(),
  1129. 0,
  1130. NULL,
  1131. NULL,
  1132. NULL,
  1133. NULL,
  1134. NULL
  1135. );
  1136. ";
  1137. sqlList.Add(sqlAddWmsInPutAwayDtl);
  1138. }
  1139. string sqlUpdateBalance = $"update WMS_STK_BALANCE set BALANCE_STATUS = '33',UPDATE_BY = '{paraMd.UPDATE_BY}',UPDATE_TIME = getdate(),DATA_VERSION = DATA_VERSION + 1 where TRAY_CODE in (select TRAY_CODE from WMS_STK_INVENTORY_DTL where TRAY_CODE = '{paraMd.InventoryDtlLst[0].TRAY_CODE}')";
  1140. string sqlUpdateTray = $"update WMS_STK_TRAY set TRAY_STATUS = '33',UPDATE_BY = '{paraMd.UPDATE_BY}',UPDATE_TIME = getdate(),DATA_VERSION = DATA_VERSION + 1 where TRAY_CODE in (select TRAY_CODE from WMS_STK_INVENTORY_DTL where TRAY_CODE = '{paraMd.InventoryDtlLst[0].TRAY_CODE}')";
  1141. string sqlUpdateTrayDtl = $"update WMS_STK_TRAY_DTL set TRAY_DTL_STATUS = '33',UPDATE_BY = '{paraMd.UPDATE_BY}',UPDATE_TIME = getdate(),DATA_VERSION = DATA_VERSION + 1 where TRAY_DTL_ID in (select TRAY_DTL_ID from WMS_STK_INVENTORY_DTL where TRAY_CODE = '{paraMd.InventoryDtlLst[0].TRAY_CODE}')";
  1142. sqlList.Add(sqlUpdateBalance);
  1143. sqlList.Add(sqlUpdateTray);
  1144. sqlList.Add(sqlUpdateTrayDtl);
  1145. }
  1146. #endregion
  1147. int row = new DataRepository<object>(_dataContext).ExecSqlListTran(sqlList);
  1148. string status = string.Empty;
  1149. if (paraMd.InventoryModeName == "正常盘点")
  1150. {
  1151. status = "88";
  1152. }
  1153. else
  1154. {
  1155. status = "99";
  1156. }
  1157. string sqlUpdateReceiptDtl = $@"
  1158. IF NOT EXISTS (
  1159. SELECT
  1160. 1
  1161. FROM
  1162. WMS_STK_INVENTORY_DTL
  1163. WHERE
  1164. INVENTORY_DTL_STATUS < '{status}'
  1165. AND INVENTORY_ID = '{paraMd.INVENTORY_ID}'
  1166. AND QTY <> ACTUAL_INVENTORY_QTY
  1167. ) UPDATE WMS_STK_INVENTORY
  1168. SET INVENTORY_STATUS = '{status}',
  1169. UPDATE_BY = '{paraMd.UPDATE_BY}',
  1170. UPDATE_TIME = GETDATE(),
  1171. DATA_VERSION = DATA_VERSION + 1
  1172. WHERE
  1173. INVENTORY_ID = '{paraMd.INVENTORY_ID}' ;
  1174. ";
  1175. new DataRepository<object>(_dataContext).Execute(sqlUpdateReceiptDtl);
  1176. if (paraMd.InventoryModeName != "正常盘点")
  1177. {
  1178. string sqlUpdateInventoryDtl = $@"
  1179. IF NOT EXISTS (
  1180. SELECT
  1181. 1
  1182. FROM
  1183. WMS_STK_INVENTORY_DTL
  1184. WHERE
  1185. INVENTORY_DTL_STATUS < '{status}'
  1186. AND INVENTORY_ID = '{paraMd.INVENTORY_ID}'
  1187. AND QTY <> ACTUAL_INVENTORY_QTY
  1188. ) UPDATE WMS_STK_INVENTORY_DTL
  1189. SET INVENTORY_DTL_STATUS = 99,
  1190. UPDATE_BY = '{paraMd.UPDATE_BY}',
  1191. UPDATE_TIME = GETDATE(),
  1192. DATA_VERSION = DATA_VERSION + 1
  1193. WHERE
  1194. INVENTORY_DTL_STATUS < '{status}'
  1195. AND INVENTORY_ID = '{paraMd.INVENTORY_ID}'
  1196. ";
  1197. new DataRepository<object>(_dataContext).Execute(sqlUpdateInventoryDtl);
  1198. }
  1199. if (row > 0)
  1200. {
  1201. return SuccessMessageStatus("提交盘点托盘数据成功!", row);
  1202. }
  1203. else
  1204. {
  1205. return FailMessageStatus("提交盘点托盘数据失败!", row);
  1206. }
  1207. }
  1208. catch (Exception ex)
  1209. {
  1210. return FailMessageStatus("提交盘点托盘数据发生异常!" + ex.Message);
  1211. }
  1212. }
  1213. #endregion
  1214. }
  1215. }