From 8168c1dad67b36bdaaa72cb006fada15bd5cff59 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Mon, 23 Sep 2024 16:15:43 +0800 Subject: [PATCH 1/5] =?UTF-8?q?1=E3=80=81=E6=96=B0=E5=A2=9E=E5=BE=AE?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1jar=E5=8C=85=E7=98=A6=E8=BA=AB=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=EF=BC=9B2=E3=80=81=E6=8A=A5=E8=A1=A8=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E5=AF=BC=E5=85=A5excel=E6=A8=A1=E6=9D=BF=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3get->post?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cf-gateway/pom.xml | 32 +++++-- cf-module-infra/cf-module-infra-biz/pom.xml | 69 ++++++++++++++ .../cf-module-prod-executor-biz/pom.xml | 85 +++++++++++++++++ .../cf-module-prod-manage-biz/pom.xml | 77 +++++++++++++++ cf-module-report/cf-module-report-biz/pom.xml | 59 ++++++++++++ .../template/ReportTemplateController.java | 2 +- cf-module-system/cf-module-system-biz/pom.xml | 93 +++++++++++++++++++ 7 files changed, 406 insertions(+), 11 deletions(-) diff --git a/cf-gateway/pom.xml b/cf-gateway/pom.xml index 2df26d27c..79e7cb1be 100644 --- a/cf-gateway/pom.xml +++ b/cf-gateway/pom.xml @@ -101,6 +101,27 @@ org.springframework.boot spring-boot-maven-plugin ${spring.boot.version} + + ZIP + + + com.cf.imes + cf-common + + + com.cf.imes + cf-module-system-api + + + com.cf.imes + cf-spring-boot-starter-banner + + + com.cf.imes + cf-spring-boot-starter-monitor + + + @@ -108,15 +129,6 @@ - - - - - - - - - org.apache.maven.plugins @@ -132,7 +144,7 @@ target/lib - + com.cf.imes diff --git a/cf-module-infra/cf-module-infra-biz/pom.xml b/cf-module-infra/cf-module-infra-biz/pom.xml index c8ac36b85..8d99c452b 100644 --- a/cf-module-infra/cf-module-infra-biz/pom.xml +++ b/cf-module-infra/cf-module-infra-biz/pom.xml @@ -161,6 +161,75 @@ org.springframework.boot spring-boot-maven-plugin ${spring.boot.version} + + ZIP + + + com.cf.imes + cf-common + + + com.cf.imes + cf-module-infra-api + + + com.cf.imes + cf-module-system-api + + + com.cf.imes + cf-spring-boot-starter-banner + + + com.cf.imes + cf-spring-boot-starter-biz-error-code + + + com.cf.imes + cf-spring-boot-starter-biz-operatelog + + + com.cf.imes + cf-spring-boot-starter-biz-organ + + + com.cf.imes + cf-spring-boot-starter-excel + + + com.cf.imes + cf-spring-boot-starter-file + + + com.cf.imes + cf-spring-boot-starter-monitor + + + com.cf.imes + cf-spring-boot-starter-mybatis + + + com.cf.imes + cf-spring-boot-starter-redis + + + com.cf.imes + cf-spring-boot-starter-rpc + + + com.cf.imes + cf-spring-boot-starter-security + + + com.cf.imes + cf-spring-boot-starter-web + + + com.cf.imes + cf-spring-boot-starter-websocket + + + diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/pom.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/pom.xml index 7f93d1641..d16009736 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/pom.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/pom.xml @@ -173,6 +173,91 @@ org.springframework.boot spring-boot-maven-plugin ${spring.boot.version} + + ZIP + + + com.cf.imes + cf-common + + + com.cf.imes + cf-module-infra-api + + + com.cf.imes + cf-module-prod-executor-api + + + com.cf.imes + cf-module-report-api + + + com.cf.imes + cf-module-system-api + + + com.cf.imes + cf-spring-boot-starter-banner + + + com.cf.imes + cf-spring-boot-starter-biz-data-permission + + + com.cf.imes + cf-spring-boot-starter-biz-dict + + + com.cf.imes + cf-spring-boot-starter-biz-error-code + + + com.cf.imes + cf-spring-boot-starter-biz-operatelog + + + com.cf.imes + cf-spring-boot-starter-biz-organ + + + com.cf.imes + cf-spring-boot-starter-elasticsearch + + + com.cf.imes + cf-spring-boot-starter-excel + + + com.cf.imes + cf-spring-boot-starter-file + + + com.cf.imes + cf-spring-boot-starter-monitor + + + com.cf.imes + cf-spring-boot-starter-mybatis + + + com.cf.imes + cf-spring-boot-starter-redis + + + com.cf.imes + cf-spring-boot-starter-rpc + + + com.cf.imes + cf-spring-boot-starter-security + + + com.cf.imes + cf-spring-boot-starter-web + + + diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/pom.xml b/cf-module-prod-manage/cf-module-prod-manage-biz/pom.xml index 876419071..7eccabf68 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/pom.xml +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/pom.xml @@ -189,6 +189,83 @@ org.springframework.boot spring-boot-maven-plugin ${spring.boot.version} + + ZIP + + + com.cf.imes + cf-common + + + com.cf.imes + cf-module-infra-api + + + com.cf.imes + cf-module-prod-manage-api + + + com.cf.imes + cf-module-system-api + + + com.cf.imes + cf-spring-boot-starter-banner + + + com.cf.imes + cf-spring-boot-starter-biz-data-permission + + + com.cf.imes + cf-spring-boot-starter-biz-dict + + + com.cf.imes + cf-spring-boot-starter-biz-error-code + + + com.cf.imes + cf-spring-boot-starter-biz-operatelog + + + com.cf.imes + cf-spring-boot-starter-biz-organ + + + com.cf.imes + cf-spring-boot-starter-excel + + + com.cf.imes + cf-spring-boot-starter-file + + + com.cf.imes + cf-spring-boot-starter-monitor + + + com.cf.imes + cf-spring-boot-starter-mybatis + + + com.cf.imes + cf-spring-boot-starter-redis + + + com.cf.imes + cf-spring-boot-starter-rpc + + + com.cf.imes + cf-spring-boot-starter-security + + + com.cf.imes + cf-spring-boot-starter-web + + + diff --git a/cf-module-report/cf-module-report-biz/pom.xml b/cf-module-report/cf-module-report-biz/pom.xml index 2dd925473..68e7d72d1 100644 --- a/cf-module-report/cf-module-report-biz/pom.xml +++ b/cf-module-report/cf-module-report-biz/pom.xml @@ -175,6 +175,65 @@ ${spring.boot.version} true + ZIP + + + com.cf.imes + cf-common + + + com.cf.imes + cf-module-infra-api + + + com.cf.imes + cf-module-prod-executor-api + + + com.cf.imes + cf-module-report-api + + + com.cf.imes + cf-module-system-api + + + com.cf.imes + cf-spring-boot-starter-banner + + + com.cf.imes + cf-spring-boot-starter-biz-operatelog + + + com.cf.imes + cf-spring-boot-starter-biz-organ + + + com.cf.imes + cf-spring-boot-starter-monitor + + + com.cf.imes + cf-spring-boot-starter-mybatis + + + com.cf.imes + cf-spring-boot-starter-redis + + + com.cf.imes + cf-spring-boot-starter-rpc + + + com.cf.imes + cf-spring-boot-starter-security + + + com.cf.imes + cf-spring-boot-starter-web + + diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/ReportTemplateController.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/ReportTemplateController.java index 4a6b22a18..5c5f2621c 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/ReportTemplateController.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/ReportTemplateController.java @@ -151,7 +151,7 @@ public class ReportTemplateController { } } - @GetMapping("/template/excel/import") + @PostMapping("/template/excel/import") @Operation(summary = "导入excel模板") @PreAuthorize("@ss.hasPermission('report:design')") public ReportDefinitionWrapper importExcel(@RequestParam("file") MultipartFile file) { diff --git a/cf-module-system/cf-module-system-biz/pom.xml b/cf-module-system/cf-module-system-biz/pom.xml index 926be9a9c..dfe3d19a4 100644 --- a/cf-module-system/cf-module-system-biz/pom.xml +++ b/cf-module-system/cf-module-system-biz/pom.xml @@ -213,6 +213,99 @@ org.springframework.boot spring-boot-maven-plugin ${spring.boot.version} + + ZIP + + + com.cf.imes + cf-common + + + com.cf.imes + cf-module-infra-api + + + com.cf.imes + cf-module-prod-executor-api + + + com.cf.imes + cf-module-system-api + + + com.cf.imes + cf-spring-boot-starter-banner + + + com.cf.imes + cf-spring-boot-starter-biz-data-permission + + + com.cf.imes + cf-spring-boot-starter-biz-dict + + + com.cf.imes + cf-spring-boot-starter-biz-error-code + + + com.cf.imes + cf-spring-boot-starter-biz-ip + + + com.cf.imes + cf-spring-boot-starter-biz-operatelog + + + com.cf.imes + cf-spring-boot-starter-biz-organ + + + com.cf.imes + cf-spring-boot-starter-biz-sms + + + com.cf.imes + cf-spring-boot-starter-captcha + + + com.cf.imes + cf-spring-boot-starter-elasticsearch + + + com.cf.imes + cf-spring-boot-starter-env + + + com.cf.imes + cf-spring-boot-starter-excel + + + com.cf.imes + cf-spring-boot-starter-monitor + + + com.cf.imes + cf-spring-boot-starter-mybatis + + + com.cf.imes + cf-spring-boot-starter-redis + + + com.cf.imes + cf-spring-boot-starter-rpc + + + com.cf.imes + cf-spring-boot-starter-security + + + com.cf.imes + cf-spring-boot-starter-web + + + From 21d55efd4c0651aef8731b04e5129797a05c65b9 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Mon, 23 Sep 2024 16:48:56 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=BE=AE=E6=9C=8D=E5=8A=A1jar=E5=8C=85?= =?UTF-8?q?=E7=98=A6=E8=BA=AB=E9=85=8D=E7=BD=AE=EF=BC=9A=E8=A1=A5=E5=85=85?= =?UTF-8?q?system=E3=80=81infra=E6=A8=A1=E5=9D=97=E5=AF=B9mq=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E7=9A=84=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cf-module-infra/cf-module-infra-biz/pom.xml | 4 ++++ cf-module-system/cf-module-system-biz/pom.xml | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/cf-module-infra/cf-module-infra-biz/pom.xml b/cf-module-infra/cf-module-infra-biz/pom.xml index 8d99c452b..8227ad15f 100644 --- a/cf-module-infra/cf-module-infra-biz/pom.xml +++ b/cf-module-infra/cf-module-infra-biz/pom.xml @@ -228,6 +228,10 @@ com.cf.imes cf-spring-boot-starter-websocket + + com.cf.imes + cf-spring-boot-starter-mq + diff --git a/cf-module-system/cf-module-system-biz/pom.xml b/cf-module-system/cf-module-system-biz/pom.xml index dfe3d19a4..62ca48d86 100644 --- a/cf-module-system/cf-module-system-biz/pom.xml +++ b/cf-module-system/cf-module-system-biz/pom.xml @@ -304,6 +304,10 @@ com.cf.imes cf-spring-boot-starter-web + + com.cf.imes + cf-spring-boot-starter-mq + From aea78731871bc1cc5364449b6f1a0141e4ae5cf5 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Mon, 23 Sep 2024 17:43:42 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=EF=BC=9A=E4=B8=89=E5=A4=A7=E5=AF=B9=E8=B1=A1?= =?UTF-8?q?=E5=A4=9A=E7=A7=9F=E6=88=B7=E5=AD=97=E6=AE=B5=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=A1=AB=E5=85=85=E6=B3=A8=E8=A7=A3=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/report/dal/dataobject/dataset/ReportDatasetDO.java | 2 ++ .../report/dal/dataobject/datasource/ReportDatasourceDO.java | 2 ++ .../module/report/dal/dataobject/template/ReportTemplateDO.java | 1 + 3 files changed, 5 insertions(+) diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/dataset/ReportDatasetDO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/dataset/ReportDatasetDO.java index 082c6408b..37c2ac48c 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/dataset/ReportDatasetDO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/dataset/ReportDatasetDO.java @@ -1,5 +1,6 @@ package com.cf.imes.module.report.dal.dataobject.dataset; +import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; @@ -71,5 +72,6 @@ public class ReportDatasetDO extends BaseDO { /** * 组织id */ + @TableField(fill = FieldFill.INSERT_UPDATE) private Long organId; } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java index 8c38c4dd6..5557bcc84 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java @@ -1,5 +1,6 @@ package com.cf.imes.module.report.dal.dataobject.datasource; +import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; @@ -82,6 +83,7 @@ public class ReportDatasourceDO extends BaseDO { /** * 组织id */ + @TableField(fill = FieldFill.INSERT_UPDATE) private Long organId; /** diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/template/ReportTemplateDO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/template/ReportTemplateDO.java index 502f4d929..c59abe40c 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/template/ReportTemplateDO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/template/ReportTemplateDO.java @@ -53,6 +53,7 @@ public class ReportTemplateDO extends BaseDO { /** * 组织id */ + @TableField(fill = FieldFill.INSERT_UPDATE) private Long organId; /** From 802b62701da9d3d8b9d47ad43a8e33c137582dc2 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Tue, 24 Sep 2024 11:45:16 +0800 Subject: [PATCH 4/5] =?UTF-8?q?1=E3=80=81=E7=A6=85=E9=81=93=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E5=A4=8D=EF=BC=9A=E5=A5=97=E9=A4=90=E5=90=8D?= =?UTF-8?q?=E9=95=BF=E5=BA=A6=E6=8F=90=E7=A4=BA=EF=BC=9B2=E3=80=81ureport-?= =?UTF-8?q?community=E4=BC=98=E5=8C=96=E6=9B=B4=E6=96=B0=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lib/ureport-core-2.3.0-SNAPSHOT.jar | Bin 919613 -> 919377 bytes .../vo/packages/TenantPackageSaveReqVO.java | 2 ++ 2 files changed, 2 insertions(+) diff --git a/cf-module-report/cf-module-report-biz/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar b/cf-module-report/cf-module-report-biz/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar index 447fc3b164c82d8a3395686816b09ad07cfa031c..2a6a166865fafd871a8e1929534dbefa8b754a45 100644 GIT binary patch delta 43472 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

iah2$KfegK?ATq^{S3FP3VX=<1NSQ zxYdUvb&nZO9OlKyeMt+~=dvnt zPj1SiJHFp=soKDyg)NTK`DhsFFxuF}SV81u#(dw2cV+6C%jnGZ(I6(RRnn~EJT*GEVDmJUVvKASNPdlOrdAYOFA z)4_~K@>j!+mvT@G#m9}a%yBHQ$qxgOIX}6I&s~ZC`rE;Au{UkgiK*la?%U|IWQzCZKR);_RW^Rc4gF5dYTR!(|5q=cs`n~z~*K?zf z9whrJlz7A5ZJslj%u`KitmAc*6&`Z!RKYqW`CdxcnPQzNzqZXUW^esWN<#(vfC4kl zV>5Dbn(q3A-#KSwFKD>+DR^?^e2qtadKj70pT3rq;vix8XnEAy)>M(o+&65?@R3`d zWQ^0{YJQ@Y@$Jh3C$=x=y-%7K(&^Uf_L|T--7)#?1f7awH#Ii-kn@~zsp|Nq!3zHX ziNxsa`NG?vz~b#e5~2cE^RSx|Lh(gBDd%g*vQ#@Z3FmsY!uC!5vv!x2vs6zVzMIk7UOgqdKK@9S z(MH$SGiz&%k2Y)CAGVBHpks4+ol!{OQz&=!WyJyN0sW%cfx8vmxeBKjp7EGB;}_p? zOa;Gwe(rjCq=91WzLj>!NFKCVbzVxN-c@6^p+>2^S;gAiv-}!ey-52P0S@=ZT8^=6 zqaiF~*Ycp$H+SFUU%wpRwOvD1FHibT4eNEN%sX~o?5+vo`l?gsHmBs}x7%4~T1^D# zPV;s3(j)sJt@RvdCVP}aUKyqNtdY!<$}o|7zy;xMXs3 zC5>vQxp?A;xkTl~;khU}Z*2S5A>onua*e`E;*|;4AM}ll$?tzQwLVx{Qh0EI<9UVB zmQPAk%;1>*zD0J0N{m>Vt#9JR7@xy+*L3V! zZoip~p#yuxp?=J&^egB`A-!|H17ipBtDAwDn*+@iN2F`WCexvaKo}BDrY@fUl;tXV zLi}f8Ab#iJ*n{xdDyQ_o;GD}CY?&a-t(4+R!j0ee0!&xyUN6@*O?t9^8D72QFUYV} zBns7Ol}5L-*miCANbORSj(Xq8srhUfU(exs;cl16S>$smiN`atN

{O%=mB~}^R zehUfrxSszc%~pz~Jn5=r&6O+ngYTQSr>EHHk$b5)_uE@3NmkxBZqIiYoWscYU&}Ok z@+yy^TLA6$jUzl-_$H2-S~dI*vN;+PdY4tES8dtGy^&oqFrX z>4Asd6?a~iCLBHv7xJXEFw{ga-15|%xu@9v%IuWrMv+Thz_{(;z}ku#eB)C>$S;<+ zRLjhKiTc%bAxntUg?XlRw^@@hdwCaghSz7SdMsmYI1^0-!tS#4b97`on{mibA0`|* zIp=B5C7vugHXt`E7H9P&l!^WqP=^GU&Z6=pL+0`xbnT-+!Scs;ZCkE5$^d*nI zrta!`!IsIpLYLiB1C@;1%R(L1*T-JpEJ$+Ze3>;Y>zJCV&8}VJPz=vdmqh$RC7lQz zePtPQ_SMA*-FJRG9gz%Y^!3l`c9v~Q8k&3(D^tn25^v?fKDB9?$MNtBn?`Q#4K`{9 zBbDgOw^HP9IexyHY00_cFt~jiqdIZ-`j2Vr*nM^sJbQ_OCE9<)uJhA!&1U11z=Yg0 zxh(6QVy(+zXIPVs#U5mFb({>B$LVKjz3iLFwY$gpiy=Tqv=z)-uuW98F<1 zdWdZV!LfQ$k$II)o}@j(+iB-3{DF6R&z}3m;U~Izn&Ml$Lw`$X^WcF}0XcZ5UMB13(bLNg?!7!|_5clHGQUWRLjC+m~>d{ya*M49!B@K{gQ{u;Nv4Ev3A7HxE*7D~I|VkU#$%W~^Um&aD2DGT)8% zr#<;AhPFb_P0US4u1)>-d9_bb`qY)fx#*B9<87AGlkLnBR0+Ee_M19PZHwgIO6^kN z{*e7oUBP$h|8qh&*a#X8&J0tVL#4raS}hA`3OG;u-4ZGY`l#O0+=$B{9KWWe#3_!E zog}vV;+8$pym(hzXdyT$&FldE3^;5#Lc0NnmOIcdfd5kus50m)`F_4kS&SoYS2n95bH(+brRp3Z=!Xhe7`UM9oMjDPVZ@F;ov6A11jz3VA>vQHSF^ zGzkr8$0WErchS`Nxfo~!pmU3d76O%6lAv=$HDBVOf7|YK2n1l#HUs*GNPrV~3SA~1 z-9C{GJr5?Y=KbR~@VFpKNnxlZ7!*k3)e*;a~=b*zt-uePG0YKqDp{!6M$LC=!w^s;s zf8e0)#^wOZhO-Vtqwy4pvDI1q zNZ^_cKR&#E0=E`~K8GKL!e#(T0|HhLNPH<^W?*ax4VwXDFKJu>cpYMEh`_C9vQA z8)Umn_^9Bx9nPf1pA@Ey8f^bvYz}^E%zLqW3%7mGA+|Xsz2^=Aw%y{lw zuseW5tOM)~fJ|@03;^`p6($X!1rHbvfDXK2YCuv-G(2vfa9AD!1>Km_acCBN&^;JE zP%haI_IF8VxAO5kAqWmc;&S|8k~r=-G%cPX5QYOB%Y$J-01^v>`2(mT5=IT6)@Xud zL>n*0!lZyDUvIFGF%cMc;H(&7qBz%hG#p=*0J{M2mXiL_`gAHx0{F}-6Q&MoM@cU1 z?-_pnLYN4kFfD<(0I2gh%vBpm+k;&JO_LAE;4PrqD8S$u0Gfis9e|k{NO%oc

lZ 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 TXPu1o@lmX%T#*b28MglezqEo7 delta 43501 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 Date: Tue, 24 Sep 2024 15:25:12 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=96=B0=E5=A2=9E-=E7=BB=84=E7=BB=87?= =?UTF-8?q?=E6=9C=BA=E5=8F=B0=E6=8E=88=E6=9D=83=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E6=9C=BA=E5=8F=B0=E6=95=B0=E6=8D=AE=E6=BA=90=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=8C=E9=80=BB=E8=BE=91=E6=9B=B4=E6=94=B9-=E6=9F=9C?= =?UTF-8?q?=E4=BD=93=E5=88=A0=E9=99=A4=EF=BC=8C=E8=BF=98=E5=8E=9F=E5=85=B3?= =?UTF-8?q?=E8=81=94=E6=8E=92=E5=8D=95=EF=BC=8C=E5=8C=85=E8=A3=B9=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=95=B0=E6=8D=AE=E6=9B=B4=E6=94=B9=EF=BC=8C=E6=8E=92?= =?UTF-8?q?=E5=8D=95=E9=83=A8=E5=88=86=E5=BC=82=E5=B8=B8=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E8=A1=A5=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executor/api/goods/dto/GoodsDTO.java | 81 --- .../executor/api/plan/OrderPlanApi.java | 100 +++ .../executor/api/plan/OrderPlanApiImpl.java | 568 +++++++++++++++++- .../admin/order/OrderController.java | 56 +- .../admin/order/vo/order/OrderGoodsIds.java | 28 + .../controller/admin/plan/PlanController.java | 8 +- .../dal/dataobject/pack/OrderPackageDO.java | 51 ++ .../dataobject/pack/OrderPrepackagedDO.java | 33 + .../executor/dal/mysql/goods/GoodsMapper.java | 24 +- .../executor/dal/mysql/order/OrderMapper.java | 2 +- .../dal/mysql/orderBody/OrderBodyMapper.java | 2 +- .../mysql/orderGroup/OrderGroupMapper.java | 2 +- .../dal/mysql/orderItem/OrderItemMapper.java | 16 +- .../mysql/orderParts/OrderPartsMapper.java | 3 +- .../dal/mysql/pack/OrderPackageMapper.java | 27 + .../mysql/pack/OrderPrepackagedMapper.java | 17 + .../executor/dal/mysql/plan/PlanMapper.java | 2 +- .../executor/dal/mysql/plate/PlateMapper.java | 37 +- .../mysql/remainplaten/RemainPlateMapper.java | 7 +- .../optimizeplan/OptimizePlanServiceImpl.java | 193 +++--- .../executor/service/order/OrderService.java | 11 +- .../service/order/OrderServiceImpl.java | 217 +++++-- .../service/plan/PlanServiceImpl.java | 137 +++-- .../resources/mapper/goods/GoodsMapper.xml | 90 ++- .../resources/mapper/order/OrderMapper.xml | 2 +- .../mapper/orderBody/OrderBodyMapper.xml | 2 +- .../mapper/orderGroup/OrderGroupMapper.xml | 15 +- .../mapper/orderItem/OrderItemMapper.xml | 63 +- .../mapper/orderParts/OrderPartsMapper.xml | 2 +- .../mapper/pack/OrderPackageMapper.xml | 21 + .../main/resources/mapper/plan/PlanMapper.xml | 4 +- .../resources/mapper/plate/PlateMapper.xml | 110 +++- .../mapper/remainplaten/RemainPlateMapper.xml | 4 +- .../controller/admin/pack/vo/PackRespVO.java | 9 +- .../dal/mysql/pack/OrderPackageMapper.java | 12 +- .../mysql/pack/OrderPrepackagedMapper.java | 7 + .../dal/mysql/plate/OrderPlateMapper.java | 1 + .../dal/mysql/query/OrderItemMapper.java | 3 +- .../manage/service/pack/PackServiceImpl.java | 87 ++- .../query/ProductionStatusServiceImpl.java | 2 - .../dal/mysql/pack/OrderPackageMapper.xml | 14 +- .../dal/mysql/plate/OrderPlateMapper.xml | 2 +- .../manage/dal/mysql/process/OrdersMapper.xml | 4 +- .../dal/mysql/query/OrderItemMapper.xml | 2 +- .../system/enums/ErrorCodeConstants.java | 13 +- .../datasource/DataSourceController.java | 66 +- .../admin/datasource/dataQuery/DataQuery.java | 87 +++ .../admin/datasource/vo/DataSource.java | 26 + .../datasource/vo/MachineDataSourceDO.java | 28 + .../admin/machine/MachineAuthController.java | 2 +- .../admin/machine/vo/MachineOrgAuthReq.java | 7 +- .../admin/machine/vo/OrganMachinePage.java | 7 +- .../admin/machine/vo/OrganMachineResp.java | 14 + .../dal/mysql/machine/MachineMapper.java | 2 +- .../system/dal/mysql/organ/OrganMapper.java | 2 +- .../dal/mysql/setting/SettingMapper.java | 12 +- .../dal/mysql/user/AdminUserMapper.java | 4 + .../service/datasource/DataSourceService.java | 11 +- .../datasource/DataSourceServiceImpl.java | 373 +++++++++++- .../service/machine/MachineServiceImpl.java | 53 +- .../service/setting/SettingServiceImpl.java | 6 +- .../mapper/machine/MachineLimitMapper.xml | 28 +- .../resources/mapper/organ/OrganMapper.xml | 4 +- .../mapper/process/AdminUserMapper.xml | 15 + .../mapper/process/MachineMapper.xml | 6 + 65 files changed, 2272 insertions(+), 572 deletions(-) delete mode 100644 cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/api/goods/dto/GoodsDTO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderGoodsIds.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/pack/OrderPackageDO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/pack/OrderPrepackagedDO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/pack/OrderPackageMapper.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/pack/OrderPrepackagedMapper.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/pack/OrderPackageMapper.xml create mode 100644 cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/datasource/dataQuery/DataQuery.java create mode 100644 cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/datasource/vo/DataSource.java create mode 100644 cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/datasource/vo/MachineDataSourceDO.java diff --git a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/api/goods/dto/GoodsDTO.java b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/api/goods/dto/GoodsDTO.java deleted file mode 100644 index 069e31e9f..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/api/goods/dto/GoodsDTO.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.cf.imes.module.executor.api.goods.dto; - - -import lombok.Data; - -import java.math.BigDecimal; - -@Data -public class GoodsDTO { - - /** - * 主键 - */ - private Long id; - - // 组织 ID - private Long organId; - - /** - * 生产单号 - */ - private Long orderId; - /** - * 设计端商品ID - */ - private String rawGoodsId; - /** - * 商品 ID - */ - private String goodsId; - /** - * 商品名称 - */ - private String goodsName; - /** - * 材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板 - */ - private String material; - /** - * 纹路 0 正纹 1 可翻转 2 反纹 - */ - private Boolean texture; - /** - * 颜色 - */ - private String color; - /** - * 宽度 - */ - private BigDecimal width; - /** - * 高度 - */ - private BigDecimal height; - /** - * 厚度 - */ - private BigDecimal thickness; - /** - * 价格 - */ - private BigDecimal price; - /** - * 品牌 - */ - private String brand; - /** - * 规格 - */ - private String spec; - /** - * 备注 - */ - private String remark; - /** - * 是否删除 - */ - private Boolean deleted; - - -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/api/plan/OrderPlanApi.java b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/api/plan/OrderPlanApi.java index 743ec360b..e7cda9bbf 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/api/plan/OrderPlanApi.java +++ b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/api/plan/OrderPlanApi.java @@ -10,6 +10,8 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; +import java.util.List; + @FeignClient(name = ApiConstants.NAME) // TODO 晨丰:fallbackFactory = @Tag(name = "RPC 服务 - 多组织") public interface OrderPlanApi { @@ -22,4 +24,102 @@ public interface OrderPlanApi { @Parameter(name = "machineId", description = "机台ID", required = true, example = "1024") CommonResult getOrderPlan(@RequestParam("machineId") Long id); + + + + /* + * 机台数据源数据查询 + * + * */ + + @GetMapping(PREFIX +"/apiDataGetPlan") + @Operation(summary = "获取当前排单对应的生产单信息") + @Parameter(name = "planId", description = "排单ID", required = true, example = "1024") + String apiDataGetPlan(@RequestParam("planId") Long planId,@RequestParam("filed") String filed); + + + + + @GetMapping(PREFIX +"/apiGetGoods") + @Operation(summary = "查询当前排单对应的大板信息") + @Parameter(name = "planId", description = "排单ID", required = true, example = "1024") + String getGoods(@RequestParam("planId") Long planId,@RequestParam("filed") String filed); + + + + + @GetMapping(PREFIX +"/apiGetOrders") + @Operation(summary = "查询当前排单对应的业务员和拆单员信息") +// @Parameter(name = "planId", description = "排单ID", required = true, example = "1024") + List apiGetOrders(@RequestParam("planId") Long planId ,@RequestParam("isSale") Boolean isSale); + + + + + @GetMapping(PREFIX +"/apiGetPlan") + @Operation(summary = "查询当前排单的信息") + @Parameter(name = "planId", description = "排单ID", required = true, example = "1024") + String getPlan(@RequestParam("planId") Long planId,@RequestParam("filed") String filed); + + + + + @GetMapping(PREFIX +"/apiGetESPlan") + @Operation(summary = "查询ES中的排单优化生产信息") + @Parameter(name = "planId", description = "排单ID", required = true, example = "1024") + String apiGetEsPlan(@RequestParam("planId") Long planId,@RequestParam("fields") List fields); + + + + + @GetMapping(PREFIX +"/apiGetPlanRemainPlate") + @Operation(summary = "查询排单中的余料板信息") + @Parameter(name = "planId", description = "排单ID", required = true, example = "1024") + String apiGetPlanRemainPlate(@RequestParam("planId") Long planId,@RequestParam("field") String field); + + + + + @GetMapping(PREFIX +"/apiGetPlanPlate") + @Operation(summary = "查询排单中的板材信息") + @Parameter(name = "planId", description = "排单ID", required = true, example = "1024") + String apiGetPlanPlate(@RequestParam("planId") Long planId,@RequestParam("field") String field); + + + + + @GetMapping(PREFIX +"/apiGetESPlate") + @Operation(summary = "查询ES中的板材信息") + @Parameter(name = "planId", description = "排单ID", required = true, example = "1024") + String apiGetEsPlate(@RequestParam("planId") Long planId,@RequestParam("fields") List fields); + + + + + @GetMapping(PREFIX +"/apiGetPlanBodyOrRoom") + @Operation(summary = "查询排单中的板材房间信息") + @Parameter(name = "planId", description = "排单ID", required = true, example = "1024") + String apiGetPlanBodyOrRoom(@RequestParam("planId") Long planId,@RequestParam("field") String field); + + + + + @GetMapping(PREFIX +"/apiGetPlanGroup") + @Operation(summary = "查询排单中的板材加工组信息") + @Parameter(name = "planId", description = "排单ID", required = true, example = "1024") + String apiGetPlanGroup(@RequestParam("planId") Long planId,@RequestParam("field") String field); + + + + @GetMapping(PREFIX +"/apiGetPlanParts") + @Operation(summary = "查询排单中的配件信息") + @Parameter(name = "planId", description = "排单ID", required = true, example = "1024") + String apiGetPlanParts(@RequestParam("planId") Long planId,@RequestParam("field") String field); + + + @GetMapping(PREFIX +"/apiGetESParts") + @Operation(summary = "查询ES中的配件备注信息") + @Parameter(name = "planId", description = "排单ID", required = true, example = "1024") + String apiGetEsParts(@RequestParam("planId") Long planId,@RequestParam("fields") List fields); + } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/api/plan/OrderPlanApiImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/api/plan/OrderPlanApiImpl.java index 92dc3c9b8..d6631a96d 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/api/plan/OrderPlanApiImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/api/plan/OrderPlanApiImpl.java @@ -1,20 +1,57 @@ package com.cf.imes.module.executor.api.plan; +import cn.hutool.core.collection.CollectionUtil; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch._types.FieldValue; +import co.elastic.clients.elasticsearch.core.SearchRequest; +import co.elastic.clients.elasticsearch.core.SearchResponse; +import co.elastic.clients.elasticsearch.core.search.Hit; +import com.alibaba.fastjson.JSON; +import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.pojo.CommonResult; +import com.cf.imes.framework.common.util.json.JsonUtils; +import com.cf.imes.module.executor.api.plan.vo.OrderGroupRespVO; +import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRemark; +import com.cf.imes.module.executor.controller.admin.plate.vo.PlateRespVO; +import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO; +import com.cf.imes.module.executor.dal.dataobject.goods.OptimizeBoardModelDO; +import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; +import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyDO; +import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO; +import com.cf.imes.module.executor.dal.dataobject.orderParts.OrderPartsDO; +import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO; import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO; +import com.cf.imes.module.executor.dal.dataobject.remainplaten.RemainPlateDO; +import com.cf.imes.module.executor.dal.mysql.goods.GoodsMapper; +import com.cf.imes.module.executor.dal.mysql.order.OrderMapper; +import com.cf.imes.module.executor.dal.mysql.orderBody.OrderBodyMapper; +import com.cf.imes.module.executor.dal.mysql.orderGroup.OrderGroupMapper; +import com.cf.imes.module.executor.dal.mysql.orderItem.OrderItemMapper; +import com.cf.imes.module.executor.dal.mysql.orderParts.OrderPartsMapper; import com.cf.imes.module.executor.dal.mysql.plan.PlanMapper; +import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper; +import com.cf.imes.module.executor.dal.mysql.remainplaten.RemainPlateMapper; +import com.fasterxml.jackson.databind.JsonNode; +import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; - +import java.io.IOException; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; +import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR; +import static com.cf.imes.framework.common.util.json.JsonUtils.toJsonString; import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; @RestController // 提供 RESTful API 接口,给 Feign 调用 @Validated +@Slf4j public class OrderPlanApiImpl implements OrderPlanApi{ @@ -22,6 +59,52 @@ public class OrderPlanApiImpl implements OrderPlanApi{ private PlanMapper planMapper; + @Resource + private GoodsMapper goodsMapper; + + + @Resource + private OrderMapper orderMapper; + + + @Resource + private RemainPlateMapper remainPlateMapper; + + + @Resource + private PlateMapper plateMapper; + + + @Resource + private OrderItemMapper orderItemMapper; + + + @Resource + private OrderBodyMapper orderBodyMapper; + + @Resource + private OrderGroupMapper orderGroupMapper; + + @Resource + private OrderPartsMapper orderPartsMapper; + + + @Resource + private ElasticsearchClient elasticsearchClient; + + + public static final String SEPARATE = "select"; + + + public static final String ORDER_REMAIN_PLATE_MODEL = "imes_order_optimize_plate_model"; + + + public static final String ORDER_PLATE_MODEL = "imes_order_plate_model"; + + + public static final String ORDER_PARTS_REMARK_MODEL = "imes_order_parts_remark_model"; + + @Override public CommonResult getOrderPlan(Long machineId) { @@ -36,4 +119,487 @@ public class OrderPlanApiImpl implements OrderPlanApi{ } + + + /* + * 机台数据源数据查询 + * + * */ + + @Override + public String apiDataGetPlan(Long planId,String filed) { + + PlanDO planDOS = planMapper.selectById(planId); + + List orderIds = JSON.parseArray(planDOS.getOrderNos()).toJavaList(Long.class); + + + return toJsonString(orderMapper.selectOrderDataSource(conversion(filed),orderIds,getUserOrganId())); + } + + + + @Override + public String getGoods(Long planId,String filed) { + + + List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, 10); + + List goodsIds = optimizeBoardModelDOS.stream().map(OptimizeBoardModelDO::getGoodsId).toList(); + + + JsonNode jsonNode = JsonUtils.parseTree(JsonUtils.toJsonString(optimizeBoardModelDOS)); + + + filed = filed.replace("place_block_number",""); + + + String filed2 = "place_block_number".equals(filed) ? ",{placeBlockNumber:"+jsonNode.get("placeBlockNumber").asLong()+"}]" : ""; + + +// String sql = " select from order_goods where organ_id = #{organId} and deleted = false"; +// +// sql = sql.replace("#{organId}", getUserOrganId() + ""); + + + List goodsDO = goodsMapper.selectPlanGoodsDataSource(conversion(filed),planId,getUserOrganId()); + + + + return "".equals(filed2) ? toJsonString(goodsDO) : toJsonString(goodsDO).replace("]", "") + filed2; + + } + + + + + @Override + public List apiGetOrders(Long planId,Boolean isSale) { + + PlanDO planDOS = planMapper.selectById(planId); + + List orderIds = JSON.parseArray(planDOS.getOrderNos()).toJavaList(Long.class); + + + return isSale ? orderMapper.selectBatchIds(orderIds).stream().map(OrderDO::getSalesman).distinct().toList() + : orderMapper.selectBatchIds(orderIds).stream().map(OrderDO::getCreator).distinct().toList(); + + + } + + + + @Override + public String getPlan(Long planId,String filed) { + + +// String sql = " select from order_plan where id =#{planId} and organ_id = #{organId} and deleted = false"; +// +// sql = sql.replace("#{organId}", getUserOrganId() + "").replace("#{planId}", planId + ""); +// +// String toInsert = filed.replaceAll("\\[|\\]", ""); + +// List planDOS = planMapper.seleTestSQL(conversion(sql, filed)); + + + List planDOS = planMapper.selectPlanDataSource(conversion(filed),planId,getUserOrganId()); + + return toJsonString(planDOS); + + + + } + + @Override + public String apiGetEsPlan(Long planId, List fields) { + + + List esData = new ArrayList<>(); + + + List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, 99); + + for (OptimizeBoardModelDO optimizeBoardModelDO : optimizeBoardModelDOS) { + List filedData = new ArrayList<>() ; + + JsonNode jsonNode = JsonUtils.parseTree(JsonUtils.toJsonString(optimizeBoardModelDO)); + + for (String field : fields) { + filedData.add(field+":"+ (jsonNode.get(field) == null ?"" : jsonNode.get(field).asText())); + } + + esData.add(filedData.toString()); + + } + + + return esData.toString(); + + + } + + @Override + public String apiGetPlanRemainPlate(Long planId, String field) { + + +// String sql = " select from order_remain_plate where organ_id = #{organId} and plan_id = #{planId} and deleted = false"; +// +// sql = sql.replace("#{organId}", getUserOrganId() + "").replace("#{planId}", planId + ""); + + + List remainPlateDOS = remainPlateMapper.selectPlanRemainDataSource(conversion(field),planId,getUserOrganId()); + + + return toJsonString(remainPlateDOS); + + + } + + + @Override + public String apiGetPlanPlate(Long planId, String field) { + + +// List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, 99); +// +// +// List goodsIds = optimizeBoardModelDOS.stream().map(OptimizeBoardModelDO::getGoodsId).toList(); +// +// +// List orderIds = BeanUtils.toBean(optimizeBoardModelDOS.stream().map(OptimizeBoardModelDO::getOrderId).toList(), Long.class); +// +// +// List goodsIdList = goodsMapper.selectListByGoodsIdList(goodsIds,orderIds, getUserOrganId()) +// .stream().map(GoodsDO::getId).toList(); + + List goodsDOS = goodsMapper.selectPlanGoods(planId, getUserOrganId()); + + List goodsIds = goodsDOS.stream().map(GoodsDO::getId).distinct().toList(); + + List orderIds = goodsDOS.stream().map(GoodsDO::getOrderId).distinct().toList(); + + + field = field + .replace("sculpt_num", "sum(front_model_count+back_model_count) as sculptNum" + "") + .replace("hole_num", "sum(unregular_point_count+front_hole_count+back_hole_count+side_hole_count) as holeNum" + ""); + + + String field2 = "sculpt_num".equals(field) || "hole_num".equals(field) ? "group by " + conversion(field) + .replace("sum(front_model_count+back_model_count) as sculptNum", "") + .replace("sum(unregular_point_count+front_hole_count+back_hole_count+side_hole_count) as holeNum", "") : ""; + + + field2 = field2.replaceFirst(",\\s*$", ""); + + + List plateDOS = plateMapper.selectPlanPlateListDataSource(conversion(field),field2,goodsIds,orderIds,getUserOrganId()); + + + return toJsonString(plateDOS); + + } + + + + @Override + public String apiGetEsPlate(Long planId, List fields) { + + List esData = new ArrayList<>(); + + // todo 目前只考虑非混单的情况,混单的情况待解决 + List plateIds = getPlateIds(planId); + + + List orderModelDOS = buildBoardByPlateIds(plateIds, ORDER_PLATE_MODEL, plateIds.size()); + + + for (OrderModelDO orderModelDO : orderModelDOS) { + List filedData = new ArrayList<>() ; + + JsonNode jsonNode = JsonUtils.parseTree(JsonUtils.toJsonString(orderModelDO)); + + for (String field : fields) { + + BigDecimal splitLength = BigDecimal.valueOf(jsonNode.get("splitLength").asDouble()); + BigDecimal splitWidth = BigDecimal.valueOf(jsonNode.get("splitWidth").asDouble()); + + filedData.add( "splitArea".equals(field)? "splitArea:"+ splitLength.multiply(splitWidth) : field+":"+jsonNode.get(field).asText() ); + +// filedData.add(field+":"+jsonNode.get(field).asText()); + } + + + esData.add(filedData.toString()); + + } + + + return esData.toString(); + + } + + + + + @Override + public String apiGetPlanBodyOrRoom(Long planId, String field) { + +// List plateIds = getPlateIds(planId); +// +// +// List orderItemDOS = orderItemMapper.selectPlateIdList(plateIds, getUserOrganId()); +// +// List bodyIds = orderItemDOS.stream().map(OrderItemDO::getBodyId).distinct().toList(); + + + List bodyIds = goodsMapper.selectPlanBodyIds(planId, getUserOrganId()); + + List orderBodyDOS = orderBodyMapper.selectPlanBodyRoomDataSource(conversion(field), bodyIds, getUserOrganId()); + + + return toJsonString(orderBodyDOS); + + } + + + + + @Override + public String apiGetPlanGroup(Long planId, String field) { + + +// List plateIds = getPlateIds(planId); +// +//// List plateIds = Arrays.asList(1825367895442456579L, 1825367895308238851L, 1824334800400416772L); +// +// List orderItemDOS = orderItemMapper.selectPlateIdList(plateIds, getUserOrganId()); +// +// List groupIds = orderItemDOS.stream().map(OrderItemDO::getGroupId).distinct().toList(); + + + List groupIds = goodsMapper.selectPlanGroupListDataSource(planId, getUserOrganId()); + + if(groupIds.isEmpty()){ + return null; + } + + field = field.replace("group_num", "count(id) as groupNum" + ""); + + + String field2 = ("group by " + conversion(field).replace("count(id) as groupNum", "")).replaceFirst(",\\s*$", ""); + + + List orderGroupDOS = orderGroupMapper.selectPlanGroupDataSource(conversion(field),field2, groupIds, getUserOrganId()); + + + return toJsonString(orderGroupDOS); + + } + + + + + + @Override + public String apiGetPlanParts(Long planId, String field) { + + +// List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, 10); +// +// +// String orderNos = optimizeBoardModelDOS.stream().map(OptimizeBoardModelDO::getOrderId).toList().toString(); +// +// +// List orderIds = JSON.parseArray(orderNos).toJavaList(Long.class); + + + List orderIds = goodsMapper.selectPlanGoods(planId, getUserOrganId()).stream().map(GoodsDO::getOrderId).distinct().toList(); + + + List partIds = orderPartsMapper.selectPartIds(orderIds, getUserOrganId()).stream().map(OrderPartsDO::getId).toList(); + + + String filed2 = "parts_num" .equals(field) ? + ",{partsNum:"+orderItemMapper.selectPartsList(partIds,orderIds, getUserOrganId()).stream().mapToDouble(OrderItemDO::getNum).sum()+"}]" : ""; + + + List orderPartsDOS = orderPartsMapper.selectPlanPartsDataSource(conversion(field), partIds, getUserOrganId()); + + + return "".equals(filed2) ? toJsonString(orderPartsDOS) : toJsonString(orderPartsDOS).replace("]", "") + filed2; + + + + } + + + + + + @Override + public String apiGetEsParts(Long planId, List fields) { + + +// List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, 10); +// +// +// String orderNos = optimizeBoardModelDOS.stream().map(OptimizeBoardModelDO::getOrderId).toList().toString(); +// +// +// List orderIds = JSON.parseArray(orderNos).toJavaList(Long.class); + + + List orderIds = goodsMapper.selectPlanGoods(planId, getUserOrganId()).stream().map(GoodsDO::getOrderId).distinct().toList(); + + List esData = new ArrayList<>(); + + List orderPartsRemarks = buildOrderPartsByOrderId(orderIds, ORDER_PARTS_REMARK_MODEL, 999); + + + for (OrderPartsRemark orderPartsRemark : orderPartsRemarks) { + + List filedData = new ArrayList<>(); + + JsonNode jsonNode = JsonUtils.parseTree(JsonUtils.toJsonString(orderPartsRemark)); + + for (String field : fields) { + filedData.add(field+":" + (jsonNode.get(field) == null ? "" : jsonNode.get(field).asText())); + } + + esData.add(filedData.toString()); + + } + + + return esData.toString(); + + + } + + + // 字符串处理 + private String conversion(String filed) { + + // 去除字段中的 【 】 + return filed.replaceAll("\\[|\\]", ""); + + // 使用正则表达式在单词后插入字符串 +// return sql.replaceAll(SEPARATE + "(\\b)", SEPARATE + " " + toInsert); + + } + + + + + // 根据排单ID获取对应的板材ID + private List getPlateIds(Long planId) { + + +// List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, 10); +// +// List goodsIds = optimizeBoardModelDOS.stream().map(OptimizeBoardModelDO::getGoodsId).toList(); +// +// +// List orderIds = BeanUtils.toBean(optimizeBoardModelDOS.stream().map(OptimizeBoardModelDO::getOrderId).toList(), Long.class); +// +// List ids = goodsMapper.selectListByGoodsIdList(goodsIds, orderIds, getUserOrganId()).stream().map(GoodsDO::getId).toList(); +// +// plateMapper.selectGoodsPlateList(ids, getUserOrganId()).stream().map(PlateDO::getId).toList(); + + return goodsMapper.selectPlanPlateList(planId, getUserOrganId()); + + } + + + private List buildOrderPartsByOrderId(List orderIds, String index, Integer size) { + + List fieldValues = orderIds.stream().map(FieldValue::of).toList(); + SearchRequest.Builder builder = new SearchRequest.Builder(); + builder.index(index); + builder.size(size); + builder.query(q -> q.terms(b -> b.field("orderId").terms(e -> e.value(fieldValues)))); + try { + SearchResponse search = elasticsearchClient.search(builder.build(), OrderPartsRemark.class); + List> hits = search.hits().hits(); + if (CollectionUtil.isNotEmpty(hits)) { + return hits.stream().map(Hit::source).collect(Collectors.toList()); + } + return new ArrayList<>(); + } catch (IOException e) { + log.error(e.getMessage()); + throw new ServiceException(INTERNAL_SERVER_ERROR); + } + + } + + + + + private List buildBoardByPlanId(Long planId, String index, Integer size) { + SearchRequest.Builder builder = new SearchRequest.Builder(); + builder.index(index); + builder.size(size); + builder.query(q -> q.term(b -> b.field("planId").value(planId))); + try { + SearchResponse search = elasticsearchClient.search(builder.build(), OptimizeBoardModelDO.class); + List> hits = search.hits().hits(); + if (CollectionUtil.isNotEmpty(hits)) { + return hits.stream().map(Hit::source).collect(Collectors.toList()); + } + return new ArrayList<>(); + } catch (IOException e) { + log.error(e.getMessage()); + throw new ServiceException(INTERNAL_SERVER_ERROR); + } + } + + + + + private List buildBoardByPlateIds(Collection plateIds, String index, Integer size) { + List fieldValues = plateIds.stream().map(FieldValue::of).toList(); + SearchRequest.Builder builder = new SearchRequest.Builder(); + builder.index(index); + builder.size(size); + builder.query(q -> q.terms(b -> b.field("plateId").terms(e -> e.value(fieldValues)))); + try { + SearchResponse search = elasticsearchClient.search(builder.build(), OrderModelDO.class); + List> hits = search.hits().hits(); + if (CollectionUtil.isNotEmpty(hits)) { + return hits.stream().map(Hit::source).collect(Collectors.toList()); + } + return new ArrayList<>(); + } catch (IOException e) { + log.error(e.getMessage()); + throw new ServiceException(INTERNAL_SERVER_ERROR); + } + } + + + public static String toCamelCase(String fieldName) { + if (fieldName == null || fieldName.isEmpty()) { + return fieldName; + } + + StringBuilder camelCase = new StringBuilder(); + boolean nextIsUpperCase = false; + + for (char c : fieldName.toCharArray()) { + if (c == '_' || c == '-') { + nextIsUpperCase = true; + } else { + if (nextIsUpperCase) { + camelCase.append(Character.toUpperCase(c)); + nextIsUpperCase = false; + } else { + camelCase.append(c); + } + } + } + + return camelCase.toString(); + } + + + } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java index 8c0ad0166..ddbcf7cdd 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java @@ -2,15 +2,20 @@ package com.cf.imes.module.executor.controller.admin.order; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; +import com.cf.imes.framework.common.pojo.CommonResult; import com.cf.imes.framework.common.pojo.PageParam; +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.common.util.object.BeanUtils; +import com.cf.imes.framework.operatelog.core.annotations.OperateLog; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.module.executor.controller.admin.order.vo.order.*; import com.cf.imes.module.executor.controller.admin.order.vo.product.OrderBodyRespVO; import com.cf.imes.module.executor.controller.admin.order.vo.product.OrderRoomBodyRespVO; import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRespVO; +import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; import com.cf.imes.module.executor.enums.OrderDeletedEnum; import com.cf.imes.module.executor.enums.OrderStatusEnum; -import com.cf.imes.module.executor.enums.OrderTypeEnum; +import com.cf.imes.module.executor.service.order.OrderService; import com.cf.imes.module.executor.util.ExcelWriterUtil; import com.cf.imes.module.executor.util.fileConversion.admin.api.webcad.ApiDataAchieve; import com.cf.imes.module.executor.util.fileConversion.admin.api.webcad.ApiTypeRealize; @@ -19,49 +24,32 @@ import com.cf.imes.module.executor.util.fileConversion.admin.files.excel.OrderPl import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.VO.OrderXmlVO; import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.XMLUtil; import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.XmlBuilder; -import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.XmlTypeRealize; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; - -import org.springframework.validation.annotation.Validated; -import org.springframework.security.access.prepost.PreAuthorize; -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Operation; - -import javax.validation.*; -import javax.servlet.http.*; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; import java.io.File; -import java.util.*; - -import com.cf.imes.framework.common.pojo.PageResult; -import com.cf.imes.framework.common.pojo.CommonResult; -import com.cf.imes.framework.common.util.object.BeanUtils; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutionException; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.framework.common.pojo.CommonResult.success; - -import com.cf.imes.framework.operatelog.core.annotations.OperateLog; - -import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.*; +import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; +import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.IMPORT; import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.*; -import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; -import com.cf.imes.module.executor.service.order.OrderService; - - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.util.concurrent.ExecutionException; - @Tag(name = "管理后台 - 生产单管理") @RestController @@ -459,7 +447,7 @@ public class OrderController { @Operation(summary = "删除柜体") @PreAuthorize("@ss.hasPermission('production:manager-list:deleteCabinet')") public CommonResult deleteBody(@Valid @RequestBody OrderModuleParameterRespVO orderModuleParameterRespVO) { - orderService.updateBodyDeletedByOrderId(orderModuleParameterRespVO.getOrderId(), orderModuleParameterRespVO.getRoomIds(), + orderService.updateDeleteBody(orderModuleParameterRespVO.getOrderId(), orderModuleParameterRespVO.getRoomIds(), orderModuleParameterRespVO.getBodyId(), OrderDeletedEnum.DELETED.getStatus()); return success(true); } @@ -468,7 +456,7 @@ public class OrderController { @Operation(summary = "还原柜体") @PreAuthorize("@ss.hasPermission('production:manager-list:restoreCabinet')") public CommonResult restoreBody(@Valid @RequestBody OrderModuleParameterRespVO orderModuleParameterRespVO) { - orderService.updateBodyDeletedByOrderId(orderModuleParameterRespVO.getOrderId(), orderModuleParameterRespVO.getRoomIds(), + orderService.updateRestoreBody(orderModuleParameterRespVO.getOrderId(), orderModuleParameterRespVO.getRoomIds(), orderModuleParameterRespVO.getBodyId(), OrderDeletedEnum.NOT_DELETED.getStatus()); return success(true); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderGoodsIds.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderGoodsIds.java new file mode 100644 index 000000000..a93db39c8 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderGoodsIds.java @@ -0,0 +1,28 @@ +package com.cf.imes.module.executor.controller.admin.order.vo.order; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +/** + * @author Administrator + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString(callSuper = true) +public class OrderGoodsIds { + + @Schema(description = "大板的实际ID") + private String goodsId; + + + @Schema(description = "大板的旧分类ID") + private Long oldId; + + + @Schema(description = "大板的新分类ID") + private Long id; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/PlanController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/PlanController.java index eb856c56a..4571a5440 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/PlanController.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/PlanController.java @@ -110,6 +110,8 @@ public class PlanController { return success(planService.getOrderPage(pageReqVO)); } + + // 目前因为这个接口没有使用,所以这个接口里代码没有进行更改 @GetMapping("getNotPlanOrderPlateList") @Operation(summary = "获取未排单的板材分页列表") @PreAuthorize("@ss.hasPermission('placeorder:query')") @@ -135,9 +137,9 @@ public class PlanController { } - @GetMapping("getNotPlanGoodsListPageByOrderId") - @Operation(summary = "根据生产单id获取未排单的商品分页列表") - @PreAuthorize("@ss.hasPermission('executor:plan:query')") +// @GetMapping("getNotPlanGoodsListPageByOrderId") +// @Operation(summary = "根据生产单id获取未排单的商品分页列表") +// @PreAuthorize("@ss.hasPermission('executor:plan:query')") public CommonResult> getNotPlanGoodsListPageByOrderId(@Valid NotPlanGoodsListPageVO pageVO) { return success(planService.getNotPlanGoodsListPageByOrderId(pageVO)); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/pack/OrderPackageDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/pack/OrderPackageDO.java new file mode 100644 index 000000000..87310592c --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/pack/OrderPackageDO.java @@ -0,0 +1,51 @@ +package com.cf.imes.module.executor.dal.dataobject.pack; + + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cf.imes.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +@TableName("order_package") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrderPackageDO extends BaseDO { + + + // 包裹ID + @TableId + private Long id; + + // 组织 ID + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long organId; + + // 生产单号 + private Long orderId; + + // 包裹编号 + private String packageNo; + + // 包裹类型,-1未定义,0板材,1配件,2其他配件 + private Integer type; + + // 包裹名 + private String name; + + // 包裹状态,0未封包,1已封包,2已入库,3已出库 + private Integer status; + + + // 备注 + private String remark; + + + +} + diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/pack/OrderPrepackagedDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/pack/OrderPrepackagedDO.java new file mode 100644 index 000000000..bc4b35a21 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/pack/OrderPrepackagedDO.java @@ -0,0 +1,33 @@ +package com.cf.imes.module.executor.dal.dataobject.pack; + + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +@TableName("order_prepackaged") +@Data +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrderPrepackagedDO { + + + @TableId + // 生产单号-主键 + private Long orderId; + + + // 预打包优化信息 + private String result; + + + // 组织 ID + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long organId; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java index c3c94a531..1f0cc2d2e 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java @@ -86,6 +86,7 @@ public interface GoodsMapper extends BaseMapperX { return selectList(new LambdaQueryWrapperX() .eq(GoodsDO::getOrganId, organId) .eq(GoodsDO::getDeleted, false) + .eq(GoodsDO::getPlanId ,0) .eq(GoodsDO::getGoodsId, goodsId)); } @@ -117,7 +118,7 @@ public interface GoodsMapper extends BaseMapperX { } - List seleTestSQL(@Param("filed") String filed,@Param("goodsIds") List goodsIds ,@Param("organId") Long organId); + List selectPlanGoodsDataSource(@Param("filed") String filed,@Param("planId") Long planId ,@Param("organId") Long organId); default GoodsDO selectGoodsId(Long orderId, String goodsId, Long organId) { @@ -199,4 +200,25 @@ public interface GoodsMapper extends BaseMapperX { List selectPlanOrderList(@Param("orderId") Long orderId,@Param("roomIds") Set roomIds, @Param("bodyId") Long bodyId,@Param("organId") Long organId); + List selectPlanPlateList(@Param("planId") Long planId,@Param("organId") Long organId); + + List selectPlanBodyIds(@Param("planId") Long planId,@Param("organId") Long organId); + + List selectPlanGroupListDataSource(@Param("planId") Long planId,@Param("organId") Long organId); + + + + default List selectGoodsListByStatus(Long orderId, List goodsIds, Long organId) { + return selectList(new LambdaQueryWrapperX() + .eq(GoodsDO::getOrganId, organId) + .eq(GoodsDO::getDeleted, true) + .eqIfPresent(GoodsDO::getOrderId,orderId) + .inIfPresent(GoodsDO::getId,goodsIds)); + + } + + + List selectNoPlanGoodsList(@Param("orderId") Long orderId,@Param("goodsIds") List goodsIds,@Param("organId") Long organId); + + } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java index b4fab3faa..f6dccec08 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java @@ -227,7 +227,7 @@ public interface OrderMapper extends BaseMapperX { - List selectTestSQL(@Param("filed") String filed,@Param("orderIds") List orderIds,@Param("organId") Long organId); + List selectOrderDataSource(@Param("filed") String filed,@Param("orderIds") List orderIds,@Param("organId") Long organId); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderBody/OrderBodyMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderBody/OrderBodyMapper.java index 4223189fe..a2be28bad 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderBody/OrderBodyMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderBody/OrderBodyMapper.java @@ -127,7 +127,7 @@ public interface OrderBodyMapper extends BaseMapperX { } - List selectTestSQL(@Param("filed") String filed,@Param("bodyIds") List bodyIds,@Param("organId") Long organId); + List selectPlanBodyRoomDataSource(@Param("filed") String filed,@Param("bodyIds") List bodyIds,@Param("organId") Long organId); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderGroup/OrderGroupMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderGroup/OrderGroupMapper.java index 4c1a32a65..d2c3a6abb 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderGroup/OrderGroupMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderGroup/OrderGroupMapper.java @@ -108,6 +108,6 @@ public interface OrderGroupMapper extends BaseMapperX { } - List selectTestSQL(@Param("filed") String filed, @Param("field2") String field2 ,@Param("groupIds") List groupIds, @Param("organId") Long organId); + List selectPlanGroupDataSource(@Param("filed") String filed, @Param("field2") String field2 ,@Param("groupIds") List groupIds, @Param("organId") Long organId); } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java index d28854a03..5228abcd9 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java @@ -5,7 +5,6 @@ import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPlatesDetailRespVO; import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRespVO; -import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PrintOrderPackReqVO; import com.cf.imes.module.executor.controller.admin.plan.vo.OrderRespVOCopy; import com.cf.imes.module.executor.controller.admin.plate.vo.PlateDetailReqVO; import com.cf.imes.module.executor.controller.admin.plate.vo.PlateDetailRespVO; @@ -59,8 +58,6 @@ public interface OrderItemMapper extends BaseMapperX { void deleteByPlateId(@Param("deletePlateIds") List deletePlateIds); - List selectPackList(@Param("ids") List ids, @Param("organId") Long organId); - default int deleteByBodyId(Long bodyId, Long organId) { return delete(new LambdaQueryWrapperX() @@ -94,9 +91,10 @@ public interface OrderItemMapper extends BaseMapperX { - default List selectPartsList(List partIds, Long organId) { + default List selectPartsList(List partIds,List orderIds, Long organId) { return selectList(new LambdaQueryWrapperX() .eq(OrderItemDO::getOrganId,organId) + .inIfPresent(OrderItemDO::getOrderId,orderIds) .inIfPresent(OrderItemDO::getPartsId, partIds) .select(OrderItemDO::getNum)); @@ -105,6 +103,14 @@ public interface OrderItemMapper extends BaseMapperX { IPage selectTestNum(@Param("page") IPage page,@Param("organId") Long organId); - List selectOrderPlateList(@Param("orderId") Long orderId,@Param("organId") Long organId); + default List selectPackId(List bodyIds, Long organId) { + return selectList(new LambdaQueryWrapperX() + .eq(OrderItemDO::getOrganId,organId) + .inIfPresent(OrderItemDO::getBodyId,bodyIds) + .select(OrderItemDO::getPackageId)); + } + + + void deletePackList(@Param("orderId") Long orderId,@Param("packIds") List packIds,@Param("organId") Long organId); } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/OrderPartsMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/OrderPartsMapper.java index 935a55495..9eab930fe 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/OrderPartsMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/OrderPartsMapper.java @@ -6,7 +6,6 @@ import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsPageReqVO; -import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRespVO; import com.cf.imes.module.executor.controller.admin.orderParts.vo.PartGoodsRespVO; import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PrintOrderPartsRespVO; import com.cf.imes.module.executor.dal.dataobject.orderParts.OrderPartsDO; @@ -87,7 +86,7 @@ public interface OrderPartsMapper extends BaseMapperX { } - List selectTestSql(@Param("filed") String filed,@Param("partIds") List partIds,@Param("organId") Long organId); + List selectPlanPartsDataSource(@Param("filed") String filed,@Param("partIds") List partIds,@Param("organId") Long organId); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/pack/OrderPackageMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/pack/OrderPackageMapper.java new file mode 100644 index 000000000..13c465783 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/pack/OrderPackageMapper.java @@ -0,0 +1,27 @@ +package com.cf.imes.module.executor.dal.mysql.pack; + + +import com.cf.imes.framework.common.enums.OrderPackageStatusEnum; +import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; +import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.module.executor.dal.dataobject.pack.OrderPackageDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface OrderPackageMapper extends BaseMapperX { + + + void updatePackList(@Param("orderId") Long orderId, @Param("packIds") List packIds, @Param("organId") Long organId); + + default List selectPackStatusList(Long orderId,Long organId) { + return selectList(new LambdaQueryWrapperX() + .eq(OrderPackageDO::getOrganId,organId) + .eq(OrderPackageDO::getDeleted,false) + .eq(OrderPackageDO::getStatus, OrderPackageStatusEnum.PACKAGED.getStatus()) + .eqIfPresent(OrderPackageDO::getOrderId, orderId)); + } + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/pack/OrderPrepackagedMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/pack/OrderPrepackagedMapper.java new file mode 100644 index 000000000..bc616afbd --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/pack/OrderPrepackagedMapper.java @@ -0,0 +1,17 @@ +package com.cf.imes.module.executor.dal.mysql.pack; + +import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; +import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.module.executor.dal.dataobject.pack.OrderPrepackagedDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface OrderPrepackagedMapper extends BaseMapperX { + + default int deletePacked(Long orderId, Long organId) { + return delete(new LambdaQueryWrapperX() + .eq(OrderPrepackagedDO::getOrganId, organId) + .eqIfPresent(OrderPrepackagedDO::getOrderId, orderId)); + } + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plan/PlanMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plan/PlanMapper.java index 2f9cb36ab..d512fb682 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plan/PlanMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plan/PlanMapper.java @@ -103,7 +103,7 @@ public interface PlanMapper extends BaseMapperX { List selectPlanAreaGroupByCreateTime(@Param("req") OrderStatisticsReqVO reqVO); - List seleTestSQL(@Param("filed") String filed,@Param("planId") Long planId,@Param("organId") Long organId); + List selectPlanDataSource(@Param("filed") String filed,@Param("planId") Long planId,@Param("organId") Long organId); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java index 8a827cf52..ce04622e3 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java @@ -10,6 +10,7 @@ import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.module.executor.controller.admin.plan.bo.GoodsNum; import com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds; +import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PrintOrderPackReqVO; import com.cf.imes.module.executor.controller.admin.plan.vo.*; import com.cf.imes.module.executor.controller.admin.plate.vo.PlateGoodsIdVO; import com.cf.imes.module.executor.controller.admin.plate.vo.PlateGoodsRespVO; @@ -143,13 +144,24 @@ public interface PlateMapper extends BaseMapperX { default List selectPlateNum(Long orderId, Long organId) { return selectList(new LambdaQueryWrapperX() .eq(PlateDO::getOrganId,organId) + .eq(PlateDO::getDeleted,false) .eqIfPresent(PlateDO::getOrderId, orderId)); } -// 房间id查小板的开料状态 - List selectPlateTypeByRoomId(@Param("orderId") Long orderId, @Param("bodyIds") Collection bodyIds, + default List selectPlateDeletedStatus(Long orderId,List goodsIds, Long organId) { + return selectList(new LambdaQueryWrapperX() + .eq(PlateDO::getOrganId,organId) + .eq(PlateDO::getDeleted,false) + .in(PlateDO::getGoodsId,goodsIds) + .eqIfPresent(PlateDO::getOrderId, orderId)); + } + + + + // 房间id查小板的开料状态 + List selectPlateTypeByRoomId(@Param("orderId") Long orderId, @Param("bodyIds") Collection bodyIds, @Param("organId") Long organId, @Param("deleted") Integer deleted); // 根据生产单id删除 @@ -180,6 +192,7 @@ public interface PlateMapper extends BaseMapperX { default List selectPlateByPlateNo(List plateNo, Long organId) { return selectList(new LambdaQueryWrapperX() .eq(PlateDO::getOrganId,organId) + .eq(PlateDO::getDeleted,false) .inIfPresent(PlateDO::getPlateNo, plateNo) .select(PlateDO::getOrderId)); @@ -197,7 +210,7 @@ public interface PlateMapper extends BaseMapperX { } - List selectTestSQL(@Param("filed") String filed, @Param("field2") String field2,@Param("goodsIdList") List goodsIdList,@Param("organId") Long organId); + List selectPlanPlateListDataSource(@Param("filed") String filed, @Param("field2") String field2,@Param("goodsIdList") List goodsIdList,@Param("orderIds") List orderIds,@Param("organId") Long organId); @@ -233,6 +246,24 @@ public interface PlateMapper extends BaseMapperX { void updateNoPlateOptimized(@Param("orderIdList") List orderIdList,@Param("ids") List ids,@Param("organId") Long organId); + List selectPlanPackList(@Param("ids") List ids,@Param("organId") Long organId); + + List selectOrderPackList(@Param("orderId") Long orderId,@Param("organId") Long organId); + + void updatePlateOptimizedStatus(@Param("plateDOList")List plateDOList,@Param("organId") Long organId,@Param("orderId") Long orderId); + + + + default List selectNoPlanPlate(Long orderId, List goodsIds, Long organId) { + return selectList(new LambdaQueryWrapperX() + .eq(PlateDO::getOrganId,organId) + .eqIfPresent(PlateDO::getOrderId,orderId) + .inIfPresent(PlateDO::getGoodsId,goodsIds) + .eq(PlateDO::getIsOptimized,false)); + + } + + // List selectTestSQL(@Param("sql") String sql); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/remainplaten/RemainPlateMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/remainplaten/RemainPlateMapper.java index 9c16c2d76..f8aa96bde 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/remainplaten/RemainPlateMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/remainplaten/RemainPlateMapper.java @@ -41,9 +41,10 @@ public interface RemainPlateMapper extends BaseMapperX { } - default List selectByPlanId(Long planId, Long userOrganId) { + default List selectByPlanId(Long planId, Long organId) { return selectList( new LambdaQueryWrapperX() - .eq(RemainPlateDO::getOrganId, userOrganId) + .eq(RemainPlateDO::getOrganId, organId) + .eq(RemainPlateDO::getDeleted,false) .eq(RemainPlateDO::getPlanId, planId)); @@ -59,7 +60,7 @@ public interface RemainPlateMapper extends BaseMapperX { .eq(RemainPlateDO::getOrganId, organId)); } - List selectTestSQL(@Param("filed") String filed,@Param("planId") Long planId,@Param("organId") Long organId); + List selectPlanRemainDataSource(@Param("filed") String filed,@Param("planId") Long planId,@Param("organId") Long organId); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java index b87f360f5..bee00fa0e 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java @@ -12,6 +12,7 @@ import com.alibaba.fastjson.JSON; import com.cf.imes.framework.common.enums.OrderStatusEnum; import com.cf.imes.framework.common.enums.PlanStatusEnum; import com.cf.imes.framework.common.exception.ServiceException; +import com.cf.imes.framework.common.util.Assert.AssertUtils; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.es.core.service.ESDocumentService; import com.cf.imes.framework.security.core.LoginUser; @@ -66,6 +67,7 @@ import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.ge import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_NOT_EXISTS; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.PLAN_NOT_EXISTS; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.*; /** * @author there @@ -160,14 +162,15 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { public Boolean commit(Long planId, List goodsNo) { PlanDO planDO = planMapper.selectById(planId); - if (Objects.isNull(planDO)) { - throw exception(PLAN_NOT_EXISTS); - } + + AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS); // todo 目前只解决了非混单的情况,混单情况待解决 List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, 10); + AssertUtils.notEmpty(optimizeBoardModelDOS,ORDER_PLAN_OPTIMIZE_ERROR); + OptimizeBoardModelDO optimizeBoardModelDO = optimizeBoardModelDOS.get(0); List plateNo = new ArrayList<>(); @@ -190,7 +193,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { } } } catch (JsonProcessingException e) { - e.printStackTrace(); + throw exception(ORDER_PLAN_OPTIMIZE_ERROR); } for (Long goods : goodsNo) { @@ -275,22 +278,14 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { Long planId = respVO.getPlanId(); List goodsNo = respVO.getGoodsNo(); -// LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); -// assert loginUser != null; -// -// if(!loginUser.getIsSupAdmin()){ -// -// throw exception(INSUFFICIENT_PERMISSIONS); -// -// } - PlanDO planDO = planMapper.selectById(planId); - if (planDO == null) { - throw exception(PLAN_NOT_EXISTS); - } + + AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS); // todo 目前只解决了非混单的情况,混单情况待解决 - List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, 99); + List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, 10); + + AssertUtils.notEmpty(optimizeBoardModelDOS,ORDER_PLAN_OPTIMIZE_ERROR); OptimizeBoardModelDO optimizeBoardModelDO = optimizeBoardModelDOS.get(0); @@ -459,10 +454,11 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { @Override public OrderSource getOrderSourceByOrderId(Long orderId) { OrderDO orderDO = orderMapper.selectById(orderId); - if (Objects.isNull(orderDO)) { - throw exception(ORDER_NOT_EXISTS); - } - OrderSource orderSource = new OrderSource(); +// if (Objects.isNull(orderDO)) { +// throw exception(ORDER_NOT_EXISTS); +// } + + AssertUtils.notEmpty(orderDO,ORDER_NOT_EXISTS); List goodsDOS = goodsMapper.selectGoodsList(orderId,getUserOrganId()); @@ -470,6 +466,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List plateDOS = plateMapper.selectPlateDetialList(orderId,getUserOrganId()); + AssertUtils.notEmpty(plateDOS,ORDER_PLATE_ERROR); for (PlateDetialRespVO plateDetailsRespVO : plateDOS) { String name = ""; @@ -489,11 +486,14 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { Integer orderModelSize = plateDOS.size(); - List orderModelDOS = buildRespByOrderId(orderId, ORDER_PLATE_MODEL, orderModelSize); + List orderModelDOS = buildRespByOrderId(orderId, orderModelSize); + + + AssertUtils.notEmpty(orderModelDOS,ORDER_PLATE_MODEL_DATE_ERROR); // 大板数据的尺寸长度 - Integer boardSize = goodsDOS.stream().map(GoodsReqVO::getId).toList().size(); + Integer boardSize = goodsDOS.size(); List optimizeBoardModelDOS = buildBoardByOrderId(orderId, ORDER_REMAIN_PLATE_MODEL, boardSize); @@ -504,8 +504,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { // 查询生产单对应的包裹信息 - List printOrderPackReqVOS = orderItemMapper.selectOrderPlateList(orderId, getUserOrganId()); - + List printOrderPackReqVOS = plateMapper.selectOrderPackList(orderId,getUserOrganId()); // 统计每个订单的包装数量 printOrderPackReqVOS @@ -515,14 +514,24 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { .forEach(f->f.setPackNum(printOrderPackReqVOS.stream().filter(e -> e.getOrderId().equals(orderId)).map(PrintOrderPackReqVO::getPackId).toList().size())); - orderSource.setOrderList(Collections.singletonList(orderDO)); - orderSource.setPlateList(plateDOS); - orderSource.setGoodsList(goodsDOS); - orderSource.setPlateModels(orderModelDOS); - orderSource.setOptimizeBoardModelDOS(optimizeBoardModelDOS); - orderSource.setOrderPartsRespVOS(printOrderPartsRespVOS); - orderSource.setOrderPackReqVOS(printOrderPackReqVOS); - return orderSource; +// orderSource.setOrderList(Collections.singletonList(orderDO)); +// orderSource.setPlateList(plateDOS); +// orderSource.setGoodsList(goodsDOS); +// orderSource.setPlateModels(orderModelDOS); +// orderSource.setOptimizeBoardModelDOS(optimizeBoardModelDOS); +// orderSource.setOrderPartsRespVOS(printOrderPartsRespVOS); +// orderSource.setOrderPackReqVOS(printOrderPackReqVOS); + + return OrderSource.builder() + .orderList(Collections.singletonList(orderDO)) + .goodsList(goodsDOS) + .plateList(plateDOS) + .plateModels(orderModelDOS) + .optimizeBoardModelDOS(optimizeBoardModelDOS) + .orderPartsRespVOS(printOrderPartsRespVOS) + .orderPackReqVOS(printOrderPackReqVOS) + .build(); + } @@ -530,15 +539,17 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { @Override public OrderSource getOrderSourceByPlanId(Long planId) { PlanDO planDO = planMapper.selectById(planId); - if (Objects.isNull(planDO)) { - throw exception(PLAN_NOT_EXISTS); - } +// if (Objects.isNull(planDO)) { +// throw exception(PLAN_NOT_EXISTS); +// } + + AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS); // 查询排单对应的大板信息 List goodsDOS = goodsMapper.selectGoodsListByOrderIds(planId,getUserOrganId()); - List orderIds = goodsDOS.stream().map(GoodsReqVO::getOrderId).toList(); + List orderIds = goodsDOS.stream().map(GoodsReqVO::getOrderId).distinct().toList(); List ids = goodsDOS.stream().map(GoodsReqVO::getId).toList(); @@ -546,26 +557,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List plateDetialRespVOS = plateMapper.selectPlateListByGoodsIds(ids, getUserOrganId()); - -// List bodyIds = plateDetialRespVOS.stream().map(PlateDetialRespVO::getBodyId).distinct().toList(); -// -// -// List orderBodyDOS = orderBodyMapper.selectOrderBodyList(bodyIds,orderIds, getUserOrganId()); -// -// -//// List detialRespVOS = new ArrayList<>(); -// -// -// for (OrderBodyDO orderBodyDO : orderBodyDOS) { -// -// plateDetialRespVOS.stream().filter(f -> f.getBodyId().equals(orderBodyDO.getId())).forEach(m -> { -// m.setBodyName(orderBodyDO.getName()); -// m.setRoomName(orderBodyDO.getRoomName()); -// }); -// -// } - - + AssertUtils.notEmpty(plateDetialRespVOS,ORDER_PLAN_PLATE_ERROR); for (PlateDetialRespVO plateDetailsRespVO : plateDetialRespVOS) { String name = ""; @@ -579,23 +571,15 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { } plateDetailsRespVO.setProcessGroupName(name); -// plateDetailsRespVO.setGoodsId(goodsDOS -// .stream() -// .filter(f->f.getId().equals(plateDetailsRespVO.getId())) -// .map(GoodsReqVO::getGoodsId) -// .findAny().orElse(null)); - -// plateDetailsRespVO.setGoodsName(goodsDOS -// .stream() -// .filter(f->f.getId().equals(plateDetailsRespVO.getId())) -// .map(GoodsReqVO::getGoodsName) -// .findAny().orElse(null)); } List orderDOS = orderMapper.selectBatchIds(orderIds); + AssertUtils.notEmpty(orderDOS,ORDER_PLAN_ERROR); + + // 造型数据的尺寸长度 Integer orderModelSize = plateDetialRespVOS.size(); @@ -605,14 +589,18 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List orderModelDOS = buildRespByPlateIds(plateIds, orderModelSize); + AssertUtils.notEmpty(orderModelDOS,ORDER_PLAN_PLATE_MODEL_DATE_ERROR); + + // 大板数据的尺寸长度 - Integer boardSize = goodsDOS.stream().map(GoodsReqVO::getId).toList().size(); + Integer boardSize = goodsDOS.size(); List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, boardSize); List remainPlateDOS = remainPlateMapper.selectByPlanId(planId,getUserOrganId()); + List optimizeRemainPlates = BeanUtils.toBean(remainPlateDOS, OptimizeRemainPlate.class); @@ -620,19 +608,20 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List printOrderPartsRespVOS = orderPartsMapper.selectPartList(orderIds, getUserOrganId()); // 查询生产单对应的包裹信息 - List printOrderPackReqVOS = orderItemMapper.selectPackList(ids, getUserOrganId()); + List printOrderPackReqVOS = plateMapper.selectPlanPackList(ids,getUserOrganId()); - for (Long orderId : orderIds) { + if(!printOrderPackReqVOS.isEmpty()) { + for (Long orderId : orderIds) { - // 统计每个订单的包装数量 - printOrderPackReqVOS - .stream() - .filter(f->f.getOrderId().equals(orderId)) - .forEach(f->f.setPackNum(printOrderPackReqVOS.stream().filter(e -> e.getOrderId().equals(orderId)).map(PrintOrderPackReqVO::getPackId).toList().size())); + // 统计每个订单的包装数量 + printOrderPackReqVOS + .stream() + .filter(f -> f.getOrderId().equals(orderId)) + .forEach(f -> f.setPackNum(printOrderPackReqVOS.stream().filter(e -> e.getOrderId().equals(orderId)).map(PrintOrderPackReqVO::getPackId).toList().size())); + } } - return OrderSource.builder() .orderList(orderDOS) .plan(planDO) @@ -652,6 +641,9 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List goodsReqVOS = goodsMapper.selectGoodsAndRemainPlate(ids, getUserOrganId()); + AssertUtils.notEmpty(goodsReqVOS,ORDER_GOODS_DATA_ERROR); + + List orderIds = goodsReqVOS.stream().map(GoodsReqVO::getOrderId).distinct().toList(); List orderDOS = orderMapper.selectBatchIds(orderIds); @@ -660,22 +652,6 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List plateDetialRespVOS = plateMapper.selectPlateListByGoodsIds(ids, getUserOrganId()); -// List bodyIds = plateDetialRespVOS.stream().map(PlateDetialRespVO::getBodyId).distinct().toList(); -// -// -// List orderBodyDOS = orderBodyMapper.selectOrderBodyList(bodyIds,orderIds, getUserOrganId()); -// -// -// for (OrderBodyDO orderBodyDO : orderBodyDOS) { -// -// plateDetialRespVOS.stream().filter(f -> f.getBodyId().equals(orderBodyDO.getId())).forEach(m -> { -// m.setBodyName(orderBodyDO.getName()); -// m.setRoomName(orderBodyDO.getRoomName()); -// }); -// -// } - - for (PlateDetialRespVO plateDetailsRespVO : plateDetialRespVOS) { String name = ""; if(!plateDetailsRespVO.getProcessGroupLists().isEmpty()) { @@ -688,13 +664,6 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { } plateDetailsRespVO.setProcessGroupName(name); - -// // todo 这样写混单时同样适用,后面加混单后这里不用修改 -// plateDetailsRespVO.setGoodsId(goodsReqVOS -// .stream() -// .filter(f->f.getId().equals(plateDetailsRespVO.getId())) -// .map(GoodsReqVO::getGoodsId) -// .findAny().orElse(null)); } @@ -729,16 +698,23 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { // todo 目前只解决非混单的情况下, List optimizeBoardModelDOS = buildBoardByPlanIds(planIds, ORDER_REMAIN_PLATE_MODEL, planIds.size()); + if(!optimizeBoardModelDOS.isEmpty()){ - deleteByPlanId(planIds,ORDER_REMAIN_PLATE_MODEL); - } // 保存优化后的大板数据 batchSaveBoardModel(req.getOptimizeBoardModelDOS()); + List goodsDOS = goodsMapper.selectPlanGoodsListByPlanIdList(planIds, getUserOrganId()); + + List ids = goodsDOS.stream().map(GoodsDO::getId).distinct().toList(); + + List orderIds = goodsDOS.stream().map(GoodsDO::getOrderId).distinct().toList(); + + plateMapper.updatePlateOptimized(orderIds,ids,getUserOrganId()); + // // 保存余料板的数据 // if (CollectionUtil.isNotEmpty(req.getOptimizeRemainPlates())) { @@ -818,8 +794,11 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List plateDOS = plateMapper.selectPlateNum(orderId, getUserOrganId()); + if(plateDOS.isEmpty()){ + return null; + } - return buildRespByOrderId(orderId, ORDER_PLATE_MODEL,plateDOS.size()); + return buildRespByOrderId(orderId, plateDOS.size()); } @@ -843,9 +822,9 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { } } - private List buildRespByOrderId(Long orderId, String index,Integer size) { + private List buildRespByOrderId(Long orderId, Integer size) { SearchRequest.Builder builder = new SearchRequest.Builder(); - builder.index(index); + builder.index(OptimizePlanService.ORDER_PLATE_MODEL); builder.size(size); builder.query(q -> q.term(b -> b.field("orderId").value(orderId))); try { @@ -874,12 +853,12 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { boolean errors = bulkResponse.errors(); if (errors) { log.error(bulkResponse.items().toString()); - throw new ServiceException(500, "未知异常"); + throw new ServiceException(INTERNAL_SERVER_ERROR); } } catch (Exception e) { e.printStackTrace(); log.error(e.getMessage()); - throw new RuntimeException(e); + throw new ServiceException(INTERNAL_SERVER_ERROR); } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderService.java index 25398f97b..4a2cb3393 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderService.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderService.java @@ -1,20 +1,19 @@ package com.cf.imes.module.executor.service.order; -import javax.servlet.http.HttpServletResponse; -import javax.validation.*; - import com.alibaba.fastjson.JSONObject; import com.cf.imes.framework.common.pojo.PageParam; +import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.module.executor.controller.admin.order.vo.order.*; import com.cf.imes.module.executor.controller.admin.order.vo.product.OrderBodyRespVO; import com.cf.imes.module.executor.controller.admin.order.vo.product.OrderRoomBodyRespVO; import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRespVO; import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; -import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.module.executor.util.fileConversion.admin.files.excel.OrderPlateImportExcelVO; import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.VO.OrderXmlVO; import org.springframework.boot.system.ApplicationHome; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; import java.io.File; import java.util.List; import java.util.Map; @@ -91,7 +90,9 @@ public interface OrderService { * @param roomId: 房间id * @param bodyId: 柜体id */ - void updateBodyDeletedByOrderId(Long orderId , Set roomId, Long bodyId, Integer status); + void updateDeleteBody(Long orderId , Set roomId, Long bodyId, Integer status); + + void updateRestoreBody(Long orderId , Set roomId, Long bodyId, Integer status); /** * @param listMap:生产单号 diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java index aa37817c4..ff86d0e47 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java @@ -30,6 +30,7 @@ import com.cf.imes.module.executor.dal.dataobject.orderGroup.OrderGroupDO; import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO; import com.cf.imes.module.executor.dal.dataobject.orderParts.OrderPartsDO; import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO; +import com.cf.imes.module.executor.dal.dataobject.pack.OrderPackageDO; import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO; import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO; @@ -40,6 +41,8 @@ import com.cf.imes.module.executor.dal.mysql.orderBody.OrderBodyMapper; import com.cf.imes.module.executor.dal.mysql.orderGroup.OrderGroupMapper; import com.cf.imes.module.executor.dal.mysql.orderItem.OrderItemMapper; import com.cf.imes.module.executor.dal.mysql.orderParts.OrderPartsMapper; +import com.cf.imes.module.executor.dal.mysql.pack.OrderPackageMapper; +import com.cf.imes.module.executor.dal.mysql.pack.OrderPrepackagedMapper; import com.cf.imes.module.executor.dal.mysql.plan.PlanMapper; import com.cf.imes.module.executor.dal.mysql.plate.PlateGoodMapper; import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper; @@ -63,12 +66,14 @@ import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import java.util.stream.Stream; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; @@ -113,6 +118,12 @@ public class OrderServiceImpl implements OrderService { @Resource private OrderItemMapper orderItemMapper; + @Resource + private OrderPackageMapper orderPackageMapper; + + @Resource + private OrderPrepackagedMapper orderPrepackagedMapper; + @Resource private OrderInputProcessor orderInputProcessor; @@ -242,7 +253,7 @@ public class OrderServiceImpl implements OrderService { @Override @Transactional(rollbackFor = Exception.class) - public void updateBodyDeletedByOrderId(Long orderId, Set roomIds, Long bodyId, Integer status) { // 要删除传1,还原传0 + public void updateDeleteBody(Long orderId, Set roomIds, Long bodyId, Integer status) { // 要删除传1,还原传0 // 判断生产单的状态和生产单柜体对应的板擦是否已开料 List planIds = validateOrderStatus(orderId, roomIds, bodyId, getUserOrganId(), OrderDeletedEnum.NOT_DELETED.getStatus()); @@ -257,43 +268,52 @@ public class OrderServiceImpl implements OrderService { } if (bodyIds.size() != 0){ - List plateDOList = plateMapper.selectPlateTypeByRoomId(orderId, bodyIds, getUserOrganId(), index); + + List plateDOList = plateMapper.selectPlateTypeByRoomId(orderId, bodyIds, getUserOrganId(), index); + List plateIds = plateDOList.stream().map(PlateDO::getId).toList(); + + List goodsIds = plateDOList.stream().map(PlateDO::getGoodsId).distinct().toList(); // List groupIds = orderGroupMapper.selectListByBodyId(bodyIds, orderId, getUserOrganId(), index); orderBodyMapper.updateDeletedById(bodyIds, status, getUserOrganId(), orderId);// 柜体 orderGroupMapper.updateDeletedById(bodyIds, status, getUserOrganId(), orderId);// 加工组 - if (plateDOList != null && plateDOList.size() != 0) { - plateMapper.updateDeletedById(plateDOList, status, getUserOrganId(), orderId);// 删小板 + + if (!plateDOList.isEmpty()) { + plateMapper.updateDeletedById(plateIds, status, getUserOrganId(), orderId);// 删小板 } + + + // 删除包裹,只需删除,无需还原 + List packIds = orderItemMapper.selectPackId(bodyIds, getUserOrganId()).stream().map(OrderItemDO::getPackageId).distinct().toList(); + + orderPackageMapper.updatePackList(orderId, packIds, getUserOrganId()); + + orderItemMapper.deletePackList(orderId, packIds, getUserOrganId()); + + orderPrepackagedMapper.deletePacked(orderId,getUserOrganId()); + + List orderPackageDOS = orderPackageMapper.selectPackStatusList(orderId, getUserOrganId()); + + if(orderPackageDOS.isEmpty()){ + + OrderDO orderDO = orderMapper.selectById(orderId); + + orderDO.setPackaged(OrderPackageStatusEnum.UNPACKED.getStatus()); + + orderMapper.updateById(orderDO); + + } + + // 删除大板 - List goodsIdList = plateMapper.selectPlateNum(orderId, getUserOrganId()); - Map> goodsIdMap = goodsIdList.stream() - .collect(Collectors.groupingBy(PlateDO::getGoodsId)); + List goodsList = plateMapper.selectPlateDeletedStatus(orderId, goodsIds, getUserOrganId()); - List goodsIdDeleted = new ArrayList<>(); + List goodsIdList = goodsList.stream().map(PlateDO::getGoodsId).distinct().toList(); - goodsIdMap.forEach((goodsId, plates) -> { - if (plates.isEmpty()) { - goodsIdDeleted.add(goodsId); - return; - } - boolean allDeleted = true; - for (PlateDO plateDO : plates) { - if (status == 1) { - if (!plateDO.getDeleted()) { - allDeleted = false; - break; - } - } else { - if (plateDO.getDeleted()) { - break; - } - } - } - if (allDeleted) { - goodsIdDeleted.add(goodsId); - } - }); + List goodsIdDeleted = Stream.concat( + goodsIds.stream().filter(str -> !goodsIdList.contains(str)), + goodsIdList.stream().filter(str -> !goodsIds.contains(str))) + .toList(); if (goodsIdDeleted.size() > 0) { @@ -301,18 +321,20 @@ public class OrderServiceImpl implements OrderService { } - if(planIds != null) { + + if(!planIds.isEmpty()) { // 判断删除的柜体对应的板材是否和排单板材一样 List goodsDOS = goodsMapper.selectPlanGoodsListByPlanIdList(planIds, getUserOrganId()); // 一样,同时删除排单的信息 - if(goodsDOS.isEmpty()){ + if(goodsDOS.isEmpty() && status.equals(1)){ planService.deletePlan(planIds); - }else { - // 只要有排单,不管删除的柜体的板材数和排单数一样,都要删除排单对应的优化数据(不用这种写法进行删除时,有时会报错,原因目前还没找到) - planService.deleteByPlanId(planIds, ORDER_REMAIN_PLATE_MODEL); } + // 只要有排单,不管删除的柜体的板材数和排单数一样,都要删除排单对应的优化数据(不用这种写法进行删除时,有时会报错,原因目前还没找到) + planService.deleteByPlanId(planIds, ORDER_REMAIN_PLATE_MODEL); + + } List partsList = orderPartsMapper.selectPartsIdListByBodyId(bodyIds, getUserOrganId(), orderId); // 配件 @@ -331,6 +353,123 @@ public class OrderServiceImpl implements OrderService { } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateRestoreBody(Long orderId, Set roomIds, Long bodyId, Integer status) { // 要删除传1,还原传0 + + // 校验存在 + OrderDO orderDO = orderMapper.selectOrderOne(orderId, getUserOrganId()); + if (orderDO == null) + throw exception(ORDER_NOT_EXISTS); + + List bodyIds = new ArrayList<>(); + Integer index = status == 1 ? 0 : 1; + + if (roomIds != null && roomIds.size() != 0) { + bodyIds = orderBodyMapper.selectBodyIdByRoomId(orderId, roomIds, getUserOrganId(), index); + } else if (bodyId != null && bodyId != 0) { + validateOrderBodyExists(orderId, bodyId, getUserOrganId(), index); + bodyIds.add(bodyId); + } + + + if (bodyIds.size() != 0){ + + List plateDOList = plateMapper.selectPlateTypeByRoomId(orderId, bodyIds, getUserOrganId(), index); + List plateIds = plateDOList.stream().map(PlateDO::getId).toList(); + + List goodsIds = plateDOList.stream().map(PlateDO::getGoodsId).distinct().toList(); + + orderBodyMapper.updateDeletedById(bodyIds, status, getUserOrganId(), orderId);// 柜体 + orderGroupMapper.updateDeletedById(bodyIds, status, getUserOrganId(), orderId);// 加工组 + + // 小板还原 + if (!plateDOList.isEmpty()) { + plateMapper.updateDeletedById(plateIds, status, getUserOrganId(), orderId); + } + + // 还原大板 + List goodsDOS = goodsMapper.selectGoodsListByStatus(orderId, goodsIds, getUserOrganId()); + if(!goodsDOS.isEmpty()){ + goodsMapper.updateBatch(goodsDOS.stream().map(m -> m.setDeleted(false)).toList()); + } + + + // 当大板对应的小板已经排单时,新建相同类型的大板,并将其他未排单的小板对应的大板ID修改为新的大板ID + List goodsDOList = goodsMapper.selectNoPlanGoodsList(orderId, goodsIds, getUserOrganId()); + + List goodsList = BeanUtils.toBean(goodsDOList, GoodsDO.class); + + if(!goodsDOList.isEmpty()){ + + // 新增的大板信息 + List list = goodsDOList.stream() + .peek(m -> { + m.setId(null); + m.setPlanId(0L); + m.setCreateTime(LocalDateTime.now()); + m.setUpdateTime(LocalDateTime.now()); + }) + .toList(); + + goodsMapper.insertBatch(list); + + // 构建新的数据集,保存新的大板ID和旧的大板ID,大板的实际ID关联这两个信息 + List orderGoodsIds = BeanUtils.toBean(list, OrderGoodsIds.class); + + List orderGoodsIdsList = new ArrayList<>(); + + for (GoodsDO goodsDO : goodsList) { + orderGoodsIdsList.addAll(orderGoodsIds.stream() + .filter(f -> f.getGoodsId().equals(goodsDO.getGoodsId())) +// .filter(a -> a.getOldId() == null) + .map(m -> m.setOldId(goodsDO.getId())).toList()); + + } + + // 需要修改的小板为未排单的部分,无论其是否删除,都需要修改,但只需修改大板ID即可,其他信息无需修改 + List plateDOS = plateMapper.selectNoPlanPlate(orderId, goodsIds, getUserOrganId()); + + List plateList = new ArrayList<>(); + + for (OrderGoodsIds ids : orderGoodsIdsList) { + + plateList.addAll(plateDOS.stream() + .filter(f->f.getGoodsId().equals(ids.getOldId())) + .peek(m->{ + m.setGoodsId(ids.getId()); + }) + .toList()); + } + + plateMapper.updateBatch(plateList); + + } + + + List partsList = orderPartsMapper.selectPartsIdListByBodyId(bodyIds, getUserOrganId(), orderId); // 配件 + if (partsList != null && partsList.size() != 0){ + orderPartsMapper.updateDeletedById(partsList, status, getUserOrganId()); + } + + } + + // 生产单柜体数量判断 + if (orderBodyMapper.selectCountByOrderId(orderId, getUserOrganId(), OrderDeletedEnum.NOT_DELETED.getStatus()) == 0) { + orderMapper.updateOrderStatus(orderId, OrderStatusEnum.EMPTY.getStatus(), getUserOrganId()); + }else { + orderMapper.updateOrderStatus(orderId, OrderStatusEnum.NEW_ORDER.getStatus(), getUserOrganId()); + } + + + } + + + + + + @Override @Transactional(rollbackFor = Exception.class) public Long importApiData(Map> listMap) { @@ -848,7 +987,7 @@ public class OrderServiceImpl implements OrderService { // 判断小板是否已开料,已开料不允许删除 List planIds = goodsMapper.selectPlanOrderList(orderId, roomIds, bodyId, organId); - if(!planIds.isEmpty()) { + if(!planIds.isEmpty() && status.equals(1)) { List planDOS = planMapper.selectPlanStatus(planIds, organId); @@ -856,11 +995,9 @@ public class OrderServiceImpl implements OrderService { // planService.deleteByPlanId(planIds, ORDER_REMAIN_PLATE_MODEL); - return planIds; - - } - return null; + + return planIds; } } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java index 227dca556..ad3c44871 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java @@ -16,6 +16,7 @@ import com.cf.imes.framework.common.enums.PlanFilterTypeEnum; import com.cf.imes.framework.common.enums.PlanStatusEnum; import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.common.util.Assert.AssertUtils; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.mybatis.core.query.MPJLambdaWrapperX; @@ -57,6 +58,7 @@ import java.io.IOException; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.ES_ERROR_DELETE; import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR; @@ -64,7 +66,7 @@ import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.e import static com.cf.imes.framework.common.util.string.SearchUtil.insertSeparator; import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.*; -import static com.cf.imes.module.system.enums.ErrorCodeConstants.NO_PRODUCTION_ORDER_INFORMATION_AVAILABLE; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.*; /** * 生产单开料排单 Service 实现类 @@ -124,6 +126,8 @@ public class PlanServiceImpl implements PlanService { // todo 目前只考虑了非混单的情况,混单的情况待考虑 List itemList = createReqVO.getItemList(); + AssertUtils.notEmpty(itemList,INSERT_PLATE_DATE_ERROR); + ArrayList planDOS = new ArrayList<>(); List goodsDOS = new ArrayList<>(); @@ -187,7 +191,7 @@ public class PlanServiceImpl implements PlanService { public void updatePlan(PlanSaveReqVO updateReqVO) { // 校验排单是否存在,是否开料 - validatePlanExists(updateReqVO.getId(),updateReqVO.getMachineId()); + validatePlanExists(updateReqVO.getId()); // 更新 PlanDO plan = BeanUtils.toBean(updateReqVO, PlanDO.class); @@ -374,7 +378,11 @@ public class PlanServiceImpl implements PlanService { optimizeBoardModelDOS.forEach(f -> orderIdList.addAll(f.getOrderId())); // 已经删除的排单的生产单号和新查找的生生产单号对比,找出不同的部分 - diff = orderIds.stream().filter(f -> !orderIdList.contains(f)).toList(); +// diff = orderIds.stream().filter(f -> !orderIdList.contains(f)).toList(); + diff = Stream.concat( + orderIds.stream().filter(str -> !orderIdList.contains(str)), + orderIdList.stream().filter(str -> !orderIds.contains(str))) + .toList(); } if(!diff.isEmpty()){ @@ -391,42 +399,14 @@ public class PlanServiceImpl implements PlanService { - private void validatePlanExists(Long id, Long machineId) { - PlanDO planDO = planMapper.selectById(id); - if ( planDO== null) { - throw exception(PLAN_NOT_EXISTS); - } - if(planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){ - throw exception(LIST_CHANGES_ARE_PROHIBITED); - } - } - - private void validatePlan(List ids) { - - List planDOS = planMapper.selectBatchIds(ids); - - for (PlanDO planDO : planDOS) { - if ( planDO== null) { - throw exception(PLAN_NOT_EXISTS); - } - - if ( planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus()) ) { - throw exception(PLAN_NOT_ALLOW_DELETE,planDO.getId()); - } - - } - - } @Override public PlanRespVO getPlan(Long id) { PlanDO planDO = planMapper.selectById(id); - if ( planDO== null) { - throw exception(PLAN_NOT_EXISTS); - } + AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS); return BeanUtils.toBean(planDO, PlanRespVO.class); @@ -445,6 +425,7 @@ public class PlanServiceImpl implements PlanService { PlanDO planDO = planMapper.selectById(pageReqVO.getId()); + AssertUtils.notEmpty(planDO,ORDER_PLAN_DATE_ERROR); List plan = pageReqVO.getIsUp() ? planMapper.selectPlanIds(planDO.getCreateTime().toString(),planDO.getSort(), getUserOrganId(), planDO.getId()) : @@ -519,8 +500,6 @@ public class PlanServiceImpl implements PlanService { // 根据排单ID查询ES中的优化数据 todo 目前只解决无混单的情况,混单情况待解决 List optimizeBoardModelDOS = buildBoardByPlanIds(planIds, ORDER_REMAIN_PLATE_MODEL, infoVOList.size()); -// for (OptimizeBoardModelDO optimizeBoardModelDO : optimizeBoardModelDOS) { -// } // 获取排单对应的生产单的信息 List planOrderRespVOS = planItemMapper.selectOrderList(planIds, getUserOrganId()); @@ -549,7 +528,7 @@ public class PlanServiceImpl implements PlanService { e.setOptimizeGoodsCount(optimizeBoardModelDOS.stream() .filter(f -> Objects.equals(f.getPlanId(), e.getId())) // todo 目前兼容修改,新的需求不需要这个校验 - .mapToLong(m -> m.getBoardCount() == null ?0 : m.getBoardCount()) + .mapToLong(m -> m.getBoardCount() == null ? 0 : m.getBoardCount()) .sum()); // 大板开料数 e.setCutGoodsCount(optimizeBoardModelDOS.stream() @@ -652,7 +631,7 @@ public class PlanServiceImpl implements PlanService { .in("order_id",orderIds) .eq("is_optimized",false) .inIfPresent("goods_id",goodsIds) - .inIfPresent("goods_id",pageReqVO.getIds()) + .inIfPresent("id",pageReqVO.getIds()) .eqIfPresent("is_special_shaped", pageReqVO.getRectangle() != null ? false: null) .eqIfPresent("is_special_shaped", pageReqVO.getSpecialShaped()) .eqIfPresent("is_sculpt", pageReqVO.getSculpt()) @@ -817,13 +796,10 @@ public class PlanServiceImpl implements PlanService { // .eq("og.organ_id",getUserOrganId()) // .eq("og.plan_id",0) // .eq("og.deleted",false) - .inIfPresent("og.order_id", pageReqVO.getOrderIds()) .inIfPresent("og.id", pageReqVO.getIds()) - // todo 修改排单数据筛选,目前只解决了非混单的情况,混单情况待解决 .eqIfPresent("og.goods_id",pageReqVO.getGoodsId()) - .likeIfPresent("o.id", pageReqVO.getOrderId() != null ? pageReqVO.getOrderId().toString() : null) .likeIfPresent("o.customer", pageReqVO.getConsignee()) .likeIfPresent("o.custom_order_no", pageReqVO.getDefaultId()) @@ -935,7 +911,7 @@ public class PlanServiceImpl implements PlanService { return null; } for (Long planId : vo.getPlanIds()) { - validatePlanExists(planId,null); + validatePlan(planId); } QueryWrapperX queryWrapperX = new QueryWrapperX<>(); @@ -967,6 +943,10 @@ public class PlanServiceImpl implements PlanService { IPage pageResult = goodsMapper.selectPlanGoodsListByPlanId(page, queryWrapperX); + if (CollectionUtil.isEmpty(pageResult.getRecords())) { + return new PageResult<>(); + } + Set bodyIds = pageResult.getRecords().stream().map(PlateResList::getBodyId).collect(Collectors.toSet()); if (CollectionUtil.isNotEmpty(bodyIds)) { @@ -981,6 +961,9 @@ public class PlanServiceImpl implements PlanService { @Override public PageResult getOrderByPlanId(PlanOrderPageReqVO pageReqVO) { + + validatePlan(pageReqVO.getPlanId()); + MPJLambdaWrapperX lambdaWrapperX = new MPJLambdaWrapperX<>(); lambdaWrapperX.leftJoin(GoodsDO.class, GoodsDO::getOrderId, OrderDO::getId) .eq(GoodsDO::getOrganId,getUserOrganId()) @@ -988,8 +971,12 @@ public class PlanServiceImpl implements PlanService { .eq(GoodsDO::getPlanId, pageReqVO.getPlanId()) .distinct(); - PageResult pageResult = orderMapper.selectJoinPage(pageReqVO, OrderDO.class, lambdaWrapperX); + + if (CollectionUtil.isEmpty(pageResult.getList())) { + return new PageResult<>(); + } + return BeanUtils.toBean(pageResult, OrderRespVO.class); } @@ -1028,18 +1015,30 @@ public class PlanServiceImpl implements PlanService { @Override public List getPlateList(List planIds) { + for (Long planId : planIds) { + validatePlan(planId); + } List plateResLists = goodsMapper.selectPlateListByPlanId(planIds, getUserOrganId()); - Set bodyIds = plateResLists.stream().map(PlateResList::getBodyId).collect(Collectors.toSet()); - if (CollectionUtil.isNotEmpty(bodyIds)) { - List orderBodyDOS = orderBodyMapper.selectBatchIds(bodyIds); - for (PlateResList resList :plateResLists) { - resList.setBodyName(orderBodyDOS.stream().filter(e -> Objects.equals(e.getId(), resList.getBodyId())).map(OrderBodyDO::getName).findAny().orElse(null)); - resList.setRoomName(orderBodyDOS.stream().filter(e -> Objects.equals(e.getRoomId(), resList.getRoomId())).map(OrderBodyDO::getRoomName).findAny().orElse(null)); - } + if(plateResLists.isEmpty()){ + return null; } + Set bodyIds = plateResLists.stream().map(PlateResList::getBodyId).collect(Collectors.toSet()); + + List orderBodyDOS = orderBodyMapper.selectBatchIds(bodyIds); + + if(orderBodyDOS.isEmpty()){ + return plateResLists; + } + + for (PlateResList resList :plateResLists) { + resList.setBodyName(orderBodyDOS.stream().filter(e -> Objects.equals(e.getId(), resList.getBodyId())).map(OrderBodyDO::getName).findAny().orElse(null)); + resList.setRoomName(orderBodyDOS.stream().filter(e -> Objects.equals(e.getRoomId(), resList.getRoomId())).map(OrderBodyDO::getRoomName).findAny().orElse(null)); + } + + return plateResLists; } @@ -1113,4 +1112,46 @@ public class PlanServiceImpl implements PlanService { } } + + private void validatePlan(Long id) { + + PlanDO planDO = planMapper.selectById(id); + + AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS); + } + + + + + private void validatePlanExists(Long id) { + PlanDO planDO = planMapper.selectById(id); +// if ( planDO== null) { +// throw exception(PLAN_NOT_EXISTS); +// } + + AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS); + + if(planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){ + throw exception(LIST_CHANGES_ARE_PROHIBITED); + } + } + + + private void validatePlan(List ids) { + + List planDOS = planMapper.selectBatchIds(ids); + + for (PlanDO planDO : planDOS) { + + AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS); + + if ( planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus()) ) { + throw exception(PLAN_NOT_ALLOW_DELETE,planDO.getId()); + } + + } + + } + + } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml index 96a6d2156..73c00cb3a 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml @@ -17,8 +17,8 @@ og.*, orp.id as remainId from order_goods og - left join order_remain_plate orp on og.id = orp.goods_id and og.organ_id = orp.organ_id - where og.order_id = #{orderId} and og.organ_id = #{organId} and og.deleted = false + left join order_remain_plate orp on og.organ_id = orp.organ_id and og.id = orp.goods_id + where og.organ_id = #{organId} and og.deleted = false and og.order_id = #{orderId} @@ -31,8 +31,8 @@ og.*, orp.id as remainId from order_goods og - left join order_remain_plate orp on og.id = orp.goods_id and og.organ_id = orp.organ_id - where og.organ_id =#{organId} and og.deleted = false and og.plan_id = #{planId} + left join order_remain_plate orp on og.organ_id = orp.organ_id and og.id = orp.goods_id + where og.organ_id = #{organId} and og.deleted = false and og.plan_id = #{planId} @@ -59,16 +59,12 @@ - select ${filed} from order_goods where organ_id = #{organId} and deleted = false - and goods_id in - - - #{goodsIds} - + and plan_id = #{planId} @@ -177,12 +173,12 @@ left join order_plate op on og.organ_id = op.organ_id and og.order_id = op.order_id and og.id = op.goods_id and og.deleted = op.deleted where og.organ_id = #{organId} - + and og.deleted = false and og.plan_id in #{ids} - +-- and op.is_optimized = true @@ -396,7 +392,7 @@ og.organ_id = #{organId} and og.deleted = false and og.order_id = #{orderId} - + and og.plan_id != 0 and oi.body_id = #{bodyId} @@ -412,4 +408,72 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml index b78cee4cf..737fda190 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml @@ -194,7 +194,7 @@ - select ${filed} from orders diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderBody/OrderBodyMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderBody/OrderBodyMapper.xml index a409533a4..2d4be93c8 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderBody/OrderBodyMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderBody/OrderBodyMapper.xml @@ -58,7 +58,7 @@ - select distinct ${filed} from order_body diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderGroup/OrderGroupMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderGroup/OrderGroupMapper.xml index 94a7b211b..115b9c448 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderGroup/OrderGroupMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderGroup/OrderGroupMapper.xml @@ -13,17 +13,18 @@ - select ${filed} from order_group - where id in - - #{groupIds} - - and organ_id = #{organId} + where + organ_id = #{organId} and deleted = false - ${field2} + and id in + + #{groupIds} + + ${field2} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml index 37c1f5ad3..5e7e0037f 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml @@ -169,45 +169,21 @@ + - + UPDATE order_item - - - - + SET package_id = 0 - - - - - - - + - - - select distinct op.id as plateId, - op.order_id as orderId, - o.id as packId, - o.package_no as packNo - from order_plate op - left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.plate_id - left join order_package o on oi.organ_id = o.organ_id and oi.order_id = o.order_id and oi.package_id = o.id - - where op.organ_id = #{organId} - and op.deleted = false - and op.order_id = #{orderId} - and oi.parts_id = 0 - and oi.package_id !=0 - - - - - \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml index faf6a1d0a..f1497a40c 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml @@ -132,7 +132,7 @@ - select distinct ${filed} from order_parts where diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/pack/OrderPackageMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/pack/OrderPackageMapper.xml new file mode 100644 index 000000000..795ca3b16 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/pack/OrderPackageMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + UPDATE order_package + + SET deleted = true + + WHERE organ_id = #{organId} + and order_id = #{orderId} + and id in + + #{packIds} + + + + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml index 3bd3e1de8..1caa4916e 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml @@ -168,10 +168,10 @@ group by date; - - select ${filed} from order_plan where id = #{planId} and organ_id = #{organId} and deleted = false + select ${filed} from order_plan where organ_id = #{organId} and deleted = false and id = #{planId} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml index 3c43384c9..b55b697af 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml @@ -665,18 +665,20 @@ - + + SELECT distinct p.* + FROM order_plate p LEFT JOIN order_item i ON p.id = i.plate_id - WHERE i.organ_id = #{organId} AND i.order_id = #{orderId} AND p.deleted = #{deleted} - - AND i.body_id IN - - #{roomIdItem} - - - + WHERE i.organ_id = #{organId} AND i.order_id = #{orderId} AND p.deleted = #{deleted} + + AND i.body_id IN + + #{roomIdItem} + + + + @@ -892,6 +896,7 @@ + update order_plate @@ -937,4 +942,79 @@ + + + + + + + + + + + + + + + + + + + + + update order_plate + + set is_optimized = true + + where organ_id = #{organId} + and deleted = false + and order_id = #{orderId} + and id in + + #{plateDOList} + + + + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/remainplaten/RemainPlateMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/remainplaten/RemainPlateMapper.xml index 16f5967c0..968d56ad6 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/remainplaten/RemainPlateMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/remainplaten/RemainPlateMapper.xml @@ -3,10 +3,10 @@ - - select ${filed} from order_remain_plate where organ_id = #{organId} and plan_id = #{planId} and deleted = false + select ${filed} from order_remain_plate where organ_id = #{organId} and deleted = false and plan_id = #{planId} diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/pack/vo/PackRespVO.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/pack/vo/PackRespVO.java index 18beabbc5..df566783d 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/pack/vo/PackRespVO.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/pack/vo/PackRespVO.java @@ -3,6 +3,7 @@ package com.cf.imes.module.manage.controller.admin.pack.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import lombok.Setter; import java.time.LocalDateTime; import java.util.List; @@ -10,6 +11,7 @@ import java.util.List; @Schema(description = "管理后台 - 生产单表 order_{N} Response VO") @Data +@Setter public class PackRespVO { @@ -86,8 +88,11 @@ public class PackRespVO { private Long pendingNum; - @Schema(description = "生产单对应的板材ID") - private List plateId; + @Schema(description = "生产单对应的板材ID集") + private List plateIdList; + + @Schema(description = "生产单对应的包裹ID集") + private List packIdList; // @Schema(description = "生产单对应的板件信息", requiredMode = Schema.RequiredMode.REQUIRED) // List plateDetailsRespVO; diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/pack/OrderPackageMapper.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/pack/OrderPackageMapper.java index 5aa4081b6..ba45e6d7d 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/pack/OrderPackageMapper.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/pack/OrderPackageMapper.java @@ -51,10 +51,11 @@ public interface OrderPackageMapper extends BaseMapperX { - default OrderPackageDO selectByPackId(Long packId,Long organId) { + default OrderPackageDO selectByPackId(Long packId,Long orderId,Long organId) { return selectOne(new LambdaQueryWrapperX() .eq(OrderPackageDO::getOrganId, organId) .eq(OrderPackageDO::getDeleted,false) + .eqIfPresent(OrderPackageDO::getOrderId,orderId) .eqIfPresent(OrderPackageDO::getId, packId)); } @@ -99,4 +100,13 @@ public interface OrderPackageMapper extends BaseMapperX { List selectPackListByOrderId(@Param("orderId") Long orderId,@Param("organId") Long organId); + + default List selectPackStatusList(Long orderId,Long organId) { + return selectList(new LambdaQueryWrapperX() + .eq(OrderPackageDO::getOrganId,organId) + .eq(OrderPackageDO::getDeleted,false) + .eq(OrderPackageDO::getStatus,OrderPackageStatusEnum.PACKAGED.getStatus()) + .eqIfPresent(OrderPackageDO::getOrderId, orderId)); + } + } diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/pack/OrderPrepackagedMapper.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/pack/OrderPrepackagedMapper.java index 806c888f3..c945a2c3c 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/pack/OrderPrepackagedMapper.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/pack/OrderPrepackagedMapper.java @@ -27,4 +27,11 @@ public interface OrderPrepackagedMapper extends BaseMapperX .eqIfPresent(OrderPrepackagedDO::getOrderId, orderId)); } + + default int deletePacked(Long orderId, Long organId) { + return delete(new LambdaQueryWrapperX() + .eq(OrderPrepackagedDO::getOrganId, organId) + .eqIfPresent(OrderPrepackagedDO::getOrderId, orderId)); + } + } diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/plate/OrderPlateMapper.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/plate/OrderPlateMapper.java index c8e47bfb1..42c7c1a36 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/plate/OrderPlateMapper.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/plate/OrderPlateMapper.java @@ -45,6 +45,7 @@ public interface OrderPlateMapper extends BaseMapperX { default List selectplateByPlateNo(Long plateNo, Long orderId, Long organId) { return selectList(new LambdaQueryWrapperX() .eq(OrderPlateDO::getOrganId, organId) + .eq(OrderPlateDO::getDeleted,false) .eq(OrderPlateDO::getOrderId, orderId) .likeIfPresent(OrderPlateDO::getPlateNo, plateNo.toString()) .select(OrderPlateDO::getId)); diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/query/OrderItemMapper.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/query/OrderItemMapper.java index ba7156913..0d6ddea53 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/query/OrderItemMapper.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/query/OrderItemMapper.java @@ -91,9 +91,10 @@ public interface OrderItemMapper extends BaseMapperX { } - default List selectPackByPlateId(List plateId, Long organId) { + default List selectPackByPlateId(List plateId,Long orderId ,Long organId) { return selectList(new LambdaQueryWrapperX() .eq(OrderItemDO::getOrganId, organId) + .eqIfPresent(OrderItemDO::getOrderId,orderId) .inIfPresent(OrderItemDO::getPlateId, plateId) .select(OrderItemDO::getPackageId)); } diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/pack/PackServiceImpl.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/pack/PackServiceImpl.java index 77f220215..32f2c7d3b 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/pack/PackServiceImpl.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/pack/PackServiceImpl.java @@ -136,6 +136,10 @@ public class PackServiceImpl implements PackService { // 查询查询分页 packRespVOS = ordersMapper.selectOrderIdList(page, pageReqVO, getUserOrganId()); + if (CollectionUtil.isEmpty(packRespVOS.getRecords())) { + return new PageResult<>(); + } + orderIds.addAll(packRespVOS.getRecords().stream().map(PackRespVO::getId).toList()); if (orderIds.isEmpty()) { @@ -150,8 +154,8 @@ public class PackServiceImpl implements PackService { AssertUtils.notEmpty(packRespVOList, ErrorCodeConstants.ORDER_PLATE_ERROR); for (PackRespVO packRespVO : packRespVOList) { - packRespVO.setTotalPieceCount((long) packRespVO.getPlateId().size()); - packRespVO.setPlateId(null); + packRespVO.setTotalPieceCount((long) packRespVO.getPlateIdList().size()); + packRespVO.setPlateIdList(null); } @@ -159,15 +163,21 @@ public class PackServiceImpl implements PackService { List respVOS = orderPackageMapper.selectPackPage(orderIds, getUserOrganId()); + for (PackRespVO packRespVO : respVOS) { + packRespVO.setPackCount((long) packRespVO.getPackIdList().size()); + packRespVO.setPackIdList(null); + } + + // 查询当前生产单已经打包的板材数量 List plateNum = orderPackageMapper.selectPackPieceCount(orderIds, getUserOrganId()); - for (PackRespVO packRespVO : plateNum) { - packRespVO.setPackPieceCount((long) packRespVO.getPlateId().size()); - packRespVO.setPlateId(null); + packRespVO.setPackPieceCount((long) packRespVO.getPlateIdList().size()); + packRespVO.setPlateIdList(null); } + for (PackRespVO record : packRespVOS.getRecords()) { // 板材总数 @@ -181,9 +191,6 @@ public class PackServiceImpl implements PackService { } - if (CollectionUtil.isEmpty(packRespVOS.getRecords())) { - return new PageResult<>(); - } return new PageResult<>(packRespVOS.getRecords(), packRespVOS.getTotal()); @@ -270,6 +277,10 @@ public class PackServiceImpl implements PackService { List orderPackageVOS = orderPackageMapper.selectPackListByOrderId(reqVO.getOrderId(), getUserOrganId()); + if(orderPackageVOS.isEmpty()){ + return new ArrayList<>(); + } + OrderDO orderDO = ordersMapper.selectById(reqVO.getOrderId()); // AssertUtils.notEmpty(orderPackageVOS,orderDO,ORDER_PLATE_ERROR); @@ -297,7 +308,6 @@ public class PackServiceImpl implements PackService { if (reqVO.getPlateNo() != null) { - List plateId = orderPlateMapper.selectplateByPlateNo(reqVO.getPlateNo(), reqVO.getOrderId(), getUserOrganId()) .stream().map(OrderPlateDO::getId).toList(); @@ -305,7 +315,7 @@ public class PackServiceImpl implements PackService { return null; } - packId = orderItemMapper.selectPackByPlateId(plateId, getUserOrganId()).stream().map(OrderItemDO::getPackageId).distinct().toList(); + packId = orderItemMapper.selectPackByPlateId(plateId,reqVO.getOrderId() ,getUserOrganId()).stream().map(OrderItemDO::getPackageId).distinct().toList(); } @@ -314,8 +324,8 @@ public class PackServiceImpl implements PackService { queryWrapperX .eq("o.organ_id", getUserOrganId()) .eq("o.deleted", false) - .eq("op.deleted", false) .eq("o.id", reqVO.getOrderId()) + .eq("op.deleted", false) .likeIfPresent("op.package_no", reqVO.getPackageNo()) .inIfPresent("op.id", packId) .eqIfPresent("op.status", reqVO.getPackStatus()) @@ -391,10 +401,10 @@ public class PackServiceImpl implements PackService { } - OrderPackageDO orderPackageDO = orderPackageMapper.selectByPackId(reqVO.getPackId(), getUserOrganId()); + OrderPackageDO orderPackageDO = orderPackageMapper.selectByPackId(reqVO.getPackId(),reqVO.getOrderId(), getUserOrganId()); List orderItemDOS = orderItemMapper.selectPackList(reqVO.getPackId(), reqVO.getOrderId(), getUserOrganId()); - List partsList = orderItemDOS.stream().map(OrderItemDO::getPartsId).toList(); + List partsList = orderItemDOS.stream().map(OrderItemDO::getPartsId).distinct().toList(); // 如果此时删除的包裹配件数量等于查询出来的配件数量,且新增的板材数量不为0,更改包裹的类型 @@ -447,6 +457,9 @@ public class PackServiceImpl implements PackService { public OrderPackRespVO unpacking(Long packageID) { OrderPackageDO packageDO = orderPackageMapper.selectById(packageID); + + AssertUtils.notEmpty(packageDO,ORDER_PACK_DATA_ERROR ); + packageDO.setStatus(OrderPackageStatusEnum.UNPACKED.getStatus()); orderPackageMapper.updateById(packageDO); return typeConversion(packageDO); @@ -484,9 +497,9 @@ public class PackServiceImpl implements PackService { } - OrderPackageDO orderPackageDO = orderPackageMapper.selectByPackId(packageVO.getPackId(), getUserOrganId()); + OrderPackageDO orderPackageDO = orderPackageMapper.selectByPackId(packageVO.getPackId(),packageVO.getOrderId(), getUserOrganId()); List orderItemDOS = orderItemMapper.selectPackList(packageVO.getPackId(), packageVO.getOrderId(), getUserOrganId()); - List plateList = orderItemDOS.stream().map(OrderItemDO::getPlateId).toList(); + List plateList = orderItemDOS.stream().map(OrderItemDO::getPlateId).distinct().toList(); // 如果此时删除的包裹板材数量等于查询出来的板材数量,且新增的配件数量不为0,更改包裹的类型 @@ -560,11 +573,8 @@ public class PackServiceImpl implements PackService { OrderDO orderDO = ordersMapper.selectById(orderId); -// if(orderDO.getFinishTime() != null){ -// return; -// } - // 修改生产单的打包状态未已打包 + // 修改生产单的打包状态为已打包 orderDO.setPackaged(OrderPackageStatusEnum.PACKAGED.getStatus()); ordersMapper.updateById(orderDO); @@ -579,7 +589,7 @@ public class PackServiceImpl implements PackService { List orderPackageDOS = orderPackageMapper.selectPackStatus(orderId, getUserOrganId()); - return orderPackageDOS.stream().map(m -> typeConversion(m)).collect(Collectors.toList()); + return orderPackageDOS.stream().map(this::typeConversion).collect(Collectors.toList()); } @@ -608,20 +618,52 @@ public class PackServiceImpl implements PackService { .stream().map(OrderItemDO::getPartsId) .distinct() .toList(); + if(partsIds.isEmpty()){ + return; + } orderPartsMapper.deleteOrderParts(partsIds, reqVO.getOrderId(), getUserOrganId()); orderPackageMapper.updateParts(reqVO.getPackageId(), reqVO.getOrderId(), getUserOrganId()); - orderItemMapper.deleteParts(reqVO.getPackageId(), reqVO.getOrderId(), partsIds, getUserOrganId()); + + List orderPackageDOS = orderPackageMapper.selectPackStatusList(reqVO.getOrderId(), getUserOrganId()); + + if(orderPackageDOS.isEmpty()){ + + OrderDO orderDO = ordersMapper.selectById(reqVO.getOrderId()); + + orderDO.setPackaged(OrderPackageStatusEnum.UNPACKED.getStatus()); + + ordersMapper.updateById(orderDO); + + } + return; } + + orderPackageMapper.updateParts(reqVO.getPackageId(), reqVO.getOrderId(), getUserOrganId()); orderItemMapper.deleteOrderPack(reqVO.getPackageId(), reqVO.getOrderId(), getUserOrganId()); + orderPrepackagedMapper.deletePacked(reqVO.getOrderId(),getUserOrganId()); + + + List orderPackageDOS = orderPackageMapper.selectPackStatusList(reqVO.getOrderId(), getUserOrganId()); + + if(orderPackageDOS.isEmpty()){ + + OrderDO orderDO = ordersMapper.selectById(reqVO.getOrderId()); + + orderDO.setPackaged(OrderPackageStatusEnum.UNPACKED.getStatus()); + + ordersMapper.updateById(orderDO); + + } + } @@ -660,7 +702,6 @@ public class PackServiceImpl implements PackService { orderItemMapper.insert(orderItemDO); // 查看新增的包裹信息 - /* return orderPackageMapper.selectByPackId(orderPackageDO.getId());*/ return typeConversion(orderPackageDO); @@ -684,7 +725,7 @@ public class PackServiceImpl implements PackService { orderParts.setType("外部配件"); orderPartsMapper.insert(orderParts); - // 在生产单明细表中添加数据(生产单号,配件ID,包裹ID,部件数量(目前一直为1)) + // 在生产单明细表中添加数据(生产单号,配件ID,包裹ID,部件数量) OrderItemDO orderItemDO = new OrderItemDO(); orderItemDO.setOrderId(reqVO.getOrderId()); orderItemDO.setPartsId(orderParts.getId()); diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/query/ProductionStatusServiceImpl.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/query/ProductionStatusServiceImpl.java index f1f6a6aaa..750b68bbc 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/query/ProductionStatusServiceImpl.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/query/ProductionStatusServiceImpl.java @@ -219,8 +219,6 @@ public class ProductionStatusServiceImpl implements ProductionStatusService { plateDetailsRespVO.setProcessGroup(name); } -// Page packageDetailsRespVOPage = page.setRecords(packageDetailsRespVOS); - return new PageResult<>(packageDetailsRespVOS.getRecords(), packageDetailsRespVOS.getTotal()); diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/pack/OrderPackageMapper.xml b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/pack/OrderPackageMapper.xml index 101529d03..612528ec4 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/pack/OrderPackageMapper.xml +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/pack/OrderPackageMapper.xml @@ -5,10 +5,12 @@ - - + + - + + + @@ -19,7 +21,7 @@ select order_id as orderId, - count(id) as packCount + id as packId from order_package @@ -35,8 +37,6 @@ #{id} - group by order_id - @@ -50,7 +50,7 @@ oi.plate_id as plateId from order_package op - left join order_item oi on op.organ_id = oi.organ_id and op.id = oi.package_id + left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.package_id where diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/plate/OrderPlateMapper.xml b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/plate/OrderPlateMapper.xml index 858b45ead..f4a983ea2 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/plate/OrderPlateMapper.xml +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/plate/OrderPlateMapper.xml @@ -178,7 +178,7 @@ - + diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/process/OrdersMapper.xml b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/process/OrdersMapper.xml index fafb23ab3..e2367ba45 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/process/OrdersMapper.xml +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/process/OrdersMapper.xml @@ -172,7 +172,7 @@ organ_id =#{organId} and deleted = false - and status != 0 + and status in (1,2,3,4) and id like concat('%', #{pageReqVO.orderId},'%') @@ -200,7 +200,7 @@ - order by create_time desc + order by order_date desc diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/query/OrderItemMapper.xml b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/query/OrderItemMapper.xml index 3123e4d65..d64a2cf6f 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/query/OrderItemMapper.xml +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/query/OrderItemMapper.xml @@ -156,7 +156,7 @@ - update order_item oi + update order_item set package_id = #{packId} diff --git a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java index 0a94a4c62..7ea78c920 100644 --- a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java +++ b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java @@ -211,11 +211,12 @@ public interface ErrorCodeConstants { ErrorCode THE_CURRENT_BRAND_OF_THE_MACHINE_EXISTS = new ErrorCode(1_002_029_008, "当前机台配置的模板中,该品牌已存在,请重新输入品牌名称"); ErrorCode THE_MODEL_OF_THE_MACHINE_DOES_NOT_EXIST = new ErrorCode(1_002_029_009, "该型号的机台不存在,请进行配置"); ErrorCode THE_CURRENT_BRAND = new ErrorCode(1_002_029_010, "品牌ID错误,或品牌不存在"); - ErrorCode MACHINE_NUM_ERROR = new ErrorCode(1_002_029_011, "当前模板创建的机台数量已达到最大值,无法继续创建"); + ErrorCode MACHINE_NUM_ERROR = new ErrorCode(1_002_029_011, "当前组织该类型的机台创建已达到最大值,无法继续创建"); ErrorCode MACHINE_NAME_ERROR = new ErrorCode(1_002_029_012, "当前机台名称已存在,请重新输入机台名称"); ErrorCode MACHINETEMPLATE_NAME_ERROR = new ErrorCode(1_002_029_013, "当前机台模板的名称已存在,请重新输入机台模板名称"); ErrorCode LABELINGMACHINE_RELATED_DATA_ERROR = new ErrorCode(1_002_029_014, "当前机台关联的贴标机数据有误,请在高级配置中重新配置贴标机或选择其他模板"); ErrorCode DRILLMACHINE_RELATED_DATA_ERROR = new ErrorCode(1_002_029_015, "当前机台关联的钻孔机数据有误,请在钻孔模块中重新配置钻孔机或选择其他模板"); + ErrorCode MACHINE_DATA_ERROR = new ErrorCode(1_002_029_016, "当前组织还未进行机台授权,请联系组织管理员在基础管理里对当前组织进行机台授权,或联系客服进行授权"); // ========== 标签模板 1-002-300-000 ========== @@ -287,6 +288,16 @@ public interface ErrorCodeConstants { //=========== 断言提示信息 1-002-041-000 ============ ErrorCode ORDER_DATE_ERROR = new ErrorCode(1_002_041_001, "生产单信息不存在,请重新进入或切换生产单"); ErrorCode ORDER_PLATE_ERROR = new ErrorCode(1_002_041_002, "生产单对应的板材数据有异常,请查看板材信息或联系客服"); + ErrorCode INSERT_PLATE_DATE_ERROR = new ErrorCode(1_002_041_003, "新增排单的板材数据有误,请重新新增"); + ErrorCode ORDER_PLAN_DATE_ERROR = new ErrorCode(1_002_041_004, "排单信息不存在,请重新进入或切换排单"); + ErrorCode ORDER_PLAN_OPTIMIZE_ERROR = new ErrorCode(1_002_041_005, "排单的优化数据异常,请将该排单重新优化"); + ErrorCode ORDER_PLATE_MODEL_DATE_ERROR = new ErrorCode(1_002_041_006, "生产单对应的板材造型数据为空,请检查板材信息或者联系客服"); + ErrorCode ORDER_PLAN_PLATE_ERROR = new ErrorCode(1_002_041_007, "当前排单对应的板材数据有异常,请查看板材信息或联系客服"); + ErrorCode ORDER_PLAN_ERROR = new ErrorCode(1_002_041_008, "当前排单对应的生产单数据有异常,请查看生产单信息或联系客服"); + ErrorCode ORDER_PLAN_PLATE_MODEL_DATE_ERROR = new ErrorCode(1_002_041_009, "当前排单对应的板材造型数据为空,请检查板材信息或者联系客服"); + ErrorCode ORDER_GOODS_DATA_ERROR = new ErrorCode(1_002_041_010, "当前大板数据异常,请检查大板信息或者联系客服"); + ErrorCode ORDER_PACK_DATA_ERROR = new ErrorCode(1_002_041_011, "当前包裹数据为空,请重新查看包裹数据或联系客服"); + diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/datasource/DataSourceController.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/datasource/DataSourceController.java index 338b3cd06..6910d4dce 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/datasource/DataSourceController.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/datasource/DataSourceController.java @@ -1,33 +1,29 @@ package com.cf.imes.module.system.controller.admin.datasource; -import com.cf.imes.framework.es.core.valid.CreateGroup; -import org.springframework.web.bind.annotation.*; -import org.springframework.validation.annotation.Validated; -import org.springframework.security.access.prepost.PreAuthorize; -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Operation; - -import java.util.*; -import java.io.IOException; - -import com.cf.imes.framework.common.pojo.PageParam; import com.cf.imes.framework.common.pojo.CommonResult; +import com.cf.imes.framework.common.pojo.PageParam; import com.cf.imes.framework.common.util.object.BeanUtils; -import static com.cf.imes.framework.common.pojo.CommonResult.success; - import com.cf.imes.framework.excel.core.util.ExcelUtils; - import com.cf.imes.framework.operatelog.core.annotations.OperateLog; -import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.*; - import com.cf.imes.module.system.controller.admin.datasource.vo.*; import com.cf.imes.module.system.dal.dataobject.datasource.DataSourceDO; import com.cf.imes.module.system.service.datasource.DataSourceService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.cf.imes.framework.common.pojo.CommonResult.success; +import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; @Tag(name = "管理后台 - 系统数据源") @RestController @@ -90,9 +86,9 @@ public class DataSourceController { } - @PostMapping("/create") - @Operation(summary = "新增数据源字段") - @PreAuthorize("@ss.hasPermission('system:data-source:create')") +// @PostMapping("/create") +// @Operation(summary = "新增数据源字段") +// @PreAuthorize("@ss.hasPermission('system:data-source:create')") public CommonResult createDataSource(@Validated @RequestBody List createReqVO) { dataSourceService.createDataSource(createReqVO); @@ -111,6 +107,36 @@ public class DataSourceController { } + + @GetMapping("/getKeyNameData") + @Operation(summary = "数据源对应字段数据查询") + @Parameters({ + @Parameter(name = "machineId", description = "机台ID", required = true), + @Parameter(name = "planId", description = "排单ID", required = true) + }) + //@PreAuthorize("@ss.hasPermission('system:data-source:query')") + public CommonResult getKeyNameData(@RequestParam("machineId") Long machineId,@RequestParam("planId") Long planId) { + + String keyNameData = dataSourceService.getKeyNameData(machineId,planId); + + return success(keyNameData); + } + + + + @PutMapping("/insertKeyNameData") + @Operation(summary = "保存机台数据源对应的数据源字段") + //@PreAuthorize("@ss.hasPermission('system:data-source:query')") + public CommonResult saveMachineKeyName(@RequestBody List machineDataSourceDOS ) { + + return success(dataSourceService.saveMachineKeyName(machineDataSourceDOS)); + + + } + + + + @GetMapping("/export-excel") @Operation(summary = "导出系统数据源 Excel") @PreAuthorize("@ss.hasPermission('system:data-source:export')") diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/datasource/dataQuery/DataQuery.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/datasource/dataQuery/DataQuery.java new file mode 100644 index 000000000..7a1498b0a --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/datasource/dataQuery/DataQuery.java @@ -0,0 +1,87 @@ +package com.cf.imes.module.system.controller.admin.datasource.dataQuery; + + +import com.cf.imes.module.system.dal.mysql.machine.MachineMapper; +import com.cf.imes.module.system.dal.mysql.organ.OrganMapper; +import com.cf.imes.module.system.dal.mysql.user.AdminUserMapper; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.Resource; +import java.util.List; + +import static com.cf.imes.framework.common.util.json.JsonUtils.toJsonString; +import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; + + + +/** + * @author Administrator + */ +@Configuration +public class DataQuery { + + String SEPARATE = "select"; + + @Resource + private OrganMapper organMapper; + + + @Resource + private AdminUserMapper userMapper; + + @Resource + private MachineMapper machineMapper; + + + + public String dataGetOrgan(String filed) { + +// String sql = "select from system_organization where id = #{id} and deleted = false"; +// +// sql = sql.replace("#{id}", String.valueOf(getUserOrganId())); + + + return toJsonString(organMapper.selectOrganDataSource(conversion(filed),getUserOrganId())); + + } + + + + + + public String dataGetUser(String filed, List nameList) { + + +// String sql = "select from system_users where nickname in (#{nameList}) and deleted = false and organ_id = #{organId}"; +// +// sql = sql.replace("#{organId}", getUserOrganId() + "").replace("#{orderIds}", nameList.toString().replaceAll("\\[|\\]", "")); + + + return toJsonString(userMapper.selectUserDataSource(conversion(filed),getUserOrganId(),nameList)); + + + + } + + + public String dataGetMachine(String filed,Long machineId) { + + + return toJsonString(machineMapper.selectMachineDataSource(conversion(filed),machineId,getUserOrganId())); + + } + + + // 字符串处理 + private String conversion(String filed) { + + // 去除字段中的 【 】 + return filed.replaceAll("\\[|\\]", ""); + + // 使用正则表达式在单词后插入字符串 +// return sql.replaceAll(SEPARATE + "(\\b)", SEPARATE + " " + toInsert); + + } + + +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/datasource/vo/DataSource.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/datasource/vo/DataSource.java new file mode 100644 index 000000000..d125934e2 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/datasource/vo/DataSource.java @@ -0,0 +1,26 @@ +package com.cf.imes.module.system.controller.admin.datasource.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Schema(description = "数据源字段信息") +public class DataSource { + + @Schema(description = "父级ID") + private Integer parentSourceId; + + @Schema(description = "数据源ID") + private Long sourceId; + + @Schema(description = "数据源字段名称") + private String keyName; + +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/datasource/vo/MachineDataSourceDO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/datasource/vo/MachineDataSourceDO.java new file mode 100644 index 000000000..1ac5ac007 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/datasource/vo/MachineDataSourceDO.java @@ -0,0 +1,28 @@ +package com.cf.imes.module.system.controller.admin.datasource.vo; + + +import com.cf.imes.framework.es.core.dal.ESDocument; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class MachineDataSourceDO extends ESDocument { + + + @Schema(description = "机台ID") + private Long machineId; + + + @Schema(description = "数据源对象") + private List dataSource; + + +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/machine/MachineAuthController.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/machine/MachineAuthController.java index c2c8f6ad3..4d57ea989 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/machine/MachineAuthController.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/machine/MachineAuthController.java @@ -29,7 +29,7 @@ public class MachineAuthController { @PutMapping("insert-organ-auth") - @Operation(summary = "组织机台授权信息更新") + @Operation(summary = "组织机台授权信息新增") @PreAuthorize("@ss.hasPermission('machine-auth::update')") public CommonResult authInsert(@RequestBody MachineOrgAuthReq vo) { return success(machineService.authInsert(vo)); diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/machine/vo/MachineOrgAuthReq.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/machine/vo/MachineOrgAuthReq.java index 11ac6ed2e..bda650983 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/machine/vo/MachineOrgAuthReq.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/machine/vo/MachineOrgAuthReq.java @@ -3,9 +3,6 @@ package com.cf.imes.module.system.controller.admin.machine.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; - -import java.util.List; - /** * @author Beal */ @@ -36,8 +33,8 @@ public class MachineOrgAuthReq { private Integer sealedgeLimit; - @Schema(description = "授权的机台ID") - private List machineAuthIds; +// @Schema(description = "授权的机台ID") +// private List machineAuthIds; } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/machine/vo/OrganMachinePage.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/machine/vo/OrganMachinePage.java index 0c46c5c5f..bdb5fc381 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/machine/vo/OrganMachinePage.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/machine/vo/OrganMachinePage.java @@ -11,8 +11,9 @@ import lombok.Data; public class OrganMachinePage extends PageParam { @Schema(description = "组织名称") - private String organName; + private Long organId; + + @Schema(description = "组织状态(0正常 1停用)") + private Integer status; - @Schema(description = "机台名称") - private String machineName; } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/machine/vo/OrganMachineResp.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/machine/vo/OrganMachineResp.java index 15ab134ba..cc30b681b 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/machine/vo/OrganMachineResp.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/machine/vo/OrganMachineResp.java @@ -6,6 +6,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + /** * @author Beal */ @@ -18,6 +20,9 @@ public class OrganMachineResp { @Schema(description = "组织id") private Long organId; + @Schema(description = "组织状态(0正常 1停用)") + private Integer status; + @Schema(description = "组织名称") private String organName; @@ -41,4 +46,13 @@ public class OrganMachineResp { @Schema(description = "封边机授权数量") private Integer sealedgeLimit; + + @Schema(description = "操作人") + private String updater; + + + @Schema(description = "修改时间") + private LocalDateTime updateTime; + + } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/machine/MachineMapper.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/machine/MachineMapper.java index bda6c58ce..f17529cea 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/machine/MachineMapper.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/machine/MachineMapper.java @@ -74,5 +74,5 @@ public interface MachineMapper extends BaseMapperX { } - + List selectMachineDataSource(@Param("filed") String filed,@Param("machineId") Long machineId,@Param("organId") Long organId); } \ No newline at end of file diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/organ/OrganMapper.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/organ/OrganMapper.java index b6240f93d..f6d366761 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/organ/OrganMapper.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/organ/OrganMapper.java @@ -90,7 +90,7 @@ public interface OrganMapper extends BaseMapperX { } - List selectTestSQL(@Param("sql") String sql); + List selectOrganDataSource(@Param("filed") String filed,@Param("organId") Long organId); /** diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/setting/SettingMapper.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/setting/SettingMapper.java index 93fb6eeb2..0cb6d3e8e 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/setting/SettingMapper.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/setting/SettingMapper.java @@ -1,15 +1,10 @@ package com.cf.imes.module.system.dal.mysql.setting; -import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.cf.imes.module.system.controller.admin.machine.vo.MachinePageReqVO; -import com.cf.imes.module.system.dal.dataobject.machinetemplate.MachineTemplateDO; import com.cf.imes.module.system.dal.dataobject.setting.PackageConfigDO; import org.apache.ibatis.annotations.Mapper; -import java.util.Collection; - @Mapper public interface SettingMapper extends BaseMapperX { @@ -23,4 +18,11 @@ public interface SettingMapper extends BaseMapperX { .eqIfPresent(PackageConfigDO::getType,type)); } + + default int deleteSetting(Integer type,Long userId, Long organId) { + return delete(new LambdaQueryWrapperX() + .eq(PackageConfigDO::getOrganId, organId) + .eq(PackageConfigDO::getUserId, userId) + .eq(PackageConfigDO::getType,type)); + } } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/user/AdminUserMapper.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/user/AdminUserMapper.java index 754c573d7..bfee9b928 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/user/AdminUserMapper.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/user/AdminUserMapper.java @@ -182,4 +182,8 @@ public interface AdminUserMapper extends BaseMapperX { */ @Delete("DELETE FROM system_users WHERE id = #{id}") int physicalDeleteById(@Param("id") Long id); + + + List selectUserDataSource(@Param("filed") String filed,@Param("organId") Long organId,@Param("nameList") List nameList); + } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/datasource/DataSourceService.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/datasource/DataSourceService.java index 4fb081507..d0efa70cc 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/datasource/DataSourceService.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/datasource/DataSourceService.java @@ -1,13 +1,11 @@ package com.cf.imes.module.system.service.datasource; -import java.util.*; +import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.module.system.controller.admin.datasource.vo.*; import com.cf.imes.module.system.dal.dataobject.datasource.DataSourceDO; -import com.cf.imes.framework.common.pojo.PageResult; -import com.cf.imes.framework.common.pojo.PageParam; -import com.cf.imes.module.system.dal.dataobject.datasource.DataSourceFiledDO; import javax.validation.Valid; +import java.util.List; /** * 系统数据源 Service 接口 @@ -59,4 +57,9 @@ public interface DataSourceService { List list(); List getList(Integer type); + + String getKeyNameData(Long machineId,Long planId); + + Boolean saveMachineKeyName(List machineDataSourceDOS); + } \ No newline at end of file diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/datasource/DataSourceServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/datasource/DataSourceServiceImpl.java index 5175af7c4..86558e733 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/datasource/DataSourceServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/datasource/DataSourceServiceImpl.java @@ -1,28 +1,37 @@ package com.cf.imes.module.system.service.datasource; -import com.alibaba.fastjson.JSON; +import cn.hutool.core.collection.CollectionUtil; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch.core.*; +import co.elastic.clients.elasticsearch.core.search.Hit; +import com.cf.imes.framework.common.enums.MachineTypeEnum; +import com.cf.imes.framework.common.exception.ServiceException; +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.es.core.service.ESDocumentService; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.module.executor.api.plan.OrderPlanApi; +import com.cf.imes.module.system.controller.admin.datasource.dataQuery.DataQuery; +import com.cf.imes.module.system.controller.admin.datasource.vo.*; +import com.cf.imes.module.system.dal.dataobject.datasource.DataSourceDO; import com.cf.imes.module.system.dal.dataobject.datasource.DataSourceFiledDO; import com.cf.imes.module.system.dal.mysql.datasource.DataSourceFiledMapper; +import com.cf.imes.module.system.dal.mysql.datasource.DataSourceMapper; +import com.cf.imes.module.system.dal.mysql.machine.MachineMapper; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import javax.annotation.Resource; +import java.io.IOException; import java.util.*; import java.util.stream.Collectors; -import com.cf.imes.module.system.controller.admin.datasource.vo.*; -import com.cf.imes.module.system.dal.dataobject.datasource.DataSourceDO; -import com.cf.imes.framework.common.pojo.PageResult; -import com.cf.imes.framework.common.pojo.PageParam; -import com.cf.imes.framework.common.util.object.BeanUtils; -import com.cf.imes.module.system.dal.mysql.datasource.DataSourceMapper; - -import javax.annotation.Resource; - +import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.ES_ERROR_DELETE; +import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.cf.imes.module.executor.enums.ErrorCodeConstants.PLAN_NOT_ALLOW_DELETE; -import static com.cf.imes.module.system.enums.ErrorCodeConstants.*; +import static com.cf.imes.framework.common.util.object.BeanUtils.toBean; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.DATA_SOURCE_NOT_EXISTS; /** * 系统数据源 Service 实现类 @@ -31,6 +40,7 @@ import static com.cf.imes.module.system.enums.ErrorCodeConstants.*; */ @Service @Validated +@Slf4j public class DataSourceServiceImpl implements DataSourceService { @Resource @@ -39,6 +49,24 @@ public class DataSourceServiceImpl implements DataSourceService { @Resource private DataSourceFiledMapper dataSourceFiledMapper; + @Resource + private MachineMapper machineMapper; + + @Resource + private ESDocumentService esDocumentService; + + @Resource + private ElasticsearchClient elasticsearchClient; + + @Resource + private OrderPlanApi orderPlanApi; + + @Resource + private DataQuery dataQuery; + + + String MACHINE_DATA_SOURCE = "imes_machine_data_source"; + @Override public void createDataSource(List createReqVO) { @@ -252,7 +280,7 @@ public class DataSourceServiceImpl implements DataSourceService { // 校验存在 validateDataSourceExists(updateReqVO.getId()); // 更新 - DataSourceDO updateObj = BeanUtils.toBean(updateReqVO, DataSourceDO.class); + DataSourceDO updateObj = toBean(updateReqVO, DataSourceDO.class); dataSourceMapper.updateById(updateObj); } @@ -388,7 +416,7 @@ public class DataSourceServiceImpl implements DataSourceService { List dataSourceDOS = dataSourceMapper.selectByType(); - List dataSourceFiledReqVOS = BeanUtils.toBean(dataSourceDOS, DataSourceFiledReqVO.class); + List dataSourceFiledReqVOS = toBean(dataSourceDOS, DataSourceFiledReqVO.class); List ids = dataSourceDOS.stream().map(DataSourceDO::getId).toList(); @@ -422,7 +450,7 @@ public class DataSourceServiceImpl implements DataSourceService { // 获取没有key的节点ID List ids = parentList.stream() - .filter(f -> f.getKeyName() == null) +// .filter(f -> f.getKeyName() == null) .map(DataSourceFiledReqVO::getId) .distinct() .toList(); @@ -450,6 +478,319 @@ public class DataSourceServiceImpl implements DataSourceService { } + + + @Override + public String getKeyNameData(Long machineId,Long planId) { + + + StringBuilder data = new StringBuilder(); + + List parentSourceId = new ArrayList<>(); + + List dataSourceDOS = buildMachineDataSourceByMachineId(machineId, MACHINE_DATA_SOURCE); + + + for (MachineDataSourceDO dataSourceDO : dataSourceDOS) { + + parentSourceId.addAll(dataSourceDO.getDataSource().stream().map(DataSource::getParentSourceId).toList()); + + } + + parentSourceId = parentSourceId.stream().distinct().toList(); + + + for (Integer aLong : parentSourceId) { + + switch (aLong) { + + // 生产单基础信息 + // 生产单经销商信息 + // 生产单终端客户信息 + case 1543, 68, 80 -> { + String machineDataSourceKeyName = getMachineDataSourceKeyName(machineId, aLong); + data.append(orderPlanApi.apiDataGetPlan(planId, machineDataSourceKeyName)); + } + + + // 生产单组织信息 + case 61 -> { + String machineDataSourceKeyName1 = getMachineDataSourceKeyName(machineId, aLong); + data.append(dataQuery.dataGetOrgan(machineDataSourceKeyName1)); + } + + + // 生产单业务员信息 + // 生产单拆单员信息 + case 74, 92 -> { + String machineDataSourceKeyName2 = getMachineDataSourceKeyName(machineId, aLong); + List nameList = orderPlanApi.apiGetOrders(planId, aLong == 74); + data.append(dataQuery.dataGetUser(machineDataSourceKeyName2, nameList)); + } + + + // 排单基础信息 + case 98 -> { + String machineDataSourceKeyName3 = getMachineDataSourceKeyName(machineId, aLong); + data.append(orderPlanApi.getPlan(planId, machineDataSourceKeyName3)); + } + + + // 排单板材的大板用量信息 + case 110 -> { + List machineDataSourceKeyName4 = buildMachineDataSourceByParentSourceId(machineId, aLong, MACHINE_DATA_SOURCE) + .get(0) + .getDataSource() + .stream().map(DataSource::getKeyName).toList(); + data.append(orderPlanApi.apiGetEsPlan(planId, machineDataSourceKeyName4)); + } + + + // 排单板材的余料板用量信息 + // 物料(商品)板材信息的余料信息 + case 119, 822 -> { + String machineDataSourceKeyName5 = getMachineDataSourceKeyName(machineId, aLong); + data.append(orderPlanApi.apiGetPlanRemainPlate(planId, machineDataSourceKeyName5)); + } + + + // 排单板件的基础信息 + // 排单板件的规格尺寸的成品尺寸信息 + // 排单板件的规格尺寸的拆单尺寸信息 + // 雕刻机加工概要信息 + // 排单钻孔机(大板上下钻)加工信息概要 + // 排单钻孔机(小板)加工信息概要 + // 板件中板材基础信息 + // 板件中的基础信息的成品尺寸 + case 140, 204, 209, 446, 552, 657, 846, 907 -> { + String machineDataSourceKeyName6 = getMachineDataSourceKeyName(machineId, aLong); + data.append(orderPlanApi.apiGetPlanPlate(planId, machineDataSourceKeyName6)); + } + + + // 排单板件的备注信息 + // 排单板件的规格尺寸的开料尺寸信息 + // 板件中板材基础信息的备注信息 + // 板件中基础信息的开料尺寸 + case 141, 213, 853, 908 -> { + List machineDataSourceKeyName7 = buildMachineDataSourceByParentSourceId(machineId, aLong, MACHINE_DATA_SOURCE) + .get(0) + .getDataSource() + .stream().map(DataSource::getKeyName).toList(); + data.append(orderPlanApi.apiGetEsPlate(planId, machineDataSourceKeyName7)); + } + + + // 生产单中的房间信息 + // 生产单中的柜体信息 + // 板件中的基础信息的房间信息 + // 板件中的基础信息的柜体信息 + case 1544,1545, 881, 889 -> { + String machineDataSourceKeyName8 = getMachineDataSourceKeyName(machineId, aLong); + data.append(orderPlanApi.apiGetPlanBodyOrRoom(planId, machineDataSourceKeyName8)); + } + + + + // 板件信息的加工组信息 + case 897 -> { + String machineDataSourceKeyName9 = getMachineDataSourceKeyName(machineId, aLong); + data.append(orderPlanApi.apiGetPlanGroup(planId, machineDataSourceKeyName9)); + } + + + // 物料(商品)的板材信息 + // 排单排版信息-大板信息 + case 808, 416 -> { + String machineDataSourceKeyName10 = getMachineDataSourceKeyName(machineId, aLong); + data.append(orderPlanApi.getGoods(planId, machineDataSourceKeyName10)); + } + + + // 物料(商品)的配件信息 + case 809 -> { + String machineDataSourceKeyName11 = getMachineDataSourceKeyName(machineId, aLong); + data.append(orderPlanApi.apiGetPlanParts(planId, machineDataSourceKeyName11)); + } + + + // 物料(商品)的配件备注信息 + case 840 -> { + List machineDataSourceKeyName12 = buildMachineDataSourceByParentSourceId(machineId, aLong, MACHINE_DATA_SOURCE) + .get(0) + .getDataSource() + .stream().map(DataSource::getKeyName).toList(); + data.append(orderPlanApi.apiGetEsParts(planId, machineDataSourceKeyName12)); + } + + // 排单信息的生产线信息 + case 1483 -> { + Integer machineType = machineMapper.selectById(machineId).getMachineType(); + if (machineType.equals(MachineTypeEnum.CUTTING.getType())){ + String machineDataSourceKeyName13 = getMachineDataSourceKeyName(machineId, aLong); + data.append(dataQuery.dataGetMachine(machineDataSourceKeyName13,machineId)); + } + } + + // 排单信息的机台信息 + case 1487 -> { + + String machineDataSourceKeyName14 = getMachineDataSourceKeyName(machineId, aLong); + data.append(dataQuery.dataGetMachine(machineDataSourceKeyName14,machineId)); + } + + + } + } + + return data.toString(); + + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean saveMachineKeyName(List machineDataSourceDOS) { + + Long machineId = machineDataSourceDOS.stream().map(MachineDataSourceDO::getMachineId).distinct().toList().get(0); + /* + * 目前数据源保存有两种方式: + * 1. 每回保存全都传过来,先将机台的原数据源删除,再重新保存 + * 2. 传过来的时候将新增的和删除的区分开来,我这边做数据处理 + * + * */ + // todo 目前先实现第一种:每回保存时传入全部数据,先删除原机台字段信息,再保存 + deleteByMachineId(machineId,MACHINE_DATA_SOURCE); + batchSaveMachineDataSource(machineDataSourceDOS); + + return Boolean.TRUE; + + } + + + public static List convertToSnakeCase(List camelCaseList) { + List snakeCaseList = new ArrayList<>(); + + // 字段ID改成数据库的形式 + camelCaseList = camelCaseList.stream().map(key -> key.replace("_", "")).toList(); + + + for (String camelCaseStr : camelCaseList) { + StringBuilder snakeCaseStr = new StringBuilder(); + + for (int i = 0; i < camelCaseStr.length(); i++) { + char c = camelCaseStr.charAt(i); + // 如果字符是大写字母,并且不是第一个字符,则添加下划线 + if (Character.isUpperCase(c) && i != 0) { + snakeCaseStr.append('_'); + } + // 转换字符为小写 + snakeCaseStr.append(Character.toLowerCase(c)); + } + + snakeCaseList.add(snakeCaseStr.toString()); + } + + return snakeCaseList; + } + + + public void batchSaveMachineDataSource(List machineDataSourceDOS) { + try { + BulkResponse bulkResponse = esDocumentService.bulkCreate(MACHINE_DATA_SOURCE, machineDataSourceDOS); + boolean errors = bulkResponse.errors(); + if (errors) { + log.error(bulkResponse.items().toString()); + throw new ServiceException(500, "未知异常"); + } + } catch (Exception e) { + e.printStackTrace(); + log.error(e.getMessage()); + throw new RuntimeException(e); + } + + } + + + + + + + private String getMachineDataSourceKeyName(Long machineId, Integer parentSourceId) { + + return convertToSnakeCase(buildMachineDataSourceByParentSourceId(machineId, parentSourceId, MACHINE_DATA_SOURCE) + .get(0) + .getDataSource() + .stream().map(DataSource::getKeyName).toList()) + .toString(); + + } + + + + // 根据机台ID和父级ID,查询对应的数据源字段 + private List buildMachineDataSourceByParentSourceId(Long machineId,Integer parentSourceId, String index) { + + SearchRequest.Builder builder = new SearchRequest.Builder(); + builder.index(index); + + builder.query(q -> q.bool(b -> b + .must(m->m.term(t->t.field("machineId").value(machineId))) + .must(m->m.match(t->t.field("dataSource.parentSourceId").query(parentSourceId))))); + + try { + SearchResponse search = elasticsearchClient.search(builder.build(), MachineDataSourceDO.class); + List> hits = search.hits().hits(); + if (CollectionUtil.isNotEmpty(hits)) { + return hits.stream().map(Hit::source).collect(Collectors.toList()); + } + return new ArrayList<>(); + } catch (IOException e) { + log.error(e.getMessage()); + throw new ServiceException(INTERNAL_SERVER_ERROR); + } + } + + + + // 根据机台ID查询机台对应的数据源字段信息 + private List buildMachineDataSourceByMachineId(Long machineId, String index) { + + SearchRequest.Builder builder = new SearchRequest.Builder(); + builder.index(index); + builder.query(q -> q.term(b -> b.field("machineId").value(machineId))); + + try { + SearchResponse search = elasticsearchClient.search(builder.build(), MachineDataSourceDO.class); + List> hits = search.hits().hits(); + if (CollectionUtil.isNotEmpty(hits)) { + return hits.stream().map(Hit::source).collect(Collectors.toList()); + } + return new ArrayList<>(); + } catch (IOException e) { + log.error(e.getMessage()); + throw new ServiceException(INTERNAL_SERVER_ERROR); + } + } + + + + // 根据机台ID删除对应的数据源ES信息 + public void deleteByMachineId(Long machineId, String index) { + DeleteByQueryRequest.Builder builder = new DeleteByQueryRequest.Builder(); + builder.index(index); + builder.query(q -> q.term(t -> t.field("machineId").value(machineId))); + try { + DeleteByQueryResponse response = elasticsearchClient.deleteByQuery(builder.build()); + log.info("Deleted {} documents with planId {}", response.deleted(), machineId); + } catch (IOException e) { + log.error("Error deleting documents with planId {}: {}", machineId, e.getMessage()); + throw new ServiceException(ES_ERROR_DELETE); + } + } + + + private List conversion(String sourceId) { return Arrays.stream(sourceId.split(",")) diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/machine/MachineServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/machine/MachineServiceImpl.java index 0aea03f47..72d56a515 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/machine/MachineServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/machine/MachineServiceImpl.java @@ -42,6 +42,7 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.io.IOException; +import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -99,13 +100,19 @@ public class MachineServiceImpl implements MachineService { LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); assert loginUser != null; + MachineLimitDO machineLimitDO = machineLimitMapper.selectById(loginUser.getOrganId()); + + if(machineLimitDO == null){ + throw exception(MACHINE_DATA_ERROR); + } + // 校验机台名称是否重复 MachineDO machine = machineMapper.selectMachineName(createReqVO.getName(), createReqVO.getMachineType(), getUserOrganId()); if (machine != null) { throw exception(MACHINE_NAME_ERROR); } -// validateMachineNum(createReqVO.getMachineType(), loginUser.getOrganId()); + validateMachineNum(createReqVO.getMachineType(), loginUser.getOrganId()); MachineDO machineDO; MachineTemplateDO machineTemplateDO; @@ -435,9 +442,9 @@ public class MachineServiceImpl implements MachineService { @Override public Boolean authInsert(MachineOrgAuthReq vo) { - OrganizationDO tenant = organMapper.selectById(vo.getOrganId()); + MachineLimitDO machineLimit = machineLimitMapper.selectById(vo.getOrganId()); - if (tenant != null) { + if (machineLimit != null) { throw exception(ORGAN_ALREADY_EXISTS); } @@ -448,7 +455,7 @@ public class MachineServiceImpl implements MachineService { .labelLimit(vo.getLabelLimit()) .sawLimit(vo.getSawLimit()) .sealedgeLimit(vo.getSealedgeLimit()) - .setting(vo.getMachineAuthIds().toString()) +// .setting(vo.getMachineAuthIds().toString()) .build(); machineLimitMapper.insert(machineLimitDO); @@ -465,6 +472,9 @@ public class MachineServiceImpl implements MachineService { throw exception(ORGAN_NOT_EXISTS); } + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + assert loginUser != null; + MachineLimitDO machineLimitDO = MachineLimitDO.builder() .organId(vo.getOrganId()) .cutLimit(vo.getCutLimit()) @@ -472,9 +482,12 @@ public class MachineServiceImpl implements MachineService { .labelLimit(vo.getLabelLimit()) .sawLimit(vo.getSawLimit()) .sealedgeLimit(vo.getSealedgeLimit()) - .setting(vo.getMachineAuthIds().toString()) + +// .setting(vo.getMachineAuthIds().toString()) .build(); + machineLimitDO.setUpdateTime(LocalDateTime.now()); + machineLimitDO.setUpdater(loginUser.getNickname()); machineLimitMapper.updateById(machineLimitDO); @@ -571,30 +584,18 @@ public class MachineServiceImpl implements MachineService { // 校验当前组织当前类型的机台是否达到最大创建数量 private void validateMachineNum(Integer machineType, Long organId) { - Integer machineNum = machineMapper.selectByOrganId(machineType, organId).size() + 1; + int machineNum = machineMapper.selectByOrganId(machineType, organId).size() ; MachineLimitDO machineLimitDO = machineLimitMapper.selectById(organId); - Integer authMachineNum = 0; - switch (machineType) { - - case 1: - authMachineNum = machineLimitDO.getCutLimit(); - break; - case 2: - authMachineNum = machineLimitDO.getDrillLimit(); - break; - case 3: - authMachineNum = machineLimitDO.getSawLimit(); - break; - case 4: - authMachineNum = machineLimitDO.getLabelLimit(); - break; - case 5: - authMachineNum = machineLimitDO.getSealedgeLimit(); - break; - - } + Integer authMachineNum = switch (machineType) { + case 1 -> machineLimitDO.getCutLimit(); + case 2 -> machineLimitDO.getDrillLimit(); + case 3 -> machineLimitDO.getSawLimit(); + case 4 -> machineLimitDO.getLabelLimit(); + case 5 -> machineLimitDO.getSealedgeLimit(); + default -> 0; + }; if (machineNum >= authMachineNum) { throw exception(MACHINE_NUM_ERROR); diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/setting/SettingServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/setting/SettingServiceImpl.java index c77f8cd79..f498ca65b 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/setting/SettingServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/setting/SettingServiceImpl.java @@ -3,7 +3,6 @@ package com.cf.imes.module.system.service.setting; import com.cf.imes.framework.common.enums.UserSettingTypeEnum; import com.cf.imes.framework.common.util.json.JsonUtils; -import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.security.core.LoginUser; import com.cf.imes.module.system.controller.admin.setting.vo.PackageConfigReqVO; import com.cf.imes.module.system.dal.dataobject.setting.PackageConfigDO; @@ -16,7 +15,7 @@ import javax.annotation.Resource; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.framework.common.util.json.JsonUtils.unzipString; import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getLoginUser; -import static com.cf.imes.module.system.enums.ErrorCodeConstants.*; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.CURRENTLY_NO_CONFIGURATION_AVAILABLE; @Service @@ -32,6 +31,9 @@ public class SettingServiceImpl implements SettingService{ public Long insertSetting(PackageConfigReqVO reqVO) { LoginUser loginUser = getLoginUser(); + + settingMapper.deleteSetting(reqVO.getType(),loginUser.getId(),loginUser.getOrganId()); + PackageConfigDO packageConfigDO = PackageConfigDO.builder() .userId(loginUser.getId()) .organId(loginUser.getOrganId()) diff --git a/cf-module-system/cf-module-system-biz/src/main/resources/mapper/machine/MachineLimitMapper.xml b/cf-module-system/cf-module-system-biz/src/main/resources/mapper/machine/MachineLimitMapper.xml index 485132725..462baab2f 100644 --- a/cf-module-system/cf-module-system-biz/src/main/resources/mapper/machine/MachineLimitMapper.xml +++ b/cf-module-system/cf-module-system-biz/src/main/resources/mapper/machine/MachineLimitMapper.xml @@ -7,24 +7,28 @@ - select sml.* + select distinct + sml.organ_id, + sml.cut_limit, + sml.drill_limit, + sml.label_limit, + sml.saw_limit, + sml.sealedge_limit, + sml.updater, + sml.update_time, + so.name as organName, + so.status from system_machine_limit sml - - left join system_organization so on sml.organ_id = so.id - left join system_machine_template smt on sml.setting like concat(smt.id, '%') + join system_organization so on sml.organ_id = so.id sml.deleted = false - and smt.deleted = false - and smt.is_enabled = true - and smt.is_default = false - and so.status = 0 - - and so.name like concat('%', #{machinePage.organName},'%') + + and sml.organ_id = #{machinePage.organId} - - and smt.name like concat('%', #{machinePage.machineName},'%') + + and so.status = #{machinePage.status} diff --git a/cf-module-system/cf-module-system-biz/src/main/resources/mapper/organ/OrganMapper.xml b/cf-module-system/cf-module-system-biz/src/main/resources/mapper/organ/OrganMapper.xml index 848369dbc..f52671131 100644 --- a/cf-module-system/cf-module-system-biz/src/main/resources/mapper/organ/OrganMapper.xml +++ b/cf-module-system/cf-module-system-biz/src/main/resources/mapper/organ/OrganMapper.xml @@ -21,9 +21,9 @@ - - ${sql} + select ${filed} from system_organization where id = #{organId} and deleted = false diff --git a/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/AdminUserMapper.xml b/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/AdminUserMapper.xml index 3f201c5fa..dac5339ba 100644 --- a/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/AdminUserMapper.xml +++ b/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/AdminUserMapper.xml @@ -38,4 +38,19 @@ ORDER BY id DESC + + + \ No newline at end of file diff --git a/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/MachineMapper.xml b/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/MachineMapper.xml index c34712671..f1ea5c8a5 100644 --- a/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/MachineMapper.xml +++ b/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/MachineMapper.xml @@ -16,4 +16,10 @@ + + \ No newline at end of file