FirstGrossesSecondlyTaresUnLock.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. using Common;
  2. using Common.vo.pb;
  3. using MeterConditionLibrary;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using com.hnshituo.core.webapp.vo;
  10. namespace MeterSceneLibrary
  11. {
  12. /// <summary>
  13. /// 先毛后皮 一车多运非互锁式
  14. /// 比如运了2种货物,则需要先 上秤-->下秤-->上秤
  15. /// 每次计量的时候会将当前的皮重作为下一条的毛重
  16. /// </summary
  17. public class FirstGrossesSecondlyTaresUnLock
  18. {
  19. private MeterBaseTermTareDataService termTareDate = new MeterBaseTermTareDataService();//期限皮操作
  20. public rtInfo MeterMethod(PreTrackScale scale, CoreAppUser appUser, RESTfulResult<List<MeterWorkPreLink>> rmDb)
  21. {
  22. rtInfo rt = new rtInfo();
  23. rt.isError = false;
  24. //0:批次预报;1:单次预报;2:联运预报;3:分检预报
  25. if (scale.predictionType != "2")
  26. {
  27. rt.result = false;
  28. rt.isError = false;
  29. return rt;
  30. }
  31. RESTfulResult<List<MeterWorkPreLink>> rm = rmDb;
  32. /******************************
  33. * 1、如果是第一次计量:走一次计量流程(若根据预报的PREDICTION_COMBINATION值使用in找不到一次计量数据,那么就是第一次计量)
  34. * 2、如果不是一次计量:根据预报的PREDICTION_COMBINATION值找到唯一一条未结净的数据,然后当前计量数据与找到的进行结净,而结净的预报信息使用找到的预报信息
  35. ******************************/
  36. //如果配置了则走下面的流程
  37. //如果存在一次计量未结净数据,则认为是结净计量,否则认为一次计量
  38. MeterWorkCarActualFirstService mwcfs = new MeterWorkCarActualFirstService();
  39. RESTfulResult<List<MeterWorkCarActualFirst>> rmX = mwcfs.doQueryWf(new MeterWorkCarActualFirst { valueFlag = "1", predictionCombination = scale.predictionCombination, carNo = scale.carNo });
  40. if (!rmX.Succeed)
  41. {
  42. rt.result = false;
  43. rt.resultInfo = "没有计量信息点语音求助";
  44. PbCache.ResultMessage = "获取一次计量数据异常!";
  45. rt.isError = true;
  46. }
  47. //因为前面已经验证过预报信息,所以这里只要有一次数据则认为已经过第一车了,后面都是结净+生成一条待结净数据
  48. if (rmX.Data != null && rmX.Data.Count > 0)
  49. {
  50. rm.Data[0].linkCode = "001021005";
  51. }
  52. if (rm.Data[0].linkCode == "001021003") //一次计量
  53. {
  54. #region
  55. /*
  56. if (rmX.Data != null && rmX.Data.Count > 0)
  57. {
  58. PbCache.ResultMessage = "计量环节为一次计量,存在未结净数据数据!";
  59. rt.resultInfo = "已经存在一次计量信息";
  60. rt.result = false;
  61. rt.isError = true;
  62. }
  63. else //验证当前毛重是否符合要求
  64. //*/
  65. #endregion
  66. {
  67. //验证物料时间段
  68. validMatTime vmt = new validMatTime();
  69. vmt.ValidMethod(scale, "1");
  70. if (!PbCache.monitorResult.valid_mat_time)
  71. {
  72. rt.result = false;
  73. rt.isError = true;
  74. rt.resultInfo = PbCache.ResultMessage;
  75. return rt;
  76. }
  77. //验证危化品验证
  78. validExceedWgt vew = new validExceedWgt();
  79. vew.validMatMethod(scale, "1", null);
  80. if (!PbCache.monitorResult.valid_exceed_wgt)
  81. {
  82. rt.result = false;
  83. rt.isError = true;
  84. return rt;
  85. }
  86. //验证预报超差信息
  87. validPredictionDiff vpd = new validPredictionDiff();
  88. vpd.ValidMethod(scale, "1", null); //验证毛重
  89. if (!PbCache.monitorResult.valid_prediction_diff)
  90. {
  91. rt.result = false;
  92. rt.isError = true;
  93. rt.resultInfo = PbCache.ResultMessage;
  94. return rt;
  95. }
  96. //验证联达码头;江西联达联达料场,预报超差
  97. validLianDaWgtDiff lianDaWgtDiff = new validLianDaWgtDiff();
  98. lianDaWgtDiff.ValidMethod(scale, "1", null); //验证毛重
  99. if (!PbCache.monitorResult.valid_prediction_diff)
  100. {
  101. rt.result = false;
  102. rt.isError = true;
  103. rt.resultInfo = PbCache.ResultMessage;
  104. return rt;
  105. }
  106. //验证两次计量时间间隔
  107. validTimeInterval vti = new validTimeInterval();
  108. vti.ValidMethod(scale, "1", null);
  109. if (!PbCache.monitorResult.valid_time_interval)
  110. {
  111. rt.result = false;
  112. rt.isError = true;
  113. rt.resultInfo = PbCache.ResultMessage;
  114. return rt;
  115. }
  116. //验证通过,保存毛重信息***********************
  117. MeterWorkCarActualFirst mwaf = new MeterWorkCarActualFirst();
  118. //相同名称的均赋值一次
  119. EntityBase<PreTrackScale> entityBase = new EntityBase<PreTrackScale>();
  120. mwaf = entityBase.format<MeterWorkCarActualFirst>(scale, mwaf);
  121. mwaf.actualFirstNo = DateTime.Now.ToString("yyyyMMdd");//10
  122. mwaf.meterWeight = PbCache.lockWgt;//计量重量
  123. mwaf.addWeight = PbCache.addWgt;//附加重量
  124. mwaf.weightType = "0"; //0=毛重;1=常规皮重;2=期限皮重;3=历史皮重;4=标识皮重;5=自重皮重
  125. mwaf.createManNo = appUser.userid;
  126. mwaf.createManName = appUser.username;
  127. mwaf.meterGroup = appUser.userGroup;
  128. mwaf.meterClass = appUser.userClass;
  129. mwaf.createTime = DateTime.Now;
  130. mwaf.baseSpotNo = PbCache.sportInfo.baseSpotNo;//计量点编号
  131. mwaf.baseSpotName = PbCache.sportInfo.baseSpotName;
  132. //mwaf.memo = "";
  133. mwaf.valueFlag = "1"; //0有效
  134. mwaf.updateManName = "";
  135. mwaf.updateManNo = "";
  136. mwaf.updateTime = null;
  137. mwaf.checkFlag = "0"; //0未审核
  138. mwaf.meterMode = string.IsNullOrEmpty(appUser.userid) ? "2" : "1"; //1远程计量,2智能计量
  139. mwaf.addWeight = PbCache.addWgt;
  140. MeterWorkPreLink mwpl = new MeterWorkPreLink();
  141. mwpl.preLinkNo = rm.Data[0].preLinkNo;
  142. mwpl.preProcessNo = rm.Data[0].preProcessNo;
  143. //操作日志
  144. MeterMonitorNote monitorNote = new MeterMonitorNote();
  145. monitorNote.baseSpotNo = mwaf.baseSpotNo;
  146. monitorNote.baseSpotName = mwaf.baseSpotName;
  147. monitorNote.operationContent = string.Format("称重保存");
  148. monitorNote.operationTime = mwaf.createTime.Value.ToString("yyyy-MM-dd HH:mm:ss");
  149. monitorNote.carNo = mwaf.carNo;
  150. monitorNote.meterNoteSource = string.IsNullOrEmpty(appUser.userid) ? "0" : "4";
  151. monitorNote.meterManNo = appUser.userid;
  152. monitorNote.meterManName = appUser.username;
  153. RESTfulResult<string> rmI = mwcfs.doAddWf(mwaf, mwpl, monitorNote, "", "0");
  154. if (rmI.Succeed)
  155. {
  156. rt.result = true;
  157. rt.resultInfo = "称重完成";
  158. PbCache.ResultMessage = "称重完成";
  159. PbCache.actualFirstNo = rmI.Data;
  160. PbCache.strQRCode = rmI.Message;
  161. PbCache.isTareWeight = false;//毛重
  162. RESTfulResult<string> RESTfulResult = termTareDate.abolishForCSharp(new MeterBaseTermTareData { carNo = mwaf.carNo });
  163. if (RESTfulResult.Succeed)
  164. {
  165. if (!string.IsNullOrEmpty(RESTfulResult.Message))
  166. {
  167. PbCache.ResultMessage = PbCache.ResultMessage + ";请注意期限皮重已作废";
  168. }
  169. }
  170. else
  171. {
  172. PbCache.ResultMessage = PbCache.ResultMessage + ";作废期限皮重异常,请点击【语音求助】联系计量员";
  173. }
  174. }
  175. else
  176. {
  177. rt.result = false;
  178. rt.isError = true;
  179. rt.resultInfo = "称重数据保存失败";
  180. PbCache.ResultMessage = "计量失败:" + rmI.ResultMessage;
  181. }
  182. }
  183. }
  184. else if (rm.Data[0].linkCode == "001021005") //结净
  185. {
  186. if (string.IsNullOrEmpty(scale.forwardingUnitName) || string.IsNullOrEmpty(scale.receivingUintName))
  187. {
  188. PbCache.ResultMessage = "结净时,预报中的发货单位以及收货单位均不允许为空,请点击[语音求助]!";
  189. rt.result = false;
  190. rt.isError = false;
  191. return rt;
  192. }
  193. if (rmX.Data == null || rmX.Data.Count == 0)
  194. {
  195. rt.resultInfo = "未找到一次计量数据!";
  196. rt.result = false;
  197. rt.isError = false;
  198. }
  199. else if (rmX.Data.Count == 1)
  200. {
  201. if (!PbCache.isNotValid)
  202. {
  203. if (Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) < AppConfigCache.differenceWgt)
  204. {
  205. //重复计量
  206. rt.result = false;
  207. rt.isError = true;
  208. rt.resultInfo = "第一次计量重量和第二次计量重量接近";
  209. //PbCache.ResultMessage = "第一次计量重量和第二次计量重量接近";
  210. PbCache.ResultMessage = "第一次计量重量【" + rmX.Data[0].meterWeight.Value / 1000 + "T】和第二次计量重量【" + PbCache.lockWgt / 1000 + "T】接近,小于结净最小值【" + AppConfigCache.differenceWgt / 1000 + " T】,请点击[语音求助],由司秤工过磅!";
  211. return rt;
  212. }
  213. }
  214. //一次重量小于当前重量,所以一次的时候应该是皮重
  215. if (rmX.Data[0].meterWeight.Value - PbCache.lockWgt < 0)
  216. {
  217. //将一次数据类型修改为皮重
  218. mwcfs.doUpdateWf(new MeterWorkCarActualFirst { actualFirstNo = rmX.Data[0].actualFirstNo, weightType = "1" });
  219. rt.result = false;
  220. rt.isError = false;
  221. PbCache.ResultMessage = "请再次点击[保存]按钮";
  222. return rt;
  223. }
  224. PreTrackScale pts = new PreTrackScale();
  225. if (rmX.Data[0].predictionNo == scale.predictionNo) //当前已经是一车联运的最后一车过磅了,所以上次的毛跟当前的皮用的同一个预报
  226. {
  227. pts = scale;
  228. }
  229. else
  230. { //当前不是一车联运的最后一个预报过磅
  231. PreTrackScaleService pService = new PreTrackScaleService();
  232. RESTfulResult<List<PreTrackScale>> rmp = pService.doQueryWf(new PreTrackScale { predictionNo = rmX.Data[0].predictionNo });
  233. if (rmp.Succeed)
  234. {
  235. if (rmp.Data != null && rmp.Data.Count > 0)
  236. {
  237. pts = scale;
  238. }
  239. else
  240. {
  241. rt.result = false;
  242. rt.isError = true;
  243. rt.resultInfo = "计量预报已经过期";
  244. PbCache.ResultMessage = string.Format("一车联运预报编号为[{0}]的信息未找到", rmX.Data[0].predictionNo);
  245. return rt;
  246. }
  247. }
  248. else
  249. {
  250. rt.result = false;
  251. rt.isError = true;
  252. rt.resultInfo = "称重数据保存失败";
  253. PbCache.ResultMessage = "计量失败:获取预报信息异常";
  254. }
  255. #region 当前的皮是后面的毛,先验证这个毛重是否可过
  256. //验证物料时间段
  257. validMatTime vmt = new validMatTime();
  258. vmt.ValidMethod(scale, "1");
  259. if (!PbCache.monitorResult.valid_mat_time)
  260. {
  261. rt.result = false;
  262. rt.isError = true;
  263. rt.resultInfo = PbCache.ResultMessage;
  264. return rt;
  265. }
  266. //验证危化品验证
  267. validExceedWgt vew = new validExceedWgt();
  268. vew.validMatMethod(scale, "1", null);
  269. if (!PbCache.monitorResult.valid_exceed_wgt)
  270. {
  271. rt.result = false;
  272. rt.isError = true;
  273. return rt;
  274. }
  275. //验证预报超差信息
  276. validPredictionDiff vpd1 = new validPredictionDiff();
  277. vpd1.ValidMethod(scale, "1", null); //验证毛重
  278. if (!PbCache.monitorResult.valid_prediction_diff)
  279. {
  280. rt.result = false;
  281. rt.isError = false;
  282. return rt;
  283. }
  284. //验证联达码头;江西联达联达料场,预报超差
  285. validLianDaWgtDiff lianDaWgtDiff = new validLianDaWgtDiff();
  286. lianDaWgtDiff.ValidMethod(scale, "1", null); //验证毛重
  287. if (!PbCache.monitorResult.valid_prediction_diff)
  288. {
  289. rt.result = false;
  290. rt.isError = true;
  291. rt.resultInfo = PbCache.ResultMessage;
  292. return rt;
  293. }
  294. #endregion
  295. }
  296. #region 一次毛与当前皮结合,此时要验证各种信息是否符合要求
  297. MeterWorkCarActualFirst first = rmX.Data[0];
  298. //卸货时间验证
  299. ValidUnloadTime unloadTime = new ValidUnloadTime();
  300. unloadTime.ValidMethod(first);
  301. if (!PbCache.monitorResult.valid_unload_time)
  302. {
  303. rt.result = false;
  304. rt.isError = true;
  305. rt.resultInfo = PbCache.ResultMessage;
  306. return rt;
  307. }
  308. //验证两次计量时间间隔
  309. validTimeInterval vti = new validTimeInterval();
  310. vti.ValidMethod(pts, "3", first);
  311. if (!PbCache.monitorResult.valid_time_interval)
  312. {
  313. rt.result = false;
  314. rt.isError = true;
  315. rt.resultInfo = PbCache.ResultMessage;
  316. return rt;
  317. }
  318. //验证预报超差信息
  319. validPredictionDiff vpd = new validPredictionDiff();
  320. vpd.ValidMethod(pts, "3", first); //验证净重
  321. if (!PbCache.monitorResult.valid_prediction_diff)
  322. {
  323. rt.result = false;
  324. rt.isError = false;
  325. return rt;
  326. }
  327. //验证计量区域:若二次计量数据的计量区域与一次计量的计量区域不一致,则禁止自助计量;
  328. validMeterArea vMeterArea = new validMeterArea();
  329. vMeterArea.ValidMethod(first.baseSpotNo);
  330. if (!PbCache.monitorResult.valid_meter_area)
  331. {
  332. rt.result = false;
  333. rt.isError = true;
  334. rt.resultInfo = PbCache.ResultMessage;
  335. return rt;
  336. }
  337. //一车联运不存在历史皮重验证
  338. #endregion
  339. //验证均通过后,则存储数据到数据表中
  340. //====所有验证均通过后,此时进行结净=====================
  341. //保存皮重信息 即:二次计量信息***********************
  342. MeterWorkCarActualFirst secondDb = new MeterWorkCarActualFirst();
  343. //相同名称的均赋值一次
  344. EntityBase<PreTrackScale> entityBase = new EntityBase<PreTrackScale>();
  345. secondDb = entityBase.format<MeterWorkCarActualFirst>(scale, secondDb);
  346. secondDb.actualFirstNo = DateTime.Now.ToString("yyyyMMdd");//10
  347. secondDb.meterWeight = PbCache.lockWgt;//计量重量
  348. secondDb.addWeight = PbCache.addWgt; //附加重量
  349. secondDb.weightType = "1"; //0=毛重;1=常规皮重;2=期限皮重;3=历史皮重;4=标识皮重;5=自重皮重
  350. secondDb.createManNo = appUser.userid;
  351. secondDb.createManName = appUser.username;
  352. secondDb.meterGroup = appUser.userGroup;
  353. secondDb.meterClass = appUser.userClass;
  354. secondDb.createTime = DateTime.Now;
  355. secondDb.baseSpotNo = PbCache.sportInfo.baseSpotNo;//计量点编号
  356. secondDb.baseSpotName = PbCache.sportInfo.baseSpotName;
  357. //secondDb.memo = "";
  358. secondDb.valueFlag = "1"; //0有效
  359. secondDb.updateManName = "";
  360. secondDb.updateManNo = "";
  361. secondDb.updateTime = null;
  362. secondDb.checkFlag = "0"; //0未审核
  363. secondDb.meterMode = string.IsNullOrEmpty(appUser.userid) ? "2" : "1"; //1远程计量,2智能计量
  364. //环节信息
  365. MeterWorkPreLink link = new MeterWorkPreLink();
  366. link.preLinkNo = rm.Data[0].preLinkNo;
  367. link.preProcessNo = rm.Data[0].preProcessNo;
  368. //结净数据
  369. MeterWorkCarActual netDb = new MeterWorkCarActual();
  370. EntityBase<MeterWorkCarActualFirst> entityActual = new EntityBase<MeterWorkCarActualFirst>();
  371. //netDb = entityActual.format<MeterWorkCarActual>(first, netDb);
  372. netDb = entityActual.format<MeterWorkCarActual>(first, netDb);
  373. netDb.predictionNo = first.predictionNo;
  374. netDb.actualFirst1No = first.actualFirstNo; //毛重计量作业编号
  375. netDb.grossTime = first.createTime;
  376. netDb.grossWeight = first.meterWeight;
  377. netDb.baseSpot1No = first.baseSpotNo;
  378. netDb.baseSpot1Name = first.baseSpotName;
  379. netDb.grossMode = first.meterMode;//1:远程计量;2:智能计量;3:手工录入;4:放行智能计量;5:滞后匹配
  380. netDb.grossManNo = first.createManNo;
  381. netDb.grossManName = first.createManName;
  382. netDb.grossClass = first.meterClass;
  383. netDb.grossGroup = first.meterGroup;
  384. //netDb.actualFirst2No = ""; //皮重计量作业编号
  385. netDb.tareWeight = PbCache.lockWgt; //皮重
  386. netDb.tareTime = DateTime.Now;
  387. netDb.baseSpot2No = PbCache.sportInfo.baseSpotNo; //皮重计量点编号
  388. netDb.baseSpot2Name = PbCache.sportInfo.baseSpotName; //皮重计量点
  389. netDb.tareMode = string.IsNullOrEmpty(appUser.userid) ? "2" : "1"; //1远程计量,2智能计量
  390. netDb.netTime = DateTime.Now;
  391. netDb.tareGroup = appUser.userGroup;
  392. netDb.tareClass = appUser.userClass;
  393. netDb.tareManNo = appUser.userid;
  394. netDb.tareManName = appUser.username;
  395. netDb.netManNo = appUser.userid; //净重计量员编码
  396. netDb.netManName = appUser.username; //净重计量员名称
  397. netDb.netSpot3No = PbCache.sportInfo.baseSpotNo; //净重计量点编号
  398. netDb.netSpot3Name = PbCache.sportInfo.baseSpotName; //净重计量点
  399. netDb.addWeight = (first.addWeight == null ? 0 : first.addWeight.Value);
  400. //净重=毛-皮-附加重量
  401. netDb.netWeight = netDb.grossWeight - netDb.tareWeight - netDb.addWeight;
  402. netDb.netMode = "1"; //1:正常结净;2:匹配结净
  403. netDb.valueFlag = "0"; //0=有效,1=作废
  404. netDb.uploadFlag = "0"; //0=待审核;1:待上传;2=已上传
  405. //操作日志
  406. MeterMonitorNote monitorNote = new MeterMonitorNote();
  407. monitorNote.baseSpotNo = secondDb.baseSpotNo;
  408. monitorNote.baseSpotName = secondDb.baseSpotName;
  409. monitorNote.operationContent = string.Format("结净称重保存");
  410. monitorNote.operationTime = secondDb.createTime.Value.ToString("yyyy-MM-dd HH:mm:ss");
  411. monitorNote.carNo = secondDb.carNo;
  412. monitorNote.meterNoteSource = string.IsNullOrEmpty(appUser.userid) ? "0" : "4";
  413. monitorNote.meterManNo = appUser.userid;
  414. monitorNote.meterManName = appUser.username;
  415. RESTfulResult<string> rmI = mwcfs.doAddNetWf(secondDb, netDb, link, monitorNote, "", "0");
  416. if (rmI.Succeed)
  417. {
  418. rt.result = true;
  419. rt.resultInfo = "称重完成";
  420. PbCache.ResultMessage = "称重完成";
  421. PbCache.actualFirstNo = rmI.Data;
  422. PbCache.strQRCode = rmI.Message;
  423. PbCache.isTareWeight = true;//皮重
  424. RESTfulResult<string> RESTfulResult = termTareDate.abolishForCSharp(new MeterBaseTermTareData { carNo = netDb.carNo });
  425. if (RESTfulResult.Succeed)
  426. {
  427. if (!string.IsNullOrEmpty(RESTfulResult.Message))
  428. {
  429. PbCache.ResultMessage = PbCache.ResultMessage + ";请注意期限皮重已作废";
  430. }
  431. }
  432. else
  433. {
  434. PbCache.ResultMessage = PbCache.ResultMessage + ";作废期限皮重异常,请点击【语音求助】联系计量员";
  435. }
  436. }
  437. else
  438. {
  439. rt.result = false;
  440. rt.isError = true;
  441. rt.resultInfo = "称重数据保存失败";
  442. PbCache.ResultMessage = "计量失败:" + rmI.ResultMessage;
  443. }
  444. }
  445. else
  446. {
  447. PbCache.ResultMessage = string.Format("当前预报[{0}]存在多条未结净数据", scale.predictionNo);
  448. rt.resultInfo = "找到多条未结净数据";
  449. rt.result = false;
  450. rt.isError = true;
  451. }
  452. }
  453. return rt;
  454. }
  455. }
  456. }