FJService.cs 82 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959
  1. using AutoMapper;
  2. using Castle.Core.Internal;
  3. using Microsoft.Extensions.Logging;
  4. using Newtonsoft.Json;
  5. using SqlSugar;
  6. using SqlSugar.Extensions;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Linq.Expressions;
  11. using WCS.Entity.fj;
  12. using wms.dataservice.IDataSetvice;
  13. using wms.dto;
  14. using wms.dto.request;
  15. using wms.dto.request.fj;
  16. using wms.dto.request.share;
  17. using wms.dto.response;
  18. using wms.dto.response.fj;
  19. using wms.service.IService;
  20. using wms.sqlsugar;
  21. using wms.sqlsugar.model;
  22. using wms.sqlsugar.model.fj;
  23. using wms.util.Check;
  24. using wms.util.Ext;
  25. namespace wms.service.Service
  26. {
  27. /// <summary>
  28. /// 分拣服务
  29. /// </summary>
  30. public class FJService : IFJService
  31. {
  32. private readonly IMapper _mapper;
  33. private readonly ILogger<FJService> _logger;
  34. private readonly IFJDataService _IFJDataService;
  35. public FJService(IMapper mapper, ILogger<FJService> logger, IFJDataService IFJDataService)
  36. {
  37. _mapper = mapper;
  38. _logger = logger;
  39. _IFJDataService = IFJDataService;
  40. }
  41. private ITenant _db => SqlSugarHelper.Db;//处理事务
  42. #region 初始化仓储
  43. private Repository<fjBillDocument> _docrepository => new Repository<fjBillDocument>();
  44. private Repository<fjSysConfig> _sysconfigrepository => new Repository<fjSysConfig>();
  45. private Repository<fjBaseMater> _materrepository => new Repository<fjBaseMater>();
  46. private Repository<fjBillTask> _billTaskrepository => new Repository<fjBillTask>();
  47. private Repository<fjBaseWarehouse> _baseWareHouserepository => new Repository<fjBaseWarehouse>();
  48. private Repository<fjBillBarcode> _billBarcoderepository => new Repository<fjBillBarcode>();
  49. private Repository<fjBillFeedbackPush> _billFbackPushrepository => new Repository<fjBillFeedbackPush>();
  50. private Repository<fjBillBomInfo> _fjBillBomInfoRepository => new Repository<fjBillBomInfo>();
  51. private Repository<fjBillWetStack> _fjBillWetStackRepository => new Repository<fjBillWetStack>();
  52. /// <summary>
  53. /// 容器表
  54. /// </summary>
  55. private Repository<BaseContinfo> _baseContinfo => new Repository<BaseContinfo>();
  56. /// <summary>
  57. /// 当前任务表
  58. /// </summary>
  59. private RepositoryTask<WCS_TaskInfo> _taskrepository => new RepositoryTask<WCS_TaskInfo>();
  60. /// <summary>
  61. /// 库存表
  62. /// </summary>
  63. private Repository<BillInvnow> _billInvnowrepository => new Repository<BillInvnow>();
  64. /// <summary>
  65. /// 条码表
  66. /// </summary>
  67. private Repository<BillInvinit> _billInvinitrepository => new Repository<BillInvinit>();
  68. /// <summary>
  69. /// 物料表
  70. /// </summary>
  71. private Repository<BaseMatinfo> _basematerrepository => new Repository<BaseMatinfo>();
  72. /// <summary>
  73. /// 码垛工字轮信息
  74. /// </summary>
  75. private Repository<BillSpoolTrans> _billSpoolTransrepository => new Repository<BillSpoolTrans>();
  76. private Repository<BillBominfo> _billBominfoRepository => new Repository<BillBominfo>();
  77. /// <summary>
  78. /// 垛形信息
  79. /// </summary>
  80. private Repository<BillBomsetinfo> _billBomsetinfoRepository => new Repository<BillBomsetinfo>();
  81. /// <summary>
  82. /// 单据表
  83. /// </summary>
  84. private Repository<BillDocsinfo> _billdocrepository => new Repository<BillDocsinfo>();
  85. /// <summary>
  86. /// 任务历史表
  87. /// </summary>
  88. private RepositoryTask<WCS_TaskOld> _wcstaskoldrepository => new RepositoryTask<WCS_TaskOld>();
  89. /// <summary>
  90. /// 流水表
  91. /// </summary>
  92. private Repository<BillInvflow> _billInvflow => new Repository<BillInvflow>();
  93. /// <summary>
  94. /// 甲方管理系统推送反馈
  95. /// </summary>
  96. private Repository<BillPushinfo> _billPushinforepository => new Repository<BillPushinfo>();
  97. /// <summary>
  98. /// 货位表
  99. /// </summary>
  100. private Repository<BaseWarecell> _basewarecellrepository => new Repository<BaseWarecell>();
  101. /// <summary>
  102. /// 仓库表
  103. /// </summary>
  104. private Repository<BaseWarehouse> _basewarehouserepository => new Repository<BaseWarehouse>();
  105. private RepositoryTask<WCS_TaskDtl> _taskdetailrepository => new RepositoryTask<WCS_TaskDtl>();
  106. /// <summary>
  107. /// 机台表
  108. /// </summary>
  109. private Repository<BillMachinfo> _basemachinforepository => new Repository<BillMachinfo>();
  110. #endregion 初始化仓储
  111. /// <summary>
  112. /// 添加单据
  113. /// </summary>
  114. /// <returns></returns>
  115. public bool Add(fjBillDocument data1)
  116. {
  117. try
  118. {
  119. _db.BeginTran();
  120. _docrepository.Insert(data1);
  121. _db.CommitTran();
  122. }
  123. catch (Exception)
  124. {
  125. _db.RollbackTran();
  126. throw;
  127. }
  128. return true;
  129. }
  130. /// <summary>
  131. /// 获取配置内容信息
  132. /// </summary>
  133. /// <param name="code">配置表code值</param>
  134. /// <returns></returns>
  135. public string GetSysConfigContentByCode(string code)
  136. {
  137. //先读缓存
  138. var cacheContent = RedisHelper.Get("sys_config" + code);
  139. if (!string.IsNullOrEmpty(cacheContent))
  140. {
  141. return cacheContent;
  142. }
  143. var sysconf = _sysconfigrepository.GetSingle(p => p.Code == code);
  144. if (sysconf == null)
  145. {
  146. throw new Exception("数据表没有配置" + code);
  147. }
  148. var content = sysconf.SContent;
  149. string sysname = sysconf.Default1;//所属系统mes/erp
  150. RedisHelper.Set("sys_config" + code, content + "|" + sysname);
  151. return content;
  152. }
  153. /// <summary>
  154. /// 获取配置信息
  155. /// </summary>
  156. /// <param name="code"></param>
  157. /// <returns></returns>
  158. public fjSysConfig GetSysConfigByCode(string code)
  159. {
  160. //Repository<dynamic> _billdtrepository = new Repository<dynamic>();
  161. return _sysconfigrepository.GetSingle(p => p.Code == code);
  162. }
  163. /// <summary>
  164. /// 获取物料信息
  165. /// </summary>
  166. /// <param name="code"></param>
  167. /// <returns></returns>
  168. public fjBaseMater GetBaseMaterByExpression(Expression<Func<fjBaseMater, bool>> WhereExpression)
  169. {
  170. return _materrepository.GetSingle(WhereExpression);
  171. }
  172. /// <summary>
  173. /// 获取配置信息
  174. /// </summary>
  175. /// <param name="code"></param>
  176. /// <returns></returns>
  177. public fjSysConfig GetSysConfigByExpression(Expression<Func<fjSysConfig, bool>> WhereExpression)
  178. {
  179. return _sysconfigrepository.GetSingle(WhereExpression);
  180. }
  181. /// <summary>
  182. /// 获取单据信息
  183. /// </summary>
  184. /// <param name="code"></param>
  185. /// <returns></returns>
  186. public fjBillDocument GetBillDocumentByExpression(Expression<Func<fjBillDocument, bool>> WhereExpression)
  187. {
  188. return _docrepository.GetSingle(WhereExpression);
  189. }
  190. /// <summary>
  191. /// 获取反馈信息
  192. /// </summary>
  193. /// <param name="code"></param>
  194. /// <returns></returns>
  195. public List<fjBillFeedbackPush> GetBillFeedbackList(Expression<Func<fjBillFeedbackPush, bool>> WhereExpression)
  196. {
  197. return _billFbackPushrepository.GetList(WhereExpression);
  198. }
  199. ///// <summary>
  200. ///// 获取单据信息
  201. ///// </summary>
  202. ///// <param name="code"></param>
  203. ///// <returns></returns>
  204. //public fjBillDocument GetBillDocumentList(Expression<Func<fjBillDocument, bool>> WhereExpression)
  205. //{
  206. // return _billdtrepository.Context.Queryable<fjBillDocument, fjSysConfig>((doc, conf) => new object[] {
  207. // JoinType.Left, doc.BState == conf.Code
  208. // }).Where((doc, conf) => doc.Status == 0)
  209. // .Select((bc, bm) => bc).First();
  210. //}
  211. /// <summary>
  212. /// 更新SysConfig表字段
  213. /// </summary>
  214. /// <param name="updateModel"></param>
  215. /// <returns></returns>
  216. public bool UpdateSysConfigModelColumns(UpdateModelColumns<fjSysConfig> updateModel)
  217. {
  218. return _sysconfigrepository.Update(updateModel.Columns, updateModel.WhereExpression);
  219. }
  220. /// <summary>
  221. /// 更新hjBillFeedbackPush表字段
  222. /// </summary>
  223. /// <param name="updateModel"></param>
  224. /// <returns></returns>
  225. public bool UpdateBillFeedbackPushModelColumns(UpdateModelColumns<fjBillFeedbackPush> updateModel)
  226. {
  227. return _billFbackPushrepository.Update(updateModel.Columns, updateModel.WhereExpression);
  228. }
  229. public SRes<bool> DeleteDoc(Expression<Func<fjBillDocument, bool>> whereExpression)
  230. {
  231. var res = new SRes<bool>();
  232. res.ResData = _docrepository.Delete(whereExpression);
  233. return res;
  234. }
  235. public bool SyncMaterInfo(List<FJSyncMaterInfoResponseItem> ResData)
  236. {
  237. foreach (var item in ResData)
  238. {
  239. if (_materrepository.IsAny(p => p.Code == item.MatCode))
  240. {
  241. _materrepository.UpdateModelColumns(p => new fjBaseMater() { IsHold = item.IsHold, HoldDuration = item.HoldDuration },
  242. p => p.Code == item.MatCode);
  243. }
  244. else
  245. {
  246. var model = _mapper.Map<fjBaseMater>(item);
  247. _materrepository.Insert(model);
  248. }
  249. }
  250. return true;
  251. }
  252. public bool SyncMachineInfo(List<SyncMachineInfoResponseItem> ResData)
  253. {
  254. foreach (var item in ResData)
  255. {
  256. if (_basemachinforepository.IsAny(p => p.MachNo == item.MacCode))
  257. {
  258. _basemachinforepository.UpdateModelColumns(p => new BillMachinfo() { GrpCode = item.MacGroup, Direction = item.Direction, Station = item.LocCode, EditTime = DateTime.Now },
  259. p => p.MachNo == item.MacCode);
  260. }
  261. else
  262. {
  263. var model = _mapper.Map<BillMachinfo>(item);
  264. _basemachinforepository.Insert(model);
  265. }
  266. }
  267. return true;
  268. }
  269. /// <summary>
  270. /// 帘线工单信息传输
  271. /// </summary>
  272. /// <param name="reqDto"></param>
  273. /// <returns></returns>
  274. public SRes CurtainProductionOrder(CurtainProductionOrderRequest reqDto)
  275. {
  276. var res = new SRes();
  277. var doc = _billdocrepository.GetSingle(p => p.DocsNo == reqDto.BillCode);
  278. if (doc == null)
  279. {
  280. doc = new BillDocsinfo();
  281. doc.WarehouseId = 0;
  282. doc.ReqNo = reqDto.BillCode;
  283. doc.DocsNo = reqDto.BillCode;
  284. doc.TypeNum = DocType.DocType_FJ_CurtainProduction.GetHashCode();
  285. doc.StateNum = DocState.DocState_Create.GetHashCode();
  286. doc.JsonContent = JsonConvert.SerializeObject(reqDto);
  287. doc.DownQty = 1;
  288. doc.IsStop = 0;
  289. var docinsert = _billdocrepository.Insert(doc);
  290. if (!docinsert)
  291. {
  292. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  293. res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription();
  294. return res;
  295. }
  296. }
  297. _basemachinforepository.UpdateModelColumns(p => new BillMachinfo() { BillCode = reqDto.BillCode, WorkOrder = reqDto.WorkOrder, PlanQty = reqDto.PlanQty, EditTime = DateTime.Now }, p => reqDto.WbList.Contains(p.MachNo));
  298. return res;
  299. }
  300. /// <summary>
  301. /// 工单启动验证
  302. /// </summary>
  303. /// <param name="reqDto"></param>
  304. /// <returns></returns>
  305. public SRes CurtainOrderStartCheck(CurtainOrderStartCheckRequest reqDto)
  306. {
  307. var res = new SRes();
  308. var wetStack = _billBominfoRepository.GetSingle(p => p.BillCode == reqDto.BillCode);
  309. if (wetStack == null)
  310. {
  311. res.ResCode = 0;
  312. res.ResMsg = reqDto.BillCode + "没有配置垛型信息,请先配置垛型";
  313. return res;
  314. }
  315. return res;
  316. }
  317. #region 湿拉工字轮/帘线芯股信息初始化
  318. /// <summary>
  319. /// 湿拉工字轮/帘线芯股信息初始化
  320. /// </summary>
  321. /// <param name="reqDto"></param>
  322. /// <returns></returns>
  323. public SRes SpoolMaterialInfoTrans(SpoolMaterialInfoTransRequest reqDto)
  324. {
  325. var res = new SRes();
  326. var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.SpoolCode);
  327. if (container == null)
  328. {
  329. var insertcon = new BaseContinfo()
  330. {
  331. ContBarCode = reqDto.SpoolCode,
  332. Name = reqDto.SpoolCode,
  333. TypeCode = ContainerType.ContainerType_Spool.ToString(),
  334. PrintQty = 1,
  335. IsStop = 0,
  336. WarehouseId = 0,
  337. WeightQty = 0,
  338. AddWho = "wms",
  339. AddTime = DateTime.Now
  340. };
  341. //新加载具信息
  342. if (!_baseContinfo.Insert(insertcon))
  343. {
  344. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  345. res.ResMsg = "工字轮载具初始化失败";
  346. return res;
  347. }
  348. }
  349. var mater = _basematerrepository.GetSingle(p => p.Code == reqDto.MatCode);
  350. if (mater == null)
  351. {
  352. res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode();
  353. res.ResMsg = ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription();
  354. return res;
  355. }
  356. BillSpoolTrans billSpoolTrans = new BillSpoolTrans();
  357. billSpoolTrans.ConBarCode = reqDto.SpoolCode;
  358. billSpoolTrans.BillCode = reqDto.BillCode;
  359. billSpoolTrans.WorkOrder = reqDto.WorkOrder;
  360. billSpoolTrans.AddTime = DateTime.Now;
  361. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.SpoolCode);
  362. if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())
  363. {
  364. billSpoolTrans.ErrType = 1;
  365. billSpoolTrans.Memo = "该工字轮条码号已在库中,请检查RFID号是否重复";
  366. }
  367. if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  368. {
  369. billSpoolTrans.ErrType = 1;
  370. billSpoolTrans.Memo = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";
  371. }
  372. //条码验证
  373. var barstock = _billInvnowrepository.GetSingle(p => p.InvBarCode == reqDto.MatBarCode);
  374. if (barstock != null && barstock.InvStateCode == InvState.InvEcecState_In.ToString())
  375. {
  376. billSpoolTrans.ErrType = 1;
  377. billSpoolTrans.Memo = "该材料号已在库中,请检查是否重复";
  378. }
  379. if (barstock != null && barstock.ContGrpBarCode != reqDto.SpoolCode)
  380. {
  381. billSpoolTrans.ErrType = 1;
  382. billSpoolTrans.Memo = reqDto.MatBarCode + "该材料号已经绑定" + barstock.ContGrpBarCode + ",请检查是否重复";
  383. }
  384. var barinfo = _billInvinitrepository.GetSingle(p => p.InvBarCode == reqDto.MatBarCode);
  385. if (barinfo == null)
  386. {
  387. barinfo = new BillInvinit()
  388. {
  389. InvBarCode = reqDto.MatBarCode,
  390. WarehouseId = 0,
  391. ContGrpId = IdFactory.NewId(),
  392. ContGrpBarCode = reqDto.SpoolCode,
  393. ExecStateCode = InvLockState.InvState_Normal.ToString(),
  394. ExecDocsNo = reqDto.WorkOrder,
  395. ExecDocsRowNo = reqDto.MatBarCode,
  396. ExecDocsTypeCode = DocType.DocType_HJ_CopperProductStockIn.GetHashCode().ToString(),
  397. InvInOut = InvInOutType.In.GetHashCode(),
  398. ExecWho = "MES",
  399. EditTime = DateTime.Now,
  400. InvStateCode = InvState.InvEcecState_BuildUp.ToString(),
  401. InDocsNo = reqDto.BillCode,
  402. InDocsRowNo = reqDto.MatBarCode,
  403. SuppCode = "",
  404. MatId = mater.Id,
  405. MatCode = mater.Code,
  406. MatName = mater.Name,
  407. LengthQty = reqDto.Length,
  408. TareWQty = reqDto.Weight,
  409. ProductTime = reqDto.ProductDate,
  410. RFIDBarCode = "",
  411. ProductLineNo = "",
  412. Grade = reqDto.Grade,
  413. HWBarCode = "",
  414. HWTypeCode = reqDto.SpoolType,//工字轮类型
  415. IsFast = reqDto.IsFast,
  416. IsRework = false,
  417. CLBarCode = reqDto.MatBarCode,
  418. Size = 1,
  419. AddTime = DateTime.Now,
  420. BackReason = "",
  421. IsBack = reqDto.IsBack,
  422. SilkTypeCode = reqDto.SilkType,
  423. IsCore = reqDto.BusType == "2",
  424. };
  425. _billInvinitrepository.InsertReturnEntity(barinfo);
  426. _billSpoolTransrepository.InsertReturnEntity(billSpoolTrans);
  427. }
  428. return res;
  429. }
  430. #endregion 湿拉工字轮/帘线芯股信息初始化
  431. /// <summary>
  432. /// 分配分拣库
  433. /// </summary>
  434. /// <returns></returns>
  435. public bool AllocationWarehouseSort(AllocationWarehouseSortRequest reqDto)
  436. {
  437. return true;
  438. }
  439. /// <summary>
  440. /// 二次扫码分配输送地址
  441. /// </summary>
  442. /// <param name="reqDto"></param>
  443. /// <returns></returns>
  444. public SRes AllocationConveyorSort(AllocationConveyorSortRequest reqDto)
  445. {
  446. var res = new SRes();
  447. var baritem = _billSpoolTransrepository.GetFirst(p => p.ConBarCode == reqDto.BarCode);
  448. //判断当前库是否有mix垛型
  449. var mixrow = _billBomsetinfoRepository.AsQueryable().Where(p => p.IsMixRow == 1 && p.WarehouseCode == baritem.WarehouseCode);
  450. if (mixrow == null || !mixrow.Any())
  451. {
  452. var matcodelist = _billBomsetinfoRepository.AsQueryable().Where(p => p.WarehouseCode == baritem.WarehouseCode);
  453. var curmatrate = matcodelist.Where(p => p.MatCode == baritem.MatCode).Count() / matcodelist.Count();
  454. //需要的总量
  455. }
  456. else
  457. {
  458. }
  459. var translist = _billSpoolTransrepository.AsQueryable().Where(p => p.WarehouseCode == baritem.WarehouseCode).ToList();
  460. foreach (var item in translist.GroupBy(p => p.ConveyorSort))
  461. {
  462. }
  463. return res;
  464. }
  465. /// <summary>
  466. /// 帘线领料出库
  467. /// </summary>
  468. /// <param name="reqDto"></param>
  469. /// <returns></returns>
  470. public SRes CurtainProductionStockOut(CurtainProductionStockOutRequest reqDto)
  471. {
  472. var res = new SRes();
  473. var warehosue = _baseWareHouserepository.GetSingle(p => p.Code == reqDto.WareCode);
  474. if (warehosue == null)
  475. {
  476. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  477. res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  478. return res;
  479. }
  480. var doc = _docrepository.GetSingle(p => p.DocNo == reqDto.BillCode);
  481. if (doc == null)
  482. {
  483. doc = new fjBillDocument();
  484. doc.WarehouseId = warehosue.Id;
  485. //保存单据信息
  486. doc.ReqNo = reqDto.ReqId;
  487. doc.DocNo = reqDto.BillCode;
  488. doc.TypeCode = DocType.DocType_FJ_CurtainProductionStockOut.ToString();
  489. doc.StateCode = DocState.DocState_Create.ToString();
  490. doc.ContentJson = JsonConvert.SerializeObject(reqDto);
  491. doc.DownQty = 1;
  492. var docinsert = _docrepository.Insert(doc);
  493. if (!docinsert)
  494. {
  495. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  496. res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription();
  497. return res;
  498. }
  499. }
  500. return res;
  501. }
  502. public SRes ProductionBack(FjProductionBackRequest reqDto)
  503. {
  504. var res = new SRes();
  505. return res;
  506. }
  507. public SRes ProductionLeftFeedBack(string doccode)
  508. {
  509. var res = new SRes();
  510. return res;
  511. }
  512. public SRes ErrorMaterialStockOut(FjErrorMaterialStockOutRequest reqDto)
  513. {
  514. var res = new SRes();
  515. return res;
  516. }
  517. public SRes BGradeMaterialStockOut(BGradeMaterialStockOutRequest reqDto)
  518. {
  519. var res = new SRes();
  520. return res;
  521. }
  522. public SRes StockChange(FjStockChangeRequest reqDto)
  523. {
  524. var res = new SRes();
  525. return res;
  526. }
  527. #region 空托盘入库
  528. /// <summary>
  529. /// 一楼空托盘人工入库任务创建
  530. /// </summary>
  531. /// <param name="reqDto"></param>
  532. /// <returns></returns>
  533. public SRes OneFloorWorkerBuildEmptyPalletsStock(FJBuildEmptyPalletsStockRequest reqDto)
  534. {
  535. var res = new SRes();
  536. var req = _mapper.Map<FJBuildEmptyPalletsStockDto>(reqDto);
  537. req.Floor = 1;
  538. req.BusType = FJTaskBusType.OneLayerManualPallets;
  539. //TODO:条码长度待定
  540. //if (reqDto.PalletCode.Length != 12)
  541. //{
  542. // res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  543. // res.ResMsg = "MES上传的RFID长度不等于12位";
  544. // return res;
  545. //}
  546. res = FJEmptyPalletsStockIn(req);
  547. return res;
  548. }
  549. /// <summary>
  550. /// 分拣库空托盘入库
  551. /// </summary>
  552. /// <param name="reqDto"></param>
  553. /// <returns></returns>
  554. public SRes FJEmptyPalletsStockIn(FJBuildEmptyPalletsStockDto reqDto)
  555. {
  556. var res = new CopperLineResponse();
  557. FJTaskBusType BusType = reqDto.BusType;
  558. //验证业务类型
  559. if (reqDto.BusType <= FJTaskBusType.def || reqDto.BusType > FJTaskBusType.OneLayerAutoPallets)
  560. {
  561. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  562. res.ResMsg = "指令类型" + reqDto.BusType + ResponseStatusCodeEnum.ErrParam.GetDescription();
  563. return res;
  564. }
  565. //验证是否有空余货位
  566. res = _mapper.Map<CopperLineResponse>(IsThereAnySpaceVacancy());
  567. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
  568. //检查仓库是否存在
  569. res = _mapper.Map<CopperLineResponse>(CheckWareCode(reqDto.WareCode));
  570. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
  571. //验证容器是否存在
  572. res = _mapper.Map<CopperLineResponse>(CheckContinfo(reqDto.PalletCode, FJContainerType.ContainerType_Pallet));
  573. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
  574. //验证托盘是否有未结束的任务
  575. res = _mapper.Map<CopperLineResponse>(CheckNoFinishTask(reqDto.PalletCode));
  576. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
  577. //验证是否存在库存信息
  578. res = _mapper.Map<CopperLineResponse>(CheckInvnow(reqDto.PalletCode));
  579. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
  580. //保存条码信息 空托盘条码即条码表条码
  581. var barinfo = _billInvinitrepository.GetSingle(p => p.InvBarCode == reqDto.PalletCode);
  582. if (barinfo == null)
  583. {
  584. var warehosue = _basewarehouserepository.GetSingle(p => p.Code == reqDto.WareCode);
  585. barinfo = new BillInvinit()
  586. {
  587. InvBarCode = reqDto.PalletCode,
  588. WarehouseId = warehosue.Id,
  589. ContGrpId = IdFactory.NewId(),
  590. ContGrpBarCode = reqDto.PalletCode,
  591. ExecStateCode = FJInvLockState.InvState_Normal.ToString(),
  592. ExecDocsTypeCode = FJDocType.DocType_FJ_EmptyPalletsStockIn.GetHashCode().ToString(),
  593. InvInOut = FJInvInOutType.In.GetHashCode(),
  594. ExecWho = "WCS",
  595. EditTime = DateTime.Now,
  596. InvStateCode = FJInvState.InvEcecState_BuildUp.ToString(),
  597. SuppCode = "",
  598. Size = 1,
  599. MatCode = reqDto.PalletCode,
  600. AddTime = DateTime.Now,
  601. };
  602. barinfo = _billInvinitrepository.InsertReturnEntity(barinfo);
  603. }
  604. //生成库存信息-分解方法
  605. var createStockRes = CreateStock(new List<BillInvinit>() { barinfo }, reqDto.PalletCode, FJContainerType.ContainerType_Pallet);
  606. if (createStockRes.ResCode != 200)
  607. {
  608. res.ResCode = createStockRes.ResCode;
  609. res.ResMsg = createStockRes.ResMsg;
  610. return res;
  611. }
  612. var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest()
  613. {
  614. BusType = BusType.GetDescription(),
  615. ContGrpBarCode = reqDto.PalletCode,
  616. ContGrpId = createStockRes.ResDataList.First().ContGrpId,
  617. Qty = reqDto.PalletNum.ObjToDecimal(),
  618. EquCode = reqDto.StartLoc,
  619. WarehouseCode = reqDto.WareCode,
  620. Floor = reqDto.Floor,
  621. };
  622. //下发wcs任务 - 分解方法
  623. var taskres = CreateStockInWcsTask(createStockInWcsTaskReqest);
  624. if (taskres.ResCode != 200)
  625. {
  626. res.ResCode = taskres.ResCode;
  627. res.ResMsg = taskres.ResMsg;
  628. return res;
  629. }
  630. //生成流水数据-分解方法
  631. CreateInvFlow(createStockRes.ResDataList);
  632. return res;
  633. }
  634. #endregion 空托盘入库
  635. #region 满轮同WCS交互
  636. #region 主线
  637. #region 分库
  638. /// <summary>
  639. /// 工字轮/芯股进入主线扫码
  640. /// </summary>
  641. /// <returns></returns>
  642. public SRes<SRes> EnteMainLine(FJEnteMainLineRequest reqDto)
  643. {
  644. var res = new SRes<SRes>();
  645. try
  646. {
  647. //RedisHelper.LPush(nameof(EnteMainLine), reqDto.IShapedWheelCodes);
  648. foreach (var item in reqDto.IShapedWheelCodes)
  649. {
  650. var res1 = AllocationWarehouseSort(item);
  651. res.ResDataList.Add(res);
  652. }
  653. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  654. res.ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription();
  655. }
  656. catch (Exception ex)
  657. {
  658. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  659. res.ResMsg = ex.Message;
  660. }
  661. return res;
  662. }
  663. /// <summary>
  664. /// 分配分拣库
  665. /// </summary>
  666. /// <param name="code">工字轮条码</param>
  667. /// <returns></returns>
  668. public SRes AllocationWarehouseSort(string code)
  669. {
  670. //开始分配分拣库
  671. var res = new SRes();
  672. //找到码垛工字轮信息
  673. var spoolTrans = _billSpoolTransrepository.GetSingle(p => p.ConBarCode == code);
  674. if (spoolTrans == null)
  675. {
  676. //创建容器信息
  677. var cont = new BillSpoolTrans
  678. {
  679. ConBarCode = code,
  680. WarehouseCode = null,
  681. AddWho = "WMS",
  682. AddTime = DateTime.Now,
  683. WorkOrder = "20230210"
  684. };
  685. //加载新的容器信息
  686. if (!_billSpoolTransrepository.Insert(cont))
  687. {
  688. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  689. res.ResMsg = "RFID载具初始化失败";
  690. return res;
  691. }
  692. spoolTrans = _billSpoolTransrepository.GetSingle(p => p.ConBarCode == code);
  693. }
  694. if (!spoolTrans.WarehouseCode.IsNullOrEmpty())
  695. {
  696. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  697. res.ResMsg = "已完成分库";
  698. return res;
  699. }
  700. //验证容器是否存在
  701. res = _mapper.Map<CopperLineResponse>(CheckContinfo(code, FJContainerType.ContainerType_IShapedWheel));
  702. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
  703. //验证工字轮是否有未结束的任务
  704. res = _mapper.Map<CopperLineResponse>(CheckNoFinishTask(code));
  705. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
  706. //验证是否存在库存信息
  707. res = _mapper.Map<CopperLineResponse>(CheckInvnow(code));
  708. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
  709. //通过订单找到对应的机台信息
  710. var maclist = _basemachinforepository.AsQueryable().Where(p => p.WorkOrder == spoolTrans.WorkOrder);
  711. var warelist = maclist.Select(p => p.WarehouseCode).Distinct().OrderBy(v => v); //找到机台对应的仓库信息
  712. if (!warelist.Any()) //当前订单没有对应仓库信息
  713. {
  714. _billSpoolTransrepository.UpdateModelColumns(p => new BillSpoolTrans()
  715. {
  716. ErrType = 1,
  717. ErrMsg = "没有配置机台信息",
  718. EditTime = DateTime.Now
  719. }, p => p.ConBarCode == spoolTrans.ConBarCode);
  720. }
  721. else if (warelist.Count() == 1) //当前订单对应一个仓库信息
  722. {
  723. int sort = int.Parse(warelist.First().Substring(0, 1));
  724. _billSpoolTransrepository.UpdateModelColumns(p => new BillSpoolTrans()
  725. {
  726. WarehouseCode = warelist.First(),
  727. WarehouseSort = sort,
  728. Direct = warelist.First().Substring(1, 1),
  729. EditTime = DateTime.Now
  730. }, p => p.ConBarCode == spoolTrans.ConBarCode);
  731. spoolTrans.WarehouseCode = warelist.First();
  732. spoolTrans.WarehouseSort = sort;
  733. spoolTrans.Direct = warelist.First().Substring(1, 1);
  734. }
  735. else //当前订单对应多个仓库信息
  736. {
  737. //TODO:怎么计算当前订单在当前仓库需要码多少托,跟据当前仓库已有订单需要的托盘数量计算各订单在可用码垛工位占比,再计算当前托盘该码什么跺
  738. var waretemplist = maclist.Select(p => new { p.WarehouseCode, p.WorkOrder, p.BillCode, p.PlanQty }).Distinct();
  739. var warehouselist = _basewarehouserepository.GetList().Select(p => p.Id);
  740. foreach (var warehouse in warehouselist)
  741. {
  742. var stackdetaillist = _billBomsetinfoRepository.AsQueryable().Where(p => p.WarehouseId == warehouse);
  743. getMatProport(spoolTrans.MatCode, warehouse);
  744. }
  745. }
  746. //保存条码信息 空托盘条码即条码表条码
  747. //TODO:此处条码号应当使用材料号,测试时使用条码
  748. var barinfo = _billInvinitrepository.GetSingle(p => p.InvBarCode == code);
  749. if (barinfo == null)
  750. {
  751. var warehosue = _basewarehouserepository.GetSingle(p => p.Code == spoolTrans.WarehouseCode);
  752. barinfo = new BillInvinit()
  753. {
  754. InvBarCode = code,
  755. WarehouseId = warehosue.Id,
  756. ContGrpId = IdFactory.NewId(),
  757. ContGrpBarCode = code,
  758. ExecStateCode = FJInvLockState.InvState_Normal.ToString(),
  759. ExecDocsTypeCode = FJDocType.DocType_FJ_EmptyPalletsStockIn.GetHashCode().ToString(),
  760. InvInOut = FJInvInOutType.In.GetHashCode(),
  761. ExecWho = "WCS",
  762. EditTime = DateTime.Now,
  763. InvStateCode = FJInvState.InvEcecState_BuildUp.ToString(),
  764. SuppCode = "",
  765. Size = 1,
  766. MatCode = spoolTrans.MatCode,
  767. AddTime = DateTime.Now,
  768. };
  769. barinfo = _billInvinitrepository.InsertReturnEntity(barinfo);
  770. }
  771. //生成库存信息-分解方法
  772. var createStockRes = CreateStock(new List<BillInvinit>() { barinfo }, code, FJContainerType.ContainerType_Pallet);
  773. if (createStockRes.ResCode != 200)
  774. {
  775. res.ResCode = createStockRes.ResCode;
  776. res.ResMsg = createStockRes.ResMsg;
  777. return res;
  778. }
  779. //开始生成WCS
  780. var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest()
  781. {
  782. BusType = FJTaskBusType.二楼组盘.GetDescription(),
  783. ContGrpBarCode = code,
  784. ContGrpId = createStockRes.ResDataList.First().ContGrpId,
  785. Qty = 1,
  786. WarehouseCode = spoolTrans.WarehouseCode,
  787. Floor = 2,
  788. };
  789. //下发wcs任务 - 分解方法
  790. var taskres = CreateStockInWcsTask(createStockInWcsTaskReqest);
  791. if (taskres.ResCode != 200)
  792. {
  793. res.ResCode = taskres.ResCode;
  794. res.ResMsg = taskres.ResMsg;
  795. return res;
  796. }
  797. //生成流水数据-分解方法
  798. CreateInvFlow(createStockRes.ResDataList);
  799. RedisHelper.Set($"AllocationWarehouseSort:{code}", JsonConvert.SerializeObject(new MainlineDiversion()
  800. {
  801. TaskId = taskres.ResData.ID,
  802. WarehouseCode = spoolTrans.WarehouseCode
  803. }));
  804. return res;
  805. }
  806. /// <summary>
  807. /// 计算物料在该仓库的比例
  808. /// </summary>
  809. /// <param name="matcode">物料编号</param>
  810. /// <param name="warehousecode">仓库编号</param>
  811. /// <returns></returns>
  812. public decimal getMatProport(string matcode, long warehouseId)
  813. {
  814. //计算此仓库所有该物料的量 已组盘/已入库
  815. var stackLisk = _billInvnowrepository.AsQueryable()
  816. .Count(v => v.WarehouseId == warehouseId
  817. && v.MatCode == matcode
  818. && (v.ExecStateCode == FJInvState.InvEcecState_BuildUp.ToString() || v.ExecStateCode == FJInvState.InvEcecState_In.ToString()));
  819. //每的单子(每盘的数量)
  820. var stackdetaillist = _billBomsetinfoRepository.AsQueryable().Where(p => p.WarehouseId == warehouseId);
  821. return 0;
  822. }
  823. #endregion 分库
  824. #endregion 主线
  825. #endregion 满轮同WCS交互
  826. public SRes BomInfoTrans(BomInfoTransRequest reqDto)
  827. {
  828. var res = new SRes();
  829. return res;
  830. }
  831. public SRes FJ1NorthAutoGenerateLocation()
  832. {
  833. SRes res = new SRes();
  834. BaseWarehouse BaseWarearea = new BaseWarehouse()
  835. {
  836. Id = IdFactory.NewId(),
  837. IsStop = 0,
  838. Code = "1N",
  839. Name = "分拣库1北",
  840. AddTime = DateTime.Now
  841. ,
  842. AddWho = "admin",
  843. EditTime = DateTime.Now,
  844. EditWho = "admin",
  845. TypeNum = 1
  846. };
  847. var baseWareareaEntity = _basewarehouserepository.InsertReturnEntity(BaseWarearea);
  848. var dbBaseWarecellLists = _basewarehouserepository.AsQueryable().ToList();
  849. var shelfcode = "";
  850. var list = new List<BaseWarecell>();
  851. var codes = new List<string>();
  852. for (int row = 1; row <= 2; row++) //行
  853. {
  854. int tunnel = 1;
  855. //12行 48列9层
  856. for (int layer = 1; layer <= 10; layer++) //层
  857. {
  858. for (int col = 1; col <= 10; col++) //列
  859. {
  860. var code = row.ToString().PadLeft(2, '0') + "-" + col.ToString().PadLeft(2, '0') + "-" + layer.ToString().PadLeft(2, '0') + "-" + tunnel;
  861. codes.Add(code);
  862. var name = row.ToString() + "行" + col.ToString() + "列" + layer.ToString() + "层";
  863. list.Add(new BaseWarecell
  864. {
  865. Id = IdFactory.NewId(),
  866. WarehouseId = baseWareareaEntity.Id,
  867. WareAreaId = 1669154208777113600,
  868. IsStop = 0,
  869. Code = code,
  870. Name = name,
  871. StateNum = 1,
  872. TypeNum = 1,
  873. Size = 1,
  874. Shelf = tunnel.ToString() + shelfcode,
  875. WarehouseCode = BaseWarearea.Code,
  876. Row = row,
  877. Col = col,
  878. Layer = layer,
  879. Depth = 1,
  880. Tunnel = tunnel,
  881. SCRel = "SRM" + tunnel.ToString().PadLeft(2, '0'),
  882. ContGrpId = 0,
  883. ContGrpBarCode = "",
  884. Memo = "",
  885. AddWho = "admin",
  886. AddTime = DateTime.Now,
  887. EditWho = "admin",
  888. EditTime = DateTime.Now,
  889. });
  890. }
  891. }
  892. }
  893. _basewarecellrepository.InsertRange(list);
  894. return res;
  895. }
  896. public SRes FJSouthAutoGenerateLocation()
  897. {
  898. SRes res = new SRes();
  899. BaseWarehouse BaseWarearea = new BaseWarehouse()
  900. {
  901. Id = IdFactory.NewId(),
  902. IsStop = 0,
  903. Code = "1S",
  904. Name = "分拣库1南",
  905. AddTime = DateTime.Now,
  906. AddWho = "admin",
  907. EditTime = DateTime.Now,
  908. EditWho = "admin",
  909. TypeNum = 1
  910. };
  911. var baseWareareaEntity = _basewarehouserepository.InsertReturnEntity(BaseWarearea);
  912. var dbBaseWarecellLists = _basewarehouserepository.AsQueryable().ToList();
  913. var shelfcode = "";
  914. var list = new List<BaseWarecell>();
  915. var codes = new List<string>();
  916. for (int row = 1; row <= 2; row++) //行
  917. {
  918. int tunnel = 1;
  919. //12行 48列9层
  920. for (int layer = 1; layer <= 10; layer++) //层
  921. {
  922. for (int col = 11; col <= 20; col++) //列
  923. {
  924. var code = row.ToString().PadLeft(2, '0') + "-" + col.ToString().PadLeft(2, '0') + "-" + layer.ToString().PadLeft(2, '0') + "-" + tunnel;
  925. codes.Add(code);
  926. var name = row.ToString() + "行" + col.ToString() + "列" + layer.ToString() + "层";
  927. list.Add(new BaseWarecell
  928. {
  929. Id = IdFactory.NewId(),
  930. WarehouseId = baseWareareaEntity.Id,
  931. WareAreaId = 1669154208777113600,
  932. IsStop = 0,
  933. Code = code,
  934. Name = name,
  935. StateNum = 1,
  936. TypeNum = 1,
  937. Size = 1,
  938. Shelf = tunnel.ToString() + shelfcode,
  939. WarehouseCode = BaseWarearea.Code,
  940. Row = row,
  941. Col = col,
  942. Layer = layer,
  943. Depth = 1,
  944. Tunnel = tunnel,
  945. SCRel = "SRM" + 2,
  946. ContGrpId = 0,
  947. ContGrpBarCode = "",
  948. Memo = "",
  949. AddWho = "admin",
  950. AddTime = DateTime.Now,
  951. EditWho = "admin",
  952. EditTime = DateTime.Now,
  953. });
  954. }
  955. }
  956. }
  957. _basewarecellrepository.InsertRange(list);
  958. return res;
  959. }
  960. #region 巷道及货位分配
  961. /// <summary>
  962. /// 分配货位
  963. /// </summary>
  964. /// <param name="request"></param>
  965. /// <returns></returns>
  966. public SRes<FJApplyStockInLocResponse> ApplyStockInLoc(FJApplyStockInLocRequest reqEntity)
  967. {
  968. var res = ApplyStockInLocTemp(reqEntity);
  969. if (string.IsNullOrEmpty(res.ResData.CellNo))
  970. {
  971. return res;
  972. }
  973. try
  974. {
  975. var task = _taskrepository.GetFirst(p => p.ID == reqEntity.TaskNum);
  976. var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  977. _db.BeginTran();
  978. //更新货位
  979. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn.GetHashCode(), ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  980. p => p.Code == res.ResData.CellNo);
  981. //更新任务
  982. //_wcstaskoldrepository.UpdateModelColumns(p => new WCS_TaskOld() { AddrTo = res.ResData.CellNo, EditTime = DateTime.Now },
  983. // p => p.ID == reqEntity.TaskNum);
  984. //_taskrepository.UpdateModelColumns(p => new WCS_TaskInfo() { AddrTo = res.ResData.CellNo, EditTime = DateTime.Now },
  985. // p => p.ID == reqEntity.TaskNum);
  986. _db.CommitTran();
  987. }
  988. catch (Exception ex)
  989. {
  990. _db.RollbackTran();
  991. _logger.LogInformation(ex.ToString());
  992. }
  993. return res;
  994. }
  995. /// <summary>
  996. /// 分配货位
  997. /// </summary>
  998. /// <param name="request"></param>
  999. /// <returns></returns>
  1000. public SRes<FJApplyStockInLocResponse> ApplyStockInLocTemp(FJApplyStockInLocRequest reqEntity)
  1001. {
  1002. var result = new SRes<FJApplyStockInLocResponse>()
  1003. {
  1004. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  1005. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  1006. ResData = new FJApplyStockInLocResponse()
  1007. };
  1008. //检擦任务是否异常
  1009. var wcstask = _wcstaskoldrepository.AsQueryable().SplitTable(tabs => tabs.Take(3)).Where(p => p.ID == reqEntity.TaskNum).First(); ;
  1010. if (wcstask == null)
  1011. {
  1012. result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  1013. result.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  1014. return result;
  1015. }
  1016. if (wcstask.Type == TaskType.OutDepot)
  1017. {
  1018. result.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  1019. result.ResMsg = "该任务是出库任务,不能分配货位;wms任务号" + wcstask.ID;
  1020. return result;
  1021. }
  1022. if (!string.IsNullOrEmpty(wcstask.AddrTo) && wcstask.AddrTo != "SRM")//如果目标地址不是堆垛机
  1023. {
  1024. result.ResData.TunnelNum = wcstask.Tunnel;
  1025. result.ResData.CellNo = wcstask.AddrTo;
  1026. result.ResData.Row = wcstask.AddrTo.Split('-')[0] != null ? int.Parse(wcstask.AddrTo.Split('-')[0]) : 0;
  1027. result.ResData.Colomn = wcstask.AddrTo.Split('-')[1] != null ? int.Parse(wcstask.AddrTo.Split('-')[1]) : 0;
  1028. result.ResData.Layer = wcstask.AddrTo.Split('-')[2] != null ? int.Parse(wcstask.AddrTo.Split('-')[2]) : 0;
  1029. return result;
  1030. }
  1031. if (reqEntity.TunnelNum <= 0)
  1032. {
  1033. result.ResCode = ResponseStatusCodeEnum.NotTunnelNum.GetHashCode();
  1034. result.ResMsg = ResponseStatusCodeEnum.NotTunnelNum.GetDescription();
  1035. return result;
  1036. }
  1037. //验证仓库信息
  1038. var warehouse = _basewarehouserepository.GetFirst(p => p.Code == wcstask.WarehouseCode);
  1039. if (warehouse == null)
  1040. {
  1041. result.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  1042. result.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  1043. return result;
  1044. }
  1045. //验证库存
  1046. var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  1047. if (stock == null)
  1048. {
  1049. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  1050. result.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription();
  1051. return result;
  1052. }
  1053. if (reqEntity.TunnelNum <= 0)
  1054. {
  1055. result.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  1056. result.ResMsg = "没有传巷道值";
  1057. return result;
  1058. }
  1059. return ApplyLoc(new FJApplyLocRequest()
  1060. {
  1061. MaterialId = stock.MatId,
  1062. MaterialCode = stock.MatCode,
  1063. Size = reqEntity.Height,
  1064. TunnelNum = reqEntity.TunnelNum,
  1065. WarehuoseId = warehouse.Id,
  1066. IsMove = wcstask.Type == TaskType.TransferDepot
  1067. });
  1068. }
  1069. /// <summary>
  1070. /// 分配货位
  1071. /// </summary>
  1072. /// <param name="reqEntity"></param>
  1073. /// <returns></returns>
  1074. public SRes<FJApplyStockInLocResponse> ApplyLoc(FJApplyLocRequest reqEntity)
  1075. {
  1076. var result = new SRes<FJApplyStockInLocResponse>()
  1077. {
  1078. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  1079. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  1080. ResData = new FJApplyStockInLocResponse()
  1081. };
  1082. //预留货位数量
  1083. var emptyLoc = _basewarecellrepository.GetList(p => p.IsStop == 0
  1084. && p.StateNum == LocationState.LocationState_Empty.GetHashCode()
  1085. && p.TypeNum == LocationType.LocationType_StorageLocation.GetHashCode()
  1086. && p.Tunnel == reqEntity.TunnelNum
  1087. && p.WarehouseId == reqEntity.WarehuoseId
  1088. && p.Size == reqEntity.Size
  1089. );
  1090. //判断是否移库
  1091. if (!reqEntity.IsMove && (emptyLoc == null || emptyLoc.Count < 2))
  1092. {
  1093. result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  1094. result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription();
  1095. return result;
  1096. }
  1097. //找到可用货位
  1098. var loc1ist = _basewarecellrepository.Context
  1099. .Queryable<BaseWarecell>()
  1100. .Where((loc1) => loc1.IsStop == 0
  1101. && loc1.StateNum == LocationState.LocationState_Empty.GetHashCode()
  1102. && loc1.TypeNum == LocationType.LocationType_StorageLocation.GetHashCode()
  1103. && loc1.Tunnel == reqEntity.TunnelNum
  1104. && loc1.WarehouseId == reqEntity.WarehuoseId
  1105. && loc1.Size == reqEntity.Size
  1106. && loc1.Depth == 1)
  1107. .Where((loc1) => loc1.Tunnel == reqEntity.TunnelNum)
  1108. .Select((loc1) => new
  1109. {
  1110. loc1.Code,
  1111. loc1.Id,
  1112. loc1.Row,
  1113. loc1.Col,
  1114. loc1.Layer,
  1115. loc1.Tunnel,
  1116. });
  1117. if (loc1ist != null)
  1118. {
  1119. var resloc = loc1ist.ToList().OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First();
  1120. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  1121. result.ResData.CellNo = resloc.Code;
  1122. result.ResData.Row = resloc.Row;
  1123. result.ResData.Colomn = resloc.Col;
  1124. result.ResData.Layer = resloc.Layer;
  1125. return result;
  1126. }
  1127. if (loc1ist == null || !loc1ist.Any())
  1128. {
  1129. result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  1130. result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription();
  1131. return result;
  1132. }
  1133. var loc = loc1ist.First();
  1134. result.ResData.TunnelNum = loc.Tunnel.ToString();
  1135. result.ResData.CellNo = loc.Code;
  1136. result.ResData.Row = loc.Row;
  1137. result.ResData.Colomn = loc.Col;
  1138. result.ResData.Layer = loc.Layer;
  1139. return result;
  1140. }
  1141. #endregion 巷道及货位分配
  1142. #region 容器、物料、条码、库存检测及创建,创建流水信息
  1143. /// <summary>
  1144. /// 检查容器是否存在,不存在则创建
  1145. /// </summary>
  1146. /// <param name="contBarCode">容器条码</param>
  1147. /// <param name="fjContainerType">容器类型</param>
  1148. /// <returns></returns>
  1149. public SRes CheckContinfo(string contBarCode, FJContainerType fjContainerType)
  1150. {
  1151. SRes res = new SRes();
  1152. var container = _baseContinfo.GetSingle(x => x.ContBarCode == contBarCode);
  1153. if (container == null)
  1154. {
  1155. //创建容器信息
  1156. var cont = new BaseContinfo
  1157. {
  1158. ContBarCode = contBarCode,
  1159. Name = contBarCode,
  1160. TypeCode = fjContainerType.ToString(),
  1161. PrintQty = 1,
  1162. IsStop = 0,
  1163. WarehouseId = 0,
  1164. AddWho = "WMS",
  1165. AddTime = DateTime.Now
  1166. };
  1167. //加载新的容器信息
  1168. if (!_baseContinfo.Insert(cont))
  1169. {
  1170. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  1171. res.ResMsg = "RFID载具初始化失败";
  1172. return res;
  1173. }
  1174. }
  1175. else if (container.IsStop != 0)
  1176. {
  1177. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1178. res.ResMsg = "容器已停用";
  1179. return res;
  1180. }
  1181. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  1182. return res;
  1183. }
  1184. /// <summary>
  1185. /// 跟据库存信息创建流水信息
  1186. /// </summary>
  1187. /// <param name="barlist">库存信息</param>
  1188. /// <returns></returns>
  1189. public SRes CreateInvFlow(List<BillInvnow> barlist)
  1190. {
  1191. var res = new SRes();
  1192. var listflow = _mapper.Map<List<BillInvflow>>(barlist);
  1193. foreach (var item in listflow)
  1194. {
  1195. item.AddTime = DateTime.Now;
  1196. item.Id = IdFactory.NewId();
  1197. }
  1198. _billInvflow.InsertRange(listflow);
  1199. return res;
  1200. }
  1201. /// <summary>
  1202. /// 跟据库存信息创建流水信息
  1203. /// </summary>
  1204. /// <param name="bar">库存信息</param>
  1205. /// <returns></returns>
  1206. public SRes CreateInvFlow(BillInvnow bar)
  1207. {
  1208. var res = new SRes();
  1209. var flow = _mapper.Map<BillInvflow>(bar);
  1210. flow.AddTime = DateTime.Now;
  1211. flow.Id = IdFactory.NewId();
  1212. _billInvflow.Insert(flow);
  1213. return res;
  1214. }
  1215. /// <summary>
  1216. /// 是否有空余货位
  1217. /// </summary>
  1218. /// <returns></returns>
  1219. public SRes IsThereAnySpaceVacancy()
  1220. {
  1221. var res = new SRes();
  1222. //验证有剩余货位
  1223. if (_basewarecellrepository.GetList(p => p.IsStop == 0 && p.StateNum == FJLocationState.LocationState_Empty.GetHashCode()).Count() < 2)
  1224. {
  1225. res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  1226. res.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription();
  1227. return res;
  1228. }
  1229. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  1230. return res;
  1231. }
  1232. /// <summary>
  1233. /// 检查传入的仓库是否存在
  1234. /// </summary>
  1235. /// <param name="wareCode">仓库编号</param>
  1236. /// <returns></returns>
  1237. public SRes CheckWareCode(string wareCode)
  1238. {
  1239. var res = new SRes();
  1240. //验证是否有对应仓库
  1241. var warehosue = _basewarehouserepository.GetSingle(p => p.Code == wareCode);
  1242. if (warehosue == null)
  1243. {
  1244. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  1245. res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  1246. return res;
  1247. }
  1248. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  1249. return res;
  1250. }
  1251. /// <summary>
  1252. /// 验证空托盘是否有未结束的任务
  1253. /// </summary>
  1254. /// <param name="PalletCode"></param>
  1255. /// <returns></returns>
  1256. public SRes CheckNoFinishTask(string PalletCode)
  1257. {
  1258. SRes res = new SRes();
  1259. //验证当前托盘是否有未结束的任务
  1260. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.BarCode == PalletCode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();
  1261. if (task != null && task.ID > 0)
  1262. {
  1263. switch (task.Type)
  1264. {
  1265. case TaskType.SetPlate:
  1266. res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();
  1267. res.ResMsg = PalletCode + "该号组盘任务还未完成,请先完成组盘任务";
  1268. return res;
  1269. case TaskType.EnterDepot:
  1270. if (task.Status > TaskStatus.WaitingToExecute && task.Status < TaskStatus.Finish)
  1271. {
  1272. res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();
  1273. res.ResMsg = PalletCode + "已有进行中任务,请检查托盘条码是否重复";
  1274. return res;
  1275. }
  1276. res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();
  1277. res.ResMsg = PalletCode + "任务已创建,请勿重复申请";
  1278. return res;
  1279. case TaskType.OutDepot:
  1280. res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();
  1281. res.ResMsg = PalletCode + "该号出库任务还未完成,请先完成出库任务";
  1282. return res;
  1283. case TaskType.TransferDepot:
  1284. res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();
  1285. res.ResMsg = PalletCode + "该号移库任务还未完成,请先完成移库任务";
  1286. return res;
  1287. case TaskType.Delivery:
  1288. res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();
  1289. res.ResMsg = PalletCode + "该号输送任务还未完成,请先完成输送任务";
  1290. return res;
  1291. case TaskType.EmptyInit:
  1292. res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();
  1293. res.ResMsg = PalletCode + "该号空轮初始化任务还未完成,请先完成空轮初始化任务";
  1294. return res;
  1295. }
  1296. }
  1297. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  1298. return res;
  1299. }
  1300. /// <summary>
  1301. /// 检查是否存在库存信息
  1302. /// </summary>
  1303. /// <param name="code">编码</param>
  1304. /// <returns></returns>
  1305. public SRes CheckInvnow(string code)
  1306. {
  1307. SRes res = new SRes();
  1308. //验证是否没有库存信息
  1309. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code);
  1310. if (stock != null && stock.InvStateCode == FJInvState.InvEcecState_In.ToString())
  1311. {
  1312. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1313. res.ResMsg = code + "该托盘号已在库中,请检查托盘号是否重复";
  1314. return res;
  1315. }
  1316. else if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  1317. {
  1318. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1319. res.ResMsg = code + "该托盘号存在出库中任务,请检查上一个任务是否已经完成";
  1320. return res;
  1321. }
  1322. else if (stock != null)
  1323. {
  1324. res.ResCode = ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetHashCode();
  1325. res.ResMsg = ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetDescription();
  1326. return res;
  1327. }
  1328. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  1329. return res;
  1330. }
  1331. /// <summary>
  1332. /// 创建库存信息
  1333. /// 不验证容器是否存在
  1334. /// 不验证容器是否有未结束的任务
  1335. /// 不验条码信息是否存在
  1336. /// </summary>
  1337. /// <param name="barList">条码集合</param>
  1338. /// <param name="containerBarcode">容器编号</param>
  1339. /// <param name="containerType">容器类型</param>
  1340. /// <returns></returns>
  1341. public SRes<BillInvnow> CreateStock(List<BillInvinit> barList, string containerBarcode, FJContainerType containerType)
  1342. {
  1343. var res = new SRes<BillInvnow>();
  1344. if (string.IsNullOrEmpty(containerBarcode))
  1345. {
  1346. res.ResCode = ResponseStatusCodeEnum.ContainerCodeNotEmpty.GetHashCode();
  1347. res.ResMsg = ResponseStatusCodeEnum.ContainerCodeNotEmpty.GetDescription();
  1348. return res;
  1349. }
  1350. //将条码表映射到库存表
  1351. var stocklist = _mapper.Map<List<BillInvnow>>(barList);
  1352. foreach (var item in stocklist)
  1353. {
  1354. item.AddTime = DateTime.Now;
  1355. item.Id = IdFactory.NewId();
  1356. }
  1357. if (!_billInvnowrepository.InsertRange(stocklist))
  1358. {
  1359. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  1360. res.ResMsg = "托盘库存信息存储失败";
  1361. return res;
  1362. }
  1363. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  1364. res.ResDataList = stocklist;
  1365. return res;
  1366. }
  1367. /// <summary>
  1368. /// 创建WCS任务
  1369. /// </summary>
  1370. /// <param name="reqDto"></param>
  1371. /// <returns></returns>
  1372. public SRes<WCS_TaskInfo> CreateStockInWcsTask(FJCreateStockInWcsTaskRequest reqDto)
  1373. {
  1374. var res = new SRes<WCS_TaskInfo>();
  1375. var wcstask = new WCS_TaskInfo()
  1376. {
  1377. Type = TaskType.EnterDepot,
  1378. Status = TaskStatus.NewBuild,
  1379. Priority = 0,
  1380. Device = "",
  1381. SrmStation = "",
  1382. AddrFrom = reqDto.EquCode,
  1383. AddrTo = "SRM",
  1384. LastInteractionPoint = "",
  1385. BarCode = reqDto.ContGrpBarCode,
  1386. Floor = reqDto.Floor,
  1387. Length = reqDto.Qty,
  1388. AddTime = DateTime.Now,
  1389. StartTime = DateTime.Now,
  1390. DocID = 0,
  1391. PalletType = 1,
  1392. ProdLine = 0,
  1393. AddWho = "WMS",
  1394. WarehouseCode = reqDto.WarehouseCode,
  1395. Enabled = true,
  1396. //WorkBench = reqDto.EquCode,
  1397. //MaterialCode = reqDto.MaterialCode,
  1398. //MatCode = reqDto.MatCode,
  1399. BusType = reqDto.BusType
  1400. };
  1401. var wcstaskhis = _mapper.Map<WCS_TaskOld>(wcstask);
  1402. try
  1403. {
  1404. _db.BeginTran();
  1405. var task = _taskrepository.InsertReturnEntity(wcstask);
  1406. wcstaskhis.ID = task.ID;
  1407. _wcstaskoldrepository.InsertableSplitTable(wcstaskhis);
  1408. var taskdetail = new WCS_TaskDtl()
  1409. {
  1410. ID = Guid.NewGuid(),
  1411. CurPoint = reqDto.EquCode,
  1412. AddTime = DateTime.Now,
  1413. AddWho = "WMS",
  1414. Enabled = true,
  1415. ParentTaskCode = task.ID,
  1416. Desc = reqDto.EquCode + "分拣库一楼空托盘入库",
  1417. };
  1418. _taskdetailrepository.InsertableSplitTable(taskdetail);
  1419. _db.CommitTran();
  1420. res.ResData = task;
  1421. }
  1422. catch (Exception ex)
  1423. {
  1424. _db.RollbackTran();
  1425. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  1426. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();
  1427. _logger.LogInformation("保存任务异常:" + ex.ToString());
  1428. return res;
  1429. }
  1430. return res;
  1431. }
  1432. #endregion 容器、物料、条码、库存检测及创建,创建流水信息
  1433. /// <summary>
  1434. /// 手动出库
  1435. /// </summary>
  1436. /// <param name="request"></param>
  1437. /// <returns></returns>
  1438. public string ManualTask(FJManualTaskRequest request)
  1439. {
  1440. var res = new SRes();
  1441. //必须要有货位信息
  1442. if (!request.Location.Any())
  1443. {
  1444. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  1445. res.ResMsg = "货位" + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  1446. return res.ToCamelCaseString();
  1447. }
  1448. try
  1449. {
  1450. foreach (var item in request.Location)
  1451. {
  1452. //货位信息验证
  1453. var location = _basewarecellrepository.GetSingle(p => p.Code == item);
  1454. if (location == null)
  1455. {
  1456. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  1457. res.ResMsg = item + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  1458. return res.ToCamelCaseString();
  1459. }
  1460. if (location.StateNum != FJLocationState.LocationState_Full.GetHashCode())
  1461. {
  1462. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1463. res.ResMsg = item + ResponseStatusCodeEnum.Fail.GetDescription() + "货位状态不满足出库条件";
  1464. return res.ToCamelCaseString();
  1465. }
  1466. if (location.IsStop == 1)
  1467. {
  1468. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1469. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + item + "被禁用";
  1470. return res.ToCamelCaseString();
  1471. }
  1472. //库存信息验证
  1473. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == location.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  1474. if (stock == null)
  1475. {
  1476. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  1477. res.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription();
  1478. return res.ToCamelCaseString();
  1479. }
  1480. if (stock.InvStateCode != InvState.InvEcecState_In.ToString())
  1481. {
  1482. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1483. res.ResMsg = item + "组盘状态不是已入库";
  1484. return res.ToCamelCaseString();
  1485. }
  1486. WCS_TaskInfo billTask = new WCS_TaskInfo();
  1487. billTask.Status = TaskStatus.NewBuild;
  1488. billTask.Type = TaskType.OutDepot;
  1489. billTask.Priority = 0;
  1490. billTask.Device = "SRM" + location.Tunnel;
  1491. billTask.AddrFrom = item;
  1492. billTask.AddrTo = request.AddTo;
  1493. billTask.BarCode = stock.ContGrpBarCode;
  1494. billTask.StartTime = DateTime.Now;
  1495. billTask.AddTime = DateTime.Now;
  1496. billTask.EditTime = DateTime.Now;
  1497. billTask.AddWho = "WMS";
  1498. billTask.WarehouseCode = location.WarehouseCode;
  1499. billTask.Enabled = true;
  1500. billTask.Floor = 2;
  1501. billTask.Tunnel = location.Tunnel.ToString();
  1502. billTask.PalletType = 1;
  1503. billTask.Length = stock.LengthQty;
  1504. billTask.MaterialCode = stock.MatCode;
  1505. billTask.OutType = OutTypeEnum.半自动手动出库任务;
  1506. billTask.BusType = FJTaskBusType.TaskBusType_FJ_ManualOut.GetDescription();
  1507. _db.BeginTran();
  1508. var wcs = _taskrepository.InsertReturnEntity(billTask);
  1509. var wcshistory = _mapper.Map<WCS_TaskOld>(wcs);
  1510. _wcstaskoldrepository.InsertableSplitTable(wcshistory);
  1511. var taskdetail = new WCS_TaskDtl()
  1512. {
  1513. ID = Guid.NewGuid(),
  1514. CurPoint = item,
  1515. AddTime = DateTime.Now,
  1516. AddWho = "wms",
  1517. Enabled = true,
  1518. ParentTaskCode = wcs.ID,
  1519. Desc = wcs.OutType.ToString(),
  1520. };
  1521. _taskdetailrepository.InsertableSplitTable(taskdetail);
  1522. _db.CommitTran();
  1523. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  1524. {
  1525. StateNum = LocationState.LocationState_StockOut.GetHashCode(),
  1526. EditTime = DateTime.Now
  1527. }, p => p.Code == item);
  1528. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  1529. {
  1530. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  1531. EditTime = DateTime.Now
  1532. }, p => p.ContGrpBarCode == stock.ContGrpBarCode);
  1533. var flow = _mapper.Map<BillInvflow>(stock);
  1534. flow.Id = IdFactory.NewId();
  1535. flow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  1536. flow.EditTime = DateTime.Now;
  1537. _billInvflow.Insert(flow);
  1538. }
  1539. }
  1540. catch (Exception ex)
  1541. {
  1542. _db.RollbackTran();
  1543. _logger.LogInformation("手动出库异常:" + ex.Message);
  1544. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  1545. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();
  1546. return res.ToCamelCaseString();
  1547. }
  1548. return res.ToCamelCaseString();
  1549. }
  1550. #region 完成/取消任务
  1551. /// <summary>
  1552. /// 完成任务
  1553. /// </summary>
  1554. /// <param name="reqDto"></param>
  1555. /// <returns></returns>
  1556. public SRes<int> CompleteTask(CompleteTaskRequest reqDto)
  1557. {
  1558. var result = new SRes<int>()
  1559. {
  1560. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  1561. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  1562. ResData = reqDto.TaskNum
  1563. };
  1564. //检查历史任务表是否有任务
  1565. var task = _wcstaskoldrepository.AsQueryable().SplitTable(tabs => tabs.Take(3)).Where(p => p.ID == reqDto.TaskNum).First();
  1566. if (task == null)
  1567. {
  1568. result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  1569. result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  1570. return result;
  1571. }
  1572. switch (task.Type)
  1573. {
  1574. case TaskType.SetPlate:
  1575. break;
  1576. case TaskType.EnterDepot:
  1577. try
  1578. {
  1579. //检擦库存信息是否正确
  1580. var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  1581. if (stock == null)
  1582. {
  1583. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  1584. result.ResMsg = task.BarCode + "没有已组盘的信息";
  1585. return result;
  1586. }
  1587. var warehouse = _basewarehouserepository.GetSingle(p => p.Code == task.WarehouseCode);
  1588. _db.BeginTran();
  1589. int row = int.Parse(task.AddrTo.Split('-')[0]);
  1590. int col = int.Parse(task.AddrTo.Split('-')[1]);
  1591. int layer = int.Parse(task.AddrTo.Split('-')[2]);
  1592. //更新库存
  1593. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow()
  1594. {
  1595. InvStateCode = InvState.InvEcecState_In.ToString(),
  1596. PutRow = row,
  1597. PutCol = col,
  1598. PutLayer = layer,
  1599. OneInTime = DateTime.Now,
  1600. EditTime = DateTime.Now
  1601. }, p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  1602. //更新货位
  1603. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell()
  1604. {
  1605. StateNum = LocationState.LocationState_Full.GetHashCode(),
  1606. ContGrpBarCode = stock.ContGrpBarCode,
  1607. ContGrpId = stock.ContGrpId,
  1608. EditTime = DateTime.Now
  1609. }, p => p.Code.Contains(task.AddrTo));
  1610. //增加流水信息
  1611. var enterDepotstocklist = _billInvnowrepository.GetList(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  1612. foreach (var item in enterDepotstocklist)
  1613. {
  1614. item.Id = IdFactory.NewId();
  1615. item.AddTime = DateTime.Now;
  1616. }
  1617. _billInvflow.InsertRange(_mapper.Map<List<BillInvflow>>(enterDepotstocklist));
  1618. //TODO:暂未处理甲方管理系统相关内容
  1619. //var list = new List<BillPushinfo>();
  1620. //string pushtype = FackbeekType.InterfaceType_HJ_1F_StockIn.ToString();
  1621. //if (stock.IsBack)
  1622. //{
  1623. // pushtype = FackbeekType.InterfaceType_HJ_2F_BackStockIn.ToString();
  1624. //}
  1625. //else if (stock.IsSurplus)
  1626. //{
  1627. // pushtype = FackbeekType.InterfaceType_HJ_2F_LeftStockIn.ToString();
  1628. //}
  1629. ////else if()
  1630. ////回调数据
  1631. //foreach (var item in stocklist)
  1632. //{
  1633. // list.Add(new BillPushinfo
  1634. // {
  1635. // DocsNo = stock.ExecDocsNo,
  1636. // TypeCode = pushtype,
  1637. // RFIDBarCode = stock.ContGrpBarCode,
  1638. // HWBarCode = stock.ContGrpBarCode,
  1639. // CLBarCode = item.CLBarCode,
  1640. // WarehouseId = warehouse.Id,
  1641. // WarehouseCode = warehouse.Code,
  1642. // WareCellId = 0,
  1643. // WareCellCode = task.AddrTo,
  1644. // MatId = item.MatId,
  1645. // MatCode = item.MatCode,
  1646. // MatName = item.MatName,
  1647. // TolWQty = item.TolWQty,
  1648. // NetWQty = item.NetWQty,
  1649. // TareWQty = item.TareWQty,
  1650. // ReqNo = Guid.NewGuid().ToString()
  1651. // });
  1652. //}
  1653. //if (stock.ContGrpType == ContGrpType.Material.GetHashCode())
  1654. //{
  1655. // _billPushinforepository.InsertRange(list);
  1656. //}
  1657. _db.CommitTran();
  1658. }
  1659. catch (Exception ex)
  1660. {
  1661. _db.RollbackTran();
  1662. result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();
  1663. result.ResMsg = task.ID + "完成任务异常";
  1664. _logger.LogInformation("完成任务异常" + ex.ToString());
  1665. }
  1666. break;
  1667. case TaskType.OutDepot:
  1668. //验证库存信息
  1669. var stocklist = _billInvnowrepository.GetList(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  1670. if (stocklist == null || !stocklist.Any())
  1671. {
  1672. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  1673. result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  1674. return result;
  1675. }
  1676. var flowlist = _mapper.Map<List<BillInvflow>>(stocklist);
  1677. foreach (var item in flowlist)
  1678. {
  1679. item.Id = IdFactory.NewId();
  1680. item.InvStateCode = InvState.InvEcecState_Out.ToString();
  1681. item.AddTime = DateTime.Now;
  1682. item.Memo = "任务完成";
  1683. }
  1684. try
  1685. {
  1686. _db.BeginTran();
  1687. //删除库存及条码信息
  1688. _billInvnowrepository.Delete(p => stocklist.Select(p => p.Id).ToList().Contains(p.Id));
  1689. _billInvinitrepository.Delete(p => p.ContGrpBarCode == task.BarCode);
  1690. //更新货位信息
  1691. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell()
  1692. {
  1693. StateNum = LocationState.LocationState_Empty.GetHashCode(),
  1694. ContGrpBarCode = "",
  1695. ContGrpId = 0,
  1696. EditTime = DateTime.Now
  1697. }, p => p.StateNum == LocationState.LocationState_StockOut.GetHashCode() && p.ContGrpId == flowlist.First().ContGrpId && p.Code.Contains(task.AddrFrom));
  1698. //更新流水信息
  1699. _billInvflow.InsertRange(flowlist);
  1700. _db.CommitTran();
  1701. }
  1702. catch (Exception ex)
  1703. {
  1704. _db.RollbackTran();
  1705. _logger.LogInformation(ex.ToString());
  1706. result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();
  1707. result.ResMsg = task.ID + "完成任务异常";
  1708. }
  1709. break;
  1710. case TaskType.TransferDepot:
  1711. var fromcell = _basewarecellrepository.GetFirst(p => p.Code == task.AddrFrom);
  1712. var grcontid = fromcell.ContGrpId;
  1713. var grcontcode = fromcell.ContGrpBarCode;
  1714. var fromcellno = fromcell.Code;
  1715. var tocellno = task.AddrTo;
  1716. try
  1717. {
  1718. _db.BeginTran();
  1719. //更新货位信息
  1720. //起始货位
  1721. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell()
  1722. {
  1723. StateNum = LocationState.LocationState_Empty.GetHashCode(),
  1724. ContGrpBarCode = "",
  1725. ContGrpId = 0,
  1726. EditTime = DateTime.Now
  1727. }, p => p.Code.Contains(fromcellno));
  1728. //目标货位
  1729. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell()
  1730. {
  1731. StateNum = LocationState.LocationState_Full.GetHashCode(),
  1732. ContGrpBarCode = grcontcode,
  1733. ContGrpId = grcontid,
  1734. EditTime = DateTime.Now
  1735. }, p => p.Code.Contains(tocellno));
  1736. //更新库存信息
  1737. int row = int.Parse(tocellno.Split('-')[0]);
  1738. int col = int.Parse(tocellno.Split('-')[1]);
  1739. int layer = int.Parse(tocellno.Split('-')[2]);
  1740. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow()
  1741. {
  1742. PutRow = row,
  1743. PutCol = col,
  1744. PutLayer = layer
  1745. }, p => p.ContGrpId == grcontid && p.InvStateCode == InvState.InvEcecState_In.ToString());
  1746. //更新流水信息
  1747. var stock = _billInvnowrepository.GetFirst(p => p.ContGrpId == grcontid && p.ContGrpBarCode == grcontcode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  1748. var flow = _mapper.Map<BillInvflow>(stock);
  1749. flow.Id = IdFactory.NewId();
  1750. flow.AddTime = DateTime.Now;
  1751. flow.Memo = grcontcode + "移库(" + fromcellno + "至" + tocellno + ")";
  1752. _billInvflow.Insert(flow);
  1753. _db.CommitTran();
  1754. }
  1755. catch (Exception ex)
  1756. {
  1757. _db.RollbackTran();
  1758. result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();
  1759. result.ResMsg = task.ID + "完成任务异常";
  1760. _logger.LogInformation("完成任务异常" + ex.ToString());
  1761. }
  1762. break;
  1763. case TaskType.Delivery:
  1764. break;
  1765. case TaskType.EmptyInit:
  1766. break;
  1767. default:
  1768. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1769. result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.Fail.GetDescription();
  1770. return result;
  1771. }
  1772. return result;
  1773. }
  1774. #endregion 完成/取消任务
  1775. }
  1776. /// <summary>
  1777. /// 主线分流
  1778. /// </summary>
  1779. public class MainlineDiversion
  1780. {
  1781. /// <summary>
  1782. /// 任务号
  1783. /// </summary>
  1784. public int TaskId { get; set; }
  1785. /// <summary>
  1786. /// 仓库号
  1787. /// </summary>
  1788. public string WarehouseCode { get; set; }
  1789. }
  1790. }