FirstTaresSecondlyGrossesLock.cs 19 KB

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