LianDaMeter.cs 22 KB

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