OuterCarJISCO.cs 72 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060
  1. using com.hnshituo.core.webapp.vo;
  2. using Common;
  3. using System;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace MeterSceneLibrary
  9. {
  10. /// <summary>
  11. /// 酒钢厂外车辆计量业务
  12. /// </summary>
  13. public class OuterCarJISCO
  14. {
  15. // 一次计量数据
  16. private MeterWorkCarActualFirstService mwcfs = new MeterWorkCarActualFirstService();
  17. // 车辆委托表
  18. private PreTrackScaleService preTrackScaleService = new PreTrackScaleService();
  19. private rtInfo rt = new rtInfo();
  20. // 构建一次计量数据
  21. private MeterWorkCarActualFirst mwaf = new MeterWorkCarActualFirst();
  22. // 结净最小值,默认取配置文件
  23. private double diffrentWgt = AppConfigCache.differenceWgt;
  24. // 根据车号查询委托表中未使用和使用中的委托
  25. private List<PreTrackScale> listPreScale;
  26. // 根据称点查询监控信息
  27. private RESTfulResult<List<MeterWorkMonitor>> listMonitor;
  28. // 查询上一次结净数据
  29. private MeterWorkCarActualService meterWorkCarActualService = new MeterWorkCarActualService();
  30. private JISCO.SaveMethod saveMethod = new JISCO.SaveMethod();
  31. public rtInfo MeterMethod(PreTrackScale scale)
  32. {
  33. Log lg = Log.GetInstance();
  34. rt.isError = false;
  35. string ResultMessage = "";
  36. bool isError = false;
  37. Hashtable map = new Hashtable();
  38. map.Add("carNo", PbCache.lockCarNo);
  39. map.Add("baseSpotNo", PbCache.sportInfo.baseSpotNo);
  40. RESTfulResult<outCar> rmMap = meterWorkCarActualService.combinationByParams(map);
  41. #region 数据查询
  42. //根据称点查询监控信息
  43. listMonitor = rmMap.Data.spotInfoList == null ? new RESTfulResult<List<MeterWorkMonitor>>() { Succeed = true } : rmMap.Data.spotInfoList;
  44. // VALUE_FLAG 状态(0=作废,1=有效(已匹配),2=结净,3=未匹配)
  45. // 根据车号查询最近的一次计量数据
  46. RESTfulResult<List<MeterWorkCarActualFirst>> rmX = rmMap.Data.firstInfoList == null ? new RESTfulResult<List<MeterWorkCarActualFirst>>() { Succeed = true } : rmMap.Data.firstInfoList;
  47. // 根据车号查询委托表中未使用和使用中的委托
  48. // 状态(0:未配车;1:未使用;2:已使用;3:已作废;4:正使用)
  49. RESTfulResult<List<PreTrackScale>> rmPre = rmMap.Data.scaleInfoList == null ? new RESTfulResult<List<PreTrackScale>>() { Succeed = true } : rmMap.Data.scaleInfoList;
  50. //计量实绩
  51. MeterWorkCarActual mwca = new MeterWorkCarActual();
  52. mwca.carNo = PbCache.lockCarNo;
  53. RESTfulResult<List<MeterWorkCarActual>> rm = rmMap.Data.actualInfoList == null ? new RESTfulResult<List<MeterWorkCarActual>>() { Succeed = true } : rmMap.Data.actualInfoList;
  54. #endregion
  55. // 签发时间比较
  56. // 通过上次结净记录,找到该委托的签发时间
  57. MeterWorkCarActual lastMeterWorkCarActual = new MeterWorkCarActual();
  58. RESTfulResult<List<PreTrackScale>> lastPre = new RESTfulResult<List<PreTrackScale>>();
  59. if (rm.Data == null || rm.Data.Count == 0)
  60. {
  61. lastMeterWorkCarActual = null;
  62. lastPre = null;
  63. }
  64. else
  65. {
  66. lastMeterWorkCarActual = rm.Data[0];
  67. if (string.IsNullOrEmpty(lastMeterWorkCarActual.predictionNo))
  68. {
  69. lastPre = null;
  70. }
  71. else
  72. {
  73. lastPre = preTrackScaleService.doQueryWf(new PreTrackScale { predictionNo = lastMeterWorkCarActual.predictionNo });
  74. }
  75. }
  76. mwaf.carNo = PbCache.lockCarNo;
  77. mwaf.weightType = ""; // 默认重量类型为空
  78. mwaf.actualFirstNo = DateTime.Now.ToString("yyyyMMdd");//10
  79. mwaf.meterWeight = PbCache.lockWgt;//计量重量
  80. mwaf.addWeight = PbCache.addWgt;//附加重量
  81. mwaf.createManNo = "admin";
  82. mwaf.createManName = "admin";
  83. mwaf.meterGroup = "";
  84. mwaf.meterClass = "";
  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 = 作废,1 = 有效(已匹配),2 = 结净,3 = 未匹配)
  90. mwaf.updateManName = "";
  91. mwaf.updateManNo = "";
  92. mwaf.updateTime = null;
  93. mwaf.checkFlag = "1"; //0未审核,1已审核
  94. mwaf.meterMode = "2"; //1:远程计量;2:智能计量;3:手工录入;4:放行智能计量;5:滞后匹配
  95. mwaf.addWeight = PbCache.addWgt;
  96. mwaf.dataSource = "1"; //数据来源(1=智能终端,2=本地计量,3=应急计量,4=手动录入(计量票据录入))
  97. mwaf.isPreScale = "0";
  98. PbCache.isActual = false;
  99. PbCache.isInnerCar = false;
  100. PbCache.ResultMessage = "";
  101. PbCache.monitorResultMessage = "";
  102. PbCache.LEDResultMessage = "";
  103. PbCache.yardActual = null;
  104. PbCache.yardFirst = null;
  105. if (rmX.Succeed)
  106. {
  107. List<MeterWorkCarActualFirst> list = rmX.Data;
  108. listPreScale = rmPre.Data;
  109. // 不存在一次计量数据
  110. if (list == null || list.Count == 0)
  111. {
  112. //// 根据车号查询委托表中未使用和使用中的委托
  113. //// 状态(0:未配车;1:未使用;2:已使用;3:已作废;4:正使用)
  114. //RESTfulResult<List<PreTrackScale>> rmPre = preTrackScaleService.doQueryByFlag(new PreTrackScale { carNo = PbCache.lockCarNo});
  115. if (rmPre.Succeed)
  116. {
  117. //listPreScale = rmPre.Data;
  118. // 不存在委托
  119. if (listPreScale == null || listPreScale.Count == 0)
  120. {
  121. PbCache.isActual = true;
  122. PbCache.isInnerCar = true;
  123. rt = saveMethod.doAddFirst(null, mwaf);
  124. PbCache.voiceType = 1;
  125. PbCache.LEDResultMessage = string.Format("车号{0},1次重量{1}吨,计量完成", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2));
  126. }
  127. // 存在一条使用中的委托
  128. else if (listPreScale.Count == 1 && listPreScale[0].valueFlag == "4")
  129. {
  130. PbCache.isActual = true;
  131. PbCache.isInnerCar = true;
  132. rt = saveMethod.doAddFirst(null, mwaf);
  133. rt.resultInfo += ",不存在一次计量数据,存在一条使用中的委托";
  134. PbCache.voiceType = 18;
  135. PbCache.LEDResultMessage = "不存在一次计量数据却存在一条使用中的委托";
  136. PbCache.monitorResultMessage = string.Format("车号:{0},不存在一次计量数据却存在一条使用中的委托",PbCache.lockCarNo);
  137. return rt;
  138. }
  139. // 只存在一条未使用的委托
  140. else if (listPreScale.Count == 1 && (listPreScale[0].valueFlag == "0" || listPreScale[0].valueFlag == "1"))
  141. {
  142. //相同名称的均赋值一次
  143. //EntityBase<PreTrackScale> entityBase = new EntityBase<PreTrackScale>();
  144. //mwaf = entityBase.format<MeterWorkCarActualFirst>(scale, mwaf);
  145. if (rm.Succeed)
  146. {
  147. // 之前没有净重记录
  148. if (rm.Data == null || rm.Data.Count == 0)
  149. {
  150. /*
  151. * a. 正常保存重量(重量类型为空)
  152. * b. 匹配委托
  153. * c. 将委托状态变更为已使用
  154. * d. 提示称重完成
  155. */
  156. // 把委托编号复制给一次计量记录
  157. PbCache.isActual = true;
  158. PbCache.isInnerCar = true;
  159. PbCache.voiceType = 1;
  160. rt = saveMethod.doAddFirst(listPreScale[0], mwaf);
  161. PbCache.LEDResultMessage = string.Format("车号{0},1次重量{1}吨,计量完成", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2));
  162. }
  163. else
  164. {
  165. // 上次净重记录未匹配委托
  166. if (lastMeterWorkCarActual.isPreScale == "0")
  167. {
  168. PbCache.isActual = true;
  169. PbCache.isInnerCar = true;
  170. PbCache.voiceType = 1;
  171. rt = saveMethod.doAddFirst(listPreScale[0], mwaf);
  172. PbCache.LEDResultMessage = string.Format("车号{0},1次重量{1}吨,计量完成", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2));
  173. }
  174. // 上次净重已匹配委托
  175. else if (lastMeterWorkCarActual.isPreScale == "1")
  176. {
  177. /* 委托和当次存在委托满足一车多卸逻辑 && 当次重量值小于上次净重记录中的皮重值
  178. * 一车多卸判断逻辑1
  179. * 存在判断依据(委托类型为一车多卸,且上次结净数据中匹配委托类型也是一车多卸)
  180. *
  181. * 一车多卸判断逻辑2
  182. * 委托不存在判断依据,则根据签发时间排序
  183. * 如果两条数据发货单位一致,收货单位不一致,且签发时间在10分钟内,则可判定为一车多卸业务
  184. */
  185. bool isYCDX = false;
  186. bool isHZ = false;
  187. //int min = 999;
  188. //if (lastPre.Succeed && lastPre.Data.Count == 1)
  189. //{
  190. // TimeSpan ts = new TimeSpan();
  191. // ts = DateTime.Parse(listPreScale[0].trustDateTime.ToString()) - DateTime.Parse(lastPre.Data[0].trustDateTime.ToString());
  192. // min = ts.Minutes; //此为相差分钟
  193. //}
  194. //// 一车多卸 && 当次重量值小于上次净重记录中的皮重值
  195. //if (listPreScale[0].meterTypeNo.Equals("xxxx"))
  196. //{
  197. // isYCDX = true;
  198. //}
  199. //// 如果两条数据发货单位一致,收货单位不一致,且签发时间在10分钟内,则可判定为一车多卸业务
  200. //else if (listPreScale[0].forwardingUnitNo.Equals(lastMeterWorkCarActual.forwardingUnitNo) && !listPreScale[0].receivingUintNo.Equals(lastMeterWorkCarActual.receivingUintNo) && min <= 10)
  201. //{
  202. // isYCDX = true;
  203. //}
  204. //if (lastPre.Data[0].predictionCombination == listPreScale[0].predictionCombination && lastPre.Data[0].predictionType == "6" && listPreScale[0].predictionType == "6")
  205. //{
  206. // isYCDX = true;
  207. //}
  208. if (!string.IsNullOrEmpty(lastPre.Data[0].receiverRemark) && !string.IsNullOrEmpty(listPreScale[0].receiverRemark) && listPreScale[0].tempConveyance == lastPre.Data[0].tempConveyance && !string.IsNullOrEmpty(listPreScale[0].tempConveyance) && !string.IsNullOrEmpty(lastPre.Data[0].tempConveyance))
  209. {
  210. isHZ = true;
  211. }
  212. if (isYCDX == true)
  213. {
  214. /*
  215. * a. 取上次净重记录的皮重为当次毛重
  216. * b. 结净匹配委托
  217. */
  218. // 新增一条毛重数据
  219. MeterWorkCarActualFirst tempCarActualFirst = new MeterWorkCarActualFirst();
  220. tempCarActualFirst.carNo = PbCache.lockCarNo;
  221. tempCarActualFirst.weightType = "0"; // 重量类型(0=毛重;1=常规皮重;2=期限皮重;3=历史皮重;4=标识皮重;5=自重皮重)
  222. tempCarActualFirst.actualFirstNo = DateTime.Now.ToString("yyyyMMdd");//10
  223. tempCarActualFirst.meterWeight = lastMeterWorkCarActual.tareWeight;//计量重量
  224. tempCarActualFirst.addWeight = PbCache.addWgt;//附加重量
  225. tempCarActualFirst.createManNo = PbCache.sportInfo.baseSpotNo;
  226. tempCarActualFirst.createManName = PbCache.sportInfo.baseSpotName;
  227. tempCarActualFirst.meterGroup = "";
  228. tempCarActualFirst.meterClass = "";
  229. tempCarActualFirst.createTime = DateTime.Now;
  230. tempCarActualFirst.baseSpotNo = PbCache.sportInfo.baseSpotNo;//计量点编号
  231. tempCarActualFirst.baseSpotName = PbCache.sportInfo.baseSpotName;
  232. //mwaf.memo = "";
  233. tempCarActualFirst.valueFlag = "1"; //状态(0 = 作废,1 = 有效(已匹配),2 = 结净,3 = 未匹配)
  234. tempCarActualFirst.updateManName = "";
  235. tempCarActualFirst.updateManNo = "";
  236. tempCarActualFirst.updateTime = null;
  237. tempCarActualFirst.checkFlag = "1"; //0未审核,1已审核
  238. tempCarActualFirst.meterMode = "2"; //1:远程计量;2:智能计量;3:手工录入;4:放行智能计量;5:滞后匹配
  239. tempCarActualFirst.addWeight = PbCache.addWgt;
  240. tempCarActualFirst.dataSource = "1"; //数据来源(1=智能终端,2=本地计量,3=应急计量,4=手动录入(计量票据录入))
  241. tempCarActualFirst.isPreScale = "1";
  242. tempCarActualFirst.valueFlag = "2";
  243. // 复制对象,将档次委托信息复制给一次记录
  244. EntityBase<PreTrackScale> entityBase = new EntityBase<PreTrackScale>();
  245. tempCarActualFirst = entityBase.format<MeterWorkCarActualFirst>(listPreScale[0], tempCarActualFirst);
  246. EntityBase<PreTrackScale> entityBase1 = new EntityBase<PreTrackScale>();
  247. mwaf = entityBase1.format<MeterWorkCarActualFirst>(listPreScale[0], mwaf);
  248. // 将当次一次计量数据重量类型改为皮重
  249. mwaf.weightType = "1"; // 常规皮重
  250. mwaf.isPreScale = "1";
  251. // 混装卸逻辑,并结净匹配委托
  252. rt = saveMethod.doNetHZHX(listPreScale[0], tempCarActualFirst, mwaf);
  253. }
  254. /* 匹配委托和当次委托满足混装逻辑 && 当次重量大于上次净重记录中的毛重值
  255. * 混装判断逻辑1
  256. * 存在判断依据(委托类型为混装,且上次结净数据中匹配委托类型也是混装)
  257. *
  258. * 混装判断逻辑2
  259. * 两次委托发货单位一致,净重时间在4个小时之内
  260. */
  261. // 签发时间比较
  262. // 通过上次结净记录,找到该委托的签发时间
  263. //int hour = 999;
  264. //if (lastPre.Succeed && lastPre.Data.Count == 1)
  265. //{
  266. // TimeSpan ts = new TimeSpan();
  267. // ts = DateTime.Parse(DateTime.Now.ToString()) - DateTime.Parse(lastMeterWorkCarActual.netTime.ToString());
  268. // hour = ts.Hours; //此为相差小时
  269. //}
  270. //// 混装逻辑 && 当次重量大于上次净重记录中的毛重值
  271. //if (listPreScale[0].meterTypeNo.Equals("yyyy") && PbCache.lockWgt > lastMeterWorkCarActual.tareWeight)
  272. //{
  273. // isHZ = true;
  274. //}
  275. //// 两次委托发货单位一致,净重时间在4个小时之内
  276. //else if (listPreScale[0].forwardingUnitNo.Equals(lastMeterWorkCarActual.forwardingUnitNo) && hour <= 4)
  277. //{
  278. // isHZ = true;
  279. //}
  280. else if (isHZ == true)
  281. {
  282. /*
  283. * a. 取上次净重记录中的毛重值为当次皮重
  284. * b. 结净匹配委托
  285. */
  286. // 新增一条皮重数据
  287. MeterWorkCarActualFirst newActualFirst = new MeterWorkCarActualFirst();
  288. // 复制对象,将档次委托信息复制给一次记录
  289. EntityBase<PreTrackScale> entityBase = new EntityBase<PreTrackScale>();
  290. newActualFirst = entityBase.format<MeterWorkCarActualFirst>(listPreScale[0], newActualFirst);
  291. newActualFirst.carNo = PbCache.lockCarNo;
  292. newActualFirst.weightType = "1"; // 默认重量类型为皮重
  293. newActualFirst.actualFirstNo = DateTime.Now.ToString("yyyyMMdd");//10
  294. newActualFirst.meterWeight = lastMeterWorkCarActual.grossWeight;//取上次净重记录中的毛重值为当次皮重
  295. newActualFirst.addWeight = PbCache.addWgt;//附加重量
  296. newActualFirst.createManNo = PbCache.sportInfo.baseSpotNo;
  297. newActualFirst.createManName = PbCache.sportInfo.baseSpotName;
  298. newActualFirst.meterGroup = "";
  299. newActualFirst.meterClass = "";
  300. newActualFirst.createTime = DateTime.Now;
  301. newActualFirst.baseSpotNo = PbCache.sportInfo.baseSpotNo;//计量点编号
  302. newActualFirst.baseSpotName = PbCache.sportInfo.baseSpotName;
  303. //mwaf.memo = "";
  304. newActualFirst.valueFlag = "1"; //状态(0 = 作废,1 = 有效(已匹配),2 = 结净,3 = 未匹配)
  305. newActualFirst.updateManName = "";
  306. newActualFirst.updateManNo = "";
  307. newActualFirst.updateTime = null;
  308. newActualFirst.checkFlag = "1"; //0未审核,1已审核
  309. newActualFirst.meterMode = "2"; //1:远程计量;2:智能计量;3:手工录入;4:放行智能计量;5:滞后匹配
  310. newActualFirst.addWeight = PbCache.addWgt;
  311. newActualFirst.dataSource = "1"; //数据来源(1=智能终端,2=本地计量,3=应急计量,4=手动录入(计量票据录入))
  312. newActualFirst.isPreScale = "1";
  313. newActualFirst.valueFlag = "2";
  314. EntityBase<PreTrackScale> entityBase1 = new EntityBase<PreTrackScale>();
  315. mwaf = entityBase1.format<MeterWorkCarActualFirst>(listPreScale[0], mwaf);
  316. /*
  317. // 读结净最小值配置
  318. ComBaseInfoService cbis = new ComBaseInfoService();
  319. RESTfulResult<List<ComBaseInfo>> res = cbis.doQueryBaseList(new ComBaseInfo { baseCode = "001031001" });
  320. if (res.Succeed)
  321. {
  322. if (res.Data != null && res.Data.Count == 1)
  323. {
  324. try
  325. {
  326. diffrentWgt = Double.Parse(res.Data[0].baseName);
  327. }
  328. finally
  329. {
  330. }
  331. }
  332. }
  333. //*/
  334. if (Math.Abs(newActualFirst.meterWeight.Value - PbCache.lockWgt) > diffrentWgt || listMonitor.Data[0].validPredictionDiff == "0")
  335. {
  336. // 将当次一次计量数据重量类型改为毛重
  337. mwaf.weightType = "0"; // 毛重
  338. mwaf.isPreScale = "1";
  339. // 混装逻辑,并结净匹配委托
  340. rt = saveMethod.doAddNetNewHZHX(listPreScale[0], newActualFirst, mwaf);
  341. rt.resultInfo += ",混装业务";
  342. double? netWeight = PbCache.lockWgt - lastMeterWorkCarActual.grossWeight;
  343. PbCache.voiceType = 1;
  344. PbCache.LEDResultMessage = string.Format("车号{0},2次重量{1}吨,净重{2}吨,混装业务", PbCache.lockCarNo, Math.Round(PbCache.lockWgt / 1000, 2), Math.Abs(Math.Round((double)netWeight / 1000, 2)));
  345. }
  346. else
  347. {
  348. rt = saveMethod.doError("第一次计量重量【" + newActualFirst.meterWeight.Value / 1000 + "T】和第二次计量重量【" + PbCache.lockWgt / 1000 + "T】接近,小于结净最小值【" + diffrentWgt / 1000 + " T】");
  349. rt.isWarn = true;
  350. rt.WarnContent = "validWgt";
  351. PbCache.voiceType = 4;
  352. PbCache.LEDResultMessage = "计量失败,小于结净最小值,请联系计量大厅";
  353. return rt;
  354. }
  355. }
  356. else
  357. {
  358. EntityBase<PreTrackScale> entityBase2 = new EntityBase<PreTrackScale>();
  359. mwaf = entityBase2.format<MeterWorkCarActualFirst>(listPreScale[0], mwaf);
  360. PbCache.isActual = true;
  361. PbCache.isInnerCar = true;
  362. PbCache.voiceType = 1;
  363. rt = saveMethod.doAddFirst(listPreScale[0], mwaf);
  364. PbCache.LEDResultMessage = string.Format("车号{0},1次重量{1}吨,计量完成", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2));
  365. }
  366. }
  367. // 存在结净记录,不满足以上逻辑
  368. else {
  369. /*
  370. * a. 正常保存重量(重量类型为空)
  371. * b. 匹配委托
  372. * c. 提示称重完成
  373. */
  374. // 把委托编号复制给一次计量记录
  375. EntityBase<PreTrackScale> entityBase = new EntityBase<PreTrackScale>();
  376. mwaf = entityBase.format<MeterWorkCarActualFirst>(listPreScale[0], mwaf);
  377. PbCache.isActual = true;
  378. PbCache.isInnerCar = true;
  379. PbCache.voiceType = 1;
  380. rt = saveMethod.doAddFirst(listPreScale[0], mwaf);
  381. PbCache.LEDResultMessage = string.Format("车号{0},1次重量{1}吨,计量完成", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2));
  382. }
  383. }
  384. }
  385. else
  386. {
  387. rt = saveMethod.doError("接口调用错误:无法读取车辆最近一次结净数据");
  388. return rt;
  389. }
  390. }
  391. else if (listPreScale.Count == 2 && listPreScale[0].valueFlag == "4" && listPreScale[1].valueFlag == "4")
  392. {
  393. rt = saveMethod.doAddFirst(null, mwaf);
  394. PbCache.voiceType = 1;
  395. PbCache.LEDResultMessage = string.Format("车号{0},1次重量{1}吨,计量完成", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2));
  396. }
  397. // 存在多条委托
  398. else if (listPreScale.Count > 1)
  399. {
  400. bool isHZ = false;
  401. if (rm.Succeed)
  402. {
  403. if (rm.Data == null || rm.Data.Count == 0)
  404. {
  405. isHZ = true;
  406. }
  407. else
  408. {
  409. if (rm.Data[0].isPreScale == "1")
  410. {
  411. isHZ = true;
  412. }
  413. }
  414. }
  415. /*
  416. * a. 正常保存重量(重量类型为空)
  417. * b. 提示称重完成
  418. */
  419. PreTrackScale pre = null;
  420. string res = "";
  421. string matter = "";
  422. string forwarding = "";
  423. string receiving = "";
  424. bool flag = true;
  425. foreach (var item in listPreScale)
  426. {
  427. if (matter == "" && forwarding == "" && receiving == "")
  428. {
  429. matter = item.matterNo;
  430. forwarding = item.forwardingUnitNo;
  431. receiving = item.receivingUintNo;
  432. }
  433. else
  434. {
  435. if (matter == item.matterNo && forwarding == item.forwardingUnitNo && receiving == item.receivingUintNo)
  436. { }
  437. else
  438. {
  439. flag = false;
  440. break;
  441. }
  442. }
  443. }
  444. if (flag)
  445. {
  446. pre = listPreScale[0];
  447. PbCache.voiceType = 1;
  448. PbCache.monitorResultMessage = string.Format("计量完成,车号{0}多个完全相同委托自动匹配最新委托", PbCache.lockCarNo);
  449. PbCache.LEDResultMessage = string.Format("车号{0},1次重量{1}吨,计量完成", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2));
  450. }
  451. if (listPreScale.Count == 2 && listPreScale[0].valueFlag == "1" && listPreScale[1].valueFlag == "1" && listPreScale[0].predictionType == "6" && listPreScale[1].predictionType == "6")
  452. {
  453. pre = listPreScale[0];
  454. }
  455. if (listPreScale.Count == 2 && listPreScale[0].valueFlag == "1" && listPreScale[1].valueFlag == "1" && listPreScale[0].predictionType == "5" && listPreScale[1].predictionType == "5")
  456. {
  457. pre = listPreScale[0];
  458. }
  459. if (listPreScale.Count == 2 && listPreScale[0].matterNo == listPreScale[1].matterNo && (listPreScale[0].receivingUintNo == listPreScale[1].forwardingUnitNo || listPreScale[0].forwardingUnitNo == listPreScale[1].receivingUintNo) && listPreScale[0].receivingUintNo != listPreScale[0].forwardingUnitNo && listPreScale[1].receivingUintNo != listPreScale[1].forwardingUnitNo)
  460. {
  461. // 正常结净并生成两条净重数据
  462. pre = listPreScale[1];
  463. res = ",双委托业务";
  464. PbCache.voiceType = 1;
  465. PbCache.LEDResultMessage = string.Format("车号{0},1次重量{1}吨,计量完成,双委托业务", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2));
  466. }
  467. if (listPreScale.Count == 2 && !string.IsNullOrEmpty(listPreScale[0].receiverRemark) && !string.IsNullOrEmpty(listPreScale[1].receiverRemark) && listPreScale[0].tempConveyance == listPreScale[1].tempConveyance && !string.IsNullOrEmpty(listPreScale[0].tempConveyance) && !string.IsNullOrEmpty(listPreScale[1].tempConveyance) && isHZ)
  468. {
  469. pre = listPreScale[1];
  470. res = ",混装业务";
  471. PbCache.voiceType = 1;
  472. PbCache.LEDResultMessage = string.Format("车号{0},1次重量{1}吨,计量完成,混装业务", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2));
  473. }
  474. if (pre == null)
  475. {
  476. res = ",存在多个委托,无法自动匹配";
  477. PbCache.voiceType = 8;
  478. PbCache.LEDResultMessage = string.Format("车号{0},1次重量{1}吨,计量完成,多委托无法自动匹配请联系", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2));
  479. PbCache.monitorResultMessage = string.Format("计量完成,车号{0}存在{1}个委托,无法自动匹配", PbCache.lockCarNo, listPreScale.Count);
  480. }
  481. PbCache.isActual = true;
  482. PbCache.isInnerCar = true;
  483. rt = saveMethod.doAddFirst(pre, mwaf);
  484. if (res != "")
  485. {
  486. rt.resultInfo += res;
  487. }
  488. }
  489. //不符合上述条件且有一次记录,不匹配委托直接保存一次
  490. else
  491. {
  492. rt = saveMethod.doAddFirst(null, mwaf);
  493. rt.resultInfo += ",存在多个委托,无法自动匹配";
  494. PbCache.voiceType = 8;
  495. PbCache.LEDResultMessage = string.Format("车号{0},1次重量{1}吨,计量完成,多委托无法自动匹配请联系", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2));
  496. PbCache.monitorResultMessage = string.Format("计量完成,车号{0}存在{1}个委托,无法自动匹配", PbCache.lockCarNo, listPreScale.Count);
  497. PbCache.isActual = true;
  498. PbCache.isInnerCar = true;
  499. }
  500. }
  501. }
  502. // 存在一次计量数据
  503. else if(list.Count == 1)
  504. {
  505. /*
  506. // 读结净最小值配置
  507. ComBaseInfoService cbis = new ComBaseInfoService();
  508. RESTfulResult<List<ComBaseInfo>> res = cbis.doQueryBaseList(new ComBaseInfo { baseCode = "001031001" });
  509. if (res.Succeed)
  510. {
  511. if (res.Data != null && res.Data.Count == 1)
  512. {
  513. try
  514. {
  515. diffrentWgt = Double.Parse(res.Data[0].baseName);
  516. }
  517. finally
  518. {
  519. }
  520. }
  521. }
  522. //*/
  523. // 校验上次计量数据和当次计量数据是否满足基础配置表中的结净最小值条件
  524. if (Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) > diffrentWgt || listMonitor.Data[0].validPredictionDiff == "0")
  525. {
  526. if (rmPre.Succeed)
  527. {
  528. // 存在的一次计量数据未匹配委托
  529. if (string.IsNullOrEmpty(rmX.Data[0].isPreScale) || rmX.Data[0].isPreScale == "0")
  530. {
  531. // 不存在委托数据
  532. if (listPreScale == null || listPreScale.Count == 0)
  533. {
  534. /*
  535. * a. 正常产生结净数据(状态为未发布)
  536. * b. 提示司机当前计量数据未匹配委托,请联系计量打印进行处理
  537. */
  538. rt = saveMethod.doNet(null, rmX.Data[0], mwaf);
  539. rt.isWarn = true;
  540. rt.WarnContent = "validIsPre";
  541. rt.resultInfo += ",无委托结净";
  542. PbCache.voiceType = 1;
  543. PbCache.LEDResultMessage = string.Format("车号{0},2次重量{1}吨,净重{2}吨,无委托结净", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), Math.Round((Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) / 1000), 2));
  544. PbCache.monitorResultMessage = string.Format("计量完成,车号{0}无委托结净", PbCache.lockCarNo);
  545. }
  546. // 只存在一条使用中的委托
  547. else if (listPreScale.Count == 1 && listPreScale[0].valueFlag == "4")
  548. {
  549. /*
  550. * a. 程序报警
  551. * b. 提示司机存在一条使用中的委托,请联系计量大厅进行确认
  552. * c. 自动进行语音求助
  553. */
  554. rt = saveMethod.doNet(null, rmX.Data[0], mwaf);
  555. rt.resultInfo += ",存在一条使用中的委托,请联系计量大厅进行确认";
  556. PbCache.voiceType = 18;
  557. PbCache.LEDResultMessage = "存在一条使用中的委托''''',请联系计量大厅进行确认";
  558. PbCache.monitorResultMessage = string.Format("车号:{0},存在一条使用中的委托,请联系计量大厅进行确认", PbCache.lockCarNo);
  559. return rt;
  560. }
  561. // 只存在一条未使用的委托数据
  562. else if (listPreScale.Count == 1 && listPreScale[0].valueFlag == "1")
  563. {
  564. /*
  565. * a. 程序根据大减小的原则,保存净重并正确设置一次计量数据中的重量类型
  566. * b. 播放称重完成的语音提示
  567. */
  568. EntityBase<PreTrackScale> entityBase = new EntityBase<PreTrackScale>();
  569. mwaf = entityBase.format<MeterWorkCarActualFirst>(listPreScale[0], mwaf);
  570. mwaf.isPreScale = "1";
  571. PbCache.voiceType = 1;
  572. rt = saveMethod.doNet(listPreScale[0], rmX.Data[0], mwaf);
  573. PbCache.LEDResultMessage = string.Format("车号{0},2次重量{1}吨,净重{2}吨,计量完成", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), Math.Round((Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) / 1000), 2));
  574. }
  575. // 如果存在两条未使用的委托
  576. else if (listPreScale.Count == 2 && listPreScale[0].valueFlag == "1" && listPreScale[1].valueFlag == "1")
  577. {
  578. /* 委托关系满足双委托逻辑
  579. * 分两种情况:
  580. * 1、委托数据货源字段中带有委托标识,且两条委托类型都是双委托。
  581. * 2、委托数据中没有带有委托标识,则根据签发时间排序,如果第一条委托的物料和第二条委托数据的相同,且第一条委托的收货单位是第二条委托的发货单位。
  582. */
  583. if (listPreScale[0].predictionType == "5" && listPreScale[1].predictionType == "5" && listPreScale[0].predictionCombination == listPreScale[1].predictionCombination)
  584. {
  585. // 正常结净并生成两条净重数据
  586. rt = saveMethod.doNetAddTwo(listPreScale, rmX.Data[0], mwaf);
  587. PbCache.voiceType = 1;
  588. PbCache.LEDResultMessage = string.Format("车号{0},2次重量{1}吨,净重{2}吨,双委托结净", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), Math.Round((Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) / 1000), 2));
  589. }
  590. else if (listPreScale[0].matterNo == listPreScale[1].matterNo && (listPreScale[0].receivingUintNo == listPreScale[1].forwardingUnitNo || listPreScale[0].forwardingUnitNo == listPreScale[1].receivingUintNo) && listPreScale[0].receivingUintNo != listPreScale[0].forwardingUnitNo && listPreScale[1].receivingUintNo != listPreScale[1].forwardingUnitNo)
  591. {
  592. // 正常结净并生成两条净重数据
  593. rt = saveMethod.doNetAddTwo(listPreScale, rmX.Data[0], mwaf);
  594. PbCache.voiceType = 1;
  595. PbCache.LEDResultMessage = string.Format("车号{0},2次重量{1}吨,净重{2}吨,双委托结净", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), Math.Round((Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) / 1000), 2));
  596. }
  597. /*
  598. * 委托关系满足混装逻辑
  599. */
  600. else if (listPreScale.Count == 2 && !string.IsNullOrEmpty(listPreScale[0].receiverRemark) && !string.IsNullOrEmpty(listPreScale[1].receiverRemark) && listPreScale[0].tempConveyance == listPreScale[1].tempConveyance && !string.IsNullOrEmpty(listPreScale[0].tempConveyance) && !string.IsNullOrEmpty(listPreScale[1].tempConveyance))
  601. {
  602. /*
  603. * a. 正常结净产生一条净重记录
  604. * b. 自动生成一条一次毛重计量数据,重量值值为当次计量数据中的毛重
  605. */
  606. PreTrackScale ptss = new PreTrackScale();
  607. foreach (var item in listPreScale)
  608. {
  609. if (item.receiverRemark == "HO1")
  610. {
  611. ptss = item;
  612. }
  613. }
  614. MeterWorkCarActualFirst mwca2 = new MeterWorkCarActualFirst();
  615. mwca2 = rmX.Data[0];
  616. mwca2.isPreScale = "1";
  617. EntityBase<PreTrackScale> entityBase = new EntityBase<PreTrackScale>();
  618. mwca2 = entityBase.format<MeterWorkCarActualFirst>(ptss, mwca2);
  619. //EntityBase<PreTrackScale> entityBase1 = new EntityBase<PreTrackScale>();
  620. //mwaf = entityBase1.format<MeterWorkCarActualFirst>(listPreScale[0], mwaf);
  621. //mwaf.isPreScale = "1";
  622. PbCache.voiceType = 1;
  623. rt = saveMethod.doNetHZHX(ptss, mwca2, mwaf);
  624. PbCache.LEDResultMessage = string.Format("车号{0},2次重量{1}吨,净重{2}吨,混装业务", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), Math.Round((Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) / 1000), 2));
  625. rt.resultInfo += ",混装业务";
  626. }
  627. // 不满足以上逻辑
  628. else
  629. {
  630. /*
  631. * a. 正常结净产生一条净重记录(状态为未发布)
  632. * b. 提示司机当前存计量数据未匹配委托
  633. * c. 进行大厅报警,请联系计量大厅进行处理
  634. * d. 自动进行语音求助(但是原有的语音求助逻辑是重量归零相应秤点的求助信息也会清空)
  635. */
  636. rt = saveMethod.doNet(null, rmX.Data[0], mwaf);
  637. rt.isWarn = true;
  638. rt.WarnContent = "validIsPre";
  639. rt.resultInfo += ",存在多个委托,无法自动匹配";
  640. PbCache.voiceType = 8;
  641. PbCache.LEDResultMessage = string.Format("车号{0},2次重量{1}吨,净重{2}吨,多委托请联系大厅", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), Math.Round((Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) / 1000), 2));
  642. PbCache.monitorResultMessage = string.Format("计量完成,车号{0}存在{1}个委托,无法自动匹配", PbCache.lockCarNo, listPreScale.Count);
  643. }
  644. }
  645. // 存在多条未使用的委托数据
  646. else if (listPreScale.Count > 2)
  647. {
  648. ///* 委托关系满足多委托逻辑
  649. // * 多委托判定逻辑:
  650. // * 多条委托数据都存在委托类型依据,且类型都是多委托。
  651. // */
  652. //if (1 == 1)
  653. //{
  654. // // 正常结净并生成两条净重数据
  655. // rt = saveMethod.doNetAddTwo(listPreScale, rmX.Data[0], mwaf);
  656. //}
  657. ///*
  658. // * 委托关系满足一车多卸逻辑
  659. // * 一车多卸逻辑:多条委托都存在委托判断依据,且类型都是一车多卸委托。
  660. // */
  661. //else if (2 == 2)
  662. //{
  663. // /*
  664. // * a. 正常结净产生一条净重记录
  665. // * b. 自动生成一条一次毛重计量数据,重量值值为当次计量数据中的毛重
  666. // */
  667. // // 将当次一次计量数据重量类型改为毛重
  668. // mwaf.weightType = "0"; // 毛重
  669. // // 结净匹配委托
  670. // rt = saveMethod.doNetMass(scale, mwaf);
  671. //}
  672. //// 不满足以上逻辑
  673. //else
  674. //{
  675. // /*
  676. // * a. 正常结净产生一条净重记录(状态为未发布)
  677. // * b. 提示司机当前计量数据未匹配委托,请联系计量大厅进行委托匹配
  678. // * c. 自动进行语音求助(但是原有的语音求助逻辑是重量归零相应秤点的求助信息也会清空)
  679. // */
  680. // rt = saveMethod.doNet(scale, rmX.Data[0], mwaf);
  681. // rt = saveMethod.doError("称重完成,当前所存计量数据未匹配委托,请联系计量大厅进行处理");
  682. //}
  683. PreTrackScale pre = null;
  684. string matter = "";
  685. string forwarding = "";
  686. string receiving = "";
  687. bool flag = true;
  688. foreach (var item in listPreScale)
  689. {
  690. if (matter == "" && forwarding == "" && receiving == "")
  691. {
  692. matter = item.matterNo;
  693. forwarding = item.forwardingUnitNo;
  694. receiving = item.receivingUintNo;
  695. }
  696. else
  697. {
  698. if (matter == item.matterNo && forwarding == item.forwardingUnitNo && receiving == item.receivingUintNo)
  699. { }
  700. else
  701. {
  702. flag = false;
  703. }
  704. }
  705. }
  706. if (flag)
  707. {
  708. pre = listPreScale[0];
  709. EntityBase<PreTrackScale> entityBase = new EntityBase<PreTrackScale>();
  710. mwaf = entityBase.format<MeterWorkCarActualFirst>(pre, mwaf);
  711. mwaf.isPreScale = "1";
  712. PbCache.monitorResultMessage = string.Format("计量完成,车号{0}多个完全相同委托自动匹配最新委托", PbCache.lockCarNo);
  713. PbCache.LEDResultMessage = string.Format("车号{0},2次重量{1}吨,净重{2}吨,计量完成", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), Math.Round((Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) / 1000), 2));
  714. }
  715. PbCache.voiceType = 1;
  716. rt = saveMethod.doNet(pre, rmX.Data[0], mwaf);
  717. rt.isWarn = true;
  718. rt.WarnContent = "validIsPre";
  719. if (pre == null)
  720. {
  721. PbCache.voiceType = 8;
  722. PbCache.LEDResultMessage = string.Format("车号{0},2次重量{1}吨,净重{2}吨,多委托请联系大厅", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), Math.Round((Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) / 1000), 2));
  723. PbCache.monitorResultMessage = string.Format("计量完成,车号{0}存在{1}个委托,无法自动匹配", PbCache.lockCarNo, listPreScale.Count);
  724. rt.resultInfo += ",存在多个委托,无法自动匹配";
  725. }
  726. }
  727. //不符合上述条件且有一次记录,不匹配委托直接结净
  728. else
  729. {
  730. rt = saveMethod.doNet(null, rmX.Data[0], mwaf);
  731. rt.isWarn = true;
  732. rt.WarnContent = "validIsPre";
  733. PbCache.voiceType = 8;
  734. rt.resultInfo += ",存在多个委托,无法自动匹配";
  735. PbCache.LEDResultMessage = string.Format("车号{0},2次重量{1}吨,净重{2}吨,多委托请联系大厅", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), Math.Round((Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) / 1000), 2));
  736. PbCache.monitorResultMessage = string.Format("计量完成,车号{0}存在{1}个委托,无法自动匹配", PbCache.lockCarNo, listPreScale.Count);
  737. }
  738. }
  739. // 存在的一次计量数据已匹配委托
  740. else if ((!string.IsNullOrEmpty(rmX.Data[0].isPreScale)) && rmX.Data[0].isPreScale == "1")
  741. {
  742. // 只存在一条使用中的委托
  743. if (listPreScale.Count == 1 && listPreScale[0].valueFlag == "4")
  744. {
  745. MeterWorkCarActualFirst oldCarActural = rmX.Data[0];
  746. if (rmX.Data[0].meterWeight.Value > PbCache.lockWgt)
  747. {
  748. mwaf.weightType = "1";
  749. oldCarActural.weightType = "0";
  750. }
  751. else
  752. {
  753. mwaf.weightType = "0";
  754. oldCarActural.weightType = "1";
  755. }
  756. PreTrackScale pts = listPreScale[0];
  757. EntityBase<PreTrackScale> entityBase = new EntityBase<PreTrackScale>();
  758. mwaf = entityBase.format<MeterWorkCarActualFirst>(pts, mwaf);
  759. mwaf.isPreScale = "1";
  760. PbCache.voiceType = 1;
  761. rt = saveMethod.doNet(pts, oldCarActural, mwaf);
  762. PbCache.LEDResultMessage = string.Format("车号{0},2次重量{1}吨,净重{2}吨,计量完成", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), Math.Round((Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) / 1000), 2));
  763. rt.resultInfo = "计量完成";
  764. }
  765. // 如果存在一条未使用的委托和一条使用中的委托
  766. else if (listPreScale.Count == 2 && (listPreScale[0].valueFlag == "4" && listPreScale[1].valueFlag == "1" || listPreScale[0].valueFlag == "1" && listPreScale[1].valueFlag == "4"))
  767. {
  768. /* 委托关系满足双委托逻辑
  769. * 分两种情况:
  770. * 1、委托数据货源字段中带有委托标识,且两条委托类型都是双委托。
  771. * 2、委托数据中没有带有委托标识,则根据签发时间排序,如果第一条委托的物料和第二条委托数据的相同,且第一条委托的收货单位是第二条委托的发货单位。
  772. */
  773. if (listPreScale[0].predictionType == "5" && listPreScale[1].predictionType == "5" && listPreScale[0].predictionCombination == listPreScale[1].predictionCombination)
  774. {
  775. // 正常结净并生成两条净重数据
  776. rt = saveMethod.doNetAddTwo(listPreScale, rmX.Data[0], mwaf);
  777. PbCache.voiceType = 1;
  778. PbCache.LEDResultMessage = string.Format("车号{0},2次重量{1}吨,净重{2}吨,双委托结净", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), Math.Round((Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) / 1000), 2));
  779. }
  780. else if (listPreScale[0].matterNo == listPreScale[1].matterNo && (listPreScale[0].receivingUintNo == listPreScale[1].forwardingUnitNo || listPreScale[0].forwardingUnitNo == listPreScale[1].receivingUintNo))
  781. {
  782. // 正常结净并生成两条净重数据
  783. rt = saveMethod.doNetAddTwo(listPreScale, rmX.Data[0], mwaf);
  784. PbCache.voiceType = 1;
  785. PbCache.LEDResultMessage = string.Format("车号{0},2次重量{1}吨,净重{2}吨,双委托结净", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), Math.Round((Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) / 1000), 2));
  786. }
  787. /*
  788. * 委托关系满足混装混卸逻辑
  789. */
  790. else if (listPreScale.Count == 2 && !string.IsNullOrEmpty(listPreScale[0].receiverRemark) && !string.IsNullOrEmpty(listPreScale[1].receiverRemark) && listPreScale[0].tempConveyance == listPreScale[1].tempConveyance && !string.IsNullOrEmpty(listPreScale[0].tempConveyance) && !string.IsNullOrEmpty(listPreScale[1].tempConveyance))
  791. {
  792. /*
  793. * a. 正常结净产生一条净重记录
  794. * b. 自动生成一条一次毛重计量数据,重量值值为当次计量数据中的毛重
  795. */
  796. MeterWorkCarActualFirst mwca3 = new MeterWorkCarActualFirst();
  797. mwca3 = rmX.Data[0];
  798. mwca3.isPreScale = "1";
  799. PreTrackScale pts = null;
  800. foreach (var item in listPreScale)
  801. {
  802. if (item.predictionNo == rmX.Data[0].predictionNo)
  803. {
  804. pts = item;
  805. }
  806. }
  807. EntityBase<PreTrackScale> entityBase = new EntityBase<PreTrackScale>();
  808. mwca3 = entityBase.format<MeterWorkCarActualFirst>(pts, mwca3);
  809. //EntityBase<PreTrackScale> entityBase1 = new EntityBase<PreTrackScale>();
  810. //mwaf = entityBase1.format<MeterWorkCarActualFirst>(pts, mwaf);
  811. //mwaf.isPreScale = "1";
  812. rt = saveMethod.doNetHZHX(pts, mwca3, mwaf);
  813. rt.resultInfo += ",混装业务";
  814. PbCache.voiceType = 1;
  815. PbCache.LEDResultMessage = string.Format("车号{0},2次重量{1}吨,净重{2}吨,混装业务", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), Math.Round((Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) / 1000), 2));
  816. }
  817. // 不满足以上逻辑
  818. else
  819. {
  820. /*
  821. * a. 正常结净产生一条净重记录(状态为未发布)
  822. * b. 提示司机当前存计量数据未匹配委托
  823. * c. 进行大厅报警,请联系计量大厅进行处理
  824. * d. 自动进行语音求助(但是原有的语音求助逻辑是重量归零相应秤点的求助信息也会清空)
  825. */
  826. MeterWorkCarActualFirst oldCarActural = rmX.Data[0];
  827. if (rmX.Data[0].meterWeight.Value > PbCache.lockWgt)
  828. {
  829. mwaf.weightType = "1";
  830. oldCarActural.weightType = "0";
  831. }
  832. else
  833. {
  834. mwaf.weightType = "0";
  835. oldCarActural.weightType = "1";
  836. }
  837. PreTrackScale pts = null;
  838. foreach (var item in listPreScale)
  839. {
  840. if (item.predictionNo == rmX.Data[0].predictionNo)
  841. {
  842. pts = item;
  843. }
  844. }
  845. EntityBase<PreTrackScale> entityBase = new EntityBase<PreTrackScale>();
  846. mwaf = entityBase.format<MeterWorkCarActualFirst>(pts, mwaf);
  847. mwaf.isPreScale = "1";
  848. PbCache.voiceType = 1;
  849. rt = saveMethod.doNet(pts, oldCarActural, mwaf);
  850. PbCache.LEDResultMessage = string.Format("车号{0},2次重量{1}吨,净重{2}吨,计量完成", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), Math.Round((Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) / 1000), 2));
  851. PbCache.monitorResultMessage = string.Format("计量完成,在结净时仍然存在{1}个委托)", PbCache.lockCarNo, listPreScale.Count-1);
  852. rt.resultInfo = "计量完成";
  853. }
  854. }
  855. else if (listPreScale.Count == 2 && listPreScale[0].valueFlag == "4" && listPreScale[1].valueFlag == "4")
  856. {
  857. rt = saveMethod.doNet(null, rmX.Data[0], mwaf);
  858. rt.isWarn = true;
  859. rt.WarnContent = "validIsPre";
  860. PbCache.voiceType = 8;
  861. rt.resultInfo += ",存在多个委托,无法自动匹配";
  862. PbCache.LEDResultMessage = string.Format("车号{0},2次重量{1}吨,净重{2}吨,多委托请联系大厅", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), Math.Round((Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) / 1000), 2));
  863. PbCache.monitorResultMessage = string.Format("计量完成,车号{0}存在{1}个委托,无法自动匹配", PbCache.lockCarNo, listPreScale.Count);
  864. }
  865. // 存在多条未使用的委托数据
  866. else if (listPreScale.Count > 2)
  867. {
  868. PreTrackScale pts = null;
  869. foreach (var item in listPreScale)
  870. {
  871. if (item.predictionNo == rmX.Data[0].predictionNo)
  872. {
  873. pts = item;
  874. }
  875. }
  876. EntityBase<PreTrackScale> entityBase = new EntityBase<PreTrackScale>();
  877. mwaf = entityBase.format<MeterWorkCarActualFirst>(pts, mwaf);
  878. mwaf.isPreScale = "1";
  879. rt = saveMethod.doNet(pts, rmX.Data[0], mwaf);
  880. if (pts == null)
  881. {
  882. rt.isWarn = true;
  883. rt.WarnContent = "validIsPre";
  884. PbCache.voiceType = 8;
  885. rt.resultInfo += ",存在多个委托,无法自动匹配";
  886. PbCache.LEDResultMessage = string.Format("车号{0},2次重量{1}吨,净重{2}吨,多委托请联系大厅", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), Math.Round((Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) / 1000), 2));
  887. PbCache.monitorResultMessage = string.Format("计量完成,车号{0}存在{1}个委托,无法自动匹配", PbCache.lockCarNo, listPreScale.Count);
  888. }
  889. else
  890. {
  891. PbCache.LEDResultMessage = string.Format("车号{0},2次重量{1}吨,净重{2}吨,计量完成", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), Math.Round((Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) / 1000), 2));
  892. }
  893. }
  894. else
  895. {
  896. PreTrackScale pts = null;
  897. foreach (var item in listPreScale)
  898. {
  899. if (item.predictionNo == rmX.Data[0].predictionNo)
  900. {
  901. pts = item;
  902. }
  903. }
  904. EntityBase<PreTrackScale> entityBase = new EntityBase<PreTrackScale>();
  905. mwaf = entityBase.format<MeterWorkCarActualFirst>(pts, mwaf);
  906. mwaf.isPreScale = "1";
  907. rt = saveMethod.doNet(pts, rmX.Data[0], mwaf);
  908. if (pts == null)
  909. {
  910. rt.isWarn = true;
  911. rt.WarnContent = "validIsPre";
  912. PbCache.voiceType = 8;
  913. rt.resultInfo += ",存在多个委托,无法自动匹配";
  914. PbCache.LEDResultMessage = string.Format("车号{0},2次重量{1}吨,净重{2}吨,多委托请联系大厅", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), Math.Round((Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) / 1000), 2));
  915. PbCache.monitorResultMessage = string.Format("计量完成,车号{0}存在{1}个委托,无法自动匹配", PbCache.lockCarNo, listPreScale.Count);
  916. }
  917. else
  918. {
  919. PbCache.LEDResultMessage = string.Format("车号{0},重量{1}吨,净重{2}吨,计量完成", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), Math.Round((Math.Abs(rmX.Data[0].meterWeight.Value - PbCache.lockWgt) / 1000), 2));
  920. }
  921. }
  922. }
  923. }
  924. }
  925. // 不满足
  926. else
  927. {
  928. rt = saveMethod.doError("第一次计量重量【" + rmX.Data[0].meterWeight.Value / 1000 + "T】和第二次计量重量【" + PbCache.lockWgt / 1000 + "T】接近,小于结净最小值【" + diffrentWgt / 1000 + " T】");
  929. rt.isWarn = true;
  930. rt.WarnContent = "validWgt";
  931. PbCache.voiceType = 4;
  932. PbCache.LEDResultMessage = "计量失败,小于结净最小值,请联系计量大厅";
  933. return rt;
  934. }
  935. }
  936. else
  937. {
  938. PbCache.isActual = true;
  939. PbCache.isInnerCar = true;
  940. rt = saveMethod.doAddFirst(null, mwaf);
  941. rt.resultInfo += ",存在"+ list.Count + "条一次数据";
  942. PbCache.voiceType = 24;
  943. PbCache.LEDResultMessage = string.Format("车号{0},重量{1}吨,存在{2}条一次数据,请联系大厅", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2),list.Count);
  944. PbCache.monitorResultMessage = string.Format("车号{0},重量{1}吨,存在{2}条一次数据,请联系大厅", PbCache.lockCarNo, Math.Round((PbCache.lockWgt / 1000), 2), list.Count);
  945. rt.isWarn = true;
  946. rt.WarnContent = "validWgt";
  947. }
  948. }
  949. else
  950. {
  951. rt = saveMethod.doError("接口调用错误:无法读取车辆最近一次计量数据");
  952. return rt;
  953. }
  954. // 后台失败处理
  955. if (!rt.result)
  956. {
  957. rt.resultInfo = "称重数据保存失败";
  958. PbCache.voiceType = 25;
  959. PbCache.LEDResultMessage = "计量失败,请联系计量大厅";
  960. PbCache.monitorResultMessage = "";
  961. }
  962. return rt;
  963. }
  964. }
  965. }