FirstGrossesSecondlyTaresLock.cs 22 KB

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