From cb2e66567ff3a46c16c3246e61f9177a5f38c33f Mon Sep 17 00:00:00 2001 From: xiaoguo Date: Sun, 26 Nov 2023 11:51:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20OEE=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=EF=BC=8C=E8=AE=BE=E5=A4=87=E4=BF=A1=E6=81=AF?= =?UTF-8?q?OEE=E4=BF=A1=E6=81=AF=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.vs/PVDEMCS/DesignTimeBuild/.dtbcache.v2 | Bin 159824 -> 160000 bytes PVDEMCS/.vs/PVDEMCS/v17/.futdcache.v2 | Bin 224 -> 224 bytes PVDEMCS/.vs/PVDEMCS/v17/.suo | Bin 201216 -> 202240 bytes .../ProjectEvaluation/pvdemcs.metadata.v7.bin | Bin 248762 -> 248815 bytes .../ProjectEvaluation/pvdemcs.projects.v7.bin | Bin 1265003 -> 1506523 bytes PVDEMCS/PVDEMCS/Common/Constant/Constant.cs | 22 ++ .../Controllers/EquipmentRecordController.cs | 24 ++ .../PublishProfiles/FolderProfile.pubxml.user | 2 +- .../Services/IEquipmentRecordService.cs | 15 ++ .../Services/Impl/EquipmentRecordService.cs | 23 ++ .../PVDEMCS/Services/Impl/EquipmentService.cs | 11 +- .../Services/Models/EquipmentOEEMonthTotal.cs | 18 ++ .../Services/Models/EquipmentOEETotal.cs | 38 +++ .../EquipmentRecordStateOEEMonthTotal.cs | 47 ++++ .../IEquipmentRecordRepository.cs | 15 ++ .../Impl/EquipmentRecordRepository.cs | 234 +++++++++++++++++- 16 files changed, 432 insertions(+), 17 deletions(-) create mode 100644 PVDEMCS/PVDEMCS/Services/Models/EquipmentOEEMonthTotal.cs create mode 100644 PVDEMCS/PVDEMCS/Services/Models/EquipmentOEETotal.cs create mode 100644 PVDEMCS/PVDEMCS/Services/Models/EquipmentRecordStateOEEMonthTotal.cs diff --git a/PVDEMCS/.vs/PVDEMCS/DesignTimeBuild/.dtbcache.v2 b/PVDEMCS/.vs/PVDEMCS/DesignTimeBuild/.dtbcache.v2 index adaa3eef7ab075aa9b1c8358258bad2bc81882e2..632c833d9a180aae9ddb715823be3bc74d5a4e79 100644 GIT binary patch delta 652 zcmb8r$!il~7{~E<-Z&){6zR!Q532$D?3N#|rP@unWye;}Eeq7W>lISPps&yrKT z_mopl5~H>*Eka$oxYjMEt+sYiCskWpFa5qL5j;BZ;rG1nyvxHoTWifPwrYP0+POs3 za$Kt?mG)da?mCWVo30fxO!Jguq|JV(KjwN?+Kri>9XCANwj;J__Qay`v=Q}KW)!X+ z4ak^vrF6BV-6+YCkk(xs49oVm^U37dflJv7eFNE4=A<(uIvewcnEyLynYsV_k?RcnT?mm?md%kosP6wM%y7W*JW55j3Xf$N)J> zK7;zF#?Q$Yc!_q#cga_Hjd{GmeZ0jxOyE5}po)*EL7lsRMJ(we*SO>pgU?t-vl-QU z3m2`B>fkR>n^)0nYK>YoxsJoE-5^ziU-1p!;iHaC{D4~j6Th&f=Y-g%IKt-Nq&h%d z_J4=$pP^o9hrP{5RCTS;l0v>>^X_JA4M`#$>kWi;?EZs7L!ayq! z5+HH4<-SX~@B0|}e?@r!BK`FD=h&YuyY)!97Eyk3%HV(_EmI0Bt!Y9R2~#(dnj>r{ zDPo!>6T;5uaZ}R`%eKsnk%`HK6St+EPU)63l19qRO|)|*HtLOe%CyG|UHQpwKI4z~ z@N#o>R%NURB{e_P%Vis9jIE$vg($|w#(ZaX4fP@{fr9yUWC%Hr+yMGVbs1TKDs-Tx z{+qA`+pq&A*o8fqgMB!FLpXwCpuQ(?3N@8w8;6{ssKYq~ms!R*jDs$a)c6u;^A!Y_ zy2h9;c>^t2dyAwC-oZUQz#}}tGrRz;e}y-AS4SB8z@QbIKatdc4*Oq|zaI2TU)USG dGQH*kYRYdUeFb0i@oK*^6Z11U&Pyt%NDe$LuvhlAx7$W0)}NG;FKg$J{{7*;UOuO2 zu{516pzYFiwvaxOX4}nO5J(C|*A;jMmm9c+>TEAjy}105C&Cu>p(wWq@h8DkAOv`T zJRr(x5SD_zpe>jN(tyZok1zm)D-;V9^AUL!JO*}vDIgm>4uZi9@IDX^iYpZH!(b#R z0OLUv2n0_6Q6?6l5ljZdKn&Obc7qWh5v&0%(Y~T5BA#F&cn63I{16(zHc$wPfJpa3 zcmueDaUd160=>XsFdRex73dFofDRxMtOw1(3qaJBjIcA>SBwGaU>?we*`OR`fSDi@ zJOiEsPlGNX2)F0l~o3buj?pbU%#Lx2Rta3&y}3tj=5S@`D*1_9|NrPeD< z@!0nsLSaNV#MPiU4ay?M%^nzmP#7UzQSM#}GXVJ-;0k`NFhbFOqc9y&@b?r(G%^Eu zLSfp0mEb`NBN`A2Bc6R|g%O4SOodV61^#IYqekU_mcqE$DvXfAZHXM)jaqD{P%HsU zK@nI6mV*_b7_0;)Ac0k2H7EfbtO3u17rA_miAlmrWX~`9PJ!(FkcT0BXfZJ z22!^{nF^b7ytW&8ORmM0{KVH3DAg7plMb>lRc93WT$(*4$QWj&B zB*!Z1#nX3@Tk_fZymJW8gG=@IqTCmVe+j;-Py4$~-W9~Z0pHc9No`(kqne1D&eC^# z+nY-KCI4&f7!Bfo{hC4~!?jfEUl*;tHb@M;WcY5FQV6R-lT<(8<|}D-zYw#w%}G1S z=oKIZg!?JS+mw+E;i=Lg7An<-r>e&xLp0b>fn?}XZuWN_MzmL&-C{96M9kkD;19Lh z*Gsf$|5p@N`$=>5r8tlnDi_;_Yxf;KRlho#z*moUFeGgi-ytZ$uTG$z3ZyLr}GW09rg<6(x z&hK4F6^Za=g>{fplgb~)#5z&MzyM|rNcJYR7S-s-m1r~W`5-1|Iv*b&kfx>65PNOZlY zdgL)-iSg#i*P~6fTJG{CdC(+I`)C;N-jZpgZ_}H(Jg0u=d#~Un$>TBtW6tb+{G;@W zVg5?9f2VfjV0EBHYj?Zexk$`xb3p%7RB2BKQAU_)U)wUZVVHDdFzIp*sfDQ(4sAmP z=Gq($m1eS)c{`el&IjR*gFz&$PP^47=_buZtW}G7NShDx!2)0;1^2y4N#?}tH^@|c z_!rBNQ)krlIl#pWd|13>e9b6Z-X|TE=4$AK6yITN&rtZfF>qa@;g)v6UnmH#zYE72 z5e@%1)LKI1#GrHpN=I1#vJ_pouPYnTGYUoYNY1f79D#?j>#K}GwPEmxqY!4`f0nhX zaKyTxbQtb36*>H^NY+~V_|2Ck<49PMpHEWhJoeyKQ)9bomKv2d{jZ_!Rk*3I5OoU|Iq=0!MQQP!zbCH;jn+3pVr!e2yM#@qXE8VFy z1z?@=Z0A5(Xi;y|s@dQQtZb;4PGGg&+pnZOc7HulrZ%a?6D^zht`t=HEdTJ z-rPP4Ph{Jhf8KAeGe){lIY_BK^=gCCtxzWIxk_ULRilL{`i=5Zm+lXt110g_*~ zAK!a|xk+ee%t?|iHM@oX#i zbzgYfW!6^7w>}#5cK)SP0pCc27rUt@=H;f9n5#bM$@m2&>%KabDJ9(y!-7!-!>SX< z>@h5vd&z75UghA^Q%?AN)Z{(Q>orS`-FWPkMR?mr$3TU($shMB2v#@^28379X&rjG z3E>s2H>(iF!wfuwaE(TxuplqH1-3J|Z_!erIIF~trEA@0Z*Nz)Z7B|Lo8lCTQwk|= zXd%5RRSoS~TB9s;CuT~suEgBnP0vua`KPodRCF7gao@9`Vc(o34FQ3JlaqS^mV>eZi&0P%CQtMMM-sk-S z3turG)wNR`bRYKJ;G=)5{jBqzZ$5F`-Q{@FjmY;tDS4Z8Ld5)}FKLrzjW)%HDft{yt=01eV1R(tz*tiVbmrsE+3|ZBU?A`zGNL8^tOCuRiAQoqiJ68?& zrk_^Q&RRz$*6C-iodvV@B`fiuMD;$@)Yhg`+>ijDKrH=Ym);;DQp?vp$ccD(EbGm? zCo(_txXWwo$^wYkIy=rfQmk_gWaEc1J&w>BA@ARj_He(O6s;Nr4>d{1#Y?-LYgg5} zz3LaXIU%>thfiGaeSCc3(p3XS_dVNr@s*ZY^U$cZN3t=TjF>QEw32@-56RNDt7<+f zy&%mV6GG8Aj%kH7B^|K#$bOM%S1GO3hG3uIC7s{cg6GY`COmJk5(z$ygfi7{Gv6A~ zgzx>5x$+|#rj>PV$U+r20+f=UyQidUqg3z5E4^hS4AoAwwne-M-#UUktYzLnK2)($ zV5%xe;e@q}zqL%TT4}M(KZg99b@{_lhv;7)RC~nyQEB?0|g0nG(ps~*{KcHFf9!Lh5b<5h)Qetv?b;7|#97Vs!0go(PmA=m=}&hWRFg9K zX~b80EB{@rnKh{d?EDkhTBuOEk zL}((y10y5r$}N*ZEghttRSx{~<^KqEwIvOo z^ac5~a8x9O3>_9579JfN8ap>EEHZnCRFJ)pTRvxwHnYZc^sNI&CiGj{x0_$iD@$iq zE*}z9){K~>D|6?mJ(#B)>O(c8=`wt1st|2buc4`2lTKYL(74l59j?xj#9 zAWXwfS3-E84{RZf)HQ7C*5dxD!PuE2^c;%yLzsKpDjIHj^Ju z-2l%>w~#EWtC^PPIkAyuY9zu95Rc8_Um zFBe-)jO7Pisq~~|@{u~Nedl7p;dgz$?;2H`)Bk@8Gmd?G{qoHt zn{`J6&7b;wV3piFFIvJE`LH-%p3L0kQHfMWWh0?S6#=YG$pz*nhbBXr;WcqT74zr* zMYNuOS3=4B^a~_&%Q7n9e$T-uEn7y;-T`rNS3|8{ayLa?JRJAkaHc$5u|d3=CJX{< z4txQ3xkxQBc{R%CaeyIzx15?|04Ja}*Ki6p>n2#ptA}~pV;<)hDYsoyUkx~0`^MzR zpl{}l$Vj~N!VGKo&s}zrbtbq~PKj972H@0ssNygmyn!NQi-h3}%EM`UHXOu>R{tsu z|0g3p5&tLQ@Lt?ag5PDpB0foB;FcmvalBiETUL{?i71FZl)ONv`JF%=d*rcs{~k{0n#%JO>tm#o)Ht zH~%!1yh!fAjZfG@?p#+!AN$O4Dqj}<5!>~{>{G={F1SqoqV4{JQ;f%-u6l9Z2#?L% z{#T6j$~+IAxs5iMDw37L_iL~XRLZAE)3Jv$BpO>oV%nF8Wl$Va+22BiAGgN&P+#d# zXqa?;-vZJ~)Aujs#z^v!ePYR<)WV@~v1ynaqNoU)AMWo*{tvM^Sk9R{Rjb>f3O}1_ z3QAxt1yMplSV)+;y^Oi^MpzW%X06M7_=TE{W@pA#>bAQk9zOJ2c zyAI%$)i$sFhnzePM|FXmzXz*S$v&FtbNXugxYs>i(=3RX5@U*dYFpFZvv0L)KH}@9 zBYSOXcX41M#=pH3%Isy!KFsvW1NbNF-lbfI)3 zmAh?Tm>Y(W^#qaEBBItI%WRX){>u1_p)^n}6d3DWqkcKIhaB4wn8X z4w$VYC;G5_x_9#@;f$^D%GrMVNRRo6h)c2Mqivlu9;&CB`}r@SYG|-H`ScHu&d!XC z>5>r?uFr@H>Y5d;56X<`5*3u4t&hx#&J2(08WY__QOQG((pc_zmhRANB0j!y9J#TF z^hhf6Fy4R636bYdqqB`3!N)v){v&t<%BeHPXYtLS!X(~2PvNwKpZko)@NfP`4t(pU zFl5%$-J)N4&g1n{rjO5?sGnq*s?VA{HM=fz``t%=zl0oel>S0gB`V41dB-S`_BKA# zLaCpYHoh*k+S-hE;^b_7?zFUDH8#zVVbD+3>nBd0WEf|dY{TmAh@a*t1`8QE$>b9vJl8gd^$iNjAa@~U$b%ze&NFL&|9r|$Bz z97jZ0<-|WG`?j7bNezQG#5!n0^abrdk;g3br_@* z7H@n~I%o-D^y?Jfw-gR#%S2=5J zk^`l(D&M9y3HK|fZYamwo=3Tf{g|UB*rGxggu{?%o%$V1ieM!gJ#fmG3jBNW_;1OZ zA2^S_L!4@%d!|?%l$0=Gu@{p^vleqKWX$4== zmz{Cx4HvHNaN_gF=Cf5!fXCdqjlv15Fgy-id;CSF@kZNx5T zj~Z`ey-F@oC->G?CrR7~T4E6w&T``GVgZ@&iuG{3VLX;GeNGmXLqE$qaYu*DS$uY~8n*>h>+xP1>5Rq@`(` zCQu9O#)ao?p<=OZ(LK`kL&o;wjCK1W4}X<9F|Kxv`ook|jgO zjR(mn8LPpOA;D=4i$vG26D z4EJe@RQ}d3s*)|0WMn0kWO*e2nOj~XUDr&^pK5z|_;o+<%_Rn96d9!}(DZcCsIsR)FTJdGJ?h3F7pG@pt z{;L++y#K^iwAF7{9APjYY6bphtyaVN^QWnkbyNN)+DKV9kZFluiC}d&7qjWV3!*)2n>NN%l0K zpk*aee(yB-gez<2iZ6VkO{YOvG;(mNsmF(5#g-7L|z`u`ZndI-Ehcm`I+9JN0Y9jN-CWCnY^bv^H;4lv8x=PDTc^# zcC34||9`PJ<)%;;DK|@C@2hyiPvk0Jj$l`t^UOPN?Q0G*XYQEHs_E#j22uL?hBJO( zpyAgpF;|r^$9tr(AEUS_g^gK#g{_iq4^Njn^nRsCY8~1PXGZ`;c1tgFI2_*5i=ivPI#C{g2 zDXV0x@(9~*$6aT#%N$=sC)IUqh#RKazGLj_e`Lo_sHDu(o+Uk4s&zWc-Y3{zJ3jSG zHoWm?TCiQOKp>UYakY*bhk|)X<(Jfw?+#x6(6FI2ERp8qvV`#*2Cww3?@ delta 10366 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 T1970{hOn-u+tv0nPvHRobAld@ delta 80 zcmaDqoqyMKel7++0R}KIn11jgqtaxDIQB;4R%6CiW2UXf%qfA4Zj&z-SWi}X%e`GV dh}kSxXmhC`SiLTgl>Hp)(tmGz^nT_kJOGq`7hV7W diff --git a/PVDEMCS/.vs/ProjectEvaluation/pvdemcs.projects.v7.bin b/PVDEMCS/.vs/ProjectEvaluation/pvdemcs.projects.v7.bin index 348a4a47c94453e7cf5d0768bf8e40b11aafe7b1..dbe400bdbc2386ed0019c94766941b9dcf2a5574 100644 GIT binary patch delta 157 zcmaDo%lG!r=!O=?7N!>F7M2#)7Pc1l7LFFq7OocV7M>Q~7QPn#7J(MQ7NIS|*}l`y zE#zmLKKnRZF7M2#)7Pc1l7LFFq7OocV7M>Q~7QPn#7J(MQ7NIS|*}ed+ CArJHb diff --git a/PVDEMCS/PVDEMCS/Common/Constant/Constant.cs b/PVDEMCS/PVDEMCS/Common/Constant/Constant.cs index 5a23d58..5735102 100644 --- a/PVDEMCS/PVDEMCS/Common/Constant/Constant.cs +++ b/PVDEMCS/PVDEMCS/Common/Constant/Constant.cs @@ -39,6 +39,28 @@ public const String CemeCon = "CemeCon"; } + /// + /// 设备类型补偿 + /// + public sealed class EquipmentTypeOffset + { + /// + /// Ionbond补偿时间 + /// + public const String IonbondOffset = "IonbondOffset"; + + /// + /// Balzers补偿时间 + /// + public const String BalzersOffset = "BalzersOffset"; + + /// + /// Cemecon补偿时间 + /// + public const String CemeConOffset = "CemeConOffset"; + } + + /// /// 设备状态 /// diff --git a/PVDEMCS/PVDEMCS/Controllers/EquipmentRecordController.cs b/PVDEMCS/PVDEMCS/Controllers/EquipmentRecordController.cs index c7996b0..f93b0ad 100644 --- a/PVDEMCS/PVDEMCS/Controllers/EquipmentRecordController.cs +++ b/PVDEMCS/PVDEMCS/Controllers/EquipmentRecordController.cs @@ -196,6 +196,20 @@ namespace PVDEMCS.Controllers return result; } + /// + /// 获取设备OEE信息 + /// + /// 设备Id + /// 开始时间 + /// 结束时间 + /// + [HttpGet] + public Result GetEquipmentOEEMonthTotal(string equipmentId, DateTime begDate, DateTime endDate) + { + var result = _equipmentRecordService.GetEquipmentOEEMonthTotal(equipmentId, begDate, endDate); + return result; + } + /// /// 获取设备总览 /// @@ -308,6 +322,16 @@ namespace PVDEMCS.Controllers return result; } + /// + /// 获取设备记录OEE月统计 + /// + /// + [HttpGet] + public Result> GetEquipmentRecordOEEMonthTotal() + { + var result = _equipmentRecordService.GetEquipmentRecordOEEMonthTotal(); + return result; + } #endregion } diff --git a/PVDEMCS/PVDEMCS/Properties/PublishProfiles/FolderProfile.pubxml.user b/PVDEMCS/PVDEMCS/Properties/PublishProfiles/FolderProfile.pubxml.user index f281e63..0cde044 100644 --- a/PVDEMCS/PVDEMCS/Properties/PublishProfiles/FolderProfile.pubxml.user +++ b/PVDEMCS/PVDEMCS/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121. <_PublishTargetUrl>D:\Source\PVDEMCS\PVDEMCS\PVDEMCS\bin\Release\net6.0\publish\ - True|2023-11-07T09:29:34.5426043Z;True|2023-11-07T14:03:31.4977185+08:00;True|2023-11-06T20:18:02.9796262+08:00;True|2023-11-06T17:16:40.7384677+08:00;True|2023-11-06T17:10:54.2886424+08:00;True|2023-11-06T15:15:13.8945359+08:00;True|2023-11-06T14:37:56.4570851+08:00;True|2023-11-04T09:50:29.5867049+08:00; + True|2023-11-14T08:47:26.4184708Z;True|2023-11-07T17:29:34.5426043+08:00;True|2023-11-07T14:03:31.4977185+08:00;True|2023-11-06T20:18:02.9796262+08:00;True|2023-11-06T17:16:40.7384677+08:00;True|2023-11-06T17:10:54.2886424+08:00;True|2023-11-06T15:15:13.8945359+08:00;True|2023-11-06T14:37:56.4570851+08:00;True|2023-11-04T09:50:29.5867049+08:00; \ No newline at end of file diff --git a/PVDEMCS/PVDEMCS/Services/IEquipmentRecordService.cs b/PVDEMCS/PVDEMCS/Services/IEquipmentRecordService.cs index e2cad7b..c12da14 100644 --- a/PVDEMCS/PVDEMCS/Services/IEquipmentRecordService.cs +++ b/PVDEMCS/PVDEMCS/Services/IEquipmentRecordService.cs @@ -130,6 +130,21 @@ namespace PVDEMCS.Services /// Result> GetEquipmentRecordFurnaceMonthTotal(); + /// + /// 获取设备记录OEE月统计 + /// + /// + Result> GetEquipmentRecordOEEMonthTotal(); + + /// + /// 获取设备OEE信息 + /// + /// 设备Id + /// 开始时间 + /// 结束时间 + /// + Result GetEquipmentOEEMonthTotal(string equipmentId, DateTime begDate, DateTime endDate); + #endregion } } diff --git a/PVDEMCS/PVDEMCS/Services/Impl/EquipmentRecordService.cs b/PVDEMCS/PVDEMCS/Services/Impl/EquipmentRecordService.cs index fa029f9..0973703 100644 --- a/PVDEMCS/PVDEMCS/Services/Impl/EquipmentRecordService.cs +++ b/PVDEMCS/PVDEMCS/Services/Impl/EquipmentRecordService.cs @@ -198,6 +198,29 @@ namespace PVDEMCS.Services.Impl return result; } + /// + /// 获取设备记录OEE月统计 + /// + /// + public Result> GetEquipmentRecordOEEMonthTotal() + { + var result = this._equipmentRecordRepository.GetEquipmentRecordOEEMonthTotal(); + return result; + } + + /// + /// 获取设备OEE信息 + /// + /// 设备Id + /// 开始时间 + /// 结束时间 + /// + public Result GetEquipmentOEEMonthTotal(string equipmentId, DateTime begDate, DateTime endDate) + { + var result = this._equipmentRecordRepository.GetEquipmentOEEMonthTotal(equipmentId, begDate, endDate); + return result; + } + #endregion } } diff --git a/PVDEMCS/PVDEMCS/Services/Impl/EquipmentService.cs b/PVDEMCS/PVDEMCS/Services/Impl/EquipmentService.cs index 6692703..2eab554 100644 --- a/PVDEMCS/PVDEMCS/Services/Impl/EquipmentService.cs +++ b/PVDEMCS/PVDEMCS/Services/Impl/EquipmentService.cs @@ -84,14 +84,15 @@ namespace PVDEMCS.Services.Impl !startStop.ObjectValue.IsNullOrEmpty() && !fault.ObjectValue.IsNullOrEmpty()) { - var state = EquipmentState.Run; - if (fault.GetValue()) + var state = EquipmentState.Stop; + //如果运行状态比警告状态高,这里先判断运行状态,如果运行状态为false,在判断警告状态 + if (startStop.GetValue()) { - state = EquipmentState.Alarm; + state = EquipmentState.Run; } - else if (!startStop.GetValue()) + else if (fault.GetValue()) { - state = EquipmentState.Stop; + state = EquipmentState.Alarm; } equipmentInfo.State = state; } diff --git a/PVDEMCS/PVDEMCS/Services/Models/EquipmentOEEMonthTotal.cs b/PVDEMCS/PVDEMCS/Services/Models/EquipmentOEEMonthTotal.cs new file mode 100644 index 0000000..68ea088 --- /dev/null +++ b/PVDEMCS/PVDEMCS/Services/Models/EquipmentOEEMonthTotal.cs @@ -0,0 +1,18 @@ +namespace PVDEMCS.Services.Models +{ + /// + /// 设备OEE月统计 + /// + public class EquipmentOEEMonthTotal + { + /// + /// 日期 + /// + public int TotalMonth { get; set; } + + /// + /// OEE值 + /// + public decimal OEE { get; set; } + } +} diff --git a/PVDEMCS/PVDEMCS/Services/Models/EquipmentOEETotal.cs b/PVDEMCS/PVDEMCS/Services/Models/EquipmentOEETotal.cs new file mode 100644 index 0000000..ae0234b --- /dev/null +++ b/PVDEMCS/PVDEMCS/Services/Models/EquipmentOEETotal.cs @@ -0,0 +1,38 @@ +namespace PVDEMCS.Services.Models +{ + /// + /// 设备OEE月统计 + /// + public class EquipmentOEETotal + { + /// + /// 设备Id + /// + public string EquipmentId { get; set; } + + /// + /// 设备类型:Ionbond,Balzers,Cemecon + /// + public string EquipmentType { get; set; } + + /// + /// 总运行时长 + /// + public decimal TotalRunningTime { get; set; } + + /// + /// 总报警时长 + /// + public decimal TotalAlarmTime { get; set; } + + /// + /// 总待机时长 + /// + public decimal TotalStopTime { get; set; } + + /// + /// OEE值 + /// + public decimal OEE { get; set; } + } +} diff --git a/PVDEMCS/PVDEMCS/Services/Models/EquipmentRecordStateOEEMonthTotal.cs b/PVDEMCS/PVDEMCS/Services/Models/EquipmentRecordStateOEEMonthTotal.cs new file mode 100644 index 0000000..3b12a02 --- /dev/null +++ b/PVDEMCS/PVDEMCS/Services/Models/EquipmentRecordStateOEEMonthTotal.cs @@ -0,0 +1,47 @@ +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations.Schema; + +namespace PVDEMCS.Services.Models +{ + /// + /// 设备状态记录OEE月统计 + /// + public class EquipmentRecordStateOEEMonthTotal + { + + /// + /// 设备Id + /// + public string EquipmentId { get; set; } + + /// + /// 设备类型:Ionbond,Balzers,Cemecon + /// + public string EquipmentType { get; set; } + + /// + /// 总运行时长 + /// + public decimal TotalRunningTime { get; set; } + + /// + /// 总报警时长 + /// + public decimal TotalAlarmTime { get; set; } + + /// + /// 总待机时长 + /// + public decimal TotalStopTime { get; set; } + + /// + /// 日期 + /// + public int TotalMonth { get; set; } + + /// + /// OEE值 + /// + public decimal OEE { get; set; } + } +} diff --git a/PVDEMCS/PVDEMCS/Services/Repositories/IEquipmentRecordRepository.cs b/PVDEMCS/PVDEMCS/Services/Repositories/IEquipmentRecordRepository.cs index d4344d0..17e67c0 100644 --- a/PVDEMCS/PVDEMCS/Services/Repositories/IEquipmentRecordRepository.cs +++ b/PVDEMCS/PVDEMCS/Services/Repositories/IEquipmentRecordRepository.cs @@ -133,6 +133,21 @@ namespace PVDEMCS.Services.Repositories /// Result> GetEquipmentRecordFurnaceMonthTotal(); + /// + /// 获取设备记录OEE月统计 + /// + /// + Result> GetEquipmentRecordOEEMonthTotal(); + + /// + /// 获取设备OEE信息 + /// + /// 设备Id + /// 开始时间 + /// 结束时间 + /// + Result GetEquipmentOEEMonthTotal(string equipmentId, DateTime begDate, DateTime endDate); + #endregion } } diff --git a/PVDEMCS/PVDEMCS/Services/Repositories/Impl/EquipmentRecordRepository.cs b/PVDEMCS/PVDEMCS/Services/Repositories/Impl/EquipmentRecordRepository.cs index 8a903e4..c74efd5 100644 --- a/PVDEMCS/PVDEMCS/Services/Repositories/Impl/EquipmentRecordRepository.cs +++ b/PVDEMCS/PVDEMCS/Services/Repositories/Impl/EquipmentRecordRepository.cs @@ -1,12 +1,15 @@ using AngleSharp.Css.Values; using AngleSharp.Dom; using Masuit.Tools; +using Masuit.Tools.DateTimeExt; using Masuit.Tools.Models; using Microsoft.EntityFrameworkCore; +using NLog.LayoutRenderers.Wrappers; using PVDEMCS.Common; using PVDEMCS.Common.Constant; using PVDEMCS.Common.DI; using PVDEMCS.Common.EF; +using PVDEMCS.Common.Tools; using PVDEMCS.Services.Models; using PVDEMCS.Services.Repositories.Entities; using SixLabors.ImageSharp.Processing.Processors.Transforms; @@ -192,15 +195,15 @@ namespace PVDEMCS.Services.Repositories.Impl return result; } var furnaceQuy = (from q in query - join e in context.EquipmentInfos.Where(f => !f.IsDelete) on q.EquipmentId equals e.Id - where q.State == EquipmentState.Run - select new - { - q.EquipmentId, - e.EquipmentType, - q.StartTime, - q.EndTime - }).ToList(); + join e in context.EquipmentInfos.Where(f => !f.IsDelete) on q.EquipmentId equals e.Id + where q.State == EquipmentState.Run + select new + { + q.EquipmentId, + e.EquipmentType, + q.StartTime, + q.EndTime + }).ToList(); //获取配置的设备的阈值 @@ -240,7 +243,7 @@ namespace PVDEMCS.Services.Repositories.Impl value.Create(); context.EquipmentRecordDayTotals.Add(value); } - else + else { value.Update(); } @@ -264,7 +267,7 @@ namespace PVDEMCS.Services.Repositories.Impl } value.FurnaceNum = 0; //出炉数量 - var furnaceList = furnaceQuy.Where(f => f.EquipmentId == value.EquipmentId && value.TotalDay.Value.ToString("yyyy-MM-dd")==f.StartTime.ToString("yyyy-MM-dd")).ToList(); + var furnaceList = furnaceQuy.Where(f => f.EquipmentId == value.EquipmentId && value.TotalDay.Value.ToString("yyyy-MM-dd") == f.StartTime.ToString("yyyy-MM-dd")).ToList(); foreach (var furnace in furnaceList) { //计算开炉次数 @@ -618,6 +621,215 @@ namespace PVDEMCS.Services.Repositories.Impl } } + /// + /// 获取设备记录OEE月统计 + /// + /// + public Result> GetEquipmentRecordOEEMonthTotal() + { + //获取今年第一天和最后一天 + var begDate = DateTime.Now.ToString("yyyy-01-01"); + var endDate = DateTime.Parse(begDate).AddYears(1).AddSeconds(-1).ToString("yyyy-MM-dd"); + using (var context = new EFContext()) + { + var sql = $@"SELECT + info.id AS EquipmentId, + info.equipment_type AS EquipmentType, + SUM( total_running_time ) AS TotalRunningTime, + MONTH ( total_day ) AS TotalMonth + + FROM + equipment_record_day_total a + JOIN equipment_info info ON a.equipment_id = info.id + WHERE + total_day >= '{begDate}' + AND total_day <= '{endDate}' + GROUP BY + TotalMonth, + EquipmentId, + EquipmentType"; + + var list = EFSqlHelper.FromSqlQuery(context, sql).ToArray(); + + //计算OEE + //获取配置的设备的初尝值 + var balzersConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentTypeOffset.BalzersOffset).Content; + var cemeconConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentTypeOffset.CemeConOffset).Content; + var ionbondConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentTypeOffset.IonbondOffset).Content; + var balzers = 0m; + var cemecon = 0m; + var ionbond = 0m; + if (balzersConfig != null && !balzersConfig.ConfigValue.IsNullOrEmpty()) + { + decimal.TryParse(balzersConfig.ConfigValue, out balzers); + } + if (cemeconConfig != null && !cemeconConfig.ConfigValue.IsNullOrEmpty()) + { + decimal.TryParse(cemeconConfig.ConfigValue, out cemecon); + } + if (ionbondConfig != null && !ionbondConfig.ConfigValue.IsNullOrEmpty()) + { + decimal.TryParse(ionbondConfig.ConfigValue, out ionbond); + } + + foreach (var item in list) + { + var days = 0; + var minutes = 0; + var now = DateTime.Now; + //如果在本月 + if (item.TotalMonth == DateTime.Now.Month) + { + //初尝值不包括今天 + days = now.Day - 1; + //获取当月到当前的分钟 + minutes = days * 60 * 24 + (now.Hour - 1) * 60 + now.Minute; + } + else + { + days = new DateTime(now.Year, item.TotalMonth, 1).GetDaysOfMonth(); + minutes = days * 60 * 24; + } + var value = 0m; + switch (item.EquipmentType) + { + case EquipmentType.Balzers: + value = days * balzers; + break; + case EquipmentType.Ionbond: + value = days * ionbond; + break; + case EquipmentType.CemeCon: + value = days * cemecon; + break; + default: + break; + } + if (minutes > 0) + { + item.OEE = (item.TotalRunningTime + value) / minutes; + } + } + + var result = list.GroupBy(f => f.TotalMonth).Select(f => new EquipmentOEEMonthTotal + { + TotalMonth = f.Key, + OEE = Math.Round(f.Sum(f => f.OEE) / f.Count(), 2) + }).ToList(); + + return new Result>(result); + + } + } + + /// + /// 获取设备OEE信息 + /// + /// 设备Id + /// 开始时间 + /// 结束时间 + /// + public Result GetEquipmentOEEMonthTotal(string equipmentId, DateTime begDate, DateTime endDate) + { + //获取今年第一天和最后一天 + var beg = begDate.ToString("yyyy-MM-dd"); + var end = endDate.AddDays(1).ToString("yyyy-MM-dd"); + EquipmentOEETotal ret = null; + + using (var context = new EFContext()) + { + var sql = $@"SELECT + info.id AS EquipmentId, + info.equipment_type AS EquipmentType, + SUM( total_running_time ) AS TotalRunningTime, + SUM( total_alarm_time ) AS TotalAlarmTime, + SUM( total_stop_time ) AS TotalStopTime + FROM + equipment_record_day_total a + JOIN equipment_info info ON a.equipment_id = info.id + WHERE + info.id = '{equipmentId}' + AND total_day >= '{beg}' + AND total_day <= '{endDate}' + GROUP BY + EquipmentId, + EquipmentType"; + + var list = EFSqlHelper.FromSqlQuery(context, sql).ToArray(); + + if (list.Length > 0) + { + var detail = list[0]; + + //获取配置的设备的初尝值 + var balzersConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentTypeOffset.BalzersOffset).Content; + var cemeconConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentTypeOffset.CemeConOffset).Content; + var ionbondConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentTypeOffset.IonbondOffset).Content; + var balzers = 0m; + var cemecon = 0m; + var ionbond = 0m; + if (balzersConfig != null && !balzersConfig.ConfigValue.IsNullOrEmpty()) + { + decimal.TryParse(balzersConfig.ConfigValue, out balzers); + } + if (cemeconConfig != null && !cemeconConfig.ConfigValue.IsNullOrEmpty()) + { + decimal.TryParse(cemeconConfig.ConfigValue, out cemecon); + } + if (ionbondConfig != null && !ionbondConfig.ConfigValue.IsNullOrEmpty()) + { + decimal.TryParse(ionbondConfig.ConfigValue, out ionbond); + } + + var now = DateTime.Now; + var minutes = 0m; + var days = 0m; + if (endDate >= now) + { + days = Convert.ToDecimal((now - begDate).TotalDays); + } + else + { + days = Convert.ToDecimal((endDate - begDate).TotalDays); + } + if (end == DateTime.Now.ToString("yyyy-MM-dd")) + { + days = days - 1; + minutes = days * 60 * 24 + (now.Hour - 1) * 60 + now.Minute; + } + else + { + minutes = days * 60 * 24; + } + + var value = 0m; + switch (detail.EquipmentType) + { + case EquipmentType.Balzers: + value = days * balzers; + break; + case EquipmentType.Ionbond: + value = days * ionbond; + break; + case EquipmentType.CemeCon: + value = days * cemecon; + break; + default: + break; + } + if (minutes > 0) + { + detail.OEE = Math.Round((detail.TotalRunningTime + value) / minutes,2); + } + + + ret = ModelTools.PubClone.Trans(detail); + } + + return new Result(ret); + } + } + #endregion } }