From e5cf995af5e91bcf4668bf2bc8f5b1d95ac12958 Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Fri, 1 Dec 2023 17:23:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9F=BA=E7=A1=80=E6=90=AC=E8=BF=90?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lms/nladmin-system/doc/wms.xls | Bin 305664 -> 307712 bytes .../coderule/impl/SysCodeRuleServiceImpl.java | 5 +- .../service/quartz/utils/ExecutionJob.java | 2 + .../cockpit/controller/CockpitController.java | 45 ++ .../wms/cockpit/service/CockpitService.java | 15 + .../service/dao/mapper/CockpitMapper.java | 30 ++ .../service/dao/mapper/CockpitMapper.xml | 73 ++++ .../service/impl/CockpitServiceImpl.java | 302 ++++++++++++++ .../material/service/dao/MdBaseMaterial.java | 4 + .../service/dto/MdBaseMaterialDto.java | 5 + .../ext/controller/AcsToWmsController.java | 8 + .../nl/wms/ext/service/AcsToWmsService.java | 6 + .../ext/service/impl/AcsToWmsServiceImpl.java | 26 +- .../pdm/service/IPdmBdWorkorderService.java | 28 ++ .../dao/mapper/PdmBdWorkorderMapper.java | 2 + .../dao/mapper/PdmBdWorkorderMapper.xml | 8 + .../impl/PdmBdWorkorderServiceImpl.java | 48 +++ .../ISchBaseVehiclematerialgroupService.java | 8 + .../SchBaseVehiclematerialgroupMapper.java | 1 + ...chBaseVehiclematerialgroupServiceImpl.java | 13 + .../point/service/ISchBasePointService.java | 11 + .../dao/mapper/SchBasePointMapper.java | 2 + .../service/dao/mapper/SchBasePointMapper.xml | 8 + .../service/impl/SchBasePointServiceImpl.java | 14 + .../impl/SchBaseRegionServiceImpl.java | 3 +- .../sch/task/service/ISchBaseTaskService.java | 2 + .../wms/sch/task/service/dao/SchBaseTask.java | 5 + .../service/impl/SchBaseTaskServiceImpl.java | 18 +- .../nl/wms/sch/task_manage/AbstractTask.java | 62 ++- .../wms/sch/task_manage/AutoCreateTask.java | 4 - .../sch/task_manage/GeneralDefinition.java | 31 +- .../task_manage/enums/PointTypeConstant.java | 21 + .../task_manage/enums/RegionCodeConstant.java | 19 + .../wms/sch/task_manage/task/TaskFactory.java | 25 +- .../sch/task_manage/task/tasks/BPSLTask.java | 228 ---------- .../task_manage/task/tasks/KGHJRKTask.java | 184 --------- .../sch/task_manage/task/tasks/MJXLTask.java | 251 ----------- .../task_manage/task/tasks/TBXBKJTask.java | 190 --------- .../sch/task_manage/task/tasks/XSCKTask.java | 241 ----------- .../task_manage/task/tasks/ZJBZKDDTask.java | 97 ----- .../task/tasks/auto/GHCMLTask.java | 326 +++++++++++++++ .../task/tasks/auto/GHCQLTask.java | 240 +++++++++++ .../task/tasks/auto/mapper/AutoMapper.java | 22 + .../task/tasks/auto/mapper/AutoMapper.xml | 86 ++++ .../task_manage/task/tasks/ghs/GHSFMTask.java | 289 ------------- .../task_manage/task/tasks/ghs/GHSQHTask.java | 311 -------------- .../task_manage/task/tasks/kj/KJQKTask.java | 187 +++++++++ .../task_manage/task/tasks/kj/KJSKTask.java | 237 +++++++++++ .../task/tasks/kj/dto/KJWStatisticsDto.java | 14 + .../task/tasks/kj/mapper/KJSKMapper.java | 17 + .../task/tasks/kj/mapper/KJSKMapper.xml | 50 +++ .../task_manage/task/tasks/tbx/TBXMLTask.java | 389 ++++++++++++++++++ .../task_manage/task/tasks/tbx/TBXQKTask.java | 230 +++++++++++ .../task/tasks/tbx/mapper/TBXMapper.java | 36 ++ .../task/tasks/tbx/mapper/TBXMapper.xml | 108 +++++ .../main/java/org/nl/wms/util/PointUtils.java | 68 ++- .../main/java/org/nl/wms/util/TaskUtils.java | 176 +++++++- .../main/resources/config/application-dev.yml | 4 +- .../resources/config/application-prod.yml | 6 +- .../test/java/org/nl/point/PointCreate.java | 385 +++++++++++++---- .../src/views/wms/basedata/material/index.vue | 40 +- .../src/views/wms/sch/point/index.vue | 6 +- .../src/views/wms/sch/task/index.vue | 7 +- 63 files changed, 3292 insertions(+), 1987 deletions(-) create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/controller/CockpitController.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/service/CockpitService.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/service/dao/mapper/CockpitMapper.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/service/dao/mapper/CockpitMapper.xml create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/service/impl/CockpitServiceImpl.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/PointTypeConstant.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/RegionCodeConstant.java delete mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/BPSLTask.java delete mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/KGHJRKTask.java delete mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/MJXLTask.java delete mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/TBXBKJTask.java delete mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/XSCKTask.java delete mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ZJBZKDDTask.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/auto/GHCMLTask.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/auto/GHCQLTask.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/auto/mapper/AutoMapper.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/auto/mapper/AutoMapper.xml delete mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ghs/GHSFMTask.java delete mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ghs/GHSQHTask.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/KJQKTask.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/KJSKTask.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/dto/KJWStatisticsDto.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/mapper/KJSKMapper.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/mapper/KJSKMapper.xml create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/tbx/TBXMLTask.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/tbx/TBXQKTask.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/tbx/mapper/TBXMapper.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/tbx/mapper/TBXMapper.xml diff --git a/lms/nladmin-system/doc/wms.xls b/lms/nladmin-system/doc/wms.xls index 5d713043e28def251478a6091a2896d30f33297a..ca4e76499055ee50b88f14bb86a1792ad4963a30 100644 GIT binary patch delta 13932 zcmbt)30PA{_xG8bn}jV85CmL9KsIFw1V~uJ4sKOJtt+xbLD>Y{>Jq4Ht5xf@UVXcu zwr*{$3u?43fLd$SSJApvYo)HOR>7_A@;`GEP^|X-p6AOvbI+YKGw1xynKS3kO;Uc+ zq5O)&!l6t(;Wy1=7i}t*lSK?m)>Mg^48|_9(}x>BYkQ6auFFpiaXrVCvNIWDH1~uZ zZC5uYhq9Wxs!GL636WOWNOxOshovsuAS)McjI;w|30$nSE%)5cl1q_#aei`2Wi|vX zU>5`UnFZWCa%Wdy$lM`m@2J2Legy)SFMADgXPjckSeYd479`j)k+kW^-IQB%BQ5Mm zG&f&1MAC=?Er6@EY|Blxx8&wqT62@^Wk~I~_1F%za^ud}+Y#Wd+XrydWYVfn9D-O* z>gpivtf)uTL%I64&aOjI%7Z33z!nM+Kdi60SML0#-uC8R-5YzmnR|=h*lYc-lAGt& z;oM;eq&2Ee!rWmTmHf|MljLDspo=pZ#_2lJ>j;-M+=TWHQa@p42B&a!CPV-2%588> z`S%h3KfPQ=dl%Oc|FFyC?M!ZA`()Rw=HA8j_PjN34QyKhdp6hD-kIcZBb=N$LkCMP z*U65IRWm{zM)s{>C9d1;)1g1xR)5@ za+J{`rGP8;%;0!$7c@k|-SR9!ts}ggIlE{}ZhKcdoW0P?8LyOA?M0=X^$KtuE%@5u z6<;@FQg~C`eUz?TU+*MR$kll|lOk>-a*L?7^osYzi#(jU=9@NPw`4TfH3wUlP$jS0bNl^rcqP>sU_FHCgZ%K{sLcGJTjDVa+hsx|(8*z#C(& zD>X#kjY_K*?jLo{AjMVhc9Rn7Mn7B>e@WF;zjm~_)IWd}EkdOj3jWUAf=G$X<&`k$ z#>wA;4l7+Gx>zwmfpqz}aY1z4oFEFiE+~M@z{SFTy7nlmh+FPMuejKxm>Us10Y{mZ zzcDxfHElW$GlyHyK3ve<8KRd{QOI3Hm7W&5|P;kKm z+*ntY7%!nNl#5Z75h?&C7Tj;X&fF)V)Ps@jxvuWEQqyB&GzY8RDM2}Kw{ZnS zv~@34a#W@rP69bow>@06kPne2(%(%qHD1*8@CAtqwq27FW?qNnyp3L)bB;O z+%%nZPNb5n-w)gBQiL=OVlv z$zZOr6I~3mGBQLkPl#-c<{?6aT5f)+mV!ats%H_r<;}su5^x747 zc)W{iso+CQ5fh2M4saFCkE2pfp5XjSuiPG9d03Tlx&-Hhmvfs_zUfi+lHZ)fyD6qv zIKq_XBqb~sVRAOjEUqd|Tolb5Bb?iiE?na*S5n6vpU|G$IYds5a~0)E?)DHR`I)O7 z>B?=K=1fj8S?FlaNo} zSv))`wg0^Il|#a^=-|0(dWvRA=W%O#yNw(Ih(e& zADt^wbH9C&>$AsVX0FWYyJBWPd!MXRS;M@Y?5A7Xf8TFtncIn8)p<^1 zyR7|Vv-gGVb)V1OwzKW@!@dVfuU++wxAdPE_SunT5vA3^4N=Jn-w|JHMaS@3m-P;* z+m*5(dv|mmdnHeIMRDKhbf@?g4S&zQAE7j4Z2NY1gD<}!wX&w-{@yd0ib-3pTWnjs z->bxJnqh`#$GV93%lCLMdDd^tv&Fw(yq?}&dq6RMPNrL!|6KKwaPDxxw>EZm*+-vG z&a{i^ce7~my!|sr=JmLob=tP$H_P>*pNj8w>m|`19-p1}v_x+kabefhD_3%UJF!){ zWu?QwYkr20+^bHE9Q56{-(K;XdU{V=IxI&re$SL6Jv}*Nx2kU0XRq%&_RYTGc}sk9 z4}bXg!l~niKJhp|`{<;O<2#;+s(EL^=eH_$Wx97xF{-ByeX+$eiubJB@z-CoKTfW0 z_#m>k!WX1exm)asA73~4~u2#DScM28onen!*93Y^Qk-TJbt?Kl=pb2 z=}#`5y^&KDIquMS1)I*qDwuA}*zz@Gv1Hodigq!XibqSX_Q=-qAt+rS%uOrhNU4CLp(9wQB9|AzSwe{DN@)$n^GrX09- zaPYXJpZ!4xNuK{4Hs6)csQ*RH8i7x(o%bMp8 zn~t1K7~Q7Dg4&zchH%{%EZg*O{`Ig6+M``PkF|HWndvyvb7|G} zZQCz?*KXBkx~{nrZn&-N|PzU}tV@8Sc)=^sxvee|UNjbM>=n_b+{* zVO57*(I0c$@9-Vf@JUs`p=DJi=a)>HQSmu+VHP%#2M_P5xZxY(#M|+36<@V#!;rRI z@fDVryAjJa*+mt&h2O_I6KgbPv9(q92O0>;;Z;)NQssT{Tny)ZU$)wUutqx@a?6r= zZq0psu#M5aEs3?}6vw38@&>kd9^_y)u>lE$p&ZkvJ&5W1%##6a({|`na&za%1N%S% z^nwhCLz)4lPz3ovr{=*(n1q~SY-d6tU+YTRP}wY<$gQ~Q$mtGB+2Z`nLaz2|8_aaw zMHaAZ9iT=4pRWNvL)rt=(;m!-bC5noD%}9^o)};n(mP0dZ3L*10F-V5xQ34xm(2ik zG23oHszl%PsRG!C^dZvGnDwUNml1c6_S_0kZH>CN0T@u>0t4PKGJr%Qz;>h;koK_! zNZJmt1L+>5DooXvb^!E87bJWSU_`nJsfRr(-ieBl{s*ZH-?29D2I%4l@WmbgdnbUh zYJlrV=htA0b_N(<3-Bk>oV@^N@Wf_N?*mwaFO0VP0V?nW;`#%?y!HT|2LP6J00{gM z;7fdE%s2>eq7%NU{seHoGeGhofEDPe8%Pr{`PUr=@WnO%?FgPDF_)(w1^5m_}P!Ih$o-% zmO(_$(s{;?L1aHMoJDN71)wd6(9~Z@>tcaDE`Tuq(en$jfahR^83f=Qp+cw(3CcJ} zS{IWH49kD?oFf(nK?p7ocA|F#AvSLnf(!U2A%YBCJnW-pQy^{LDgzhy6&X@9R{olr zl(sowd(H-Xr7Ct|OBua%_Y;1qE!G^xbi{z|AN zd+^xW4G)ADNK4`GYe-kwuP+(o0^dzb!k7z$uZU$F$vOT#EiUnXEz$6cwIq)1b8 zonuJIYojv%$@&smXydEJgddaN>sSPgGy-28-E1#ir#JC2Ilhrky=oqBFsnByrmlID zAj~~)_APu&c5fVy$*(n^4~Zo^2xDxBC3A@7 zvcUv0^9WovmdBIXU7~&`m=)2r)D8ldNOQT2fkXp_W{fKYQ@t>T2H{oGT&@`t@`$5c zGJYX}@I^+jp<>#o+YSv=> zq2+S|k3N5Gmg`c=f8+~Yqmk@Y5W+(aHwa-VlyjpQyL zMaexr(?n*P$T~{y^Z%vfE`P_wbXp^f)KYSvA4bWad<7*p_*F=F$2G)(KSwXZ-HVnx zyUqwPhCeEZ8K^KoHc5qWDdp14hB+DIokFtDHtv-%lfL@+&=&wNTMjfwLaG{@Z5#8bN)!`hcpC#_X`ow&f{+U!X!6P-ZOs1G3LqYsL15hn?oX^1qhAu2muI+2I`Rr0nFcK zFeGA$fpId>L`0Q$5R^v>${(7QM+(XxnUzGgD35HVJhH_Lk*$j%rl?^7d!(e zF#P%HjM7kskB$@g&w)ASG7o5(BRpAk2>8{fEe$=&qu%rsjL->2(3eyih&sUtJc9^E z=vs`>2}XQt-d(yDBXl6~H77cnU3G#LuVq&_gO<)gg}^_X&J1QGUHQQsMBaWh!=fI{ zf_O)kp=MvptN4REDi=Ps`0(_^J6p6*&DVAiCGdaFU~JpDtz#%-}^&70zU+b}chjk;?2nN3aM7kMk6;>^_w<6uo zpE}BT+1KDLo^xR@)_qvF@Umk}hRd&bdjacjSm}B0cdXA*8$aV1GsQUa2WA+HC&M35 z7PWwS_2163fBnQbvfJvI2U0v9jyF&0j+5ScL?w^-PG_0xU5}9nbCmSNwW=eLEiDlo zC-^0o5J5dLQcm!JzcBcFBcJjMGlZPrzxstKB|jTo&M`%VoZ{!4XL?wlCV@Dg?zO&r zqmRhRc<(&ZfiP!?(f$IHZ;Y$}IzB}$GD9cgsni66EPXHH; zPBEgj^tGXjc@lj`{uk87YjL89?2;5wj$NOx^uk{avLvk}z0}p1)l2jrDf{^P<2&1ih#ZO0ae!!qNW2Z>_JwiM zAklOp8VbFPP3a;h>>DcjgJB(xIn-^-5N)$CgyL?G#a{>15Rca+@I$J>Rv_M~@%Wa6 zEk8U$gg_9sO}s$l2P0pDe_4vd@mffPsW2J)6NGUIC@~)I{cw&Jxm1E$&_N|oEulD$ zN{w~IOA?k?6p@63RM-`7OwAQVxbP$Ti?qhw<)V|pJ#5a~{5lMd!?*a$1-&xxfK5SH z*j%^y<8}T*%D-oG|8@RZ%5Rbxf88RwFE)gr`$DmXVWnSB(|i(+G!|i9TZj(Cka&`%v&o}}^9h6Jf`{|1HzYc#4jbbI2| z$?AlVAV`RfPw)%UqNDxPacZ?6dN?%1PaCU6&&DPusa2uz%v4!Ua(+=(X1*Jln^v5e zO^T8-E%HnCHXp{9=riSInOXTxo%@vN6*>Cse7>QVNNPBlUNTM=mpHN5rKnU-Z0!Tn z^#y>x2$ks*^d)TG_$3bU<4VhlEDG}8o12i3SD=9OL46W465@iuTNN1CO%ddyP{fuh z(qLQRC{|`Q%kG_ivGG0MPi$x3D=n>W&rjvdpr!J(l*GjJROp?M_-;meY+QNI#I*F- ze(4p721qR|(~r`ZD8TE`^F0?f-P#6gPh8!)|3Kp**ma`n$93QTAbZ~`9=x_c-gBYC z0;(_7)Ytv@`~Qk+nOMfSb?4bLr}u9=N^E6TeIONjfFfyJVRl(wk*-iNN?(=$x#{JT ziuK+(S!Lx!CDnCP^#K>(Zhzy=|sT^Hdd*C`Dkr zD4wK_tWhX)vVxQ~Gxm2WPS4dB?vunSV2^^y18JZly-1<;*GeTsDsqdGPRQ%_Oc6N4 zzgAj{hufK!v$S?|T@tMhra%X!LaF%PvwK@r&$hL)8EVzxF14|e#EE%j3WF}7heVfH zn4?G?`6JtVgnnX~BJW3$J4qBlK5;K9$;{5zHyPZgxwAtqx~~ks=)Qc>kM2#gtz$gg z-1UH0v5&`9WqmDc^>%HNdJCpA?otCeKT+@z7#l}fSlcX(K-T){3dsRI+vwa#g0Z z%hQb1!o0Hjyv+Q(_b!S04b0A~&nwK)PrQ*{OJ?>=O1(%7%L_}2CUg=N=8P){Co-$b z+>djk1z^-LSi0z70^A%g-~H&$FcI94}mynbL&35>}q zDjMUTmJ51)S*d?~(KwsJGNyM(8Rv!ev~f^JfiT5^LR*t{GX87#NZqJ z5%FTG^b1!iyj?l(t_oFOi}+nXpL95T>T{V@*O(|pu&kt=;@(QK{P5$G=j3&DGOOdr zRnNUbMuFFzNOfJ^y~yczbekh(Rs(bMHY%(a1S=xE2TOhYw^4eiFY3$b&u zbczvQ9c<_HT;imT5nDLX;bX^GIqeA!Ft_~0p}yiKkyCuJW1wSSs1L<2W`p`dwvsdk z>I-u+HNl{m=9P7;Pwp}2Q~Gt%Vont^OZr}U{ktXKbS>BQD!`x9bK=I8l@%3&ak!dY z8OCSLV3nYFb;o@?ML{%lUaw4i{<#+ zBZEhK7GE7Ccz&QC-t9lck$*IqJ!4QoVz4?$qlxo_Ftu9cr&fnRqMs&Fljs)+s@RaA zq&SV*B3`YT6WYI2Ujn5=Rce)1JrrV#ixV=-GKWIXqU_B4q3L=kC?1+PFKDeJjryrS^lUF9n>({r2 z9|?&yyYqC_!8S0Z+;)HWAa#i9K-iqrKD$)@LGinKEUWnFqoE~5MP);$FC;p?Ut&^X zLTb8omZscZvBDm6Phn$ONl|`Gs3PQj2X&}-AS~3mloKnelT?vfqN{jSdLtg2?A}A5kQ!;$*q7bDox6NB#I`C4N#Tdw{ z$A4*zfphI{i-VqsiyVTN?<{Z_`rXAb4rF7NLR+BFj#9|ih>${)EHm&({|B<5Te6@( zg=<=qEX)7q(fjQ~Z^=SK{*+PDB)cTLThj5S%u*2^`>xw`RdO;UInpLV*(tvp5+e3(tmXJo(Y{VH}?F!mvdTcJvIW#&cgH-f8eks~?^- zRe1QLr%PNB6rVR&X#;h$JW;%n=$57?ePLww#aui1qlm*pa008|Se_ z{HTvuIbS`GP2q3OWfgqPJl65!;so(T+~#<$oyUe5zOU(c>A01+$A)Dtz7D}-Zqp5l z2X<(edTnUu6K8d^XJ;<@Ys$WgW2|Jvm@e`M@0kpYp2|Ji1@+{Bx zW>krMI?sCID-`fkd3G@E|AlA$ak#}&)>njyl@D3U`cu9hDM>RfUdmn(5pUz9&sa4+ z-^0Q}RUz?-Nx@-B!LL@O%qpQzT$EBBuTBin#DyejGzm#sQ^mgI_$XyiaF8lEEHNlB zDKVJVq(I}tFW8yHSiYQH%t(K(*}7LzbDMAfB^zQ{en}#{vx&IlVlQL)mu$J@{{ThS B<*on# delta 11921 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 X6=aE;d8YbJ(kD2c#*&Rx3HSd2l8lkl diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/coderule/impl/SysCodeRuleServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/coderule/impl/SysCodeRuleServiceImpl.java index 51ba327..ca71f7f 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/coderule/impl/SysCodeRuleServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/coderule/impl/SysCodeRuleServiceImpl.java @@ -61,7 +61,8 @@ public class SysCodeRuleServiceImpl extends ServiceImpl().eq(SysCodeRule::getCode, code)).getId(); // 如果flag = 1就执行更新数据库的操作 String flag = (String) form.get("flag"); - List ruleDetails = codeRuleDetailMapper.selectList(new LambdaQueryWrapper().eq(SysCodeRuleDetail::getCode_rule_id, id)); + List ruleDetails = codeRuleDetailMapper.selectList(new LambdaQueryWrapper() + .eq(SysCodeRuleDetail::getCode_rule_id, id).orderByAsc(SysCodeRuleDetail::getSort_num)); String demo = ""; boolean isSame = true; for(SysCodeRuleDetail detail : ruleDetails) { @@ -91,7 +92,7 @@ public class SysCodeRuleServiceImpl extends ServiceImpl maxValue) { + if (!isSame || (Long.valueOf(detail.getCurrent_value()) + step) > maxValue) { numValue = detail.getInit_value(); } else { numValue = Integer.parseInt(detail.getCurrent_value()) + step + ""; diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/utils/ExecutionJob.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/utils/ExecutionJob.java index 234c641..e47816a 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/utils/ExecutionJob.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/utils/ExecutionJob.java @@ -12,6 +12,7 @@ import org.nl.system.service.quartz.dao.SysQuartzJob; import org.nl.system.service.quartz.dao.SysQuartzLog; import org.nl.system.service.quartz.dao.mapper.SysQuartzLogMapper; import org.nl.system.service.quartz.impl.SysQuartzJobServiceImpl; +import org.quartz.DisallowConcurrentExecution; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.annotation.Async; @@ -28,6 +29,7 @@ import java.util.concurrent.ThreadPoolExecutor; @Async @SuppressWarnings({"unchecked", "all"}) @Slf4j +@DisallowConcurrentExecution public class ExecutionJob extends QuartzJobBean { /** diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/controller/CockpitController.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/controller/CockpitController.java new file mode 100644 index 0000000..aa32794 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/controller/CockpitController.java @@ -0,0 +1,45 @@ +package org.nl.wms.cockpit.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.logging.annotation.Log; +import org.nl.wms.cockpit.service.CockpitService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Author: lyd + * @Description: 天能数字孪生接口 + * @Date: 2023/11/22 + */ +@RestController +@Api(tags = "数字孪生") +@RequestMapping("/api/Tianneng") +@Slf4j +@SaIgnore +public class CockpitController { + + @Autowired + private CockpitService cockpitService; + + @PostMapping("/getDeviceInfo") + @Log("设备ui") + @ApiOperation("设备ui") + public ResponseEntity equipmentInfo(@RequestParam String deviceCode){ + return new ResponseEntity<>(cockpitService.equipmentInfo(deviceCode), HttpStatus.OK); + } + + @PostMapping("/allDeviceStatus") + @Log("设备ui") + @ApiOperation("设备ui") + public ResponseEntity allDeviceStatus(){ + return new ResponseEntity<>(cockpitService.allDeviceStatus(), HttpStatus.OK); + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/service/CockpitService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/service/CockpitService.java new file mode 100644 index 0000000..3d5e24d --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/service/CockpitService.java @@ -0,0 +1,15 @@ +package org.nl.wms.cockpit.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * @Author: lyd + * @Description: + * @Date: 2023/11/22 + */ +public interface CockpitService { + JSONObject equipmentInfo(String deviceCode); + + JSONArray allDeviceStatus(); +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/service/dao/mapper/CockpitMapper.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/service/dao/mapper/CockpitMapper.java new file mode 100644 index 0000000..7cf01fd --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/service/dao/mapper/CockpitMapper.java @@ -0,0 +1,30 @@ +package org.nl.wms.cockpit.service.dao.mapper; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.apache.ibatis.annotations.Param; + +/** + * @Author: lyd + * @Description: + * @Date: 2023/11/22 + */ +public interface CockpitMapper { + /** + * 获取最近n条工单数据 + * @param deviceCode + * @param number + * @return + */ + JSONArray getDeviceLimitOrders(@Param("deviceCode") String deviceCode, @Param("number") int number); + + JSONObject getVehicleGroupInfo(String vehicleCode, String vehicleType); + + JSONArray getGHSInteriorList(); + + JSONArray getSSXInteriorList(); + + JSONArray getZCList(); + + JSONArray getKJList(); +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/service/dao/mapper/CockpitMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/service/dao/mapper/CockpitMapper.xml new file mode 100644 index 0000000..b8550a6 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/service/dao/mapper/CockpitMapper.xml @@ -0,0 +1,73 @@ + + + + + + + + + + diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/service/impl/CockpitServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/service/impl/CockpitServiceImpl.java new file mode 100644 index 0000000..678b686 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/cockpit/service/impl/CockpitServiceImpl.java @@ -0,0 +1,302 @@ +package org.nl.wms.cockpit.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.nl.wms.cockpit.service.CockpitService; +import org.nl.wms.cockpit.service.dao.mapper.CockpitMapper; +import org.nl.wms.pdm.service.IPdmBdWorkorderService; +import org.nl.wms.pdm.service.dao.PdmBdWorkorder; +import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; +import org.nl.wms.sch.point.service.ISchBasePointService; +import org.nl.wms.sch.point.service.dao.SchBasePoint; +import org.nl.wms.sch.task_manage.enums.RegionCodeConstant; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +/** + * @Author: lyd + * @Description: + * @Date: 2023/11/22 + */ +@Service +public class CockpitServiceImpl implements CockpitService { + + @Autowired + private ISchBasePointService pointService; + @Autowired + private IPdmBdWorkorderService workorderService; + @Autowired + private CockpitMapper cockpitMapper; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + + @Override + public JSONObject equipmentInfo(String deviceCode) { + JSONObject res = new JSONObject(); + + SchBasePoint point = pointService.getById(deviceCode); + List points; + switch (point.getRegion_code()) { + case RegionCodeConstant.COATED_PLATE_LINE_AREA: + // hint: 涂板线是作为一整台设备显示。point:设备点 + points = pointService.getSubSites(deviceCode); + res.put("device_code", deviceCode); + res.put("device_name", point.getPoint_name()); + res.put("mode", "2"); + res.put("status", "1"); + res.put("error", "0"); + res.put("open_time", DateUtil.now()); + res.put("standby_time", 20); + res.put("production_time", 20); + res.put("error_time", 0); + res.put("material", "01200000"); + JSONArray array = new JSONArray(); + for (int i = 0; i < points.size(); i++) { + SchBasePoint pointObj = points.get(i); + JSONObject one = new JSONObject(); + one.put("device_code", pointObj.getPoint_code()); + one.put("device_name", pointObj.getPoint_name()); + one.put("mode", "2"); + one.put("move", "0"); + one.put("material_type", pointObj.getCan_vehicle_type()); + one.put("error", "0"); + array.add(one); + } + res.put("details", array); + // 获取最近3条工单数据 + JSONArray productionTask = cockpitMapper.getDeviceLimitOrders(deviceCode, 3); + res.put("production_tasks", productionTask); + break; + case RegionCodeConstant.CURING_ZONE: + // hint: 固化室,需要显示整个设备+内部位置明细 + points = pointService.getSubSites(deviceCode); // 小固化位置以及进出口(入口是不管的) + res.put("device_code", deviceCode); + res.put("device_name", point.getPoint_name()); + res.put("temperature_setting", 50); + res.put("temperature", 20); + res.put("humidity_setting", 20); + res.put("humidity", 10); + res.put("total_running_time", 8); + res.put("current_stage", 0); + res.put("executing_stage_num", 1); + res.put("device_statue", 1); + JSONArray ghsArray = new JSONArray(); + for (int i = 0; i < points.size(); i++) { + SchBasePoint pointObj = points.get(i); + if (pointObj.getPoint_type().equals("4")) break; + JSONObject one = new JSONObject(); + one.put("device_code", pointObj.getPoint_code()); + one.put("device_name", pointObj.getPoint_name()); + one.put("move", (Integer.parseInt(pointObj.getPoint_status()) - 1)); + one.put("material_type", ObjectUtil.isNotEmpty(pointObj.getVehicle_type()) + ? pointObj.getVehicle_type() : "-"); + ghsArray.add(one); + } + res.put("details", ghsArray); + break; + case RegionCodeConstant.EMPTY_TEMPORARY_STORAGE_AREA: + // 空暂存区 + points = pointService.getSubSites(deviceCode); + res.put("device_code", deviceCode); + res.put("device_name", point.getPoint_name()); + res.put("mode", 0); + res.put("open_time", DateUtil.now()); + res.put("standby_time", 20); + res.put("production_time", 10); + res.put("error_time", 8); + res.put("material_type", ObjectUtil.isNotEmpty(point.getVehicle_type()) + ? point.getVehicle_type() : "-"); + res.put("end_time", "-"); + JSONArray ssxArray = new JSONArray(); + for (int i = 0; i < points.size(); i++) { + SchBasePoint pointObj = points.get(i); + JSONObject one = new JSONObject(); + one.put("device_code", pointObj.getPoint_code()); + one.put("device_name", pointObj.getPoint_name()); + one.put("move", "0"); + ssxArray.add(one); + } + res.put("details", ssxArray); + break; + case RegionCodeConstant.EMPTY_POSITION_AREA: + // 空架位直接显示 + res.put("device_code", deviceCode); + res.put("device_name", point.getPoint_name()); + res.put("move", (Integer.parseInt(point.getPoint_status()) - 1)); + res.put("vehicle_type", ObjectUtil.isNotEmpty(point.getVehicle_type()) + ? point.getVehicle_type() : "-"); + break; + case RegionCodeConstant.STAGING_AREA: + // 货位直接显示,获取组盘信息,组装数据反馈 + res.put("device_code", deviceCode); + res.put("device_name", point.getPoint_name()); + res.put("vehicle_code", ObjectUtil.isNotEmpty(point.getVehicle_code())?point.getPoint_code():"-"); + res.put("vehicle_type", ObjectUtil.isNotEmpty(point.getVehicle_type())?point.getVehicle_type():"-"); + if (ObjectUtil.isNotEmpty(point.getVehicle_type()) && ObjectUtil.isNotEmpty(point.getVehicle_code())) { + JSONObject groupInfo = cockpitMapper.getVehicleGroupInfo(point.getVehicle_code(), + point.getVehicle_type()); + if (ObjectUtil.isNotEmpty(groupInfo)) { + res.put("storage_info", groupInfo); + } + } + break; + } + return res; + } + + @Override + public JSONArray allDeviceStatus() { + JSONArray array = new JSONArray(); + Random random = new Random(); + int lowerBound = 10000; + int upperBound = 18000; + for (int i = 1; i <= 4; i++) { + JSONObject agv = new JSONObject(); + agv.put("device_name", "AGV" + i); + agv.put("device_code", i); + agv.put("device_status", "IDLE"); + agv.put("energyLevel", 80); + agv.put("transportOrder", null); + agv.put("positionX", random.nextInt(upperBound - lowerBound + 1) + lowerBound); + agv.put("positionY", random.nextInt(upperBound - lowerBound + 1) + lowerBound); + agv.put("positionAngle", 90); + array.add(agv); + } + for (int i = 1; i <= 7; i++) { + JSONObject rgv_z = new JSONObject(); + rgv_z.put("vehicle", "RGV-Z-" + i); + rgv_z.put("energyLevel", 80); + rgv_z.put("status", "IDLE"); + rgv_z.put("task_code", null); + rgv_z.put("angle", 90); + rgv_z.put("rfid", "1-" + i + "-2"); + rgv_z.put("Relation_vehicle", null); + rgv_z.put("end_time", null); + rgv_z.put("open_time", DateUtil.now()); + rgv_z.put("standby_time", 0); + rgv_z.put("production_time", 0); + rgv_z.put("error_time", 0); + array.add(rgv_z); + } + for (int i = 1; i <= 13; i++) { + JSONObject rgv_m = new JSONObject(); + rgv_m.put("vehicle", "RGV-M-" + i); + rgv_m.put("energyLevel", 80); + rgv_m.put("status", "IDLE"); + rgv_m.put("angle", 90); + rgv_m.put("rfid", "2-" + i + "-2"); + rgv_m.put("Relation_vehicle", null); + rgv_m.put("end_time", null); + rgv_m.put("open_time", DateUtil.now()); + rgv_m.put("standby_time", 0); + rgv_m.put("production_time", 0); + rgv_m.put("error_time", 0); + array.add(rgv_m); + } + List tbx = pointService.list(new LambdaQueryWrapper().eq(SchBasePoint::getPoint_type, "1") + .eq(SchBasePoint::getRegion_code, "TBX")); + List tbxList = tbx.stream().map(SchBasePoint::getPoint_code).collect(Collectors.toList()); + tbxList.forEach(s -> { + JSONObject object = new JSONObject(); + object.put("device_code", s); + object.put("device_name", s); + object.put("mode", "2"); + object.put("status", "1"); + object.put("error", "0"); + object.put("open_time", DateUtil.now()); + object.put("standby_time", 20); + object.put("production_time", 20); + object.put("error_time", 0); + object.put("material", "01200000"); + array.add(object); + }); + List tbxDjw = pointService.list(new LambdaQueryWrapper().eq(SchBasePoint::getPoint_type, "2") + .eq(SchBasePoint::getRegion_code, "TBX")); + List tbxDjwList = tbxDjw.stream().map(SchBasePoint::getPoint_code).collect(Collectors.toList()); + tbxDjwList.forEach(s -> { + JSONObject object = new JSONObject(); + object.put("device_code", s); + object.put("device_name", s); + object.put("mode", "2"); + object.put("move", "0"); + object.put("error", 0); + array.add(object); + }); + // 缓存位 + List hcx = pointService.list(new LambdaQueryWrapper().eq(SchBasePoint::getPoint_type, "3") + .eq(SchBasePoint::getRegion_code, "TBX")); + List hcxList = hcx.stream().map(SchBasePoint::getPoint_code).collect(Collectors.toList()); + hcxList.forEach(s -> { + JSONObject object = new JSONObject(); + object.put("device_code", s); + object.put("device_name", s); + object.put("move", "0"); + array.add(object); + }); + List gh = pointService.list(new LambdaQueryWrapper().eq(SchBasePoint::getPoint_type, "1") + .eq(SchBasePoint::getRegion_code, "GH")); + List ghList = gh.stream().map(SchBasePoint::getPoint_code).collect(Collectors.toList()); + ghList.forEach(s -> { + JSONObject object = new JSONObject(); + object.put("device_code", s); + object.put("device_name", s); + object.put("temperature_setting", 50); + object.put("temperature", 20); + object.put("humidity_setting", 20); + object.put("humidity", 10); + object.put("total_running_time", 8); + object.put("current_stage", 0); + object.put("executing_stage_num", 1); + object.put("device_statue", 1); + object.put("front_door", 1); + object.put("back_door", 0); + array.add(object); + }); + // 整体 + List kjzc = pointService.list(new LambdaQueryWrapper().eq(SchBasePoint::getPoint_type, "5") + .eq(SchBasePoint::getRegion_code, "KJZC")); + List kjzcList = kjzc.stream().map(SchBasePoint::getPoint_code).collect(Collectors.toList()); + kjzcList.forEach(s -> { + JSONObject object = new JSONObject(); + object.put("device_code", s); + object.put("device_name", s); + object.put("mode", 0); + object.put("open_time", DateUtil.now()); + object.put("standby_time", 20); + object.put("production_time", 10); + object.put("error_time", 8); + object.put("material_type", "1"); + array.add(object); + }); + // 固化室详情 + JSONArray ghsInteriorList = cockpitMapper.getGHSInteriorList(); + JSONObject ghsDetail = new JSONObject(); + ghsDetail.put("ghs_detail", ghsInteriorList); + array.add(ghsDetail); + // 输送线详情 + JSONArray ssxInteriorList = cockpitMapper.getSSXInteriorList(); + JSONObject ssxDetail = new JSONObject(); + ssxDetail.put("ssx_detail", ssxInteriorList); + array.add(ssxDetail); + // 库位 + JSONArray zcList = cockpitMapper.getZCList(); + JSONObject storage = new JSONObject(); + storage.put("storage", zcList); + array.add(storage); + // 空架缓存位 + JSONArray kjList = cockpitMapper.getKJList(); + JSONObject emptyCacheBit = new JSONObject(); + emptyCacheBit.put("empty_cache", kjList); + array.add(emptyCacheBit); + return array; + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dao/MdBaseMaterial.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dao/MdBaseMaterial.java index 7ec52ab..ad5c250 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dao/MdBaseMaterial.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dao/MdBaseMaterial.java @@ -73,5 +73,9 @@ public class MdBaseMaterial implements Serializable { @ApiModelProperty(value = "外部标识") private String ext_id; + @ApiModelProperty(value = "标准数量") + private String standard_qty; + @ApiModelProperty(value = "工艺号") + private String technique_num; } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dto/MdBaseMaterialDto.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dto/MdBaseMaterialDto.java index 56354af..b39701b 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dto/MdBaseMaterialDto.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/database/material/service/dto/MdBaseMaterialDto.java @@ -1,5 +1,6 @@ package org.nl.wms.database.material.service.dto; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; @@ -62,4 +63,8 @@ public class MdBaseMaterialDto implements Serializable { /** 外部标识 */ private String ext_id; + /** 标准数量 */ + private String standard_qty; + /** 工艺号 */ + private String technique_num; } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/controller/AcsToWmsController.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/controller/AcsToWmsController.java index 3e04561..accd3c2 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/controller/AcsToWmsController.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/controller/AcsToWmsController.java @@ -65,6 +65,14 @@ public class AcsToWmsController { return new ResponseEntity<>(acsToWmsService.feedbackState(param), HttpStatus.OK); } + @PostMapping("/againApply") + @Log("二次申请任务") + @ApiOperation("二次申请任务") + @SaIgnore + public ResponseEntity againApply(@RequestBody JSONObject task) { + return new ResponseEntity<>(acsToWmsService.againApply(task), HttpStatus.OK); + } + @PostMapping("/notify") @Log("acs通知wms") @ApiOperation("acs通知wms") diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/AcsToWmsService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/AcsToWmsService.java index cc74c00..3764ea1 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/AcsToWmsService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/AcsToWmsService.java @@ -21,4 +21,10 @@ public interface AcsToWmsService { /** acs通知wms */ BaseResponse notify(JSONObject param); + /** + * 二次请求 + * @param task + * @return + */ + String againApply(JSONObject task); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/AcsToWmsServiceImpl.java index 26ae64b..a7b6465 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/AcsToWmsServiceImpl.java @@ -1,50 +1,32 @@ package org.nl.wms.ext.service.impl; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpStatus; import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.nl.common.exception.BadRequestException; import org.nl.system.service.notice.ISysNoticeService; -import org.nl.system.service.param.ISysParamService; -import org.nl.wms.database.material.service.IMdBaseMaterialService; -import org.nl.wms.database.material.service.dao.MdBaseMaterial; import org.nl.wms.ext.service.AcsToWmsService; import org.nl.wms.ext.service.dto.to.BaseResponse; import org.nl.wms.ext.service.dto.to.wms.FeedBackTaskStatusRequest; import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; -import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; import org.nl.wms.sch.point.service.ISchBasePointService; -import org.nl.wms.sch.point.service.dao.SchBasePoint; import org.nl.wms.sch.task.service.ISchBaseTaskService; import org.nl.wms.sch.task.service.dao.SchBaseTask; import org.nl.wms.sch.task_manage.AbstractTask; -import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum; import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum; -import org.nl.wms.sch.task_manage.enums.PointStatusEnum; -import org.nl.wms.sch.task_manage.enums.WorkOrderStatusEnum; import org.nl.wms.sch.task_manage.task.TaskFactory; import org.nl.wms.sch.task_manage.task.core.TaskStatus; import org.nl.wms.sch.task_manage.task.tasks.mapper.PointMapper; -import org.nl.wms.util.PointUtils; -import org.nl.wms.util.TaskUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; /** * @Author: lyd @@ -181,6 +163,14 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { return BaseResponse.responseOk(requestNo, "反馈成功!"); } + // todo: ??? + @Override + public String againApply(JSONObject task) { + String configCode = task.getString("config_code"); + AbstractTask task1 = taskFactory.getTask(configCode); + return task1.againApply(task.getString("task_id")); + } + /** * 任务阶段反馈最新点位 * todo diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/service/IPdmBdWorkorderService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/service/IPdmBdWorkorderService.java index f926f55..ac8237d 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/service/IPdmBdWorkorderService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/service/IPdmBdWorkorderService.java @@ -40,4 +40,32 @@ public interface IPdmBdWorkorderService extends IService { * @param ids / */ void deleteAll(Set ids); + + /** + * 悲观锁查找工单数据 + * @param id + * @return + */ + PdmBdWorkorder selectByIdLock(String id); + + /** + * 根据编码获取 + * @param orderCode + * @return + */ + PdmBdWorkorder getByCode(String orderCode); + + /** + * 获取设备生产中的工单 + * @param deviceCode + * @return + */ + PdmBdWorkorder getDeviceProductionTask(String deviceCode); + + /** + * 根据对接位获取工单 + * @param deviceCode + * @return + */ + PdmBdWorkorder getDeviceDockingProductionTask(String deviceCode); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/service/dao/mapper/PdmBdWorkorderMapper.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/service/dao/mapper/PdmBdWorkorderMapper.java index 10fd966..9c0c40b 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/service/dao/mapper/PdmBdWorkorderMapper.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/service/dao/mapper/PdmBdWorkorderMapper.java @@ -12,4 +12,6 @@ import org.nl.wms.pdm.service.dto.PdmBdWorkorderQuery; public interface PdmBdWorkorderMapper extends BaseMapper { IPage selectPageLeftJoin(IPage pages, PdmBdWorkorderQuery query); + + PdmBdWorkorder selectByIdLock(String id); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/service/dao/mapper/PdmBdWorkorderMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/service/dao/mapper/PdmBdWorkorderMapper.xml index bc0fe33..6987882 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/service/dao/mapper/PdmBdWorkorderMapper.xml +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/service/dao/mapper/PdmBdWorkorderMapper.xml @@ -29,4 +29,12 @@ + diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/service/impl/PdmBdWorkorderServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/service/impl/PdmBdWorkorderServiceImpl.java index 4ad5956..699b9ab 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/service/impl/PdmBdWorkorderServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/service/impl/PdmBdWorkorderServiceImpl.java @@ -3,6 +3,8 @@ package org.nl.wms.pdm.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -15,6 +17,9 @@ import org.nl.wms.pdm.service.IPdmBdWorkorderService; import org.nl.wms.pdm.service.dao.PdmBdWorkorder; import org.nl.wms.pdm.service.dao.mapper.PdmBdWorkorderMapper; import org.nl.wms.pdm.service.dto.PdmBdWorkorderQuery; +import org.nl.wms.sch.point.service.ISchBasePointService; +import org.nl.wms.sch.point.service.dao.SchBasePoint; +import org.nl.wms.sch.task_manage.enums.WorkOrderStatusEnum; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -32,6 +37,8 @@ public class PdmBdWorkorderServiceImpl extends ServiceImpl queryAll(PdmBdWorkorderQuery query, PageQuery page){ @@ -80,4 +87,45 @@ public class PdmBdWorkorderServiceImpl extends ServiceImpl lam = new QueryWrapper().lambda(); + lam.eq(PdmBdWorkorder::getWorkorder_code, orderCode); + return pdmBdWorkorderMapper.selectOne(lam); + } + + @Override + public PdmBdWorkorder getDeviceProductionTask(String deviceCode) { + if (ObjectUtil.isEmpty(deviceCode)) { + throw new BadRequestException("根据设备查询工单,设备编码不能为空"); + } + // 只能有一个生产中 + LambdaQueryWrapper lam = new QueryWrapper().lambda(); + lam.eq(PdmBdWorkorder::getPoint_code, deviceCode) + .eq(PdmBdWorkorder::getWorkorder_status, WorkOrderStatusEnum.PRODUCING.getCode()); + return pdmBdWorkorderMapper.selectOne(lam); + } + + @Override + public PdmBdWorkorder getDeviceDockingProductionTask(String deviceCode) { + if (ObjectUtil.isEmpty(deviceCode)) { + throw new BadRequestException("根据设备查询工单,设备编码不能为空"); + } + // 查找父类设备 + SchBasePoint basePoint = pointService.getById(deviceCode); + // 只能有一个生产中 + LambdaQueryWrapper lam = new QueryWrapper().lambda(); + lam.eq(PdmBdWorkorder::getPoint_code, basePoint.getParent_point_code()) + .eq(PdmBdWorkorder::getWorkorder_status, WorkOrderStatusEnum.PRODUCING.getCode()); + return pdmBdWorkorderMapper.selectOne(lam); + } + } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/ISchBaseVehiclematerialgroupService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/ISchBaseVehiclematerialgroupService.java index f4c154d..c2e0538 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/ISchBaseVehiclematerialgroupService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/ISchBaseVehiclematerialgroupService.java @@ -49,4 +49,12 @@ public interface ISchBaseVehiclematerialgroupService extends IService selectPageLeftJoin(IPage pages, SchBaseVehiclematerialgroupQuery query); SchBaseVehiclematerialgroup getGroup(JSONObject entity); + } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/impl/SchBaseVehiclematerialgroupServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/impl/SchBaseVehiclematerialgroupServiceImpl.java index 3a97dec..ab13929 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/impl/SchBaseVehiclematerialgroupServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/impl/SchBaseVehiclematerialgroupServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -19,6 +20,7 @@ import org.nl.wms.sch.group.service.dto.SchBaseVehiclematerialgroupQuery; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Map; import java.util.Set; @@ -79,4 +81,15 @@ public class SchBaseVehiclematerialgroupServiceImpl extends ServiceImpl lambda = new QueryWrapper().lambda(); + lambda.eq(SchBaseVehiclematerialgroup::getVehicle_code, vehicleCode) + .eq(SchBaseVehiclematerialgroup::getVehicle_type, vehicleType) + .eq(SchBaseVehiclematerialgroup::getGroup_bind_material_status, status) + .eq(SchBaseVehiclematerialgroup::getIs_delete, false); + List selectOne = vehiclematerialgroupMapper.selectList(lambda); + return selectOne.size() > 0 ? selectOne.get(0) : null; + } + } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/ISchBasePointService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/ISchBasePointService.java index 4e9ad65..40cd21a 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/ISchBasePointService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/ISchBasePointService.java @@ -62,4 +62,15 @@ public interface ISchBasePointService extends IService { */ void updateStatus(JSONObject jsonObject); + /** + * 获取子点位 + * @param deviceCode + * @return + */ + List getSubSites(String deviceCode); + /** + * 行锁获取对应点位 + * @return + */ + SchBasePoint selectByIdLock(String id); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/mapper/SchBasePointMapper.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/mapper/SchBasePointMapper.java index 2e0fe47..fae52a4 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/mapper/SchBasePointMapper.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/mapper/SchBasePointMapper.java @@ -17,4 +17,6 @@ public interface SchBasePointMapper extends BaseMapper { * @param used */ void batchChangeUsed(List pointCodes, Boolean used); + + SchBasePoint selectByIdLock(String id); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/mapper/SchBasePointMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/mapper/SchBasePointMapper.xml index 66342b0..b839445 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/mapper/SchBasePointMapper.xml +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/mapper/SchBasePointMapper.xml @@ -12,4 +12,12 @@ + diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/impl/SchBasePointServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/impl/SchBasePointServiceImpl.java index 431cbd1..2204423 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/impl/SchBasePointServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/impl/SchBasePointServiceImpl.java @@ -6,6 +6,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -200,4 +201,17 @@ public class SchBasePointServiceImpl extends ServiceImpl getSubSites(String deviceCode) { + LambdaQueryWrapper lam = new QueryWrapper().lambda(); + lam.eq(SchBasePoint::getParent_point_code, deviceCode) + .ne(SchBasePoint::getPoint_code, deviceCode); + return pointMapper.selectList(lam); + } + + @Override + public SchBasePoint selectByIdLock(String id) { + return pointMapper.selectByIdLock(id); + } + } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/region/service/impl/SchBaseRegionServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/region/service/impl/SchBaseRegionServiceImpl.java index d8cb4e6..ddbea58 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/region/service/impl/SchBaseRegionServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/region/service/impl/SchBaseRegionServiceImpl.java @@ -89,7 +89,8 @@ public class SchBaseRegionServiceImpl extends ServiceImpl getRegionList(SchBaseRegion region) { return schBaseRegionMapper.selectList(new LambdaQueryWrapper() - .eq(ObjectUtil.isNotEmpty(region), SchBaseRegion::getIs_has_workder, true)); + .eq(ObjectUtil.isNotEmpty(region), SchBaseRegion::getIs_has_workder, true) + .orderByAsc(SchBaseRegion::getOrder_seq)); } @Override diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/ISchBaseTaskService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/ISchBaseTaskService.java index b04e381..331278c 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/ISchBaseTaskService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/ISchBaseTaskService.java @@ -99,4 +99,6 @@ public interface ISchBaseTaskService extends IService { * @param param */ void operation(Map param); + + SchBaseTask getByCode(String taskCode); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/dao/SchBaseTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/dao/SchBaseTask.java index 3b33d43..9ded2bd 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/dao/SchBaseTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/dao/SchBaseTask.java @@ -1,6 +1,7 @@ package org.nl.wms.sch.task.service.dao; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; @@ -125,5 +126,9 @@ public class SchBaseTask implements Serializable { @ApiModelProperty(value = "点位2高度") private String point_code2_height="0"; + @ApiModelProperty(value = "取货等待点") + private String start_wait_point; + @ApiModelProperty(value = "放货等待点") + private String next_wait_point; } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java index 149a02f..18e8adc 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -218,14 +219,14 @@ public class SchBaseTaskServiceImpl extends ServiceImpl param) { - String task_id = ObjectUtil.isNotEmpty(param.get("task_id")) ? param.get("task_id").toString() : null; + String task_code = ObjectUtil.isNotEmpty(param.get("task_code")) ? param.get("task_code").toString() : null; String method_name = ObjectUtil.isNotEmpty(param.get("method_name")) ? param.get("method_name").toString() : null; String config_code = ObjectUtil.isNotEmpty(param.get("config_code")) ? param.get("config_code").toString() : null; - if (ObjectUtil.isEmpty(task_id) || ObjectUtil.isEmpty(method_name) || ObjectUtil.isEmpty(config_code)) { + if (ObjectUtil.isEmpty(task_code) || ObjectUtil.isEmpty(method_name) || ObjectUtil.isEmpty(config_code)) { throw new BadRequestException("操作失败"); } // 根据标识找到任务 - SchBaseTask taskOne = schBaseTaskMapper.selectById(task_id); + SchBaseTask taskOne = this.getByCode(task_code); if (Integer.parseInt(taskOne.getTask_status()) >= Integer.parseInt(TaskStatus.FINISHED.getCode())) { throw new BadRequestException("任务已完成或已取消!"); } @@ -241,14 +242,21 @@ public class SchBaseTaskServiceImpl extends ServiceImpl lam = new QueryWrapper().lambda(); + lam.eq(SchBaseTask::getTask_code, taskCode); + return this.getOne(lam); + } + } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java index 2bebcc8..aa80c17 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java @@ -1,10 +1,12 @@ package org.nl.wms.sch.task_manage; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.nl.common.exception.BadRequestException; +import org.nl.config.SpringContextHolder; import org.nl.wms.database.material.service.IMdBaseMaterialService; import org.nl.wms.database.material.service.dao.MdBaseMaterial; import org.nl.wms.ext.service.dto.to.BaseResponse; @@ -20,8 +22,10 @@ import org.nl.wms.sch.task_manage.enums.TaskDirectionEnum; import org.nl.wms.sch.task_manage.enums.WorkOrderStatusEnum; import org.nl.wms.sch.task_manage.task.AcsUtil; import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.util.TaskUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.HashMap; @@ -53,6 +57,15 @@ public abstract class AbstractTask { */ protected abstract void create() throws BadRequestException; + /** + * 任务创建 + * 只会创建完整的任务,创建失败则抛出异常 + * + * @param task + */ + protected void createCompletion(SchBaseTask task) { + } + /** * @return WCS的任务集合 @@ -123,6 +136,15 @@ public abstract class AbstractTask { protected abstract void updateStatus(String task_code, TaskStatus status); + /** + * 首先组盘在下发任务 + * + * @param param 具体参数 + */ + public String setGroupPlate(JSONObject param) { + return ""; + } + /** * 设置起点或者终点 @@ -163,11 +185,13 @@ public abstract class AbstractTask { * @param param * @throws BadRequestException */ + @Transactional(rollbackFor = Exception.class) public void apply(JSONObject param) throws BadRequestException { // 申请任务 SchBaseTask task = new SchBaseTask(); // 任务实体 String apply_point_code = param.getString("device_code"); // 请求点 String config_code = param.getString("config_code"); + String requestNo = param.getString("requestNo"); // 1、校验数据 SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() .eq(SchBaseTaskconfig::getConfig_code, config_code)); @@ -196,8 +220,6 @@ public abstract class AbstractTask { if (ObjectUtil.isEmpty(workorder)) { throw new BadRequestException("设备" + one.getPoint_code() + "工单未生产!"); } - MdBaseMaterial mdBaseMaterial=materialService.getOne(new LambdaQueryWrapper() - .eq(MdBaseMaterial::getMaterial_id,workorder.getMaterial_id())); param.put("workorder_code", workorder.getWorkorder_code()); // 静置时间 // 设置任务数据 task.setVehicle_type(workorder.getVehicle_type()); @@ -208,21 +230,29 @@ public abstract class AbstractTask { return; } // 2、创建申请任务 - task.setAcs_trace_id(param.getString("acs_trace_id")); + task.setAcs_trace_id(requestNo); + task.setTask_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + task.setTask_code(IdUtil.getSnowflake(1, 1).nextIdStr()); task.setConfig_code(config_code); - task.setCreate_mode(param.getString("create_mode")); + task.setCreate_mode(ObjectUtil.isNotEmpty(param.getString("create_mode")) + ? param.getString("create_mode") : GeneralDefinition.ACS_CREATION); task.setVehicle_code(param.getString("vehicle_code")); task.setVehicle_qty(param.getInteger("vehicle_qty")); task.setTask_status(TaskStatus.APPLY.getCode()); task.setWorkshop_code(taskConfig.getWorkshop_code()); // 车间编码 // 设置起/终点 this.setTaskPoint(taskConfig, task, apply_point_code); - task.setExt_group_data(JSONObject.toJSONString(param)); - taskService.create(task); - + task.setRequest_param(JSONObject.toJSONString(param)); + TaskUtils.setCreateByAcsOrPda(task, param); // 设置创建人信息 + AbstractTask bean = SpringContextHolder.getBean(this.getClass()); // 3、判断是否直接找点下发 - if (taskConfig.getIs_immediate_create()) { - this.create(); + if (taskConfig.getIs_immediate_create()) { // 立即创建吧组盘放到具体位置,免得重复创建 + bean.createCompletion(task); + } else { // 不需要立即创建,需要立马组盘 + // 设置组盘 - 需要的话由子类自行实现 + task.setGroup_id(bean.setGroupPlate(param)); + taskService.save(task); // 创建一条单点任务。 + bean.create(); } } @@ -230,16 +260,24 @@ public abstract class AbstractTask { this.updateStatus(task_code, status); } + /** + * @param task_id: 任务标识 + * @return 二次申请的点位 + */ + public String againApply(String task_id) { + return ""; + } + /** * 任务阶段反馈最新点位 * * @param param * @throws BadRequestException */ - public void feedbackState(JSONObject param,SchBaseTask schBaseTask, BaseResponse result) throws BadRequestException { - this.feedbackTaskState(param,schBaseTask,result); + public void feedbackState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result) throws BadRequestException { + this.feedbackTaskState(param, schBaseTask, result); } - protected abstract void feedbackTaskState(JSONObject param,SchBaseTask schBaseTask,BaseResponse result); + protected abstract void feedbackTaskState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AutoCreateTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AutoCreateTask.java index fa9e62b..42e5c63 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AutoCreateTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AutoCreateTask.java @@ -39,10 +39,6 @@ public class AutoCreateTask { // 调用AbstractAcsTask类的每个子类的schedule()方法 try { Object obj = SpringContextHolder.getBean(clz); -// if (ObjectUtil.isEmpty(obj)) { // 如果spring中获取不到,就用newInstance创建 -// obj = clz.newInstance(); -// } - //Method m = obj.getClass().getDeclaredMethod("schedule"); Method m = obj.getClass().getMethod("schedule"); m.invoke(obj); } catch (InvocationTargetException e) { diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/GeneralDefinition.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/GeneralDefinition.java index 5c72138..6ae6803 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/GeneralDefinition.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/GeneralDefinition.java @@ -21,6 +21,10 @@ public class GeneralDefinition { public static final String MATERIAL_CUP = "LZ"; /** 钢托盘 */ public static final String STEEL_TRAY = "GTP"; + /** 连涂 */ + public static final String CONTINUOUS_COATING = "2"; + /** 普涂 */ + public static final String COMMON_COATING = "1"; // 账号定义 /** acs系统 */ public static final String ACS_ID = "2"; @@ -30,16 +34,6 @@ public class GeneralDefinition { public static final String MES_ID = "3"; /** mes系统 */ public static final String MES_NAME = "MES系统"; - // 点位类型 - /** 设备位 */ - public static final String DEVICE_POINT = "1"; - /** 对接位 */ - public static final String DOCKING_POINT = "2"; - // 出入口 - /**入口**/ - public static final String ENTRANCE = "1"; - /**出口**/ - public static final String EXIT = "2"; // 任务生产方式 /**自动创建**/ public static final String AUTO_CREATION = "1"; @@ -54,11 +48,6 @@ public class GeneralDefinition { public static final String MES_LMS = "3"; /**LMS->MES**/ public static final String LMS_MES = "4"; - // 区域定义 - /** 料盅睏料线区域 */ - public static final String LZKLX = "LZKLX"; - /** 干燥窑区域 */ - public static final String GZY = "GZY"; // 特殊: 1-缓存输送线入口,2-缓存输送线出口,3-上输送线,4-下输送线 /** 上输送线 */ public static final String UPPER_CONVEYOR_LINE = "3"; @@ -78,4 +67,16 @@ public class GeneralDefinition { public static final String TASK_FINISH = "任务完成"; /** 任务取消 */ public static final String TASK_CANCEL = "任务取消"; + // 固化方案 + /** 不混料 */ + public static final String NOT_MIXING = "1"; + /** 可混料 */ + public static final String CAN_MIXING = "2"; + /** 自定义混料 */ + public static final String CUSTOM_MIXING = "3"; + // 出入口 + /**入口**/ + public static final String ENTRANCE = "4"; + /**出口**/ + public static final String EXIT = "3"; } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/PointTypeConstant.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/PointTypeConstant.java new file mode 100644 index 0000000..b18c436 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/PointTypeConstant.java @@ -0,0 +1,21 @@ +package org.nl.wms.sch.task_manage.enums; + +/** + * @Author: lyd + * @Description: 点位类型产量 + * @Date: 2023/11/22 + */ +public class PointTypeConstant { + // 点位类型 + /** 设备位/展示位 */ + public static final String DEVICE_POINT = "1"; + /** 对接位/固化位/暂存位 */ + public static final String DOCKING_POINT = "2"; + /** 缓存位 */ + public static final String CACHE_POINT = "3"; + // 出入口 + /**入口**/ + public static final String ENTRANCE = "4"; + /**出口**/ + public static final String EXIT = "3"; +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/RegionCodeConstant.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/RegionCodeConstant.java new file mode 100644 index 0000000..f6aa8af --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/RegionCodeConstant.java @@ -0,0 +1,19 @@ +package org.nl.wms.sch.task_manage.enums; + +/** + * @Author: lyd + * @Description: 区域编码常量 + * @Date: 2023/11/22 + */ +public class RegionCodeConstant { + /** 固化区域 */ + public final static String CURING_ZONE = "GH"; + /** 空架暂存区域 */ + public final static String EMPTY_TEMPORARY_STORAGE_AREA = "KJZC"; + /** 空架位区域 */ + public final static String EMPTY_POSITION_AREA = "KJW"; + /** 涂板线区域 */ + public final static String COATED_PLATE_LINE_AREA = "TBX"; + /** 暂存区域 */ + public final static String STAGING_AREA = "ZC"; +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/TaskFactory.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/TaskFactory.java index f1c6384..4007844 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/TaskFactory.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/TaskFactory.java @@ -1,7 +1,9 @@ package org.nl.wms.sch.task_manage.task; import org.nl.wms.sch.task_manage.AbstractTask; +import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; @@ -10,33 +12,32 @@ import java.util.Map; /** * @author ldjun - * @version 2.0 + * @version 3.0 * @date 2023年05月16日 16:42 - * @desc 采用获取注解来标识任务类型,并通过扫描和反射的方式来获取任务实例 + * @desc 2.0 采用获取注解来标识任务类型,并通过扫描和反射的方式来获取任务实例 + * 3.0 采用获取所有bean对象判断是否为AbstractTask */ @Component -public class TaskFactory { +public class TaskFactory implements BeanPostProcessor { private final Map taskMap; @Autowired - public TaskFactory(ApplicationContext applicationContext) { + public TaskFactory() { taskMap = new HashMap<>(); - initializeTasks(applicationContext); } - private void initializeTasks(ApplicationContext applicationContext) { - Map taskBeans = applicationContext.getBeansWithAnnotation(TaskType.class); - for (Object taskBean : taskBeans.values()) { - TaskType taskTypeAnnotation = taskBean.getClass().getAnnotation(TaskType.class); - String taskType = taskTypeAnnotation.value(); - taskMap.put(taskType.toUpperCase(), (AbstractTask) taskBean); + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof AbstractTask) { + taskMap.put(beanName, (AbstractTask) bean); } + return bean; } public AbstractTask getTask(String taskType) { if (taskType == null) { return null; } - return taskMap.get(taskType.toUpperCase()); + return taskMap.get(taskType); } } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/BPSLTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/BPSLTask.java deleted file mode 100644 index 27a20db..0000000 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/BPSLTask.java +++ /dev/null @@ -1,228 +0,0 @@ -package org.nl.wms.sch.task_manage.task.tasks; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.extern.slf4j.Slf4j; -import org.nl.common.exception.BadRequestException; -import org.nl.config.MapOf; -import org.nl.wms.ext.service.WmsToAcsService; -import org.nl.wms.ext.service.dto.to.BaseResponse; -import org.nl.wms.pdm.service.IPdmBdWorkorderService; -import org.nl.wms.pdm.service.dao.PdmBdWorkorder; -import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; -import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; -import org.nl.wms.sch.point.service.ISchBasePointService; -import org.nl.wms.sch.point.service.dao.SchBasePoint; -import org.nl.wms.sch.task.service.ISchBaseTaskService; -import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; -import org.nl.wms.sch.task.service.dao.SchBaseTask; -import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; -import org.nl.wms.sch.task_manage.AbstractTask; -import org.nl.wms.sch.task_manage.GeneralDefinition; -import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum; -import org.nl.wms.sch.task_manage.enums.GroupStatusEnum; -import org.nl.wms.sch.task_manage.task.TaskType; -import org.nl.wms.sch.task_manage.task.core.TaskStatus; -import org.nl.wms.sch.task_manage.task.tasks.mapper.PointMapper; -import org.nl.wms.util.PointUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.math.BigDecimal; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @Author: psh - * @Description: 包片上料 - * @Date: 2023/9/28 - */ -@Slf4j -@Component -@TaskType("BPSLTask") -public class BPSLTask extends AbstractTask { - private static String TASK_CONFIG_CODE = "BPSLTask"; - /** - * 入口 - */ - private static String ENTRANCE = "1"; - @Autowired - private ISchBasePointService pointService; - @Autowired - private ISchBaseTaskService taskService; - @Autowired - private ISchBaseTaskconfigService taskConfigService; - @Autowired - private IPdmBdWorkorderService workorderService; - @Autowired - private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; - @Autowired - private PointMapper pointMapper; - @Autowired - private WmsToAcsService wmsToAcsService; - - @Override -// @Transactional(rollbackFor = Exception.class) - protected void create() throws BadRequestException { - // 获取任务 - List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); - // 配置信息 - SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() - .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); - for (SchBaseTask task : tasks) { - String extGroupData = task.getExt_group_data(); - JSONObject jsonObject = JSONObject.parseObject(extGroupData); - String materialType = jsonObject.getString("material_type"); - SchBasePoint point = findNextPoint(jsonObject); - if (ObjectUtil.isEmpty(point)) { - task.setRemark("未找到所需点位!"); - taskService.update(task); - // 消息通知 - log.info("包片上料未找到当前符合条件的点位materialType:{},",materialType); - continue; - } - // 设置起点并修改创建成功状态 - // 取料先去等待点 - task.setPoint_code1(point.getStart_wait_point()); - task.setTask_status(TaskStatus.CREATED.getCode()); - task.setRemark(""); - taskService.update(task); - - //发起任务时先把点位占用,防止发起重复任务 - point.setIng_task_code(task.getTask_code()); - point.setVehicle_qty(point.getVehicle_qty() - 1); - point.setVehicle_type(materialType); - pointService.update(point); - - //下发 - this.renotifyAcs(task); - } - } - - /** - * 判断目标点位 - * 从10-1查找可以物料一致且有货的点位 - * - * @param extGroupData - * @return - */ - private SchBasePoint findNextPoint(JSONObject extGroupData) { - String regionCode = "HCQ1"; - String materialType = extGroupData.getString("material_type"); - List schBasePointList = pointMapper.findPointByRegion(regionCode,"2"); - for(int i=schBasePointList.size()-1;i>=0;i--){ - SchBasePoint schBasePoint=schBasePointList.get(i); - if (!"2".equals(schBasePoint.getPoint_type())&&schBasePoint.getVehicle_qty()!=0 - &&ObjectUtil.isEmpty(schBasePoint.getIng_task_code()) - &&(ObjectUtil.isEmpty(schBasePoint.getVehicle_type())||materialType.equals(schBasePoint.getVehicle_type()))){ - log.info("包片上料任务找到当前符合条件的缓存区位置{}",schBasePoint.getPoint_code()); - return schBasePoint; - } - } - return null; - } - - /** - * 1.取货完毕后起点减少最后一份组盘,并且该组盘视为已结束 - * 2.包片机LMS不记录点位信息,由人工对组盘进行操作 - */ - @Override -// @Transactional(rollbackFor = Exception.class) - protected void updateStatus(String task_code, TaskStatus status) { - // 校验任务 - SchBaseTask taskObj = taskService.getById(task_code); - if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { - throw new BadRequestException("该任务已完成!"); - } - if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { - throw new BadRequestException("该任务已取消!"); - } - String startPoint = taskObj.getPoint_code1(); // 获取起点 - String endPoint = taskObj.getPoint_code2(); // 获取终点 - SchBasePoint startPointObj = pointService.getById(startPoint); - SchBasePoint endPointObj = pointService.getById(endPoint); - // 根据传来的类型去对任务进行操作 - if (status.equals(TaskStatus.EXECUTING)) { // 执行中 - taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); - taskObj.setRemark("执行中"); - } - if (status.equals(TaskStatus.FINISHED)) { // 完成 - List vehicleCodeList = Arrays.stream(startPointObj.getVehicle_code().split(",")).collect(Collectors.toList()); - String vehicleCode=vehicleCodeList.get(vehicleCodeList.size()-1); - SchBaseVehiclematerialgroup one = vehiclematerialgroupService.getOne(new LambdaQueryWrapper() - .eq(SchBaseVehiclematerialgroup::getVehicle_code, vehicleCode) - .eq(SchBaseVehiclematerialgroup::getGroup_bind_material_status, - GroupBindMaterialStatusEnum.BOUND.getValue())); - if (ObjectUtil.isEmpty(one)) { - throw new BadRequestException(vehicleCode + " => " + startPointObj.getVehicle_type() + "的组盘信息未找到"); - } - one.setTask_code(taskObj.getTask_code()); - one.setPoint_code(endPointObj.getPoint_code()); // 当前位置 - one.setPoint_name(endPointObj.getPoint_name()); - one.setMove_way(one.getMove_way()==null?"":(one.getMove_way() + " -> ") + endPointObj.getPoint_code()); - one.setGroup_bind_material_status(GroupBindMaterialStatusEnum.UNBOUND.getValue()); - one.setUpdate_id(GeneralDefinition.ACS_ID); - one.setUpdate_name(GeneralDefinition.ACS_NAME); - one.setUpdate_time(DateUtil.now()); - vehiclematerialgroupService.updateById(one); - // 起点清空 - if (vehicleCodeList.size()==1) { - startPointObj.setVehicle_code(""); - }else{ - StringBuilder vehicle_code=new StringBuilder(); - for(int i=0;i<=vehicleCodeList.size()-2;i++){ - vehicle_code.append(vehicleCodeList.get(i)).append(','); - } - startPointObj.setVehicle_code(vehicle_code.toString()); - } - startPointObj.setIng_task_code(""); - startPointObj.setUpdate_time(DateUtil.now()); - pointService.updateById(startPointObj); - //包片上料完毕后,整排打上记号只允许包片上料 - pointMapper.updatePointType(endPointObj.getPoint_code().substring(0,endPointObj.getPoint_code().length()-2),"1"); - // 任务完成 - taskObj.setTask_status(TaskStatus.FINISHED.getCode()); - taskObj.setGroup_id(one.getGroup_id()); - taskObj.setRemark("任务完成"); - } - if (status.equals(TaskStatus.CANCELED)) { // 取消 - // 终点解锁 - if (ObjectUtil.isNotEmpty(endPointObj)) { - endPointObj.setIng_task_code(""); - pointService.update(endPointObj); - } - // 起点解锁 - if (ObjectUtil.isNotEmpty(startPointObj)) { - startPointObj.setIng_task_code(""); - startPointObj.setVehicle_qty(startPointObj.getVehicle_qty()+1); - pointService.update(endPointObj); - } - taskObj.setRemark("任务取消"); - taskObj.setTask_status(TaskStatus.CANCELED.getCode()); - } - taskService.update(taskObj); - } - - @Override - public void forceFinish(String task_code) { - this.updateStatus(task_code, TaskStatus.FINISHED); - } - - @Override - public void cancel(String task_code) { - this.updateStatus(task_code, TaskStatus.CANCELED); - } - - @Override - protected void feedbackTaskState(JSONObject param,SchBaseTask schBaseTask, BaseResponse result) { - //todo 重算最优点 - JSONObject jsonObject = JSONObject.parseObject(schBaseTask.getExt_group_data()); - SchBasePoint point = this.findNextPoint(jsonObject); - // 设置起点并修改创建成功状态 - schBaseTask.setPoint_code1(point.getPoint_code()); - } -} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/KGHJRKTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/KGHJRKTask.java deleted file mode 100644 index 9b24457..0000000 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/KGHJRKTask.java +++ /dev/null @@ -1,184 +0,0 @@ -package org.nl.wms.sch.task_manage.task.tasks; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.extern.slf4j.Slf4j; -import org.nl.common.exception.BadRequestException; -import org.nl.config.MapOf; -import org.nl.wms.ext.service.WmsToAcsService; -import org.nl.wms.ext.service.dto.to.BaseResponse; -import org.nl.wms.pdm.service.IPdmBdWorkorderService; -import org.nl.wms.pdm.service.dao.PdmBdWorkorder; -import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; -import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; -import org.nl.wms.sch.point.service.ISchBasePointService; -import org.nl.wms.sch.point.service.dao.SchBasePoint; -import org.nl.wms.sch.task.service.ISchBaseTaskService; -import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; -import org.nl.wms.sch.task.service.dao.SchBaseTask; -import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; -import org.nl.wms.sch.task_manage.AbstractTask; -import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum; -import org.nl.wms.sch.task_manage.enums.GroupStatusEnum; -import org.nl.wms.sch.task_manage.task.TaskType; -import org.nl.wms.sch.task_manage.task.core.TaskStatus; -import org.nl.wms.sch.task_manage.task.tasks.mapper.PointMapper; -import org.nl.wms.util.PointUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.math.BigDecimal; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @Author: psh - * @Description: 空固化架入库 - * @Date: 2023/9/28 - */ -@Slf4j -@Component -@TaskType("KGHJRKTask") -public class KGHJRKTask extends AbstractTask { - private static String TASK_CONFIG_CODE = "KGHJRKTask"; - /** - * 入口 - */ - private static String ENTRANCE = "1"; - @Autowired - private ISchBasePointService pointService; - @Autowired - private ISchBaseTaskService taskService; - @Autowired - private ISchBaseTaskconfigService taskConfigService; - @Autowired - private IPdmBdWorkorderService workorderService; - @Autowired - private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; - @Autowired - private PointMapper pointMapper; - @Autowired - private WmsToAcsService wmsToAcsService; - - @Override -// @Transactional(rollbackFor = Exception.class) - protected void create() throws BadRequestException { - // 获取任务 - List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); - - for (SchBaseTask task : tasks) { - // 找终点 - SchBasePoint startPoint = pointService.getOne(new LambdaQueryWrapper() - .eq(SchBasePoint::getPoint_code, task.getPoint_code1())); - SchBasePoint point = findNextPoint(startPoint); - if (ObjectUtil.isEmpty(point)) { - task.setRemark("未找到所需点位!"); - taskService.update(task); - // 消息通知 - log.info("空固化架入库未找到当前符合条件的点位"); - continue; - } - // 设置终点并修改创建成功状态 - task.setPoint_code2(point.getPoint_code()); - task.setTask_status(TaskStatus.CREATED.getCode()); - task.setRemark(""); - taskService.update(task); - - //发起任务时先把点位占用,防止发起重复任务 - point.setIng_task_code(task.getTask_code()); - pointService.update(point); - - //下发 - this.renotifyAcs(task); - } - } - - /** - * 判断目标点位 - * 1.A区的去A区缓存点,B区的去B区 - * 2.倒叙查找,找到满足当前位置数量不足3的即可 - */ - private SchBasePoint findNextPoint(SchBasePoint startPoint) { - String regionCode = null; - if (startPoint.getRegion_code().endsWith("1")) { - //1找A区 - regionCode = "KGHJ1"; - - } else if (startPoint.getRegion_code().endsWith("2")) { - //2找B区 - regionCode = "KGHJ2"; - } - List schBasePointList = pointMapper.findPointByRegion(regionCode,null); - for(int i=schBasePointList.size()-1;i>=0;i--) { - SchBasePoint schBasePoint = schBasePointList.get(i); - if(schBasePoint.getVehicle_qty()<3&& - ObjectUtil.isEmpty(schBasePoint.getIng_task_code())){ - log.info("空固化架放货找到当前符合条件的点位{}",schBasePoint.getPoint_code()); - return schBasePoint; - } - } - return null; - } - - @Override -// @Transactional(rollbackFor = Exception.class) - protected void updateStatus(String task_code, TaskStatus status) { - // 校验任务 - SchBaseTask taskObj = taskService.getById(task_code); - if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { - throw new BadRequestException("该任务已完成!"); - } - if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { - throw new BadRequestException("该任务已取消!"); - } - - String startPoint = taskObj.getPoint_code1(); // 获取起点 - String endPoint = taskObj.getPoint_code2(); // 获取终点 - SchBasePoint startPointObj = pointService.getById(startPoint); - SchBasePoint endPointObj = pointService.getById(endPoint); - // 根据传来的类型去对任务进行操作 - if (status.equals(TaskStatus.EXECUTING)) { // 执行中 - taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); - taskObj.setRemark("执行中"); - } - if (status.equals(TaskStatus.FINISHED)) { // 完成 - // 终点解锁,库存增加 - startPointObj.setIng_task_code(""); - startPointObj.setVehicle_qty(startPointObj.getVehicle_qty()+1); - pointService.update(endPointObj); - - // 任务完成 - taskObj.setTask_status(TaskStatus.FINISHED.getCode()); - taskObj.setRemark("任务完成"); - } - if (status.equals(TaskStatus.CANCELED)) { // 取消 - // 终点解锁 - if (ObjectUtil.isNotEmpty(endPointObj)) { - endPointObj.setIng_task_code(""); - pointService.update(endPointObj); - } - taskObj.setRemark("任务取消"); - taskObj.setTask_status(TaskStatus.CANCELED.getCode()); - } - taskService.update(taskObj); - } - - @Override - public void forceFinish(String task_code) { - this.updateStatus(task_code, TaskStatus.FINISHED); - } - - @Override - public void cancel(String task_code) { - this.updateStatus(task_code, TaskStatus.CANCELED); - } - - @Override - protected void feedbackTaskState(JSONObject param,SchBaseTask schBaseTask, BaseResponse result) { - //todo 重算最优点 - } -} \ No newline at end of file diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/MJXLTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/MJXLTask.java deleted file mode 100644 index e34a3f2..0000000 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/MJXLTask.java +++ /dev/null @@ -1,251 +0,0 @@ -package org.nl.wms.sch.task_manage.task.tasks; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.extern.slf4j.Slf4j; -import org.nl.common.exception.BadRequestException; -import org.nl.wms.ext.service.dto.to.BaseResponse; -import org.nl.wms.pdm.service.IPdmBdWorkorderService; -import org.nl.wms.pdm.service.dao.PdmBdWorkorder; -import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; -import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; -import org.nl.wms.sch.point.service.ISchBasePointService; -import org.nl.wms.sch.point.service.dao.SchBasePoint; -import org.nl.wms.sch.task.service.ISchBaseTaskService; -import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; -import org.nl.wms.sch.task.service.dao.SchBaseTask; -import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; -import org.nl.wms.sch.task_manage.AbstractTask; -import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum; -import org.nl.wms.sch.task_manage.enums.GroupStatusEnum; -import org.nl.wms.sch.task_manage.enums.PointStatusEnum; -import org.nl.wms.sch.task_manage.task.TaskType; -import org.nl.wms.sch.task_manage.task.core.TaskStatus; -import org.nl.wms.sch.task_manage.task.tasks.mapper.PointMapper; -import org.nl.wms.util.PointUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.math.BigDecimal; -import java.util.List; -import java.util.Map; - -/** - * @Author: psh - * @Description: 满架下料 - * @Date: 2023/9/28 - */ -@Slf4j -@Component -@TaskType("MJXLTask") -public class MJXLTask extends AbstractTask { - private static String TASK_CONFIG_CODE = "MJXLTask"; - /** - * 入口 - */ - private static String ENTRANCE = "1"; - @Autowired - private ISchBasePointService pointService; - @Autowired - private ISchBaseTaskService taskService; - @Autowired - private ISchBaseTaskconfigService taskConfigService; - @Autowired - private IPdmBdWorkorderService workorderService; - @Autowired - private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; - @Autowired - private PointMapper pointMapper; - - @Override -// @Transactional(rollbackFor = Exception.class) - protected void create() throws BadRequestException { - // 获取任务 - List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); - // 配置信息 - SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() - .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); - for (SchBaseTask task : tasks) { - // 找终点 - SchBasePoint startPoint = pointService.getOne(new LambdaQueryWrapper() - .eq(SchBasePoint::getPoint_code, task.getPoint_code1())); - String extGroupData = task.getExt_group_data(); - JSONObject jsonObject = JSONObject.parseObject(extGroupData); - String materialType = jsonObject.getString("material_type"); - SchBasePoint point = findNextPoint(startPoint, jsonObject); - if (ObjectUtil.isEmpty(point)) { - task.setRemark("未找到所需点位!"); - taskService.update(task); - // 消息通知 - log.info("满架下料未找到当前符合条件的点位materialType:{},",materialType); - continue; - } - // 设置终点并修改创建成功状态 - task.setPoint_code2(point.getPoint_code()); - task.setTask_status(TaskStatus.CREATED.getCode()); - task.setRemark(""); - taskService.update(task); - - //发起任务时先把点位占用,防止发起重复任务 - point.setIng_task_code(task.getTask_code()); - point.setVehicle_qty(point.getVehicle_qty() + 1); - point.setVehicle_type(materialType); - pointService.update(point); - - //下发 - this.renotifyAcs(task); - } - } - - /** - * 判断目标点位 - * 1.A区的去A区缓存点,B区的去B区 - * 2.优先找未放满的固化室的起始位置01和06,且物料必须一致 - * 4.固化室不满足条件时按顺序取下一个固化室 - * 5.都不满足则抛出异常暂时等待 - * - * @param startPoint - * @param extGroupData - * @return - */ - private SchBasePoint findNextPoint(SchBasePoint startPoint, JSONObject extGroupData) { - String regionCode = null; - String materialType = extGroupData.getString("material_type"); - if ("TBX1".equals(startPoint.getRegion_code())) { - //TBX1找A区 - regionCode = "GHS1"; - - } else if ("TBX2".equals(startPoint.getRegion_code())) { - //TBX2找B区 - regionCode = "GHS2"; - } - List schBasePointList = pointMapper.findPointByRegion(regionCode,"2"); - for (SchBasePoint schBasePoint : schBasePointList) { - if (!schBasePoint.getPoint_code().endsWith("01") && - !schBasePoint.getPoint_code().endsWith("06")) { - continue; - } - if ((ObjectUtil.isEmpty(schBasePoint.getVehicle_type())|| - materialType.equals(schBasePoint.getVehicle_type())) - && "2".equals(schBasePoint.getPoint_status()) - && schBasePoint.getVehicle_qty() < 3) { - log.info("满架下料找到当前符合条件的点位{}",schBasePoint.getPoint_code()); - return schBasePoint; - } - } - return null; - } - - @Override -// @Transactional(rollbackFor = Exception.class) - protected void updateStatus(String task_code, TaskStatus status) { - // 校验任务 - SchBaseTask taskObj = taskService.getById(task_code); - if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { - throw new BadRequestException("该任务已完成!"); - } - if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { - throw new BadRequestException("该任务已取消!"); - } - // 获取参数 - JSONObject extGroupData = ObjectUtil.isNotEmpty(taskObj.getExt_group_data()) - ? JSONObject.parseObject(taskObj.getExt_group_data()) - : null; - // 载具编码:没有就创建一个 - String vehicle_code = ObjectUtil.isNotEmpty(taskObj.getVehicle_code()) - ? taskObj.getVehicle_code() - : IdUtil.getSnowflake(1, 1).nextIdStr(); - PdmBdWorkorder workorderCode = ObjectUtil.isNotEmpty(extGroupData.getString("workorder_code")) - ? workorderService.getOne(new LambdaQueryWrapper() - .eq(PdmBdWorkorder::getWorkorder_code, extGroupData.getString("workorder_code"))) - : null; - String startPoint = taskObj.getPoint_code1(); // 获取起点 - String endPoint = taskObj.getPoint_code2(); // 获取终点 - SchBasePoint startPointObj = pointService.getById(startPoint); - SchBasePoint endPointObj = pointService.getById(endPoint); - // 根据传来的类型去对任务进行操作 - if (status.equals(TaskStatus.EXECUTING)) { // 执行中 - taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); - taskObj.setRemark("执行中"); - } - if (status.equals(TaskStatus.FINISHED)) { // 完成 - // 起点清空 - if (ObjectUtil.isNotEmpty(startPointObj)) { - PointUtils.clearPoint(startPointObj); - } - // 终点解锁 - endPointObj.setIng_task_code(""); - endPointObj.setVehicle_code(ObjectUtil.isEmpty(endPointObj.getVehicle_code()) ? vehicle_code + "," : endPointObj.getVehicle_code() + vehicle_code + ","); - pointService.update(endPointObj); - // 要把数据存到组盘表 -> 改造公共方法,返回id - SchBaseVehiclematerialgroup groupEntity = new SchBaseVehiclematerialgroup(); - groupEntity.setGroup_id(IdUtil.getSnowflake(1, 1).nextIdStr()); - groupEntity.setCreate_id("2"); - groupEntity.setCreate_name("ACS"); - groupEntity.setCreate_time(DateUtil.now()); - groupEntity.setMaterial_id(ObjectUtil.isNotEmpty(workorderCode) - ? workorderCode.getMaterial_id() - : ""); - groupEntity.setStanding_time(ObjectUtil.isNotEmpty(workorderCode) - ? workorderCode.getStanding_time() - : 0); - groupEntity.setMaterial_weight(ObjectUtil.isNotEmpty(extGroupData) - ? extGroupData.getBigDecimal("material_qty") - : BigDecimal.valueOf(0)); - groupEntity.setWorkorder_code(ObjectUtil.isNotEmpty(workorderCode) - ? workorderCode.getWorkorder_code() - : ""); - groupEntity.setVehicle_code(vehicle_code); - groupEntity.setVehicle_type(taskObj.getVehicle_type()); - groupEntity.setPoint_code(startPoint); - groupEntity.setPoint_name(startPointObj.getPoint_name()); - groupEntity.setPcsn(DateUtil.format(DateUtil.date(), "yyyyMMdd")); - groupEntity.setInstorage_time(DateUtil.now()); - groupEntity.setTask_code(taskObj.getTask_code()); - groupEntity.setGroup_bind_material_status(GroupBindMaterialStatusEnum.BOUND.getValue()); // 绑定 - groupEntity.setGroup_status(GroupStatusEnum.IN_STORAGE.getType()); // 暂时不维护。 - groupEntity.setIs_delete(false); - groupEntity.setMove_way(startPoint); - vehiclematerialgroupService.save(groupEntity); - - - // 任务完成 - taskObj.setTask_status(TaskStatus.FINISHED.getCode()); - taskObj.setGroup_id(groupEntity.getGroup_id()); - taskObj.setRemark("任务完成"); - } - if (status.equals(TaskStatus.CANCELED)) { // 取消 - // 终点解锁 - if (ObjectUtil.isNotEmpty(endPointObj)) { - endPointObj.setIng_task_code(""); - //任务取消把原先占用的位置释放 - endPointObj.setVehicle_qty(endPointObj.getVehicle_qty()-1); - if(endPointObj.getVehicle_qty()<=0){ - endPointObj.setVehicle_type(null); - } - pointService.update(endPointObj); - } - taskObj.setRemark("任务取消"); - taskObj.setTask_status(TaskStatus.CANCELED.getCode()); - } - taskService.update(taskObj); - } - - @Override - public void forceFinish(String task_code) { - this.updateStatus(task_code, TaskStatus.FINISHED); - } - - @Override - public void cancel(String task_code) { - this.updateStatus(task_code, TaskStatus.CANCELED); - } - - @Override - protected void feedbackTaskState(JSONObject param,SchBaseTask schBaseTask, BaseResponse result) { - //无需重算,返回当前点位即可 - } -} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/TBXBKJTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/TBXBKJTask.java deleted file mode 100644 index 0e4b895..0000000 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/TBXBKJTask.java +++ /dev/null @@ -1,190 +0,0 @@ -package org.nl.wms.sch.task_manage.task.tasks; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.extern.slf4j.Slf4j; -import org.nl.common.exception.BadRequestException; -import org.nl.config.MapOf; -import org.nl.wms.ext.service.WmsToAcsService; -import org.nl.wms.ext.service.dto.to.BaseResponse; -import org.nl.wms.pdm.service.IPdmBdWorkorderService; -import org.nl.wms.pdm.service.dao.PdmBdWorkorder; -import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; -import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; -import org.nl.wms.sch.point.service.ISchBasePointService; -import org.nl.wms.sch.point.service.dao.SchBasePoint; -import org.nl.wms.sch.task.service.ISchBaseTaskService; -import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; -import org.nl.wms.sch.task.service.dao.SchBaseTask; -import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; -import org.nl.wms.sch.task_manage.AbstractTask; -import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum; -import org.nl.wms.sch.task_manage.enums.GroupStatusEnum; -import org.nl.wms.sch.task_manage.task.TaskType; -import org.nl.wms.sch.task_manage.task.core.TaskStatus; -import org.nl.wms.sch.task_manage.task.tasks.mapper.PointMapper; -import org.nl.wms.util.PointUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.math.BigDecimal; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @Author: psh - * @Description: 涂板线补空架 - * @Date: 2023/9/28 - */ -@Slf4j -@Component -@TaskType("TBXBKJTask") -public class TBXBKJTask extends AbstractTask { - private static String TASK_CONFIG_CODE = "TBXBKJTask"; - /** - * 入口 - */ - private static String ENTRANCE = "1"; - @Autowired - private ISchBasePointService pointService; - @Autowired - private ISchBaseTaskService taskService; - @Autowired - private ISchBaseTaskconfigService taskConfigService; - @Autowired - private IPdmBdWorkorderService workorderService; - @Autowired - private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; - @Autowired - private PointMapper pointMapper; - @Autowired - private WmsToAcsService wmsToAcsService; - - /** - * 涂版线工位发起叫料请求 - * 从对应AB区的空固化架缓存位生成搬运任务 - * 不记录组盘,不考虑点位状态 - */ - @Override -// @Transactional(rollbackFor = Exception.class) - protected void create() throws BadRequestException { - // 获取任务 - List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); - // 配置信息 - SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() - .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); - for (SchBaseTask task : tasks) { - // 找起点 - SchBasePoint startPoint = pointService.getOne(new LambdaQueryWrapper() - .eq(SchBasePoint::getPoint_code, task.getPoint_code1())); - SchBasePoint point = findNextPoint(startPoint); - if (ObjectUtil.isEmpty(point)) { - task.setRemark("未找到所需点位!"); - taskService.update(task); - // 消息通知 - log.info("涂板线补空架未找到空架缓存点存在空架!"); - continue; - } - // 设置终点并修改创建成功状态 - task.setPoint_code2(point.getPoint_code()); - task.setTask_status(TaskStatus.CREATED.getCode()); - task.setRemark(""); - taskService.update(task); - - //发起任务时先把点位占用,防止发起重复任务 - point.setIng_task_code(task.getTask_code()); - //空固化架区别于组盘,任务完成后再扣除库存 -// point.setVehicle_qty(point.getVehicle_qty() - 1); - pointService.update(point); - - //下发 - this.renotifyAcs(task); - } - } - - - /** - * 从01到10顺序判断最先有货的工位 - */ - private SchBasePoint findNextPoint(SchBasePoint startPoint) { - String regionCode = null; - if ("TBX1".equals(startPoint.getRegion_code())) { - //KGHJ1找A区 - regionCode = "KGHJ1"; - - } else if ("TBX2".equals(startPoint.getRegion_code())) { - //KGHJ2找B区 - regionCode = "KGHJ2"; - } - List schBasePointList = pointMapper.findPointByRegion(regionCode,null); - for (SchBasePoint schBasePoint : schBasePointList) { - if (schBasePoint.getVehicle_qty() > 0) { - log.info("涂板线补空架找到当前符合条件的点位{}",schBasePoint.getPoint_code()); - return schBasePoint; - } - } - return null; - } - - @Override -// @Transactional(rollbackFor = Exception.class) - protected void updateStatus(String task_code, TaskStatus status) { - // 校验任务 - SchBaseTask taskObj = taskService.getById(task_code); - if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { - throw new BadRequestException("该任务已完成!"); - } - if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { - throw new BadRequestException("该任务已取消!"); - } - - String startPoint = taskObj.getPoint_code1(); // 获取起点 - String endPoint = taskObj.getPoint_code2(); // 获取终点 - SchBasePoint startPointObj = pointService.getById(startPoint); - SchBasePoint endPointObj = pointService.getById(endPoint); - // 根据传来的类型去对任务进行操作 - if (status.equals(TaskStatus.EXECUTING)) { // 执行中 - taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); - taskObj.setRemark("执行中"); - } - if (status.equals(TaskStatus.FINISHED)) { // 完成 - // 起点解锁,库存减少 - startPointObj.setIng_task_code(""); - startPointObj.setVehicle_qty(startPointObj.getVehicle_qty()-1); - pointService.update(endPointObj); - - // 任务完成 - taskObj.setTask_status(TaskStatus.FINISHED.getCode()); - taskObj.setRemark("任务完成"); - } - if (status.equals(TaskStatus.CANCELED)) { // 取消 - // 终点解锁 - if (ObjectUtil.isNotEmpty(endPointObj)) { - endPointObj.setIng_task_code(""); - pointService.update(endPointObj); - } - taskObj.setRemark("任务取消"); - taskObj.setTask_status(TaskStatus.CANCELED.getCode()); - } - taskService.update(taskObj); - } - - @Override - public void forceFinish(String task_code) { - this.updateStatus(task_code, TaskStatus.FINISHED); - } - - @Override - public void cancel(String task_code) { - this.updateStatus(task_code, TaskStatus.CANCELED); - } - - @Override - protected void feedbackTaskState(JSONObject param,SchBaseTask schBaseTask, BaseResponse result) { - //todo 重算最优点 - } -} \ No newline at end of file diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/XSCKTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/XSCKTask.java deleted file mode 100644 index d92d171..0000000 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/XSCKTask.java +++ /dev/null @@ -1,241 +0,0 @@ -package org.nl.wms.sch.task_manage.task.tasks; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.extern.slf4j.Slf4j; -import org.nl.common.exception.BadRequestException; -import org.nl.config.MapOf; -import org.nl.wms.ext.service.WmsToAcsService; -import org.nl.wms.ext.service.dto.to.BaseResponse; -import org.nl.wms.pdm.service.IPdmBdWorkorderService; -import org.nl.wms.pdm.service.dao.PdmBdWorkorder; -import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; -import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; -import org.nl.wms.sch.point.service.ISchBasePointService; -import org.nl.wms.sch.point.service.dao.SchBasePoint; -import org.nl.wms.sch.task.service.ISchBaseTaskService; -import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; -import org.nl.wms.sch.task.service.dao.SchBaseTask; -import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; -import org.nl.wms.sch.task_manage.AbstractTask; -import org.nl.wms.sch.task_manage.GeneralDefinition; -import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum; -import org.nl.wms.sch.task_manage.enums.GroupStatusEnum; -import org.nl.wms.sch.task_manage.task.TaskType; -import org.nl.wms.sch.task_manage.task.core.TaskStatus; -import org.nl.wms.sch.task_manage.task.tasks.mapper.PointMapper; -import org.nl.wms.util.PointUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.math.BigDecimal; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @Author: psh - * @Description: 销售出库 - * @Date: 2023/9/28 - */ -@Slf4j -@Component -@TaskType("XSCKTask") -public class XSCKTask extends AbstractTask { - private static String TASK_CONFIG_CODE = "XSCKTask"; - /** - * 入口 - */ - private static String ENTRANCE = "1"; - @Autowired - private ISchBasePointService pointService; - @Autowired - private ISchBaseTaskService taskService; - @Autowired - private ISchBaseTaskconfigService taskConfigService; - @Autowired - private IPdmBdWorkorderService workorderService; - @Autowired - private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; - @Autowired - private PointMapper pointMapper; - @Autowired - private WmsToAcsService wmsToAcsService; - - @Override -// @Transactional(rollbackFor = Exception.class) - protected void create() throws BadRequestException { - // 获取任务 - List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); - // 配置信息 - SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() - .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); - for (SchBaseTask task : tasks) { - // 找起点 - SchBasePoint nextPoint = pointService.getOne(new LambdaQueryWrapper() - .eq(SchBasePoint::getPoint_code, task.getPoint_code2())); - String extGroupData = task.getExt_group_data(); - JSONObject jsonObject = JSONObject.parseObject(extGroupData); - String materialType = jsonObject.getString("material_type"); - SchBasePoint point = findNextPoint(nextPoint,jsonObject); - if (ObjectUtil.isEmpty(point)) { - task.setRemark("未找到所需点位!"); - taskService.update(task); - // 消息通知 - log.info("销售出库未找到当前符合条件的点位materialType:{},", materialType); - continue; - } - // 设置起点并修改创建成功状态 - // 取料先去等待点 - task.setPoint_code1(point.getStart_wait_point()); - task.setTask_status(TaskStatus.CREATED.getCode()); - task.setRemark(""); - taskService.update(task); - - //发起任务时先把点位占用,防止发起重复任务 - point.setIng_task_code(task.getTask_code()); - point.setVehicle_qty(point.getVehicle_qty() - 1); - point.setVehicle_type(materialType); - pointService.update(point); - - //下发 - this.renotifyAcs(task); - } - } - - - /** - * 判断目标点位 - * 从10-1查找可以物料一致且有货的点位 - * - * @param extGroupData - * @return - */ - private SchBasePoint findNextPoint(SchBasePoint nextPoint,JSONObject extGroupData) { - String regionCode = null; - String materialType = extGroupData.getString("material_type"); - if ("XSQ1".equals(nextPoint.getRegion_code())) { - //XSQ1找A区 - regionCode = "HCQ1"; - - } else if ("XSQ2".equals(nextPoint.getRegion_code())) { - //XSQ2找B区 - regionCode = "HCQ2"; - } - List schBasePointList = pointMapper.findPointByRegion(regionCode,"2"); - for(int i=schBasePointList.size()-1;i>=0;i--){ - SchBasePoint schBasePoint=schBasePointList.get(i); - if (!"1".equals(schBasePoint.getPoint_type())&&schBasePoint.getVehicle_qty()!=0 - &&ObjectUtil.isEmpty(schBasePoint.getIng_task_code()) - &&(ObjectUtil.isEmpty(schBasePoint.getVehicle_type())||materialType.equals(schBasePoint.getVehicle_type()))){ - log.info("销售出库任务找到当前符合条件的缓存区位置{}",schBasePoint.getPoint_code()); - return schBasePoint; - } - } - return null; - } - - /** - * 1.取货完毕后起点减少最后一份组盘,并且该组盘视为已结束 - * 2.销售出库LMS不记录点位信息,由人工对组盘进行操作 - */ - @Override -// @Transactional(rollbackFor = Exception.class) - protected void updateStatus(String task_code, TaskStatus status) { - // 校验任务 - SchBaseTask taskObj = taskService.getById(task_code); - if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { - throw new BadRequestException("该任务已完成!"); - } - if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { - throw new BadRequestException("该任务已取消!"); - } - String startPoint = taskObj.getPoint_code1(); // 获取起点 - String endPoint = taskObj.getPoint_code2(); // 获取终点 - SchBasePoint startPointObj = pointService.getById(startPoint); - SchBasePoint endPointObj = pointService.getById(endPoint); - // 根据传来的类型去对任务进行操作 - if (status.equals(TaskStatus.EXECUTING)) { // 执行中 - taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); - taskObj.setRemark("执行中"); - } - if (status.equals(TaskStatus.FINISHED)) { // 完成 - List vehicleCodeList = Arrays.stream(startPointObj.getVehicle_code().split(",")).collect(Collectors.toList()); - String vehicleCode=vehicleCodeList.get(vehicleCodeList.size()-1); - SchBaseVehiclematerialgroup one = vehiclematerialgroupService.getOne(new LambdaQueryWrapper() - .eq(SchBaseVehiclematerialgroup::getVehicle_code, vehicleCode) - .eq(SchBaseVehiclematerialgroup::getGroup_bind_material_status, - GroupBindMaterialStatusEnum.BOUND.getValue())); - if (ObjectUtil.isEmpty(one)) { - throw new BadRequestException(vehicleCode + " => " + startPointObj.getVehicle_type() + "的组盘信息未找到"); - } - one.setTask_code(taskObj.getTask_code()); - one.setPoint_code(endPointObj.getPoint_code()); // 当前位置 - one.setPoint_name(endPointObj.getPoint_name()); - one.setMove_way(one.getMove_way()==null?"":(one.getMove_way() + " -> ") + endPointObj.getPoint_code()); - one.setGroup_bind_material_status(GroupBindMaterialStatusEnum.UNBOUND.getValue()); - one.setUpdate_id(GeneralDefinition.ACS_ID); - one.setUpdate_name(GeneralDefinition.ACS_NAME); - one.setUpdate_time(DateUtil.now()); - vehiclematerialgroupService.updateById(one); - // 起点清空 - if (vehicleCodeList.size()==1) { - startPointObj.setVehicle_code(""); - }else{ - StringBuilder vehicle_code=new StringBuilder(); - for(int i=0;i<=vehicleCodeList.size()-2;i++){ - vehicle_code.append(vehicleCodeList.get(i)).append(','); - } - startPointObj.setVehicle_code(vehicle_code.toString()); - } - startPointObj.setIng_task_code(""); - startPointObj.setUpdate_time(DateUtil.now()); - pointService.updateById(startPointObj); - //销售出库完毕后,整排打上记号只允许销售出库 - pointMapper.updatePointType(endPointObj.getPoint_code().substring(0,endPointObj.getPoint_code().length()-2),"2"); - // 任务完成 - taskObj.setTask_status(TaskStatus.FINISHED.getCode()); - taskObj.setGroup_id(one.getGroup_id()); - taskObj.setRemark("任务完成"); - } - if (status.equals(TaskStatus.CANCELED)) { // 取消 - // 终点解锁 - if (ObjectUtil.isNotEmpty(endPointObj)) { - endPointObj.setIng_task_code(""); - pointService.update(endPointObj); - } - // 起点解锁 - if (ObjectUtil.isNotEmpty(startPointObj)) { - startPointObj.setIng_task_code(""); - startPointObj.setVehicle_qty(startPointObj.getVehicle_qty()+1); - pointService.update(endPointObj); - } - taskObj.setRemark("任务取消"); - taskObj.setTask_status(TaskStatus.CANCELED.getCode()); - } - taskService.update(taskObj); - } - - @Override - public void forceFinish(String task_code) { - this.updateStatus(task_code, TaskStatus.FINISHED); - } - - @Override - public void cancel(String task_code) { - this.updateStatus(task_code, TaskStatus.CANCELED); - } - - @Override - protected void feedbackTaskState(JSONObject param,SchBaseTask schBaseTask, BaseResponse result) { - // 重算最优点 - SchBasePoint nextPoint=pointService.getOne(new LambdaQueryWrapper() - .eq(SchBasePoint::getPoint_code, schBaseTask.getPoint_code2())); - SchBasePoint point = this.findNextPoint(nextPoint,JSONObject.parseObject(schBaseTask.getExt_group_data())); - // 设置起点并修改创建成功状态 - schBaseTask.setPoint_code1(point.getPoint_code()); - } -} \ No newline at end of file diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ZJBZKDDTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ZJBZKDDTask.java deleted file mode 100644 index c1306b5..0000000 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ZJBZKDDTask.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.nl.wms.sch.task_manage.task.tasks; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.extern.slf4j.Slf4j; -import org.nl.common.exception.BadRequestException; -import org.nl.config.MapOf; -import org.nl.wms.ext.service.WmsToAcsService; -import org.nl.wms.ext.service.dto.to.BaseResponse; -import org.nl.wms.pdm.service.IPdmBdWorkorderService; -import org.nl.wms.pdm.service.dao.PdmBdWorkorder; -import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; -import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; -import org.nl.wms.sch.point.service.ISchBasePointService; -import org.nl.wms.sch.point.service.dao.SchBasePoint; -import org.nl.wms.sch.task.service.ISchBaseTaskService; -import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; -import org.nl.wms.sch.task.service.dao.SchBaseTask; -import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; -import org.nl.wms.sch.task_manage.AbstractTask; -import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum; -import org.nl.wms.sch.task_manage.enums.GroupStatusEnum; -import org.nl.wms.sch.task_manage.task.TaskType; -import org.nl.wms.sch.task_manage.task.core.TaskStatus; -import org.nl.wms.sch.task_manage.task.tasks.mapper.PointMapper; -import org.nl.wms.util.PointUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.math.BigDecimal; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @Author: psh - * @Description: 正极板转库堆叠 - * @Date: 2023/9/28 - */ -@Slf4j -@Component -@TaskType("ZJBZKDDTask") -public class ZJBZKDDTask extends AbstractTask { - private static String TASK_CONFIG_CODE = "ZJBZKDDTask"; - /** - * 入口 - */ - private static String ENTRANCE = "1"; - @Autowired - private ISchBasePointService pointService; - @Autowired - private ISchBaseTaskService taskService; - @Autowired - private ISchBaseTaskconfigService taskConfigService; - @Autowired - private IPdmBdWorkorderService workorderService; - @Autowired - private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; - @Autowired - private PointMapper pointMapper; - @Autowired - private WmsToAcsService wmsToAcsService; - - @Override -// @Transactional(rollbackFor = Exception.class) - protected void create() throws BadRequestException { - - } - - - private SchBasePoint findNextPoint(SchBasePoint startPoint) { - return null; - } - - @Override -// @Transactional(rollbackFor = Exception.class) - protected void updateStatus(String task_code, TaskStatus status) { - } - - @Override - public void forceFinish(String task_code) { - this.updateStatus(task_code, TaskStatus.FINISHED); - } - - @Override - public void cancel(String task_code) { - this.updateStatus(task_code, TaskStatus.CANCELED); - } - - @Override - protected void feedbackTaskState(JSONObject param,SchBaseTask schBaseTask, BaseResponse result) { - //todo 重算最优点 - } -} \ No newline at end of file diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/auto/GHCMLTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/auto/GHCMLTask.java new file mode 100644 index 0000000..cfdb773 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/auto/GHCMLTask.java @@ -0,0 +1,326 @@ +package org.nl.wms.sch.task_manage.task.tasks.auto; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.exception.BadRequestException; +import org.nl.system.service.notice.ISysNoticeService; +import org.nl.system.service.param.ISysParamService; +import org.nl.wms.ext.service.dto.to.BaseResponse; +import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; +import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; +import org.nl.wms.sch.point.service.ISchBasePointService; +import org.nl.wms.sch.point.service.dao.SchBasePoint; +import org.nl.wms.sch.task.service.ISchBaseTaskService; +import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; +import org.nl.wms.sch.task.service.dao.SchBaseTask; +import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; +import org.nl.wms.sch.task_manage.AbstractTask; +import org.nl.wms.sch.task_manage.GeneralDefinition; +import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum; +import org.nl.wms.sch.task_manage.enums.PointStatusEnum; +import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum; +import org.nl.wms.sch.task_manage.task.TaskFactory; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.sch.task_manage.task.tasks.auto.mapper.AutoMapper; +import org.nl.wms.util.PointUtils; +import org.nl.wms.util.TaskUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author: lyd + * @Description: 固化室出口出库任务 + * @Date: 2023/11/30 + */ +@Slf4j +@Component("GHCMLTask") +public class GHCMLTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "GHCMLTask"; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private ISysNoticeService noticeService; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISysParamService paramService; + @Autowired + private AutoMapper autoMapper; + @Autowired + private TaskFactory taskFactory; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + + @Override + protected void create() throws BadRequestException { + + } + + @Override + protected void autoCreate() { + // 自动创建任务 + // 寻找固化室满足出库的位置:有货 + List ghsExitList = autoMapper.getGHSExitMaterialList(); + AbstractTask task = taskFactory.getTask(TASK_CONFIG_CODE); + ghsExitList.forEach(point -> { + JSONObject param = new JSONObject(); + param.put("config_code", TASK_CONFIG_CODE); + param.put("requestNo", "LMS" + IdUtil.simpleUUID()); + param.put("device_code", point.getPoint_code()); + param.put("vehicle_code", point.getVehicle_code()); + param.put("vehicle_type", point.getVehicle_type()); + param.put("create_mode", GeneralDefinition.AUTO_CREATION); + task.apply(param); + }); + } + + @Override + protected void createCompletion(SchBaseTask task) { + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + List nextRegionStr = Arrays.stream(taskConfig.getNext_region_str().split(",")) + .collect(Collectors.toList()); + SchBasePoint startPoint = pointService.getById(task.getPoint_code1()); + SchBaseVehiclematerialgroup groupInfo = vehiclematerialgroupService.getVehicleGroupInfo( + startPoint.getVehicle_code(), + startPoint.getVehicle_type(), + GroupBindMaterialStatusEnum.BOUND.getValue()); + // 找终点 + String requestParam = task.getRequest_param(); + JSONObject jsonObject = JSONObject.parseObject(requestParam); + jsonObject.put("material_id", groupInfo.getMaterial_id()); + SchBasePoint point = findNextPoint(nextRegionStr, jsonObject); + if (ObjectUtil.isEmpty(point)) { + throw new BadRequestException("涂板线[" + task.getPoint_code1() + "]未找到所需点位!"); + } + // 设置组盘 - 需要的话由子类自行实现 + task.setGroup_id(setGroupPlate(jsonObject)); + // 设置等待点并修改创建成功状态 + task.setNext_wait_point(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setRemark(""); + TaskUtils.setUpdateByAcs(task); // 修改修改者 + taskService.save(task); + + PointUtils.setUpdateByAcs(point); + pointService.updateById(point); + + } + + /** + * 寻找终点等待点 + * @param nextRegionStr: 只有一个区域 + * @param jsonObject + * @return + */ + private SchBasePoint findNextPoint(List nextRegionStr, JSONObject jsonObject) { + // 查找是否有相同物料的货位: + // 最小排最小列,且列大于1(即不是等待位置,1不写死:使用子查询,寻找当排最小列序号的值) + // 多个数据选择一个:Limit 1, 还需要考虑任务数,尽量一排排满 + SchBasePoint sameMaterialPoints = autoMapper.getZCSameMaterialPoint(nextRegionStr.get(0), jsonObject.getString("material_id")); + if (ObjectUtil.isNotEmpty(sameMaterialPoints)) { + // 找到相同物料。分配等待点。 + List points = pointService.list(new LambdaQueryWrapper() + .in(SchBasePoint::getRegion_code, nextRegionStr) + .eq(SchBasePoint::getRow_num, sameMaterialPoints.getRow_num()) + .eq(SchBasePoint::getIs_used, true) + .orderByAsc(SchBasePoint::getCol_num)); + if (points.size() > 0) { + return points.get(0); + } + } + // 如果没有找到。或者分配等待点失败,就选择一个空列存放 + return autoMapper.getZCEmptyMaterialPoint(nextRegionStr.get(0)); + } + + @Override + protected void updateStatus(String task_code, TaskStatus status) { +// 校验任务 + SchBaseTask taskObj = taskService.getByCode(task_code); + if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("该任务已完成!"); + } + if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { + throw new BadRequestException("该任务已取消!"); + } + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { // 执行中 + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + TaskUtils.setUpdateByAcs(taskObj); + taskService.updateById(taskObj); + } + if (status.equals(TaskStatus.FINISHED)) { // 完成 + this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + } + if (status.equals(TaskStatus.CANCELED)) { // 取消 + this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + } + } + + @Override + public void forceFinish(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + + @Override + public void cancel(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + + public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + String startPoint = taskObj.getPoint_code1(); // 获取终点 + String endPoint = taskObj.getPoint_code2(); // 获取终点 + SchBasePoint startPointObj = pointService.getById(startPoint); + SchBasePoint endPointObj = pointService.getById(endPoint); + if (ObjectUtil.isNotEmpty(endPointObj)) { + SchBaseVehiclematerialgroup vehiclematerialgroup = vehiclematerialgroupService.getById(taskObj.getGroup_id()); + TaskUtils.setGroupUpdateByType(vehiclematerialgroup, taskFinishedType); + vehiclematerialgroup.setTask_code(taskObj.getTask_code()); // 当前任务 + vehiclematerialgroup.setBuss_move_id(taskObj.getTask_code()); // 设置链路id,使用任务编码 + vehiclematerialgroup.setPoint_code(endPointObj.getPoint_code()); // 当前位置 + vehiclematerialgroup.setPoint_name(endPointObj.getPoint_name()); + vehiclematerialgroup.setMove_way(vehiclematerialgroup.getMove_way() + " -> " + endPointObj.getPoint_code()); + vehiclematerialgroupService.updateById(vehiclematerialgroup); + // 终点解锁 + endPointObj.setIng_task_code(""); + PointUtils.setUpdateByType(endPointObj, taskFinishedType); + // 赋值 + endPointObj.setVehicle_code(vehiclematerialgroup.getVehicle_code()); + endPointObj.setVehicle_type(vehiclematerialgroup.getVehicle_type()); + endPointObj.setVehicle_qty(1); + endPointObj.setPoint_status(PointStatusEnum.EMPTY_VEHICLE.getCode()); + pointService.updateById(endPointObj); + // 插入生产过程跟踪表 +// PdmBdProductionProcessTracking processTracking = new PdmBdProductionProcessTracking(); +// processTracking.setBuss_move_id(vehiclematerialgroup.getBuss_move_id()); +// processTracking.setProcess_action("压制送料入双层缓存线"); +// processTracking.setProcess_location(endPoint); +// processTracking.setRecord_time(DateUtil.now()); +// processTrackingService.create(processTracking); + } + // 起点清空 + PointUtils.setUpdateByType(startPointObj, taskFinishedType); + PointUtils.clearPoint(startPointObj); + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark(GeneralDefinition.TASK_FINISH); + taskObj.setFinished_type(taskFinishedType.getCode()); + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } + + public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + // 获取参数 + String endPoint = taskObj.getPoint_code2(); // 获取终点 + SchBasePoint endPointObj = pointService.getById(endPoint); + // 终点解锁 + if (ObjectUtil.isNotEmpty(endPointObj)) { + endPointObj.setIng_task_code(""); + PointUtils.setUpdateByType(endPointObj, taskFinishedType); + pointService.updateById(endPointObj); + } + taskObj.setRemark(GeneralDefinition.TASK_CANCEL); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setFinished_type(taskFinishedType.getCode()); + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } + + @Override + protected void feedbackTaskState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result) { + + } + + @Override + public String setGroupPlate(JSONObject param) { + // 组盘 + String vehicleCode = param.getString("vehicle_code"); + String vehicleType = param.getString("vehicle_type"); + SchBaseVehiclematerialgroup groupInfo = vehiclematerialgroupService.getVehicleGroupInfo(vehicleCode, + vehicleType, GroupBindMaterialStatusEnum.BOUND.getValue()); + return ObjectUtil.isNotEmpty(vehicleType) ? groupInfo.getGroup_id() : null; + } + + /** + * 二次申请 + * @param task_id: 任务标识 + * @return + */ + @Override + public String againApply(String task_id) { + SchBaseTask task = taskService.getById(task_id); + if (ObjectUtil.isEmpty(task)) { + throw new BadRequestException("任务:[" + task_id + "]不存在!"); + } + String waitPoint = task.getNext_wait_point(); + if (ObjectUtil.isEmpty(waitPoint)) { + throw new BadRequestException("找不到任务:[" + task_id + "]等待点!"); + } + SchBasePoint waitPointObj = pointService.getById(waitPoint); + SchBasePoint result; + // 找到这排对应的准确货位, + // hint: 需要考虑前后空,中间有货的情况,有货之后的即使是空也不能放。 + // 寻找有货的数据 + List points = pointService.list(new LambdaQueryWrapper() + .eq(SchBasePoint::getRegion_code, waitPointObj.getRegion_code()) + .eq(SchBasePoint::getRow_num, waitPointObj.getRow_num()) + .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_VEHICLE.getCode()) + .eq(SchBasePoint::getIs_used, true) + .orderByDesc(SchBasePoint::getIn_order_seq)); + if (points.size() > 0) { + SchBasePoint basePoint = points.get(0); + // 找到物料位置的下一个位置 + result = pointService.getOne(new LambdaQueryWrapper() + .eq(SchBasePoint::getRegion_code, waitPointObj.getRegion_code()) + .eq(SchBasePoint::getRow_num, waitPointObj.getRow_num()) + .eq(SchBasePoint::getCol_num, basePoint.getCol_num() - 1) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) // 当前执行的任务为空或者NULL,有数据表示锁住 + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getIs_used, true)); + if (ObjectUtil.isEmpty(result)) { + throw new BadRequestException("点位错误"); + } + } else { + // 空的话代表这排是新的一排,找个位置就行 + points = pointService.list(new LambdaQueryWrapper() + .eq(SchBasePoint::getRegion_code, waitPointObj.getRegion_code()) + .eq(SchBasePoint::getRow_num, waitPointObj.getRow_num()) + .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_POINT.getCode()) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) // 当前执行的任务为空或者NULL,有数据表示锁住 + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getIs_used, true) + .orderByAsc(SchBasePoint::getIn_order_seq)); + result = points.get(0); // 获取第一条 + } + // 锁住货位点 + PointUtils.setUpdateByAcs(result); + result.setIng_task_code(task.getTask_code()); + pointService.updateById(result); + // 任务修改点位 + task.setPoint_code2(result.getPoint_code()); + TaskUtils.setUpdateByAcs(task); + taskService.updateById(task); + return result.getPoint_code(); + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/auto/GHCQLTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/auto/GHCQLTask.java new file mode 100644 index 0000000..2bcbd5f --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/auto/GHCQLTask.java @@ -0,0 +1,240 @@ +package org.nl.wms.sch.task_manage.task.tasks.auto; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.exception.BadRequestException; +import org.nl.system.service.notice.ISysNoticeService; +import org.nl.system.service.param.ISysParamService; +import org.nl.wms.ext.service.dto.to.BaseResponse; +import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; +import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; +import org.nl.wms.sch.point.service.ISchBasePointService; +import org.nl.wms.sch.point.service.dao.SchBasePoint; +import org.nl.wms.sch.task.service.ISchBaseTaskService; +import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; +import org.nl.wms.sch.task.service.dao.SchBaseTask; +import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; +import org.nl.wms.sch.task_manage.AbstractTask; +import org.nl.wms.sch.task_manage.GeneralDefinition; +import org.nl.wms.sch.task_manage.enums.*; +import org.nl.wms.sch.task_manage.task.TaskFactory; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.sch.task_manage.task.tasks.auto.mapper.AutoMapper; +import org.nl.wms.util.PointUtils; +import org.nl.wms.util.TaskUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author: lyd + * @Description: 固化室出口叫料 + * @Date: 2023/11/30 + */ +@Slf4j +@Component("GHCQLTask") +public class GHCQLTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "GHCQLTask"; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private ISysNoticeService noticeService; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISysParamService paramService; + @Autowired + private AutoMapper autoMapper; + @Autowired + private TaskFactory taskFactory; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + + @Override + protected void create() throws BadRequestException { + + } + + @Override + protected void autoCreate() { + // 自动创建任务 + // 寻找出料中,并且出口没有锁住的点位 + List ghsExitList = autoMapper.getGHSExitAvailableList(); + AbstractTask task = taskFactory.getTask(TASK_CONFIG_CODE); + ghsExitList.forEach(point -> { + JSONObject param = new JSONObject(); + param.put("config_code", TASK_CONFIG_CODE); + param.put("requestNo", "LMS" + IdUtil.simpleUUID()); + param.put("device_code", point.getPoint_code()); + param.put("create_mode", GeneralDefinition.AUTO_CREATION); + task.apply(param); + }); + } + + @Override + protected void createCompletion(SchBaseTask task) { + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + List startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(",")) + .collect(Collectors.toList()); + String requestParam = task.getRequest_param(); + JSONObject extGroupData = JSONObject.parseObject(requestParam); + SchBasePoint point = findStartPoint(startRegionStr, extGroupData); + if (ObjectUtil.isEmpty(point)) { + // 消息通知 + noticeService.createNotice("固化室没有所需物料!", TASK_CONFIG_CODE + task.getPoint_code2(), + NoticeTypeEnum.WARN.getCode()); + throw new BadRequestException("固化室没有所需物料!"); + } + // 设置起点并修改创建成功状态 + task.setPoint_code1(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setVehicle_code(point.getVehicle_code()); + task.setVehicle_type(point.getVehicle_type()); + task.setGroup_id(point.getGroup_id()); + task.setRemark(""); + taskService.save(task); + + point.setIng_task_code(task.getTask_code()); + PointUtils.setUpdateByAcs(point); + pointService.updateById(point); + } + + /** + * 寻找起点 + * @param startRegionStr + * @return + */ + private SchBasePoint findStartPoint(List startRegionStr, JSONObject extGroupData) { + SchBasePoint device = pointService.getById(extGroupData.getString("device_code")); + LambdaQueryWrapper lam = new QueryWrapper().lambda(); + lam.in(SchBasePoint::getRegion_code, startRegionStr) + .eq(SchBasePoint::getParent_point_code, device.getParent_point_code()) + .eq(SchBasePoint::getPoint_type, PointTypeConstant.DOCKING_POINT) + .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_VEHICLE.getCode()) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) // 当前执行的任务为空或者NULL,有数据表示锁住 + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .orderByAsc(SchBasePoint::getIn_order_seq); + List schBasePoints = pointService.list(lam); + return ObjectUtil.isNotEmpty(schBasePoints) ? schBasePoints.get(0) : null; + } + + @Override + protected void updateStatus(String task_code, TaskStatus status) { + // 校验任务 + SchBaseTask taskObj = taskService.getByCode(task_code); + if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("该任务已完成!"); + } + if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { + throw new BadRequestException("该任务已取消!"); + } + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { // 执行中 + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + TaskUtils.setUpdateByAcs(taskObj); + taskService.updateById(taskObj); + } + if (status.equals(TaskStatus.FINISHED)) { // 完成 + this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + } + if (status.equals(TaskStatus.CANCELED)) { // 取消 + this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + } + } + + @Override + public void forceFinish(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + + @Override + public void cancel(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + + public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + String startPoint = taskObj.getPoint_code1(); // 获取起点 + String endPoint = taskObj.getPoint_code2(); // 获取起点 + SchBasePoint startPointObj = pointService.getById(startPoint); + SchBasePoint endPointObj = pointService.getById(endPoint); + String requestParam = taskObj.getRequest_param(); + JSONObject extGroupData = JSONObject.parseObject(requestParam); + // 除了解锁需要将组盘表中的物料绑定载具设置为已解绑 + // 起点设置空位 + if (ObjectUtil.isNotEmpty(startPointObj)) { + PointUtils.setUpdateByType(startPointObj, taskFinishedType); + PointUtils.clearPoint(startPointObj); + SchBaseVehiclematerialgroup vehicleMaterialGroupObj = vehiclematerialgroupService.getVehicleGroupInfo( + taskObj.getVehicle_code(), taskObj.getVehicle_type(), + GroupBindMaterialStatusEnum.BOUND.getValue()); + // 等到变成空盘才能解除 + vehicleMaterialGroupObj.setPoint_code(endPointObj.getPoint_code()); // 当前位置 + vehicleMaterialGroupObj.setPoint_name(endPointObj.getPoint_name()); + vehicleMaterialGroupObj.setTask_code(taskObj.getTask_code()); + vehicleMaterialGroupObj.setMove_way(vehicleMaterialGroupObj.getMove_way() + " -> " + endPointObj.getPoint_code()); + TaskUtils.setGroupUpdateByType(vehicleMaterialGroupObj, taskFinishedType); + vehiclematerialgroupService.updateById(vehicleMaterialGroupObj); + // 插入生产过程跟踪表 +// PdmBdProductionProcessTracking processTracking = new PdmBdProductionProcessTracking(); +// processTracking.setBuss_move_id(vehicleMaterialGroupObj.getBuss_move_id()); +// processTracking.setProcess_action("钢托盘缓存位到分拣"); +// processTracking.setProcess_location(endPoint); +// processTracking.setRecord_time(DateUtil.now()); +// processTrackingService.create(processTracking); + // 终点设置对应的参数 + endPointObj.setVehicle_code(taskObj.getVehicle_code()); + endPointObj.setVehicle_type(taskObj.getVehicle_type()); + endPointObj.setPoint_status(PointStatusEnum.EMPTY_VEHICLE.getCode()); + PointUtils.setUpdateByType(endPointObj, taskFinishedType); + pointService.updateById(endPointObj); + } + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark(GeneralDefinition.TASK_FINISH); + taskObj.setFinished_type(taskFinishedType.getCode()); + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } + + public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + String startPoint = taskObj.getPoint_code1(); // 获取终点 + SchBasePoint startPointObj = pointService.getById(startPoint); + // 终点解锁 + if (ObjectUtil.isNotEmpty(startPointObj)) { + startPointObj.setIng_task_code(""); + PointUtils.setUpdateByType(startPointObj, taskFinishedType); + pointService.updateById(startPointObj); + } + taskObj.setRemark(GeneralDefinition.TASK_CANCEL); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setFinished_type(taskFinishedType.getCode()); + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } + + @Override + protected void feedbackTaskState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result) { + + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/auto/mapper/AutoMapper.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/auto/mapper/AutoMapper.java new file mode 100644 index 0000000..2b4b3af --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/auto/mapper/AutoMapper.java @@ -0,0 +1,22 @@ +package org.nl.wms.sch.task_manage.task.tasks.auto.mapper; + +import org.nl.wms.sch.point.service.dao.SchBasePoint; + +import java.util.List; + +/** + * @Author: lyd + * @Description: + * @Date: 2023/11/30 + */ +public interface AutoMapper { + + List getGHSExitAvailableList(); + + List getGHSExitMaterialList(); + + SchBasePoint getZCSameMaterialPoint(String regionCode, String materialId); + + SchBasePoint getZCEmptyMaterialPoint(String regionCode); + +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/auto/mapper/AutoMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/auto/mapper/AutoMapper.xml new file mode 100644 index 0000000..10a31f9 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/auto/mapper/AutoMapper.xml @@ -0,0 +1,86 @@ + + + + + + + + + diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ghs/GHSFMTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ghs/GHSFMTask.java deleted file mode 100644 index a4b0663..0000000 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ghs/GHSFMTask.java +++ /dev/null @@ -1,289 +0,0 @@ -package org.nl.wms.sch.task_manage.task.tasks.ghs; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.extern.slf4j.Slf4j; -import org.nl.common.exception.BadRequestException; -import org.nl.config.MapOf; -import org.nl.wms.database.material.service.dao.MdBaseMaterial; -import org.nl.wms.ext.service.WmsToAcsService; -import org.nl.wms.ext.service.dto.to.BaseResponse; -import org.nl.wms.pdm.service.IPdmBdWorkorderService; -import org.nl.wms.pdm.service.dao.PdmBdWorkorder; -import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; -import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; -import org.nl.wms.sch.point.service.ISchBasePointService; -import org.nl.wms.sch.point.service.dao.SchBasePoint; -import org.nl.wms.sch.task.service.ISchBaseTaskService; -import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; -import org.nl.wms.sch.task.service.dao.SchBaseTask; -import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; -import org.nl.wms.sch.task_manage.AbstractTask; -import org.nl.wms.sch.task_manage.GeneralDefinition; -import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum; -import org.nl.wms.sch.task_manage.enums.GroupStatusEnum; -import org.nl.wms.sch.task_manage.enums.PointStatusEnum; -import org.nl.wms.sch.task_manage.enums.WorkOrderStatusEnum; -import org.nl.wms.sch.task_manage.task.TaskType; -import org.nl.wms.sch.task_manage.task.core.TaskStatus; -import org.nl.wms.sch.task_manage.task.tasks.mapper.PointMapper; -import org.nl.wms.util.PointUtils; -import org.nl.wms.util.TaskUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.math.BigDecimal; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @Author: psh - * @Description: 固化室起始站点放满后自动生成搬运到内部的任务,优先级为8 - * @Date: 2023/9/28 - */ -@Slf4j -@Component -@TaskType("GHSFMTask") -public class GHSFMTask extends AbstractTask { - private static String TASK_CONFIG_CODE = "GHSFMTask"; - /** - * 入口 - */ - private static String ENTRANCE = "1"; - @Autowired - private ISchBasePointService pointService; - @Autowired - private ISchBaseTaskService taskService; - @Autowired - private ISchBaseTaskconfigService taskConfigService; - @Autowired - private IPdmBdWorkorderService workorderService; - @Autowired - private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; - @Autowired - private PointMapper pointMapper; - @Autowired - private WmsToAcsService wmsToAcsService; - - /** - * 1.扫描每个允许放货的固化室01和06位置是否满足三列均已放满,开始下一层判断 - * 2.如果当列1-5或6-10总15个位置已经放满,则进行下一层判断 - * 3.如果该固化室30个位置全部放满,则通知acs告知固化室开始固化 - * 4.如果内部2-5或7-10仍有空列,则生成1-(2-5),6-(7-10)的任务,优先级为8最高 - */ - @Override -// @Transactional(rollbackFor = Exception.class) - protected void create() throws BadRequestException { - List schBasePointList = pointMapper.findPointByRegion("GHS","2"); - for (SchBasePoint schBasePoint : schBasePointList) { - if (!schBasePoint.getPoint_code().endsWith("01") && - !schBasePoint.getPoint_code().endsWith("06")) { - continue; - } - if (schBasePoint.getVehicle_qty()==3&&ObjectUtil.isEmpty(schBasePoint.getIng_task_code())) { - log.info("固化室对接位{}已经放满,开始进行后续判断",schBasePoint.getPoint_code()); - String first=schBasePoint.getPoint_code().substring(0,schBasePoint.getPoint_code().length()-2); - String last=schBasePoint.getPoint_code().substring(schBasePoint.getPoint_code().length()-1); - String middle=schBasePoint.getPoint_code().substring(schBasePoint.getPoint_code().length()-4,schBasePoint.getPoint_code().length()-2); - boolean flag=false; - String pointCode=null; - //倒叙检查是否有符合要求的终点 - for(int i=4;i>0;i--){ - pointCode=first+ String.format("%02d",Integer.valueOf(last)+i); - for(SchBasePoint schBasePoint1 : schBasePointList){ - if (schBasePoint1.getPoint_code().equals(pointCode) - &&schBasePoint1.getVehicle_qty()==0&&ObjectUtil.isEmpty(schBasePoint1.getIng_task_code())){ - log.info("找到当前列内部存在空位{}",pointCode); - flag=true; - break; - } - } - if(flag){ - break; - } - } - if (flag){ - //生成任务并下发 - this.createTask(schBasePoint,pointCode); - }else{ - //如果当列均已放满,检查隔壁列是否已全部放满 - if("1".equals(last)){ - last="6"; - } - for(int i=0;i<=4;i++){ - pointCode=first+ String.format("%02d",Integer.valueOf(last)+i); - for(SchBasePoint schBasePoint1 : schBasePointList){ - if (schBasePoint1.getPoint_code().equals(pointCode) - &&(schBasePoint1.getVehicle_qty()!=3||ObjectUtil.isNotEmpty(schBasePoint1.getIng_task_code()))){ - log.info("检查当前固化室{}隔壁列,找到当前列内部存在空位{},不发送固化请求",schBasePoint.getPoint_code(),pointCode); - flag=true; - break; - } - } - } - - } - if(!flag){ - //通知acs已经放满,固化室可以进行固化 - String device_code="ZDM"+middle; - log.info("当前固化室已经全部放满,通知固化室的自动门{}开始固化",device_code); - JSONObject map = new JSONObject(); - map.put("device_code",device_code); - map.put("type","1"); - wmsToAcsService.notifyAcs(map); - } - } - } - } - - /** - * 创建任务并下发 - * - * @param schBasePoint - * @param endPoint - * @return - */ - private void createTask(SchBasePoint schBasePoint,String endPoint) { - // 申请任务 - SchBaseTask task = new SchBaseTask(); // 任务实体 - String apply_point_code =schBasePoint.getPoint_code(); // 请求点 - String config_code = "GHSFMTask"; - // 1、校验数据 - SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() - .eq(SchBaseTaskconfig::getConfig_code, config_code)); - Assert.notNull(taskConfig, "找不到配置文件,请确认[" + config_code + "]配置是否存在!"); - // 最大任务数 - Integer tcmn = taskConfig.getTask_create_max_num(); - // 获取执行中的任务 - List unFinishTasksByTaskConfig = taskService.findUnFinishTasksByTaskConfig( - taskConfig.getConfig_code(), apply_point_code, taskConfig.getTask_direction()); - - Assert.isFalse(unFinishTasksByTaskConfig.size() >= tcmn, - "该点位申请的任务未完成数已超过上限,无法申请任务"); - // 获取对接位点位对象 - SchBasePoint pointObj = pointService.getOne(new LambdaQueryWrapper() - .eq(SchBasePoint::getPoint_code, apply_point_code)); - // 校验是否需要自动agv - if (!pointObj.getIs_auto()) { - // 如果不需要自动,则不创建任务 - return; - } - // 2、创建申请任务 - task.setConfig_code(config_code); - task.setCreate_mode(GeneralDefinition.ACS_CREATION); - task.setVehicle_code(schBasePoint.getVehicle_code()); - task.setVehicle_qty(schBasePoint.getVehicle_qty()); - task.setTask_status(TaskStatus.APPLY.getCode()); - task.setWorkshop_code(taskConfig.getWorkshop_code()); // 车间编码 - task.setPoint_code2(endPoint); - task.setTask_status(TaskStatus.CREATED.getCode()); - task.setRemark(""); - // 设置起/终点 - this.setTaskPoint(taskConfig, task, apply_point_code); - taskService.create(task); - - //下发 - this.renotifyAcs(task); - } - - /** - * 修改任务状态 - * 1.任务完成时,无需再次组盘,将点位表起点货位三个组盘信息移动到终点 - * 2.组盘表中三个点位增加移动动作,并且修改当前点位到目标地点 - * 3. - * - * @param task_code - * @param status - * @return - */ - @Override -// @Transactional(rollbackFor = Exception.class) - protected void updateStatus(String task_code, TaskStatus status) { - // 校验任务 - SchBaseTask taskObj = taskService.getById(task_code); - if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { - throw new BadRequestException("该任务已完成!"); - } - if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { - throw new BadRequestException("该任务已取消!"); - } - String startPoint = taskObj.getPoint_code1(); // 获取起点 - String endPoint = taskObj.getPoint_code2(); // 获取终点 - SchBasePoint startPointObj = pointService.getById(startPoint); - SchBasePoint endPointObj = pointService.getById(endPoint); - // 根据传来的类型去对任务进行操作 - if (status.equals(TaskStatus.EXECUTING)) { // 执行中 - taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); - taskObj.setRemark("执行中"); - } - if (status.equals(TaskStatus.FINISHED)) { // 完成 - StringBuilder group_id= new StringBuilder(); - // 终点解锁 - endPointObj.setIng_task_code(""); - endPointObj.setVehicle_code(startPointObj.getVehicle_code()); - endPointObj.setVehicle_type(startPointObj.getVehicle_type()); - endPointObj.setVehicle_code(startPointObj.getVehicle_code()); - endPointObj.setVehicle_qty(startPointObj.getVehicle_qty()); - endPointObj.setUpdate_time(DateUtil.now()); - pointService.update(endPointObj); - List vehicleCodeList = Arrays.stream(startPointObj.getVehicle_code().split(",")).collect(Collectors.toList()); - for(String vehicleCode:vehicleCodeList) { - SchBaseVehiclematerialgroup one = vehiclematerialgroupService.getOne(new LambdaQueryWrapper() - .eq(SchBaseVehiclematerialgroup::getVehicle_code, vehicleCode) - .eq(SchBaseVehiclematerialgroup::getGroup_bind_material_status, - GroupBindMaterialStatusEnum.BOUND.getValue())); - if (ObjectUtil.isEmpty(one)) { - throw new BadRequestException(vehicleCode + " => " + startPointObj.getVehicle_type() + "的组盘信息未找到"); - } - one.setTask_code(taskObj.getTask_code()); - one.setPoint_code(endPointObj.getPoint_code()); // 当前位置 - one.setPoint_name(endPointObj.getPoint_name()); - one.setMove_way(one.getMove_way()==null?"":(one.getMove_way() + " -> ") + endPointObj.getPoint_code()); - one.setUpdate_id(GeneralDefinition.ACS_ID); - one.setUpdate_name(GeneralDefinition.ACS_NAME); - one.setUpdate_time(DateUtil.now()); - vehiclematerialgroupService.updateById(one); - group_id.append(one.getGroup_id()).append(','); - } - // 起点清空 - if (ObjectUtil.isNotEmpty(startPointObj)) { - PointUtils.clearPoint(startPointObj); - } - // 任务完成 - taskObj.setTask_status(TaskStatus.FINISHED.getCode()); - taskObj.setGroup_id(group_id.toString()); - taskObj.setRemark("任务完成"); - } - if (status.equals(TaskStatus.CANCELED)) { // 取消 - // 终点解锁 - if (ObjectUtil.isNotEmpty(endPointObj)) { - endPointObj.setIng_task_code(""); - pointService.update(endPointObj); - } - taskObj.setRemark("任务取消"); - taskObj.setTask_status(TaskStatus.CANCELED.getCode()); - } - taskService.update(taskObj); - } - - @Override - public void forceFinish(String task_code) { - this.updateStatus(task_code, TaskStatus.FINISHED); - } - - @Override - public void cancel(String task_code) { - this.updateStatus(task_code, TaskStatus.CANCELED); - } - - - @Override - protected void feedbackTaskState(JSONObject param,SchBaseTask schBaseTask, BaseResponse result) { - //todo 重算最优点 - } -} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ghs/GHSQHTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ghs/GHSQHTask.java deleted file mode 100644 index 2a549eb..0000000 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ghs/GHSQHTask.java +++ /dev/null @@ -1,311 +0,0 @@ -package org.nl.wms.sch.task_manage.task.tasks.ghs; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.nl.common.exception.BadRequestException; -import org.nl.config.MapOf; -import org.nl.wms.ext.service.WmsToAcsService; -import org.nl.wms.ext.service.dto.to.BaseResponse; -import org.nl.wms.pdm.service.IPdmBdWorkorderService; -import org.nl.wms.pdm.service.dao.PdmBdWorkorder; -import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; -import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; -import org.nl.wms.sch.point.service.ISchBasePointService; -import org.nl.wms.sch.point.service.dao.SchBasePoint; -import org.nl.wms.sch.task.service.ISchBaseTaskService; -import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; -import org.nl.wms.sch.task.service.dao.SchBaseTask; -import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; -import org.nl.wms.sch.task_manage.AbstractTask; -import org.nl.wms.sch.task_manage.GeneralDefinition; -import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum; -import org.nl.wms.sch.task_manage.enums.GroupStatusEnum; -import org.nl.wms.sch.task_manage.task.TaskType; -import org.nl.wms.sch.task_manage.task.core.TaskStatus; -import org.nl.wms.sch.task_manage.task.tasks.mapper.PointMapper; -import org.nl.wms.util.PointUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.math.BigDecimal; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @Author: psh - * @Description: 固化室通知取货后将十个点位增加到取货队列,固化室发起自动取货任务,当前固化室十个点位取货完毕后通知固化室取货完毕 - * @Date: 2023/9/28 - */ -@Slf4j -@Component -@TaskType("GHSQHTask") -public class GHSQHTask extends AbstractTask { - private static String TASK_CONFIG_CODE = "GHSQHTask"; - /** - * 入口 - */ - private static String ENTRANCE = "1"; - @Autowired - private ISchBasePointService pointService; - @Autowired - private ISchBaseTaskService taskService; - @Autowired - private ISchBaseTaskconfigService taskConfigService; - @Autowired - private IPdmBdWorkorderService workorderService; - @Autowired - private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; - @Autowired - private PointMapper pointMapper; - @Autowired - private WmsToAcsService wmsToAcsService; - - /** - * 1.扫描每个允许取货的固化室从1-10的顺序开始进行取货 - */ - @Override -// @Transactional(rollbackFor = Exception.class) - protected void create() throws BadRequestException { - - List schBasePointList = pointMapper.findPointByRegion("GHS","3"); - if (schBasePointList.size()==0) { - // 消息通知 - log.info("未找到当前符合允许取货的固化室点位,暂不生成任务"); - return; - } - SchBasePoint schBasePoint=null; - //按顺序查找第一个符合条件的固化室位置,发起任务 - for(SchBasePoint schBasePoint1:schBasePointList){ - if (schBasePoint1.getVehicle_qty()==3&&ObjectUtil.isEmpty(schBasePoint1.getIng_task_code())) { - schBasePoint=schBasePoint1; - break; - } - } - if (ObjectUtil.isEmpty(schBasePoint)) { - // 消息通知 - log.info("未找到当前符合允许取货的固化室点位,暂不生成任务"); - return; - } - SchBasePoint nextPoint=this.findNextPoint(schBasePoint); - if (ObjectUtil.isEmpty(nextPoint)) { - // 消息通知 - log.info("未找到当前符合允许放货的缓存点,暂不生成任务Vehicle_type:{}",schBasePoint.getVehicle_type()); - return; - } - // 放料先去等待点 - this.createTask(schBasePoint,nextPoint.getNext_wait_point()); - - } - - /** - * 创建任务并下发 - * - * @param schBasePoint - * @param endPoint - * @return - */ - private void createTask(SchBasePoint schBasePoint,String endPoint) { - // 申请任务 - SchBaseTask task = new SchBaseTask(); // 任务实体 - String apply_point_code =schBasePoint.getPoint_code(); // 请求点 - String config_code = "GHSQHTask"; - // 1、校验数据 - SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() - .eq(SchBaseTaskconfig::getConfig_code, config_code)); - Assert.notNull(taskConfig, "找不到配置文件,请确认[" + config_code + "]配置是否存在!"); - // 最大任务数 - Integer tcmn = taskConfig.getTask_create_max_num(); - // 获取执行中的任务 - List unFinishTasksByTaskConfig = taskService.findUnFinishTasksByTaskConfig( - taskConfig.getConfig_code(), apply_point_code, taskConfig.getTask_direction()); - - Assert.isFalse(unFinishTasksByTaskConfig.size() >= tcmn, - "该点位申请的任务未完成数已超过上限,无法申请任务"); - // 获取对接位点位对象 - SchBasePoint pointObj = pointService.getOne(new LambdaQueryWrapper() - .eq(SchBasePoint::getPoint_code, apply_point_code)); - // 校验是否需要自动agv - if (!pointObj.getIs_auto()) { - // 如果不需要自动,则不创建任务 - return; - } - // 2、创建申请任务 - task.setConfig_code(config_code); - task.setCreate_mode(GeneralDefinition.ACS_CREATION); - task.setVehicle_code(schBasePoint.getVehicle_code()); - task.setVehicle_qty(schBasePoint.getVehicle_qty()); - task.setTask_status(TaskStatus.APPLY.getCode()); - task.setWorkshop_code(taskConfig.getWorkshop_code()); // 车间编码 - task.setPoint_code2(endPoint); - task.setTask_status(TaskStatus.CREATED.getCode()); - task.setRemark(""); - // 设置起/终点 - this.setTaskPoint(taskConfig, task, apply_point_code); - taskService.create(task); - - //下发 - this.renotifyAcs(task); - } - - /** - * 1.根据当前固化室所处区域,判断到哪个区的缓存位 - * 2.从1010列到0101列倒叙判断当前列物料类型是否与起点一致且存在空位 - * 3.将当前点位设置为目标点 - * 4.如果没有符合条件的点位,跳过执行暂时等待 - */ - private SchBasePoint findNextPoint(SchBasePoint startPoint) { - String regionCode = null; - String materialType = startPoint.getVehicle_type(); - if ("GHS1".equals(startPoint.getRegion_code())) { - //HCQ1找A区 - regionCode = "HCQ1"; - - } else if ("GHS2".equals(startPoint.getRegion_code())) { - //GHS2找B区 - regionCode = "HCQ2"; - } - List schBasePointList = pointMapper.findPointByRegion(regionCode,"2"); - for(int i=schBasePointList.size()-1;i>=0;i--){ - SchBasePoint schBasePoint=schBasePointList.get(i); - SchBasePoint temp=null; - if (schBasePoint.getVehicle_qty()==0 - &&ObjectUtil.isEmpty(schBasePoint.getIng_task_code()) - &&(ObjectUtil.isEmpty(schBasePoint.getVehicle_type())||materialType.equals(schBasePoint.getVehicle_type()))){ - //发现有空位时暂存当前位置,检查当前列前面是否存在已放货位置,找最前面无货的位置 - //如果当列其他位置均已放满,则继续找下一列 - List tempList = pointMapper.findPointByParentPoint(schBasePoint.getParent_point_code()); - for(SchBasePoint tempPoint:tempList){ - if(tempPoint.getVehicle_qty()!=0||ObjectUtil.isNotEmpty(schBasePoint.getIng_task_code())){ - if(temp!=null){ - return temp; - } - temp=tempPoint; - } - } - if(temp==null){ - continue; - } - log.info("固化室取货任务找到当前符合条件的缓存区位置{}",schBasePoint.getPoint_code()); - return temp; - } - } - return null; - } - - /** - * 1.如果起点点位为10结尾视为最后该固化室最后一个任务,取完后通知acs取货完毕 - */ - @Override -// @Transactional(rollbackFor = Exception.class) - protected void updateStatus(String task_code, TaskStatus status) { - // 校验任务 - SchBaseTask taskObj = taskService.getById(task_code); - if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { - throw new BadRequestException("该任务已完成!"); - } - if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { - throw new BadRequestException("该任务已取消!"); - } - String startPoint = taskObj.getPoint_code1(); // 获取起点 - String endPoint = taskObj.getPoint_code2(); // 获取终点 - SchBasePoint startPointObj = pointService.getById(startPoint); - SchBasePoint endPointObj = pointService.getById(endPoint); - // 根据传来的类型去对任务进行操作 - if (status.equals(TaskStatus.EXECUTING)) { // 执行中 - taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); - taskObj.setRemark("执行中"); - } - if (status.equals(TaskStatus.FINISHED)) { // 完成 - StringBuilder group_id= new StringBuilder(); - // 终点解锁 - endPointObj.setIng_task_code(""); - endPointObj.setVehicle_code(startPointObj.getVehicle_code()); - endPointObj.setVehicle_type(startPointObj.getVehicle_type()); - endPointObj.setVehicle_code(startPointObj.getVehicle_code()); - endPointObj.setVehicle_qty(startPointObj.getVehicle_qty()); - endPointObj.setUpdate_time(DateUtil.now()); - pointService.update(endPointObj); - //固化室放料完毕后,将当前一整排都标记上物料信息,防止出现混放情况 - pointMapper.updateVehicleType(endPointObj.getPoint_code().substring(0,endPointObj.getPoint_code().length()-2),endPointObj.getVehicle_type()); - List vehicleCodeList = Arrays.stream(startPointObj.getVehicle_code().split(",")).collect(Collectors.toList()); - for(String vehicleCode:vehicleCodeList) { - SchBaseVehiclematerialgroup one = vehiclematerialgroupService.getOne(new LambdaQueryWrapper() - .eq(SchBaseVehiclematerialgroup::getVehicle_code, vehicleCode) - .eq(SchBaseVehiclematerialgroup::getGroup_bind_material_status, - GroupBindMaterialStatusEnum.BOUND.getValue())); - if (ObjectUtil.isEmpty(one)) { - throw new BadRequestException(vehicleCode + " => " + startPointObj.getVehicle_type() + "的组盘信息未找到"); - } - one.setTask_code(taskObj.getTask_code()); - one.setPoint_code(endPointObj.getPoint_code()); // 当前位置 - one.setPoint_name(endPointObj.getPoint_name()); - one.setMove_way(one.getMove_way()==null?"":(one.getMove_way() + " -> ") + endPointObj.getPoint_code()); - one.setUpdate_id(GeneralDefinition.ACS_ID); - one.setUpdate_name(GeneralDefinition.ACS_NAME); - one.setUpdate_time(DateUtil.now()); - vehiclematerialgroupService.updateById(one); - group_id.append(one.getGroup_id()).append(','); - } - // 起点清空 - if (ObjectUtil.isNotEmpty(startPointObj)) { - PointUtils.clearPoint(startPointObj); - } - // 任务完成 - taskObj.setTask_status(TaskStatus.FINISHED.getCode()); - taskObj.setGroup_id(group_id.toString()); - taskObj.setRemark("任务完成"); - - //如果起点点位为10结尾视为最后该固化室最后一个任务,取完后通知acs取货完毕 - if(taskObj.getPoint_code1().endsWith("10")) { - String middle = taskObj.getPoint_code1().substring(taskObj.getPoint_code1().length() - 4, taskObj.getPoint_code1().length() - 2); - //通知acs已经放满,固化室可以进行固化 - String device_code = "ZDM" + middle; - log.info("当前固化室已经全部取完,通知固化室的自动门{}取货完毕", device_code); - JSONObject map = new JSONObject(); - map.put("device_code", device_code); - map.put("type", "2"); - wmsToAcsService.notifyAcs(map); - } - } - if (status.equals(TaskStatus.CANCELED)) { // 取消 - // 终点解锁 - if (ObjectUtil.isNotEmpty(endPointObj)) { - endPointObj.setIng_task_code(""); - pointService.update(endPointObj); - } - taskObj.setRemark("任务取消"); - taskObj.setTask_status(TaskStatus.CANCELED.getCode()); - } - taskService.update(taskObj); - } - - @Override - public void forceFinish(String task_code) { - this.updateStatus(task_code, TaskStatus.FINISHED); - } - - @Override - public void cancel(String task_code) { - this.updateStatus(task_code, TaskStatus.CANCELED); - } - - @SneakyThrows - @Override - protected void feedbackTaskState(JSONObject param,SchBaseTask schBaseTask, BaseResponse result) { - //todo 重算最优点 - SchBasePoint startPoint=pointService.getOne(new LambdaQueryWrapper() - .eq(SchBasePoint::getPoint_code, schBaseTask.getPoint_code1())); - SchBasePoint nextPoint=this.findNextPoint(startPoint); - if(ObjectUtil.isEmpty(nextPoint)){ - throw new Exception("当前起点"+schBaseTask.getPoint_code1()+"未找到合适的放货点位"); - } - schBaseTask.setPoint_code2(nextPoint.getPoint_code()); - } -} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/KJQKTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/KJQKTask.java new file mode 100644 index 0000000..39f34b3 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/KJQKTask.java @@ -0,0 +1,187 @@ +package org.nl.wms.sch.task_manage.task.tasks.kj; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.exception.BadRequestException; +import org.nl.system.service.notice.ISysNoticeService; +import org.nl.wms.ext.service.dto.to.BaseResponse; +import org.nl.wms.sch.point.service.ISchBasePointService; +import org.nl.wms.sch.point.service.dao.SchBasePoint; +import org.nl.wms.sch.task.service.ISchBaseTaskService; +import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; +import org.nl.wms.sch.task.service.dao.SchBaseTask; +import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; +import org.nl.wms.sch.task_manage.AbstractTask; +import org.nl.wms.sch.task_manage.GeneralDefinition; +import org.nl.wms.sch.task_manage.enums.PointStatusEnum; +import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.util.PointUtils; +import org.nl.wms.util.TaskUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author: lyd + * @Description: 空架缺空移架 - 转存 + * @Date: 2023/12/1 + */ +@Slf4j +@Component("KJQKTask") +public class KJQKTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "KJQKTask"; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private ISysNoticeService noticeService; + @Override + protected void create() throws BadRequestException { + + } + + @Override + protected void createCompletion(SchBaseTask task) { + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + TaskUtils.setUpdateByAcs(task); + List startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(",")) + .collect(Collectors.toList()); + // 找起点 + String requestParam = task.getRequest_param(); + JSONObject extGroupData = JSONObject.parseObject(requestParam); + // 根据对接位查找对应的载具类型 + SchBasePoint endPoint = pointService.getById(task.getPoint_code2()); + extGroupData.put("vehicle_type", endPoint.getCan_vehicle_type()); + SchBasePoint point = findStartPoint(startRegionStr, extGroupData); + if (ObjectUtil.isEmpty(point)) { + throw new BadRequestException("未找到所需点位!"); + } + // 设置终点并修改创建成功状态 + task.setPoint_code1(point.getPoint_code()); + task.setVehicle_type(endPoint.getCan_vehicle_type()); + task.setRemark(""); + task.setTask_status(TaskStatus.CREATED.getCode()); + taskService.save(task); + + point.setIng_task_code(task.getTask_code()); + PointUtils.setUpdateByAcs(point); + pointService.updateById(point); + } + + /** + * 从空架暂存位获取 + * @param startRegionStr + * @param extGroupData + * @return + */ + private SchBasePoint findStartPoint(List startRegionStr, JSONObject extGroupData) { + // todo:不考虑等待点 + LambdaQueryWrapper lam = new QueryWrapper().lambda(); + lam.in(SchBasePoint::getRegion_code, startRegionStr) + .eq(SchBasePoint::getVehicle_type, extGroupData.getString("vehicle_type")) + .eq(SchBasePoint::getIs_used, true) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) // 当前执行的任务为空或者NULL,有数据表示锁住 + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_VEHICLE.getCode()) + .orderByAsc(SchBasePoint::getCol_num) + .orderByAsc(SchBasePoint::getRow_num); + List list = pointService.list(lam); + return list.size() > 0 ? list.get(0) : null; + } + + @Override + protected void updateStatus(String task_code, TaskStatus status) { + // 校验任务 + SchBaseTask taskObj = taskService.getByCode(task_code); + if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("该任务已完成!"); + } + if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { + throw new BadRequestException("该任务已取消!"); + } + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { // 执行中 + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + TaskUtils.setUpdateByAcs(taskObj); + taskService.updateById(taskObj); + } + if (status.equals(TaskStatus.FINISHED)) { // 完成 + this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + } + if (status.equals(TaskStatus.CANCELED)) { // 取消 + this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + } + } + + @Override + public void forceFinish(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + + @Override + public void cancel(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + + public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + // 获取参数 + String startPoint = taskObj.getPoint_code1(); // 获取起点 + SchBasePoint startPointObj = pointService.selectByIdLock(startPoint); + // 起点清空 + if (ObjectUtil.isNotEmpty(startPointObj)) { + PointUtils.setUpdateByType(startPointObj, taskFinishedType); + startPointObj.setIng_task_code(""); + pointService.updateById(startPointObj); + } + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark(GeneralDefinition.TASK_FINISH); + taskObj.setFinished_type(taskFinishedType.getCode()); + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } + + public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + // 获取参数 + String startPoint = taskObj.getPoint_code1(); // 获取起点 + SchBasePoint startPointObj = pointService.getById(startPoint); + // 起点解锁 + if (ObjectUtil.isNotEmpty(startPointObj)) { + startPointObj.setIng_task_code(""); + PointUtils.setUpdateByType(startPointObj, taskFinishedType); + pointService.updateById(startPointObj); + } + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setFinished_type(taskFinishedType.getCode()); + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } + + @Override + protected void feedbackTaskState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result) { + + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/KJSKTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/KJSKTask.java new file mode 100644 index 0000000..87359cb --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/KJSKTask.java @@ -0,0 +1,237 @@ +package org.nl.wms.sch.task_manage.task.tasks.kj; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.exception.BadRequestException; +import org.nl.system.service.notice.ISysNoticeService; +import org.nl.system.service.param.ISysParamService; +import org.nl.wms.ext.service.dto.to.BaseResponse; +import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; +import org.nl.wms.sch.point.service.ISchBasePointService; +import org.nl.wms.sch.point.service.dao.SchBasePoint; +import org.nl.wms.sch.task.service.ISchBaseTaskService; +import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; +import org.nl.wms.sch.task.service.dao.SchBaseTask; +import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; +import org.nl.wms.sch.task_manage.AbstractTask; +import org.nl.wms.sch.task_manage.GeneralDefinition; +import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum; +import org.nl.wms.sch.task_manage.enums.PointStatusEnum; +import org.nl.wms.sch.task_manage.enums.PointTypeConstant; +import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum; +import org.nl.wms.sch.task_manage.task.TaskFactory; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.sch.task_manage.task.tasks.kj.dto.KJWStatisticsDto; +import org.nl.wms.sch.task_manage.task.tasks.kj.mapper.KJSKMapper; +import org.nl.wms.util.PointUtils; +import org.nl.wms.util.TaskUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author: lyd + * @Description: 空架回收(送空)任务 空架输送线 -> 暂存输送线、暂存区域 + * @Date: 2023/11/30 + */ +@Slf4j +@Component("KJSKTask") +public class KJSKTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "KJSKTask"; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private ISysNoticeService noticeService; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISysParamService paramService; + @Autowired + private TaskFactory taskFactory; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + @Autowired + private KJSKMapper kjskMapper; + + @Override + protected void create() throws BadRequestException { + + } + + @Override + protected void createCompletion(SchBaseTask task) { + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + List nextRegionStr = Arrays.stream(taskConfig.getNext_region_str().split(",")) + .collect(Collectors.toList()); + // 找终点 + String requestParam = task.getRequest_param(); + JSONObject jsonObject = JSONObject.parseObject(requestParam); + SchBasePoint point = findNextPoint(nextRegionStr, jsonObject); + if (ObjectUtil.isEmpty(point)) { + // 消息通知 + noticeService.createNotice("暂无所需点位存放空架!", TASK_CONFIG_CODE + task.getPoint_code2(), + NoticeTypeEnum.WARN.getCode()); + throw new BadRequestException("暂无所需点位存放空架!"); + } + SchBasePoint startPoint = pointService.getById(task.getPoint_code1()); + // 设置起点并修改创建成功状态 + task.setPoint_code2(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setVehicle_type(startPoint.getCan_vehicle_type()); + task.setRemark(""); + taskService.save(task); + + point.setIng_task_code(task.getTask_code()); + PointUtils.setUpdateByAcs(point); + pointService.updateById(point); + } + + /** + * todo: 待优化:如果第二排运行中,就不知道第二排是什么类型 + * 找终点 + * @param nextRegionStr + * @param jsonObject + * @return + */ + private SchBasePoint findNextPoint(List nextRegionStr, JSONObject jsonObject) { + SchBasePoint device = pointService.getById(jsonObject.getString("device_code")); + // 先找暂存输送线有没有空位 + List zcssxList = pointService.list(new LambdaQueryWrapper() + .eq(SchBasePoint::getRegion_code, nextRegionStr.get(0)) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) // 当前执行的任务为空或者NULL,有数据表示锁住 + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getCan_vehicle_type, device.getVehicle_type()) + .eq(SchBasePoint::getIs_used, true) + .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_POINT.getCode()) + .eq(SchBasePoint::getPoint_type, PointTypeConstant.ENTRANCE)); + if (zcssxList.size() == 0) { + // 如果暂存输送线找不到,就去暂存位存放。 + // 1、先获取相同类型且不是最开始的位置(最外面1,最里面2) + List tempList = kjskMapper.getSameTypePoint(nextRegionStr.get(1)); + if (ObjectUtil.isNotEmpty(tempList)) { + SchBasePoint tempPoint = tempList.get(0); + // 找到就获取下一个位置 + List resultPointList = pointService.list(new LambdaQueryWrapper() + .eq(SchBasePoint::getRegion_code, nextRegionStr.get(1)) + .eq(SchBasePoint::getRow_num, tempPoint.getRow_num() - 1) + .eq(SchBasePoint::getCol_num, tempPoint.getCol_num()) + .eq(SchBasePoint::getIs_used, true)); + if (resultPointList.size() > 0) { + return resultPointList.get(0); + } + } + // 如果是没有找到相同位置的,或者是相同位置的下一个位置是不能用的,就得从新找一个全新的位置 + List kjwStatisticsDtos = kjskMapper.getKJWStatistics(nextRegionStr.get(1)); + // 如果还没找到,那就是没有位置 + if (kjwStatisticsDtos.size() == 0) { + return null; + } + zcssxList = pointService.list(new LambdaQueryWrapper() + .eq(SchBasePoint::getRegion_code, nextRegionStr.get(1)) + .eq(SchBasePoint::getCol_num, kjwStatisticsDtos.get(0).getCol_num()) + .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_POINT.getCode()) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) // 当前执行的任务为空或者NULL,有数据表示锁住 + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getIs_used, true) + .orderByAsc(SchBasePoint::getIn_empty_seq)); + } + return zcssxList.size() > 0 ? zcssxList.get(0) : null; + } + + @Override + protected void updateStatus(String task_code, TaskStatus status) { + // 校验任务 + SchBaseTask taskObj = taskService.getByCode(task_code); + if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("该任务已完成!"); + } + if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { + throw new BadRequestException("该任务已取消!"); + } + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { // 执行中 + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + TaskUtils.setUpdateByAcs(taskObj); + taskService.updateById(taskObj); + } + if (status.equals(TaskStatus.FINISHED)) { // 完成 + this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + } + if (status.equals(TaskStatus.CANCELED)) { // 取消 + this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + } + } + + @Override + public void forceFinish(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + + @Override + public void cancel(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + // 获取参数 + String endPoint = taskObj.getPoint_code2(); // 获取终点 + String vehicleType = ObjectUtil.isNotEmpty(taskObj.getVehicle_type()) ? taskObj.getVehicle_type() : ""; + SchBasePoint endPointObj = pointService.getById(endPoint); + // 设置载具类型、点位状态、释放点位 + if (ObjectUtil.isNotEmpty(endPoint)) { + endPointObj.setIng_task_code(""); + if (endPointObj.getRegion_code().equals("KJW")) { + endPointObj.setVehicle_type(vehicleType); + endPointObj.setPoint_status(PointStatusEnum.EMPTY_VEHICLE.getCode()); + } + PointUtils.setUpdateByType(endPointObj, taskFinishedType); + pointService.updateById(endPointObj); + } + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark(GeneralDefinition.TASK_FINISH); + taskObj.setFinished_type(taskFinishedType.getCode()); + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } + public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + // 获取参数 + String endPoint = taskObj.getPoint_code2(); // 获取终点 + SchBasePoint endPointObj = pointService.getById(endPoint); + // 释放点位 + if (ObjectUtil.isNotEmpty(endPoint)) { + endPointObj.setIng_task_code(""); + PointUtils.setUpdateByType(endPointObj, taskFinishedType); + pointService.update(endPointObj); + } + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setRemark(GeneralDefinition.TASK_CANCEL); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setFinished_type(taskFinishedType.getCode()); + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } + + @Override + protected void feedbackTaskState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result) { + + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/dto/KJWStatisticsDto.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/dto/KJWStatisticsDto.java new file mode 100644 index 0000000..f37e1ee --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/dto/KJWStatisticsDto.java @@ -0,0 +1,14 @@ +package org.nl.wms.sch.task_manage.task.tasks.kj.dto; + +import lombok.Data; + +/** + * @Author: lyd + * @Description: 空架位统计的Dto + * @Date: 2023/11/30 + */ +@Data +public class KJWStatisticsDto { + private Integer col_num; + private Integer sum; +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/mapper/KJSKMapper.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/mapper/KJSKMapper.java new file mode 100644 index 0000000..8eadbd0 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/mapper/KJSKMapper.java @@ -0,0 +1,17 @@ +package org.nl.wms.sch.task_manage.task.tasks.kj.mapper; + +import org.nl.wms.sch.point.service.dao.SchBasePoint; +import org.nl.wms.sch.task_manage.task.tasks.kj.dto.KJWStatisticsDto; + +import java.util.List; + +/** + * @Author: lyd + * @Description: + * @Date: 2023/11/30 + */ +public interface KJSKMapper { + List getSameTypePoint(String region); + + List getKJWStatistics(String region); +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/mapper/KJSKMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/mapper/KJSKMapper.xml new file mode 100644 index 0000000..ce9cea6 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/kj/mapper/KJSKMapper.xml @@ -0,0 +1,50 @@ + + + + + + + diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/tbx/TBXMLTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/tbx/TBXMLTask.java new file mode 100644 index 0000000..72dbd36 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/tbx/TBXMLTask.java @@ -0,0 +1,389 @@ +package org.nl.wms.sch.task_manage.task.tasks.tbx; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.CodeUtil; +import org.nl.system.service.notice.ISysNoticeService; +import org.nl.system.service.param.ISysParamService; +import org.nl.system.service.param.dao.Param; +import org.nl.wms.ext.service.dto.to.BaseResponse; +import org.nl.wms.pdm.service.IPdmBdWorkorderService; +import org.nl.wms.pdm.service.dao.PdmBdWorkorder; +import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; +import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; +import org.nl.wms.sch.point.service.ISchBasePointService; +import org.nl.wms.sch.point.service.dao.SchBasePoint; +import org.nl.wms.sch.task.service.ISchBaseTaskService; +import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; +import org.nl.wms.sch.task.service.dao.SchBaseTask; +import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; +import org.nl.wms.sch.task_manage.AbstractTask; +import org.nl.wms.sch.task_manage.GeneralDefinition; +import org.nl.wms.sch.task_manage.enums.*; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.sch.task_manage.task.tasks.tbx.mapper.TBXMapper; +import org.nl.wms.util.PointUtils; +import org.nl.wms.util.TaskUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author: lyd + * @Description: 涂板线满料请求 + * @Date: 2023/11/17 + */ +@Slf4j +@Component("TBXMLTask") +public class TBXMLTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "TBXMLTask"; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private ISysNoticeService noticeService; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISysParamService paramService; + @Autowired + private TBXMapper tbxMapper; + @Autowired + private IPdmBdWorkorderService workorderService; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + + /** + * hint: 涂板线任务先发到等待点,接着二次请求获取真正的点位。 + * + * @throws BadRequestException + */ + @Override + protected void create() throws BadRequestException { + // 获取任务 + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + for (SchBaseTask task : tasks) { + TaskUtils.setUpdateByAcs(task); // 修改修改者 + List nextRegionStr = Arrays.stream(taskConfig.getNext_region_str().split(",")) + .collect(Collectors.toList()); + // 找终点 + String requestParam = task.getRequest_param(); + JSONObject jsonObject = JSONObject.parseObject(requestParam); + SchBasePoint point = findNextPoint(nextRegionStr, jsonObject); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("涂板线[" + task.getPoint_code1() + "]未找到所需点位!"); + taskService.updateById(task); + // 消息通知 + noticeService.createNotice(task.getRemark(), TASK_CONFIG_CODE + task.getTask_code(), + NoticeTypeEnum.WARN.getCode()); + continue; + } + // 设置终点并修改创建成功状态 + task.setPoint_code2(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setRemark(""); + taskService.updateById(task); + + point.setIng_task_code(task.getTask_code()); + PointUtils.setUpdateByAcs(point); + pointService.updateById(point); + } + } + + /** + * 不创建半条任务,直接创建完整任务 + * @param task + */ + @Override + protected void createCompletion(SchBaseTask task) { + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + List nextRegionStr = Arrays.stream(taskConfig.getNext_region_str().split(",")) + .collect(Collectors.toList()); + // 找终点 + String requestParam = task.getRequest_param(); + JSONObject jsonObject = JSONObject.parseObject(requestParam); + SchBasePoint point = findNextPoint(nextRegionStr, jsonObject); + if (ObjectUtil.isEmpty(point)) { + throw new BadRequestException("涂板线[" + task.getPoint_code1() + "]未找到所需点位!"); + } + // 生成载具编码 + String vehicleCode = CodeUtil.getNewCode("VEHICLE_CODE"); + jsonObject.put("vehicle_code", vehicleCode); + // 设置组盘 - 需要的话由子类自行实现 + task.setGroup_id(setGroupPlate(jsonObject)); + // 设置等待点并修改创建成功状态 + task.setNext_wait_point(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setRemark(""); + task.setVehicle_code(vehicleCode); + TaskUtils.setUpdateByAcs(task); // 修改修改者 + taskService.save(task); + +// point.setIng_task_code(task.getTask_code()); + PointUtils.setUpdateByAcs(point); + pointService.updateById(point); + } + + /** + * 在固化室找一个等待点 + * hint: 需要校验存放类型 + * todo: 目前不考虑固化方案 + * + * @param nextRegionStr + * @param jsonObject + * @return + */ + private SchBasePoint findNextPoint(List nextRegionStr, JSONObject jsonObject) { + // 获取工单 + String workorderCode = jsonObject.getString("workorder_code"); + if (ObjectUtil.isEmpty(workorderCode)) { + throw new BadRequestException("当前设备暂无工单"); + } + PdmBdWorkorder workorder = workorderService.getByCode(workorderCode); + // todo: 获取载具类型 + String vehicle_type = workorder.getVehicle_type(); + Param curingPlan = paramService.findByCode("CuringPlan");// 获取固化方案 + List points = new ArrayList<>(); + if (curingPlan.getValue().equals(GeneralDefinition.NOT_MIXING)) { + // 不可混料-需要根据工单上物料的信息 + // 1 获取含有该物料并且没满的固化室。 + points = tbxMapper.getNotFullByMaterial(nextRegionStr, vehicle_type, workorder.getMaterial_id()); + if (points.size() == 0) { + // 2 没有对应的固化室,就找新的固化室 + points = tbxMapper.getEmptyPoint(nextRegionStr, vehicle_type); + } + } else if (curingPlan.getValue().equals(GeneralDefinition.CAN_MIXING)) { + // 可混料 + points = tbxMapper.getCanMiningPoint(nextRegionStr, vehicle_type); + } else { + // todo:自定义混料 + } + return points.size() > 0 ? points.get(0) : null; + } + + @Override + protected void updateStatus(String task_code, TaskStatus status) { +// 校验任务 + SchBaseTask taskObj = taskService.getByCode(task_code); + if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("该任务已完成!"); + } + if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { + throw new BadRequestException("该任务已取消!"); + } + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { // 执行中 + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + TaskUtils.setUpdateByAcs(taskObj); + taskService.updateById(taskObj); + } + if (status.equals(TaskStatus.FINISHED)) { // 完成 + this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + } + if (status.equals(TaskStatus.CANCELED)) { // 取消 + this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + } + } + + @Override + public void forceFinish(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + + @Override + public void cancel(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + + @Override + protected void feedbackTaskState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result) { + + } + + @Override + public String setGroupPlate(JSONObject param) { + // 获取工单 + PdmBdWorkorder orderObject = workorderService.getDeviceDockingProductionTask(param.getString("device_code")); + if (ObjectUtil.isEmpty(orderObject)) { + throw new BadRequestException("设备:[" + param.getString("device_code") + "]工单不存在!"); + } + String vehicleCode = param.getString("vehicle_code"); + if (ObjectUtil.isEmpty(vehicleCode)) { // 如果不是立即创建,就需要再此生成 + vehicleCode = CodeUtil.getNewCode("VEHICLE_CODE"); + } + SchBaseVehiclematerialgroup vehicleGroupInfo = vehiclematerialgroupService.getVehicleGroupInfo(vehicleCode, + orderObject.getVehicle_type(), GroupBindMaterialStatusEnum.BOUND.getValue()); + if (ObjectUtil.isNotEmpty(vehicleGroupInfo)) { + throw new BadRequestException("载具号:" + vehicleCode + "-载具类型:" + orderObject.getVehicle_type() + "组盘信息已存在"); + } + // 获取当前位置 + SchBasePoint basePoint = pointService.getById(param.getString("device_code")); + SchBaseVehiclematerialgroup groupEntity = new SchBaseVehiclematerialgroup(); + groupEntity.setGroup_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + // 解绑同载具的信息 +// vehiclematerialgroupService.unBindingSameVehicleMaterial(vehicleCode, vehicleType); + // 要把数据存到组盘表 + groupEntity.setMaterial_id(ObjectUtil.isNotEmpty(orderObject) + ? orderObject.getMaterial_id() + : ""); + groupEntity.setStanding_time(ObjectUtil.isNotEmpty(orderObject) + ? orderObject.getStanding_time() + : 0); + groupEntity.setWorkorder_code(ObjectUtil.isNotEmpty(orderObject) + ? orderObject.getWorkorder_code() + : ""); + groupEntity.setCreate_id(GeneralDefinition.ACS_ID); + groupEntity.setCreate_name(GeneralDefinition.ACS_NAME); + groupEntity.setCreate_time(DateUtil.now()); + groupEntity.setVehicle_code(vehicleCode); + groupEntity.setVehicle_type(orderObject.getVehicle_type()); + groupEntity.setPoint_code(basePoint.getPoint_code()); // 对接位 + groupEntity.setPoint_name(basePoint.getPoint_name()); + groupEntity.setSource_vehicle_code(basePoint.getPoint_code()); + groupEntity.setMove_way(basePoint.getPoint_code()); + groupEntity.setPcsn(DateUtil.format(DateUtil.date(), "yyyyMMdd")); // 批次号使用自己定义的 + groupEntity.setInstorage_time(DateUtil.now()); + groupEntity.setGroup_bind_material_status(GroupBindMaterialStatusEnum.BOUND.getValue()); // 绑定 + groupEntity.setGroup_status(GroupStatusEnum.IN_STORAGE.getType()); // 暂时不维护。 + groupEntity.setIs_delete(false); + groupEntity.setIs_full(true); + vehiclematerialgroupService.saveOrUpdate(groupEntity); + // 返回组盘id记录任务中 + return groupEntity.getGroup_id(); + } + + public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + String endPoint = taskObj.getPoint_code2(); // 获取终点 + SchBasePoint endPointObj = pointService.getById(endPoint); + if (ObjectUtil.isNotEmpty(endPointObj)) { + SchBaseVehiclematerialgroup vehiclematerialgroup = vehiclematerialgroupService.getById(taskObj.getGroup_id()); + TaskUtils.setGroupUpdateByType(vehiclematerialgroup, taskFinishedType); + vehiclematerialgroup.setTask_code(taskObj.getTask_code()); // 当前任务 + vehiclematerialgroup.setBuss_move_id(taskObj.getTask_code()); // 设置链路id,使用任务编码 + vehiclematerialgroup.setGroup_bind_material_status(GroupBindMaterialStatusEnum.BOUND.getValue()); + vehiclematerialgroup.setPoint_code(endPointObj.getPoint_code()); // 当前位置 + vehiclematerialgroup.setPoint_name(endPointObj.getPoint_name()); + vehiclematerialgroup.setMove_way(vehiclematerialgroup.getMove_way() + " -> " + endPointObj.getPoint_code()); + vehiclematerialgroupService.updateById(vehiclematerialgroup); + // 终点解锁 + endPointObj.setIng_task_code(""); + PointUtils.setUpdateByType(endPointObj, taskFinishedType); + // 赋值 + endPointObj.setVehicle_code(vehiclematerialgroup.getVehicle_code()); + endPointObj.setVehicle_type(vehiclematerialgroup.getVehicle_type()); + endPointObj.setPoint_status(PointStatusEnum.EMPTY_VEHICLE.getCode()); + pointService.updateById(endPointObj); + // 插入生产过程跟踪表 +// PdmBdProductionProcessTracking processTracking = new PdmBdProductionProcessTracking(); +// processTracking.setBuss_move_id(vehiclematerialgroup.getBuss_move_id()); +// processTracking.setProcess_action("压制送料入双层缓存线"); +// processTracking.setProcess_location(endPoint); +// processTracking.setRecord_time(DateUtil.now()); +// processTrackingService.create(processTracking); + // 工单统计实际数量 +// Integer materialQty = vehiclematerialgroup.getMaterial_qty(); +// PdmBdWorkorder bdWorkorder = workorderService.getByCode(vehiclematerialgroup.getWorkorder_code()); +// BigDecimal realQty = bdWorkorder.getReal_qty(); +// bdWorkorder.setReal_qty(NumberUtil.add(realQty, materialQty)); +// TaskUtils.setWorkOrderUpdateByType(bdWorkorder, taskFinishedType); +// workorderService.updateById(bdWorkorder); + } + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark(GeneralDefinition.TASK_FINISH); + taskObj.setFinished_type(taskFinishedType.getCode()); + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } + + public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + // 获取参数 +// String waitPoint = taskObj.getNext_wait_point(); // 获取等待点 + String endPoint = taskObj.getPoint_code2(); // 获取终点 +// SchBasePoint waitPointObj = pointService.getById(waitPoint); + SchBasePoint endPointObj = pointService.getById(endPoint); + // 等待点解锁 不锁 +// if (ObjectUtil.isNotEmpty(waitPointObj)) { +// waitPointObj.setIng_task_code(""); +// PointUtils.setUpdateByType(waitPointObj, taskFinishedType); +// pointService.updateById(waitPointObj); +// } + // 终点解锁 + if (ObjectUtil.isNotEmpty(endPointObj)) { + endPointObj.setIng_task_code(""); + PointUtils.setUpdateByType(endPointObj, taskFinishedType); + pointService.updateById(endPointObj); + } + taskObj.setRemark(GeneralDefinition.TASK_CANCEL); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setFinished_type(taskFinishedType.getCode()); + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } + + /** + * 再次请求 + * @param task_id: 任务标识 + * @return + */ + @Override + public String againApply(String task_id) { + SchBaseTask task = taskService.getById(task_id); + if (ObjectUtil.isEmpty(task)) { + throw new BadRequestException("任务:[" + task_id + "]不存在!"); + } + String waitPoint = task.getNext_wait_point(); + if (ObjectUtil.isEmpty(waitPoint)) { + throw new BadRequestException("找不到任务:[" + task_id + "]等待点!"); + } + // 根据任务上等待点的位置获取准确的固化室位置。 + // mark: 不考虑前空中间有货后空的问题 + SchBasePoint ghsInPoint = pointService.getById(waitPoint); + List pointList = pointService.list(new LambdaQueryWrapper() + .eq(SchBasePoint::getParent_point_code, ghsInPoint.getParent_point_code()) + .eq(SchBasePoint::getPoint_type, PointTypeConstant.DOCKING_POINT) + .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_POINT.getCode()) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) // 当前执行的任务为空或者NULL,有数据表示锁住 + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getIs_used, true) + .orderByAsc(SchBasePoint::getIn_order_seq)); + if (pointList.size() == 0) { // hint: 如果满了,是否可以考虑转到其他固化室等待点 + throw new BadRequestException("找不到对应的固化室"); + } + SchBasePoint point = pointList.get(0); // 获取第一条 + // 锁住货位点 + PointUtils.setUpdateByAcs(point); + point.setIng_task_code(task.getTask_code()); + pointService.updateById(point); + // 任务修改点位 + task.setPoint_code2(point.getPoint_code()); + TaskUtils.setUpdateByAcs(task); + taskService.updateById(task); + return point.getPoint_code(); + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/tbx/TBXQKTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/tbx/TBXQKTask.java new file mode 100644 index 0000000..667760c --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/tbx/TBXQKTask.java @@ -0,0 +1,230 @@ +package org.nl.wms.sch.task_manage.task.tasks.tbx; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.exception.BadRequestException; +import org.nl.system.service.notice.ISysNoticeService; +import org.nl.wms.ext.service.dto.to.BaseResponse; +import org.nl.wms.sch.point.service.ISchBasePointService; +import org.nl.wms.sch.point.service.dao.SchBasePoint; +import org.nl.wms.sch.task.service.ISchBaseTaskService; +import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; +import org.nl.wms.sch.task.service.dao.SchBaseTask; +import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; +import org.nl.wms.sch.task_manage.AbstractTask; +import org.nl.wms.sch.task_manage.GeneralDefinition; +import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum; +import org.nl.wms.sch.task_manage.enums.PointStatusEnum; +import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.util.PointUtils; +import org.nl.wms.util.TaskUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author: lyd + * @Description: + * @Date: 2023/11/29 + */ +@Slf4j +@Component(value = "TBXQKTask") +public class TBXQKTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "TBXQKTask"; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private ISysNoticeService noticeService; + @Override + protected void create() throws BadRequestException { + // 获取任务 + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + for (SchBaseTask task : tasks) { + TaskUtils.setUpdateByAcs(task); // 修改修改者 + List startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(",")) + .collect(Collectors.toList()); + // 找起点 + String requestParam = task.getRequest_param(); + JSONObject jsonObject = JSONObject.parseObject(requestParam); + // 根据对接位查找对应的载具类型 + SchBasePoint startPoint = pointService.getById(task.getPoint_code2()); + jsonObject.put("vehicle_type", startPoint.getCan_vehicle_type()); + SchBasePoint point = findStartPoint(startRegionStr, jsonObject); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("未找到所需点位!"); + taskService.updateById(task); + // 消息通知 + noticeService.createNotice("未找到所需点位!", TASK_CONFIG_CODE + task.getTask_code(), + NoticeTypeEnum.WARN.getCode()); + continue; + } + // 设置终点并修改创建成功状态 + task.setPoint_code1(point.getPoint_code()); + task.setVehicle_type(startPoint.getCan_vehicle_type()); + task.setRemark(""); + task.setTask_status(TaskStatus.CREATED.getCode()); + taskService.updateById(task); + + point.setIng_task_code(task.getTask_code()); + PointUtils.setUpdateByAcs(point); + pointService.updateById(point); + + //下发 + //this.renotifyAcs(task); + } + } + + @Override + protected void createCompletion(SchBaseTask task) { + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + TaskUtils.setUpdateByAcs(task); + List startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(",")) + .collect(Collectors.toList()); + // 找起点 + String requestParam = task.getRequest_param(); + JSONObject extGroupData = JSONObject.parseObject(requestParam); + // 根据对接位查找对应的载具类型 + SchBasePoint startPoint = pointService.getById(task.getPoint_code2()); + extGroupData.put("vehicle_type", startPoint.getCan_vehicle_type()); + SchBasePoint point = findStartPoint(startRegionStr, extGroupData); + if (ObjectUtil.isEmpty(point)) { + throw new BadRequestException("未找到所需点位!"); + } + // 设置终点并修改创建成功状态 + task.setPoint_code1(point.getPoint_code()); + task.setVehicle_type(startPoint.getCan_vehicle_type()); + task.setRemark(""); + task.setTask_status(TaskStatus.CREATED.getCode()); + taskService.save(task); + + point.setIng_task_code(task.getTask_code()); + PointUtils.setUpdateByAcs(point); + pointService.updateById(point); + } + + /** + * 业务过程:到指定的区域获取空架 + * @param startRegionStr + * @param requestParam + * @return + */ + private SchBasePoint findStartPoint(List startRegionStr, JSONObject requestParam) { + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.in(SchBasePoint::getRegion_code, startRegionStr) // hint: 默认一直都有载具 + .eq(SchBasePoint::getPoint_type, GeneralDefinition.EXIT) // 点位类型是拆盘机出口 + .eq(SchBasePoint::getCan_vehicle_type, requestParam.getString("vehicle_type")) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) // 当前执行的任务为空或者NULL,有数据表示锁住 + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getBlock_num, "1") + .eq(SchBasePoint::getIs_used, true); + List schBasePoints = pointService.list(lam); + return ObjectUtil.isNotEmpty(schBasePoints) ? schBasePoints.get(0) : null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + protected void updateStatus(String task_code, TaskStatus status) { + // 校验任务 + SchBaseTask taskObj = taskService.getByCode(task_code); + if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("该任务已完成!"); + } + if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { + throw new BadRequestException("该任务已取消!"); + } + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { // 执行中 + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + TaskUtils.setUpdateByAcs(taskObj); + taskService.updateById(taskObj); + } + if (status.equals(TaskStatus.FINISHED)) { // 完成 + this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + } + if (status.equals(TaskStatus.CANCELED)) { // 取消 + this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + } + } + + @Override + public void forceFinish(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + + @Override + public void cancel(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + + public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + // 获取参数 + String startPoint = taskObj.getPoint_code1(); // 获取起点 + String endPoint = taskObj.getPoint_code2(); // 获取起点 + SchBasePoint startPointObj = pointService.selectByIdLock(startPoint); + SchBasePoint endPointObj = pointService.selectByIdLock(endPoint); + // 起点清空 + if (ObjectUtil.isNotEmpty(startPointObj)) { + PointUtils.setUpdateByType(startPointObj, taskFinishedType); + startPointObj.setIng_task_code(""); + pointService.updateById(startPointObj); + endPointObj.setPoint_status(PointStatusEnum.EMPTY_VEHICLE.getCode()); + endPointObj.setVehicle_type(taskObj.getVehicle_type()); + endPointObj.setVehicle_qty(1); + PointUtils.setUpdateByType(endPointObj, taskFinishedType); + pointService.updateById(endPointObj); + } + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark(GeneralDefinition.TASK_FINISH); + taskObj.setFinished_type(taskFinishedType.getCode()); + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } + + public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + // 获取参数 + String startPoint = taskObj.getPoint_code1(); // 获取起点 + SchBasePoint startPointObj = pointService.getById(startPoint); + // 起点解锁 + if (ObjectUtil.isNotEmpty(startPointObj)) { + startPointObj.setIng_task_code(""); + PointUtils.setUpdateByType(startPointObj, taskFinishedType); + pointService.updateById(startPointObj); + } + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setFinished_type(taskFinishedType.getCode()); + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } + + @Override + protected void feedbackTaskState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result) { + + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/tbx/mapper/TBXMapper.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/tbx/mapper/TBXMapper.java new file mode 100644 index 0000000..4eb575f --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/tbx/mapper/TBXMapper.java @@ -0,0 +1,36 @@ +package org.nl.wms.sch.task_manage.task.tasks.tbx.mapper; + +import org.nl.wms.sch.point.service.dao.SchBasePoint; + +import java.util.List; + +/** + * @Author: lyd + * @Description: + * @Date: 2023/11/17 + */ +public interface TBXMapper { + /** + * 随机找可用的固化室 + * @param regionCode + * @param vehicleType + * @return + */ + List getCanMiningPoint(List regionCode, String vehicleType); + + /** + * 获取固化中没满可用的固化室 + * @param nextRegionStr + * @param materialId + * @return + */ + List getNotFullByMaterial(List nextRegionStr, String vehicleType, String materialId); + + /** + * 获取空的固化室 + * @param nextRegionStr + * @param vehicleType + * @return + */ + List getEmptyPoint(List nextRegionStr, String vehicleType); +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/tbx/mapper/TBXMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/tbx/mapper/TBXMapper.xml new file mode 100644 index 0000000..3045206 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/tbx/mapper/TBXMapper.xml @@ -0,0 +1,108 @@ + + + + + + + + diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/PointUtils.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/PointUtils.java index 279b027..0cba520 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/PointUtils.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/PointUtils.java @@ -1,11 +1,15 @@ package org.nl.wms.util; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import org.nl.common.utils.SecurityUtils; import org.nl.config.SpringContextHolder; import org.nl.wms.sch.point.service.dao.SchBasePoint; import org.nl.wms.sch.point.service.impl.SchBasePointServiceImpl; +import org.nl.wms.sch.task_manage.GeneralDefinition; import org.nl.wms.sch.task_manage.enums.PointStatusEnum; +import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum; /** * @Author: lyd @@ -16,14 +20,15 @@ public class PointUtils { /** * 获取状态名或者类型名 + * * @param explain * @param label * @return */ public static String getStatusOrTypeName(String explain, String label) { JSONObject statusArr = new JSONObject(); - String[] split = explain.split(","); - for ( int j = 0; j < split.length; j++) { + String[] split = explain.split(","); + for (int j = 0; j < split.length; j++) { String[] status = split[j].split("-"); statusArr.put(status[0], status[1]); } @@ -33,11 +38,15 @@ public class PointUtils { /** * 清空点位 + * * @param point */ public static void clearPoint(SchBasePoint point) { + if (ObjectUtil.isEmpty(point)) { + return; // 空直接退出 + } SchBasePointServiceImpl pointService = SpringContextHolder.getBean(SchBasePointServiceImpl.class); -// point.setPoint_status(PointStatusEnum.EMPTY_POINT.getCode()); + point.setPoint_status(PointStatusEnum.EMPTY_POINT.getCode()); point.setVehicle_type(""); point.setVehicle_code(""); point.setIng_task_code(""); @@ -45,4 +54,57 @@ public class PointUtils { point.setUpdate_time(DateUtil.now()); pointService.updateById(point); } + + /** + * 清空点位 + * 双层输送线特殊功能:上五下五 + * + * @param point + */ + public static void clearPointAndRetainNum(SchBasePoint point) { + if (ObjectUtil.isEmpty(point)) { + return; // 空直接退出 + } + SchBasePointServiceImpl pointService = SpringContextHolder.getBean(SchBasePointServiceImpl.class); + // 获取父点位 + String parentPointCode = point.getParent_point_code(); + SchBasePoint basePoint = pointService.getById(parentPointCode); + point.setVehicle_type(""); + point.setVehicle_code(""); + point.setIng_task_code(""); + point.setVehicle_qty(point.getVehicle_qty() == 5 ? point.getVehicle_qty() : point.getVehicle_qty() + 1); + if (basePoint.getVehicle_qty() == 5) { // 等到新的点执行第一托的时候,才判断另一个点满足5个托盘的时候就清空 + basePoint.setVehicle_qty(0); + basePoint.setUpdate_time(DateUtil.now()); + pointService.updateById(basePoint); + } + point.setUpdate_time(DateUtil.now()); + pointService.updateById(point); + } + + /** + * 点位修改更新信息 + **/ + public static void setUpdateByAcs(SchBasePoint pointObj) { + pointObj.setUpdate_id(GeneralDefinition.ACS_ID); + pointObj.setUpdate_name(GeneralDefinition.ACS_NAME); + pointObj.setUpdate_time(DateUtil.now()); + } + + /** + * 点位修改更新信息 + **/ + public static void setUpdateByPC(SchBasePoint pointObj) { + pointObj.setUpdate_id(SecurityUtils.getCurrentUserId()); + pointObj.setUpdate_name(SecurityUtils.getCurrentNickName()); + pointObj.setUpdate_time(DateUtil.now()); + } + + public static void setUpdateByType(SchBasePoint pointObj, TaskFinishedTypeEnum taskFinishedType) { + if (taskFinishedType.equals(TaskFinishedTypeEnum.AUTO_ACS)) { + setUpdateByAcs(pointObj); + } else { + setUpdateByPC(pointObj); + } + } } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/TaskUtils.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/TaskUtils.java index 2fd4b78..f451f70 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/TaskUtils.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/TaskUtils.java @@ -1,43 +1,119 @@ package org.nl.wms.util; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; import org.nl.common.utils.SecurityUtils; import org.nl.config.SpringContextHolder; +import org.nl.wms.pdm.service.dao.PdmBdWorkorder; +import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; import org.nl.wms.sch.task.service.ISchBaseTaskService; import org.nl.wms.sch.task.service.dao.SchBaseTask; -import org.nl.wms.sch.task.service.impl.SchBaseTaskServiceImpl; +import org.nl.wms.sch.task_manage.GeneralDefinition; import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum; import org.nl.wms.sch.task_manage.task.core.TaskStatus; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; import java.util.List; -import java.util.function.Consumer; /** * @Author: lyd * @Description: 任务修改抽取的公用方法 * @Date: 2023/6/13 */ -@Component +@Slf4j public class TaskUtils { - @Autowired - private ISchBaseTaskService taskService; - public void setUpdateByAcs(SchBaseTask taskObj) { - taskObj.setUpdate_id("2"); - taskObj.setUpdate_name("ACS系统"); + public static void setCreateByAcs(SchBaseTask taskObj) { + taskObj.setCreate_id(GeneralDefinition.ACS_ID); + taskObj.setCreate_name(GeneralDefinition.ACS_NAME); + taskObj.setCreate_time(DateUtil.now()); + } + public static void setCreateByPda(SchBaseTask taskObj) { + taskObj.setCreate_id(SecurityUtils.getCurrentUserId()); + taskObj.setCreate_name(SecurityUtils.getCurrentNickName()); + taskObj.setCreate_time(DateUtil.now()); + } + public static void setCreateByAcsOrPda(SchBaseTask taskObj, JSONObject param) { + // 如果是人工创建,会带个用户过来 + if (ObjectUtil.isNotEmpty(param.getString("user_id"))) { + setCreateByPda(taskObj); + } else { + setCreateByAcs(taskObj); + } + } + + public static void setUpdateByAcs(SchBaseTask taskObj) { + taskObj.setUpdate_id(GeneralDefinition.ACS_ID); + taskObj.setUpdate_name(GeneralDefinition.ACS_NAME); taskObj.setUpdate_time(DateUtil.now()); } - public void setUpdateByPC(SchBaseTask taskObj) { + + public static void setUpdateByPC(SchBaseTask taskObj) { taskObj.setUpdate_id(SecurityUtils.getCurrentUserId()); taskObj.setUpdate_name(SecurityUtils.getCurrentNickName()); taskObj.setUpdate_time(DateUtil.now()); } + public static void setGroupUpdateByAcs(SchBaseVehiclematerialgroup groupEntity) { + groupEntity.setUpdate_id(GeneralDefinition.ACS_ID); + groupEntity.setUpdate_name(GeneralDefinition.ACS_NAME); + groupEntity.setUpdate_time(DateUtil.now()); + } + + public static void setGroupUpdateByPC(SchBaseVehiclematerialgroup groupEntity) { + groupEntity.setUpdate_id(SecurityUtils.getCurrentUserId()); + groupEntity.setUpdate_name(SecurityUtils.getCurrentNickName()); + groupEntity.setUpdate_time(DateUtil.now()); + } + // 根据类型去判断谁修改的 - public void setUpdateByType(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + public static void setGroupUpdateByType(SchBaseVehiclematerialgroup groupEntity, TaskFinishedTypeEnum taskFinishedType) { + if (taskFinishedType.equals(TaskFinishedTypeEnum.AUTO_ACS)) { + setGroupUpdateByAcs(groupEntity); + } else { + setGroupUpdateByPC(groupEntity); + } + } + public static void setWorkOrderUpdateByAcs(PdmBdWorkorder pdmBdWorkorder) { + pdmBdWorkorder.setUpdate_id(GeneralDefinition.ACS_ID); + pdmBdWorkorder.setUpdate_name(GeneralDefinition.ACS_NAME); + pdmBdWorkorder.setUpdate_time(DateUtil.now()); + } + + public static void setWorkOrderUpdateByPC(PdmBdWorkorder pdmBdWorkorder) { + pdmBdWorkorder.setUpdate_id(ObjectUtil.isNotEmpty(SecurityUtils.getCurrentUserId()) + ? SecurityUtils.getCurrentUserId() : ""); + pdmBdWorkorder.setUpdate_name(ObjectUtil.isNotEmpty(SecurityUtils.getCurrentNickName()) + ? SecurityUtils.getCurrentNickName() : ""); + pdmBdWorkorder.setUpdate_time(DateUtil.now()); + } + + // 根据类型去判断谁修改的 + public static void setWorkOrderUpdateByType(PdmBdWorkorder groupEntity, TaskFinishedTypeEnum taskFinishedType) { + if (taskFinishedType.equals(TaskFinishedTypeEnum.AUTO_ACS)) { + setWorkOrderUpdateByAcs(groupEntity); + } else { + setWorkOrderUpdateByPC(groupEntity); + } + } + + + public static void setUpdateAuto(SchBaseTask taskObj) { + String currentUserId = ObjectUtil.isNotEmpty(SecurityUtils.getCurrentUserId()) + ? SecurityUtils.getCurrentUserId() + : "2"; + String nickName = ObjectUtil.isNotEmpty(SecurityUtils.getCurrentNickName()) + ? SecurityUtils.getCurrentNickName() + : "ACS系统"; + taskObj.setUpdate_id(currentUserId); + taskObj.setUpdate_name(nickName); + taskObj.setUpdate_time(DateUtil.now()); + } + + // 根据类型去判断谁修改的 + public static void setUpdateByType(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { if (taskFinishedType.equals(TaskFinishedTypeEnum.AUTO_ACS)) { setUpdateByAcs(taskObj); } else { @@ -45,8 +121,11 @@ public class TaskUtils { } } - /** 校验是否有起点终点的任务 */ - public Boolean hasTaskAll(String pointCode) { + /** + * 校验是否有起点终点的任务 + */ + public static Boolean hasTaskAll(String pointCode) { + ISchBaseTaskService taskService = SpringContextHolder.getBean(ISchBaseTaskService.class); final String code = pointCode; List list = taskService.list(new LambdaQueryWrapper() .lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode()) @@ -60,4 +139,73 @@ public class TaskUtils { .eq(SchBaseTask::getPoint_code4, code))); return list.size() > 0; } + + /**不需要转换 + * 转成ACS需要的载具类型 + * ACS载具类型:1 2 3 ... + * LMS载具类型:3 4 5 ... + * @param acsVehicleType + * @return + */ + public static String toAcsVehicleTypeShift(String acsVehicleType) { + if (ObjectUtil.isEmpty(acsVehicleType)) { + return null; + } + String lmsVehicleType = null; + try { + lmsVehicleType = Integer.parseInt(acsVehicleType) - 2 + ""; + } catch (Exception e) { + log.error("acs载具转换异常: {}", e.getMessage()); + } + return lmsVehicleType; + } + + /**不需要转换 + * 转成LMS需要的载具类型 + * ACS载具类型:1 2 3 ... + * LMS载具类型:3 4 5 ... + * @param lmsVehicleType + * @return + */ + public static String toLmsVehicleTypeShift(String lmsVehicleType) { + if (ObjectUtil.isEmpty(lmsVehicleType)) { + return null; + } + String acsVehicleType = null; + try { + acsVehicleType = Integer.parseInt(lmsVehicleType) + 2 + ""; + } catch (Exception e) { + log.error("acs载具转换异常: {}", e.getMessage()); + } + return acsVehicleType; + } + + /** + * 如果传来的载具编码是0,就返回null, 否则替换成四位数,用零补齐 + * @param acsVehicleCode + * @return + */ + public static String defaultVehicleCode(String acsVehicleCode) { + if (ObjectUtil.isEmpty(acsVehicleCode) || acsVehicleCode.equals(GeneralDefinition.NO)) { + return null; + } + return String.format("%04d", Integer.parseInt(acsVehicleCode)); + } + + /** + * 将输入的字符串相乘得出值 + * eg: 2*7*6 + * return: 84 + * @param needFullNumberStr + * @return + */ + public static int convertMultiply(String needFullNumberStr) { + String[] parts = needFullNumberStr.split("\\*"); // 使用 "*" 来分割字符串 + int result = 1; // 初始化结果为1 + for (String part : parts) { + int number = Integer.parseInt(part); // 将字符串部分解析为整数 + result *= number; // 将解析的整数与结果相乘 + } + return result; + } } diff --git a/lms/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml b/lms/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml index 0ef6ed3..75d08d6 100644 --- a/lms/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml +++ b/lms/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml @@ -6,10 +6,10 @@ spring: druid: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:cw_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true + url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:xftn_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true # url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:stand_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true username: ${DB_USER:root} - password: ${DB_PWD:123456} + password: ${DB_PWD:12356} # password: ${DB_PWD:P@ssw0rd} # 初始连接数 initial-size: 5 diff --git a/lms/nladmin-system/nlsso-server/src/main/resources/config/application-prod.yml b/lms/nladmin-system/nlsso-server/src/main/resources/config/application-prod.yml index f0fc978..3bf0425 100644 --- a/lms/nladmin-system/nlsso-server/src/main/resources/config/application-prod.yml +++ b/lms/nladmin-system/nlsso-server/src/main/resources/config/application-prod.yml @@ -1,14 +1,14 @@ server: - port: 8010 + port: 8011 #配置数据源 spring: datasource: druid: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.4.121}:${DB_PORT:3306}/${DB_NAME:yy_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true + url: jdbc:log4jdbc:mysql://${DB_HOST:101.37.151.193}:${DB_PORT:53306}/${DB_NAME:xftn_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true username: ${DB_USER:root} - password: ${DB_PWD:123456} + password: ${DB_PWD:P@ssW0rd123} # 初始连接数 initial-size: 5 # 最小连接数 diff --git a/lms/nladmin-system/nlsso-server/src/test/java/org/nl/point/PointCreate.java b/lms/nladmin-system/nlsso-server/src/test/java/org/nl/point/PointCreate.java index 02e4210..f6bdd01 100644 --- a/lms/nladmin-system/nlsso-server/src/test/java/org/nl/point/PointCreate.java +++ b/lms/nladmin-system/nlsso-server/src/test/java/org/nl/point/PointCreate.java @@ -1,6 +1,8 @@ package org.nl.point; import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import org.junit.jupiter.api.Test; import org.nl.wms.sch.point.service.ISchBasePointService; import org.nl.wms.sch.point.service.dao.SchBasePoint; @@ -25,64 +27,119 @@ public class PointCreate { @Autowired private ISchBaseRegionService regionService; @Test - void test01() { - // 创建YJ01-08 + void testTBX() { + // 创建涂板线 List pointList = new ArrayList<>(); - for (int i = 3; i <= 8; i++) { - String pointName = "压机0"; - String pointCode = "YJ0"; + // 普 + for (int i = 1; i <= 4; i++) { + String pointName = "普涂线0"; + String pointCode = "PTX0"; pointName = pointName + i; pointCode = pointCode + i; SchBasePoint point = new SchBasePoint(); point.setPoint_code(pointCode); point.setPoint_name(pointName); - point.setRegion_code("YZ"); - point.setRegion_name("压制区域"); + point.setRegion_code("TBX"); + point.setRegion_name("涂板线区域"); point.setPoint_type("1"); point.setParent_point_code(pointCode); point.setIs_has_workder(true); point.setIs_auto(true); + point.setCreate_id("1"); + point.setCreate_name("管理员"); + point.setCreate_time(DateUtil.now()); + pointList.add(point); + } + // 普对接 + for (int i = 1; i <= 4; i++) { + String pointName = "普涂线0" + i + "对接位0"; + String pointCode = "PTX0" + i + "DJW0"; + pointName = pointName + i; + pointCode = pointCode + i; + SchBasePoint point = new SchBasePoint(); + point.setPoint_code(pointCode); + point.setPoint_name(pointName); + point.setRegion_code("TBX"); + point.setRegion_name("涂板线区域"); + point.setPoint_type("2"); + point.setParent_point_code("PTX0" + i); + point.setIs_has_workder(false); + point.setIs_auto(true); + point.setCreate_id("1"); + point.setCreate_name("管理员"); + point.setCreate_time(DateUtil.now()); + pointList.add(point); + } + // 连 + for (int i = 1; i <= 6; i++) { + String pointName = "连涂线0"; + String pointCode = "LTX0"; + pointName = pointName + i; + pointCode = pointCode + i; + SchBasePoint point = new SchBasePoint(); + point.setPoint_code(pointCode); + point.setPoint_name(pointName); + point.setRegion_code("TBX"); + point.setRegion_name("涂板线区域"); + point.setPoint_type("1"); + point.setParent_point_code(pointCode); + point.setIs_has_workder(true); + point.setIs_auto(true); + point.setCreate_id("1"); + point.setCreate_name("管理员"); + point.setCreate_time(DateUtil.now()); + pointList.add(point); + // 连对 + for (int j = 1; j <= 2; j++) { + String pointName2 = "连涂线0" + i + "对接位0"; + String pointCode2 = "LTX0" + i + "DJW0"; + pointName2 = pointName2 + j; + pointCode2 = pointCode2 + j; + SchBasePoint point2 = new SchBasePoint(); + point2.setPoint_code(pointCode2); + point2.setPoint_name(pointName2); + point2.setRegion_code("TBX"); + point2.setRegion_name("涂板线区域"); + point2.setPoint_type("2"); + point2.setParent_point_code("LTX0" + i); + point2.setIs_has_workder(false); + point2.setIs_auto(true); + point2.setCreate_id("1"); + point2.setCreate_name("管理员"); + point2.setCreate_time(DateUtil.now()); + pointList.add(point2); + } + } + // 缓存位普涂缓存位01-07 + for (int i = 1; i <= 7; i++) { + String pointName = "普涂线缓存位0"; + String pointCode = "PTXHCW0"; + pointName = pointName + i; + pointCode = pointCode + i; + SchBasePoint point = new SchBasePoint(); + point.setPoint_code(pointCode); + point.setPoint_name(pointName); + point.setRegion_code("TBX"); + point.setRegion_name("涂板线区域"); + point.setPoint_type("3"); + point.setParent_point_code(pointCode); + point.setIs_has_workder(false); + point.setIs_auto(true); + point.setCreate_id("1"); + point.setCreate_name("管理员"); + point.setCreate_time(DateUtil.now()); pointList.add(point); } pointService.saveBatch(pointList); } + // 新增固化区域 @Test - void test02() { // 压机接料位 - // 创建YJ01JLW01 + void testGH() { List pointList = new ArrayList<>(); - for (int i = 3; i <= 8; i++) { - String pointName = "压机0"; - String pointCode = "YJ0"; - pointName = pointName + i; - pointCode = pointCode + i; - for (int j = 1; j <= 2; j++) { - String jlw = "JLW0"; - String jlw2 = "接料位0"; - jlw = jlw + j; - jlw2 = jlw2 + j; - SchBasePoint point = new SchBasePoint(); - point.setPoint_code(pointCode + jlw); - point.setPoint_name(pointName + jlw2); - point.setRegion_code("YZ"); - point.setRegion_name("压制区域"); - point.setPoint_type("2"); - point.setParent_point_code(pointCode); - point.setIs_has_workder(false); - point.setIs_auto(true); - pointList.add(point); - } - } - pointService.saveBatch(pointList); - } - - @Test - void test03() { // 料盅睏料线区域 - // 创建LZKL01 - 32 - List pointList = new ArrayList<>(); - for (int i = 1; i <= 12; i++) {// 3台 - String pointName = "睏料位"; - String pointCode = "KLW"; + for (int i = 1; i <= 84; i++) { + String pointName = "固化室"; + String pointCode = "GHS"; if (i < 10) { pointName = pointName + "0" + i; pointCode = pointCode + "0" + i; @@ -93,64 +150,214 @@ public class PointCreate { SchBasePoint point = new SchBasePoint(); point.setPoint_code(pointCode); point.setPoint_name(pointName); - point.setRegion_code("LZKLX"); - point.setRegion_name("料盅睏料线区域"); + point.setRegion_code("GH"); + point.setRegion_name("固化区域"); + point.setPoint_type("1"); point.setParent_point_code(pointCode); point.setIs_has_workder(false); point.setIs_auto(true); + point.setWorkshop_code("A1"); + point.setIn_order_seq(i); + point.setOut_order_seq(i); + point.setCreate_id("1"); + point.setCreate_name("管理员"); + point.setCreate_time(DateUtil.now()); pointList.add(point); + for (int j = 1; j <= 7; j++) { + String pointName2 = pointName + "0" + j; + String pointCode2 = pointCode + "0" + j; + SchBasePoint point2 = new SchBasePoint(); + point2.setPoint_code(pointCode2); + point2.setPoint_name(pointName2); + point2.setRegion_code("GH"); + point2.setRegion_name("固化区域"); + point2.setPoint_type("2"); + point2.setParent_point_code(pointCode); + point2.setIs_has_workder(false); + point2.setIs_auto(true); + point2.setIn_order_seq(j); + point2.setOut_order_seq(j); + point2.setWorkshop_code("A1"); + point2.setCreate_id("1"); + point2.setCreate_name("管理员"); + point2.setCreate_time(DateUtil.now()); + pointList.add(point2); + } + String pointName2 = pointName + "出口"; + String pointCode2 = pointCode + "C"; + SchBasePoint point2 = new SchBasePoint(); + point2.setPoint_code(pointCode2); + point2.setPoint_name(pointName2); + point2.setRegion_code("GH"); + point2.setRegion_name("固化区域"); + point2.setPoint_type("3"); + point2.setParent_point_code(pointCode); + point2.setIs_has_workder(false); + point2.setIs_auto(true); + point2.setIn_order_seq(i); + point2.setOut_order_seq(i); + point2.setWorkshop_code("A1"); + point2.setCreate_id("1"); + point2.setCreate_name("管理员"); + point2.setCreate_time(DateUtil.now()); + pointList.add(point2); + String pointName3 = pointName + "入口"; + String pointCode3 = pointCode + "R"; + SchBasePoint point3 = new SchBasePoint(); + point3.setPoint_code(pointCode3); + point3.setPoint_name(pointName3); + point3.setRegion_code("GH"); + point3.setRegion_name("固化区域"); + point3.setPoint_type("4"); + point3.setParent_point_code(pointCode); + point3.setIs_has_workder(false); + point3.setIs_auto(true); + point3.setIn_order_seq(i); + point3.setOut_order_seq(i); + point3.setWorkshop_code("A1"); + point3.setCreate_id("1"); + point3.setCreate_name("管理员"); + point3.setCreate_time(DateUtil.now()); + pointList.add(point3); } - pointService.saveBatch(pointList); + pointService.saveOrUpdateBatch(pointList); } - - + // 暂存输送线 @Test - void test04() { // 缓存库位区域 + void testZCSSX() { List pointList = new ArrayList<>(); - int count = 1; - for (int i = 1; i <= 2; i++) { - for (int j = 1; j <= 29; j++) { - for (int k = 1; k <= 3; k++) { - String code = "HCHJ"; - String name = "缓存货架"; - if (count < 10) { - code = code + "00" + count; - name = name + "00" + count; - } else if (count >= 10 && count < 100) { - code = code + "0" + count; - name = name + "0" + count; - } else { - code = code + count; - name = name + count; - } - SchBasePoint point = new SchBasePoint(); - point.setPoint_code(code); - point.setPoint_name(name); - point.setRegion_code("GTPHC"); - point.setRegion_name("钢托盘缓存区域"); - point.setPoint_status("1"); - point.setCan_vehicle_type("2"); - point.setVehicle_max_qty(1); - point.setBlock_num(1); - point.setRow_num(i); - point.setCol_num(j); - point.setLayer_num(k); - point.setIn_order_seq(count); - point.setOut_order_seq(count); - point.setIn_empty_seq(count); - point.setOut_empty_seq(count); - point.setParent_point_code(code); - point.setCreate_id("1"); - point.setCreate_name("管理员"); - point.setCreate_time(DateUtil.now()); - point.setIs_has_workder(false); - point.setIs_auto(true); - point.setIs_used(true); - pointList.add(point); - count++; - } + for (int i = 1; i <= 6; i++) { + String pointName = "暂存输送线0"; + String pointCode = "ZCSSX0"; + pointName = pointName + i; + pointCode = pointCode + i; + for (int j = 1; j <= 7; j++) { + SchBasePoint point = new SchBasePoint(); + point.setPoint_code(pointCode + "0" + j); + point.setPoint_name(pointName + "0" + j); + point.setRegion_code("KJZC"); + point.setRegion_name("空架暂存区域"); + point.setPoint_type("3"); + point.setParent_point_code(pointCode); + point.setIs_has_workder(false); + point.setIs_auto(true); + point.setCreate_id("1"); + point.setCreate_name("管理员"); + point.setCreate_time(DateUtil.now()); + pointList.add(point); } } pointService.saveBatch(pointList); } + @Test + void testZCSSX2() { + List pointList = new ArrayList<>(); + for (int i = 1; i <= 6; i++) { + String pointName = "暂存输送线0"; + String pointCode = "ZCSSX0"; + pointName = pointName + i; + pointCode = pointCode + i; + SchBasePoint point = new SchBasePoint(); + point.setPoint_code(pointCode); + point.setPoint_name(pointName); + point.setRegion_code("KJZC"); + point.setRegion_name("空架暂存区域"); + point.setPoint_type("5"); + point.setParent_point_code(pointCode); + point.setIs_has_workder(false); + point.setIs_auto(true); + point.setWorkshop_code("A1"); + point.setCreate_id("1"); + point.setCreate_name("管理员"); + point.setCreate_time(DateUtil.now()); + pointList.add(point); + } + pointService.saveOrUpdateBatch(pointList); + } + + @Test + void testKJZC() { + int number = 1; + List pointList = new ArrayList<>(); + for (int i = 1; i <= 2; i++) { // 排 + for (int j = 1; j <= 21; j++) { // 列 + SchBasePoint point = new SchBasePoint(); + String pointName = "空架暂存位"; + String pointCode = "KJZCW"; + if (number < 10) { + pointName = pointName + "0" + number; + pointCode = pointCode + "0" + number; + } else { + pointName = pointName + number; + pointCode = pointCode + number; + } + point.setPoint_code(pointCode); + point.setPoint_name(pointName); + point.setRegion_code("KJZC"); + point.setRegion_name("空架暂存区域"); + point.setRow_num(i); + point.setCol_num(j); + point.setOut_empty_seq(i); + point.setIn_empty_seq(2 - i + 1); + point.setPoint_type("2"); + point.setParent_point_code(pointCode); + point.setIs_has_workder(false); + point.setIs_auto(true); + point.setCreate_id("1"); + point.setCreate_name("管理员"); + point.setCreate_time(DateUtil.now()); + pointList.add(point); + number++; + } + } + pointService.saveBatch(pointList); + } + // 暂存区 9*18 + @Test + void testZCQLeft() { + List pointList = new ArrayList<>(); + for (int i = 1; i <= 18; i++) { + for (int j = 1; j <= 9; j++) { + SchBasePoint point = new SchBasePoint(); + if (i < 10) { + point.setPoint_code("0" + i + "-0" + j + "-01"); + point.setPoint_name("0" + i + "排0" + j + "列01层"); + } else { + point.setPoint_code(i + "-0" + j + "-01"); + point.setPoint_name(i + "排0" + j + "列01层"); + } + point.setRegion_code("ZC"); + point.setRegion_name("暂存区域"); + point.setRow_num(i); + point.setCol_num(j); + point.setOut_order_seq(j); + point.setIn_order_seq(9 - j + 1); + point.setPoint_status("1"); + point.setParent_point_code(point.getPoint_code()); + point.setIs_has_workder(false); + point.setIs_auto(true); + point.setCreate_id("1"); + point.setCreate_name("管理员"); + point.setCreate_time(DateUtil.now()); + pointList.add(point); + } + } + pointService.saveOrUpdateBatch(pointList); + } + + @Test + void testData() { + JSONObject res = new JSONObject(); + JSONArray array = new JSONArray(); + for (int i = 0; i < 7; i++) { + JSONObject object = new JSONObject(); + object.put("name", "XC-" + i); + object.put("order_num", 1655); + object.put("guada_num", 1200); + object.put("residue_num", 1655 - 1200); + array.add(object); + } + res.put("MonthlyWorkOrder", array); + System.out.println(res); + } } diff --git a/lms/nladmin-ui/src/views/wms/basedata/material/index.vue b/lms/nladmin-ui/src/views/wms/basedata/material/index.vue index 0f93777..d25f401 100644 --- a/lms/nladmin-ui/src/views/wms/basedata/material/index.vue +++ b/lms/nladmin-ui/src/views/wms/basedata/material/index.vue @@ -40,28 +40,41 @@ - - + + - + - + - + - - + + - - + + - - + + - +