From 0110c194c4bf9cdffdb738b6f1fd0ef1bc000ec7 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Fri, 20 Sep 2024 12:11:27 +0800 Subject: [PATCH 1/8] =?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=E4=BF=AE=E6=94=B9=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E7=B1=BB=E5=9E=8B=EF=BC=8C=E5=90=8C=E6=AD=A5=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=85=B3=E8=81=94=E5=AD=97=E6=AE=B5=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=9A=84=E7=B1=BB=E5=9E=8B=E5=AD=97=E6=AE=B5=EF=BC=9B2?= =?UTF-8?q?=E3=80=81system=E5=BE=AE=E6=9C=8D=E5=8A=A1=E7=9F=AD=E4=BF=A1?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=8A=A0=E5=AF=86=E4=B8=B2=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common}/enums/DeletedCodeEnum.java | 2 +- .../remainplaten/RemainPlateServiceImpl.java | 2 +- .../service/dict/DictTypeServiceImpl.java | 21 +++++++++++++++++-- .../src/main/resources/application.yaml | 6 +++--- 4 files changed, 24 insertions(+), 7 deletions(-) rename {cf-module-prod-manage/cf-module-prod-manage-api/src/main/java/com/cf/imes/module/manage => cf-framework/cf-common/src/main/java/com/cf/imes/framework/common}/enums/DeletedCodeEnum.java (91%) diff --git a/cf-module-prod-manage/cf-module-prod-manage-api/src/main/java/com/cf/imes/module/manage/enums/DeletedCodeEnum.java b/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/enums/DeletedCodeEnum.java similarity index 91% rename from cf-module-prod-manage/cf-module-prod-manage-api/src/main/java/com/cf/imes/module/manage/enums/DeletedCodeEnum.java rename to cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/enums/DeletedCodeEnum.java index 8963aa73a..caedf91d6 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-api/src/main/java/com/cf/imes/module/manage/enums/DeletedCodeEnum.java +++ b/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/enums/DeletedCodeEnum.java @@ -1,4 +1,4 @@ -package com.cf.imes.module.manage.enums; +package com.cf.imes.framework.common.enums; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateServiceImpl.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateServiceImpl.java index 821a823f0..6eb570638 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateServiceImpl.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateServiceImpl.java @@ -5,7 +5,7 @@ import com.cf.imes.module.manage.controller.admin.plate.vo.remain.RemainPlatePag import com.cf.imes.module.manage.controller.admin.plate.vo.remain.RemainPlateSaveReqVO; import com.cf.imes.module.manage.dal.dataobject.remainplaten.RemainPlateDO; import com.cf.imes.module.manage.dal.mysql.remainplaten.RemainPlateMapper; -import com.cf.imes.module.manage.enums.DeletedCodeEnum; +import com.cf.imes.framework.common.enums.DeletedCodeEnum; import com.cf.imes.module.manage.enums.RemainPlateStatusEnum; import com.cf.imes.module.manage.enums.RemainPlateUseTypeEnum; import org.springframework.stereotype.Service; diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dict/DictTypeServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dict/DictTypeServiceImpl.java index 1af6b0759..134d04275 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dict/DictTypeServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dict/DictTypeServiceImpl.java @@ -1,17 +1,23 @@ package com.cf.imes.module.system.service.dict; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.cf.imes.framework.common.enums.DeletedCodeEnum; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.util.date.LocalDateTimeUtils; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.module.system.controller.admin.dict.vo.type.DictTypePageReqVO; import com.cf.imes.module.system.controller.admin.dict.vo.type.DictTypeSaveReqVO; +import com.cf.imes.module.system.dal.dataobject.dict.DictDataDO; import com.cf.imes.module.system.dal.dataobject.dict.DictTypeDO; +import com.cf.imes.module.system.dal.mysql.dict.DictDataMapper; import com.cf.imes.module.system.dal.mysql.dict.DictTypeMapper; import com.cf.imes.module.system.enums.ErrorCodeConstants; import com.google.common.annotations.VisibleForTesting; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.time.LocalDateTime; @@ -33,6 +39,9 @@ public class DictTypeServiceImpl implements DictTypeService { @Resource private DictTypeMapper dictTypeMapper; + @Resource + private DictDataMapper dictDataMapper; + @Override public PageResult getDictTypePage(DictTypePageReqVO pageReqVO) { return dictTypeMapper.selectPage(pageReqVO); @@ -63,17 +72,25 @@ public class DictTypeServiceImpl implements DictTypeService { } @Override + @Transactional(rollbackFor = Exception.class) public void updateDictType(DictTypeSaveReqVO updateReqVO) { + String updateReqVOType = updateReqVO.getType(); // 校验自己存在 - validateDictTypeExists(updateReqVO.getId()); + DictTypeDO oldDictTypeDO = validateDictTypeExists(updateReqVO.getId()); // 校验字典类型的名字的唯一性 validateDictTypeNameUnique(updateReqVO.getId(), updateReqVO.getName()); // 校验字典类型的类型的唯一性 - validateDictTypeUnique(updateReqVO.getId(), updateReqVO.getType()); + validateDictTypeUnique(updateReqVO.getId(), updateReqVOType); // 更新字典类型 DictTypeDO updateObj = BeanUtils.toBean(updateReqVO, DictTypeDO.class); dictTypeMapper.updateById(updateObj); + + // 字典类型发生改变,更新关联字典数据 + String oldDictTypeDOType = oldDictTypeDO.getType(); + if (ObjectUtil.isAllNotEmpty(oldDictTypeDOType, updateReqVOType) && ObjectUtil.notEqual(oldDictTypeDOType, updateReqVOType)) { + dictDataMapper.update(new LambdaUpdateWrapper().set(DictDataDO::getDictType, updateReqVOType).eq(DictDataDO::getDictType, oldDictTypeDOType).eq(DictDataDO::getStatus, DeletedCodeEnum.NOT_DELETED.getStatus())); + } } @Override diff --git a/cf-module-system/cf-module-system-biz/src/main/resources/application.yaml b/cf-module-system/cf-module-system-biz/src/main/resources/application.yaml index ff3b4969c..085a8f37d 100644 --- a/cf-module-system/cf-module-system-biz/src/main/resources/application.yaml +++ b/cf-module-system/cf-module-system-biz/src/main/resources/application.yaml @@ -206,9 +206,9 @@ chenfeng: end-code: 9999 # 这里配置 9999 的原因是,测试方便。 sms: channel: DEBUG_DING_TALK - signature: - apiKey: 28PlJanD0aJLMyMLuH6JI5oVj1/j5ZNGvZPx/zguEvJl02PdrbWe5yIV4s1RSD3CDX9obUhITNlc6glW7MNJq03N7H/v50MFgN4f8mK1oAA= - apiSecret: O6Yk9gT3xQ9fqSKFuZa9I4bWOULCw2syH4/a1OrD2W7BAE2aQ+bSgqLXfBJT+de0GKHKgjuPNv0v+sDKkizLP22gsYIhdn/3OPSvyJF7Tng= + signature: sELLIaR5FAhCp8xx6tDJr1goyvsziMfTsD1HHxWnLkZgbVQOoly0GeadK81IkxbMVlvA5AhB7Apapg38Gx+MuE7G5xiVXt4JSzOqW1Qa6gn88joGXe0wh++lAtw= + apiKey: sELLIaR5FAhCp8xx6tDJr1goyvsziMfTsD1HHxWnLkZgbVQOoly0GeadK81IkxbMVlvA5AhB7Apapg38Gx+MuE7G5xiVXt4JSzOqW1Qa6gn88joGXe0wh++lAtw= + apiSecret: UjISv3wc1DfeFeG4WaPF4q8boPdrdhuUKuIhUDr1MImA0bK1KMqV76HL7fzEW2NR/Uqrq9Fe3vfWOCwblgKgL/J0twmrNCknBQSXhLNDw9zosoQR9Q1Lgql8dcI/d4g= encrypt: enable: false publicKey: cfimes From 692c4889ab73270fa0030c2f4d3d686bbb29f977 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Fri, 20 Sep 2024 15:40:37 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E7=A6=85=E9=81=93=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E5=AD=97=E5=85=B8=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=A2=9E=E6=94=B9CssClass=E5=A2=9E=E5=8A=A0=E9=A2=9C=E8=89=B2?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E9=99=90=E5=88=B6=EF=BC=8C=E6=97=A0=E6=95=88?= =?UTF-8?q?=E5=85=A5=E5=8F=82=E6=A0=A1=E9=AA=8C=E5=99=A8=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/dict/vo/data/DictDataSaveReqVO.java | 2 ++ .../OrderStatisticsUnitInEnumValidator.java | 36 ------------------- .../system/dict/CssClassValid.java} | 18 +++++----- .../system/dict/CssClassValidator.java | 27 ++++++++++++++ 4 files changed, 39 insertions(+), 44 deletions(-) delete mode 100644 cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/order/OrderStatisticsUnitInEnumValidator.java rename cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/{order/OrderStatisticsUnitInEnum.java => validation/system/dict/CssClassValid.java} (51%) create mode 100644 cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/validation/system/dict/CssClassValidator.java diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/dict/vo/data/DictDataSaveReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/dict/vo/data/DictDataSaveReqVO.java index 8537ef0d0..10650ce47 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/dict/vo/data/DictDataSaveReqVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/dict/vo/data/DictDataSaveReqVO.java @@ -2,6 +2,7 @@ package com.cf.imes.module.system.controller.admin.dict.vo.data; import com.cf.imes.framework.common.enums.CommonStatusEnum; import com.cf.imes.framework.common.validation.InEnum; +import com.cf.imes.module.system.validation.system.dict.CssClassValid; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -44,6 +45,7 @@ public class DictDataSaveReqVO { private String colorType; @Schema(description = "css 样式", example = "btn-visible") + @CssClassValid private String cssClass; @Schema(description = "备注", example = "我是一个角色") diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/order/OrderStatisticsUnitInEnumValidator.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/order/OrderStatisticsUnitInEnumValidator.java deleted file mode 100644 index 85cd02a5e..000000000 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/order/OrderStatisticsUnitInEnumValidator.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.cf.imes.module.system.order; - -import cn.hutool.core.util.ObjectUtil; -import com.cf.imes.module.executor.enums.OrderStatisticsUnit; - -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; - -/** - * 生产单统计维度单位入参校验器 - * - * @author Gqr - * @since 2024/7/17 9:33 - */ -public class OrderStatisticsUnitInEnumValidator implements ConstraintValidator { - - @Override - public void initialize(OrderStatisticsUnitInEnum constraintAnnotation) { - ConstraintValidator.super.initialize(constraintAnnotation); - } - - @Override - public boolean isValid(Integer value, ConstraintValidatorContext context) { - if (ObjectUtil.isNull(value)) { - return true; - } - OrderStatisticsUnit unit = OrderStatisticsUnit.fromValue(value); - if (ObjectUtil.isNotNull(unit)) { - return true; - } else { - return false; - } - } - -} - diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/order/OrderStatisticsUnitInEnum.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/validation/system/dict/CssClassValid.java similarity index 51% rename from cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/order/OrderStatisticsUnitInEnum.java rename to cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/validation/system/dict/CssClassValid.java index 6bc77140e..4c4fe19de 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/order/OrderStatisticsUnitInEnum.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/validation/system/dict/CssClassValid.java @@ -1,14 +1,16 @@ -package com.cf.imes.module.system.order; +package com.cf.imes.module.system.validation.system.dict; import javax.validation.Constraint; import javax.validation.Payload; -import java.lang.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; /** - * 生产单统计维度单位入参校验注解 - * * @author Gqr - * @since 2024/7/17 9:33 + * @since 2024/9/20 15:24 */ @Target({ ElementType.METHOD, @@ -21,10 +23,10 @@ import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Documented @Constraint( - validatedBy = {OrderStatisticsUnitInEnumValidator.class} + validatedBy = {CssClassValidator.class} ) -public @interface OrderStatisticsUnitInEnum { - String message() default "生产单统计维度单位[unit]错误,请检查"; +public @interface CssClassValid { + String message() default "颜色格式错误,请检查"; Class[] groups() default {}; diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/validation/system/dict/CssClassValidator.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/validation/system/dict/CssClassValidator.java new file mode 100644 index 000000000..b699b2cb9 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/validation/system/dict/CssClassValidator.java @@ -0,0 +1,27 @@ +package com.cf.imes.module.system.validation.system.dict; + +import org.apache.commons.lang3.StringUtils; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +/** + * @author Gqr + * @since 2024/9/20 15:27 + */ +public class CssClassValidator implements ConstraintValidator { + private static final String REGEX = "^#([0-9a-fA-F]{3}){1,2}$"; + + @Override + public void initialize(CssClassValid constraintAnnotation) { + ConstraintValidator.super.initialize(constraintAnnotation); + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + if (StringUtils.isEmpty(value)) { + return true; + } + return value.matches(REGEX); + } +} From 9a8f5a3340470be0eee58b1adf498298d103d633 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Mon, 23 Sep 2024 11:58:58 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E7=BB=84=E7=BB=87=E7=AE=A1=E7=90=86-?= =?UTF-8?q?=E7=BB=84=E7=BB=87=E6=9D=83=E9=99=90=EF=BC=9A=E7=A7=BB=E9=99=A4?= =?UTF-8?q?system=5Fmenu=E5=AF=B9visiable=E7=9A=84=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=EF=BC=8C=E5=8F=AA=E8=BF=87=E6=BB=A4deleted=E6=98=AFtrue?= =?UTF-8?q?=E7=9A=84=E8=8F=9C=E5=8D=95=EF=BC=8C=E8=A7=A3=E5=86=B3=E7=B1=BB?= =?UTF-8?q?=E4=BC=BC=E4=BA=8E=E6=8A=A5=E8=A1=A8=E9=A2=84=E8=A7=88=E8=BF=99?= =?UTF-8?q?=E7=A7=8D=E5=B5=8C=E5=A5=97=E5=AD=90=E8=8F=9C=E5=8D=95=E4=B8=8D?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E4=BD=86=E6=98=AF=E8=A6=81=E6=8E=88=E6=9D=83?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controller/admin/permission/MenuController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/permission/MenuController.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/permission/MenuController.java index 1a6ea7b3b..a3d1a6264 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/permission/MenuController.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/permission/MenuController.java @@ -110,7 +110,7 @@ public class MenuController { public CommonResult> getSimpleMenuList() { // status:0 开启 visiable:1 显示 List list = menuService.getMenuListByOrgan( - new MenuListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus()).setVisiable(CommonStatusEnum.DISABLE.getStatus())); + new MenuListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus())); list.sort(Comparator.comparing(MenuDO::getSort)); return success(BeanUtils.toBean(list, MenuSimpleRespVO.class)); } From 79f011c2dfb5e77540a0168ddf6ea204226dd325 Mon Sep 17 00:00:00 2001 From: lym <1994302445@qq.com> Date: Mon, 23 Sep 2024 15:44:36 +0800 Subject: [PATCH 4/8] =?UTF-8?q?xml=E6=95=B0=E6=8D=AE=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executor/enums/DictTypeConstants.java | 12 +- .../admin/order/OrderController.java | 32 +- .../dataobject/ordermodel/OrderModelDO.java | 4 +- .../dal/mysql/plate/PlateGoodMapper.java | 4 +- .../service/order/OrderServiceImpl.java | 15 +- .../structure/IOriginModelingData.java | 4 + .../deviseData/structure/ModelDetail.java | 19 + .../deviseData/structure/PlateDetail.java | 3 +- .../util/fileConversion/admin/ToolUtil.java | 7 +- .../admin/api/webcad/ApiTypeRealize.java | 19 + .../admin/files/xml/VO/AssemblyXmlVO.java | 54 +- .../admin/files/xml/VO/BlockXmlVO.java | 86 +- .../admin/files/xml/VO/BoxXmlVO.java | 13 +- .../admin/files/xml/VO/CorrelationXmlVO.java | 58 +- .../admin/files/xml/VO/CorrelationXmlVOS.java | 9 +- .../admin/files/xml/VO/EdgingXmlVO.java | 52 +- .../admin/files/xml/VO/GrooveXmlVO.java | 3 + .../admin/files/xml/VO/GrooveXmlVOS.java | 30 +- .../admin/files/xml/VO/GroupXmlVO.java | 4 - .../admin/files/xml/VO/HardwareXmlVO.java | 54 +- .../admin/files/xml/VO/HoleXmlVO.java | 57 +- .../admin/files/xml/VO/HoleXmlVOS.java | 22 +- .../admin/files/xml/VO/IsletXmlVO.java | 4 +- .../admin/files/xml/VO/IsletXmlVOS.java | 9 +- .../admin/files/xml/VO/MaterialXmlVO.java | 2 +- .../admin/files/xml/VO/ModuleXmlVO.java | 4 - .../admin/files/xml/VO/OffsetLineXmlVO.java | 4 - .../admin/files/xml/VO/OffsetLineXmlVOS.java | 9 +- .../admin/files/xml/VO/OrderXmlVO.java | 9 +- .../admin/files/xml/VO/PlateXmlVO.java | 20 +- .../admin/files/xml/VO/PlateXmlVOS.java | 2 +- .../admin/files/xml/VO/PointXmlVO.java | 34 +- .../admin/files/xml/VO/PointXmlVOS.java | 12 +- .../admin/files/xml/VO/RemarkXmlVO.java | 4 - .../admin/files/xml/VO/RoomXmlVO.java | 39 +- .../admin/files/xml/XMLUtil.java | 1569 +++++++++++++---- .../admin/files/xml/XmlTypeRealize.java | 114 +- .../plate/vo/remain/RemainPlateRespVO.java | 2 +- .../manage/dal/mysql/plate/PlateMapper.java | 7 + .../service/plate/PlateServiceImpl.java | 5 + .../system/enums/ErrorCodeConstants.java | 1 + 41 files changed, 1845 insertions(+), 566 deletions(-) diff --git a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/DictTypeConstants.java b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/DictTypeConstants.java index a4fb9469a..693d813c1 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/DictTypeConstants.java +++ b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/DictTypeConstants.java @@ -5,17 +5,21 @@ package com.cf.imes.module.executor.enums; */ public interface DictTypeConstants { + String HOLE_FACE = "hole_face";//加工面 + String HOLE_DIRECTION = "hole_direction";// 方向 + // ========== PLATE 模块 ========== String TYPOGRAPHY_TYPE = "typographyType"; // 排版面 String GRAIN_TYPE = "grainType";// 小板纹路类型 String DOOR_OPENING_DIRECTIONS = "doorOpeningDirections";//开门方向 String PLATE_TYPE = "order_plate_type"; // 板类型 - String UNIT_LENGTH = "unit_length"; // 长度单位 - String UNIT_AREA = "area_unit"; // 面积单位 // ========== HOLE 模块 ========== - String HOLE_FACE = "hole_face";//孔加工面 - String HOLE_DIR = "hole_direction";// 孔方向 String HOLE_TYPE = "hole_type";//孔类型 + + + // ========== 单位 模块 ========== + String UNIT_LENGTH = "length_unit"; // 长度单位 + String UNIT_AREA = "area_unit"; // 面积单位 } 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..a90663f02 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 @@ -10,7 +10,6 @@ import com.cf.imes.module.executor.controller.admin.order.vo.product.OrderRoomBo import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRespVO; 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.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,7 +18,6 @@ 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.Parameters; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @@ -59,7 +57,6 @@ 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; @@ -285,17 +282,15 @@ public class OrderController { @RequestParam(value = "type") Integer type, @RequestParam(value = "index", required = false, defaultValue = "0") Integer index, @RequestParam(value = "id", required = false, defaultValue = "0") Long orderId, - HttpServletResponse response) { + HttpServletResponse response) throws Exception { + List list = null; + OrderXmlVO orderXmlVO = null; + + OrderDO orderDO = null; + Map mapOrder = null; + + Boolean flag = true; try { - List list = null; - OrderXmlVO orderXmlVO = null; - - OrderDO orderDO = null; - Map mapOrder; - - Boolean flag = true; - - if (type == 0) { //excel excelReadUtil.setErr(0); Map map = excelReadUtil.read(file); @@ -345,6 +340,7 @@ public class OrderController { } else if (type == 2) { // xml orderXmlVO = (OrderXmlVO) XMLUtil.read(file, OrderXmlVO.class); + System.out.println("1、 " + orderXmlVO); if (index == 0){ if (orderXmlVO != null) { @@ -368,16 +364,18 @@ public class OrderController { orderXmlVO = new OrderXmlVO().setMemo("生产单内容为空"); flag = false; } else if (orderDO.getCustomOrderNo() != null && !orderService.customOrderNoIsExists(orderDO.getCustomOrderNo())) { - orderXmlVO.setCustomOrderNo(orderXmlVO.getCustomOrderNo() + "自定义单号重复"); + orderXmlVO.setOrderCode(orderXmlVO.getOrderCode() + "自定义单号重复"); flag = false; } else if (flag){ // 生产单的内容正确 if (orderXmlVO.getMaterialXmlVO().getPlateXmlVOS().getPlateXmlVOList().size() == 0) { orderDO.setStatus(OrderStatusEnum.EMPTY.getStatus()); } else { orderDO.setStatus(OrderStatusEnum.NEW_ORDER.getStatus()); + flag = xmlUtil.checkVO(orderXmlVO); } } if (!flag){ + System.out.println("xml = " + orderXmlVO); String xmlStr = XmlBuilder.objectToXmlStr(orderXmlVO); XMLUtil.writeErr(response, xmlStr, " 错误.xml"); return; @@ -386,6 +384,12 @@ public class OrderController { orderService.importExcelData(orderDO, type , index, list, orderXmlVO); } catch (Exception e) { log.error("文件导入异常", e); + if (type == 0) { + ExcelWriterUtil.write(response, mapOrder, list, orderService.getSavePath() + File.separator + "order_add_excel_err.xlsx"); + } else if (type == 2) { + String xmlStr = XmlBuilder.objectToXmlStr(orderXmlVO); + XMLUtil.writeErr(response, xmlStr, " 错误.xml"); + } } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/ordermodel/OrderModelDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/ordermodel/OrderModelDO.java index 980610647..41f6a7e6d 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/ordermodel/OrderModelDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/ordermodel/OrderModelDO.java @@ -69,8 +69,10 @@ public class OrderModelDO extends ESDocument { private List rawPointDetail; @Schema(description = "孔明细列表") private List holeDetail; - @Schema(description = "造型明细") + @Schema(description = "造型明细(凹槽)") private List contourDetail; + @Schema(description = "造型明细(孤岛,现在是xml数据格式添加)") + private List isletsDetail ; //造型明细(孤岛) @Schema(description = "侧面孔明细列表") private List sideHoleDetail; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateGoodMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateGoodMapper.java index f2aa7261b..6f3500231 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateGoodMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateGoodMapper.java @@ -18,8 +18,8 @@ import java.util.List; public interface PlateGoodMapper extends BaseMapperX { // goodsId匹配 - default PlateGoodDO selectGoodOne(String id, Long organId) { - return selectOne(new LambdaQueryWrapper() + default List selectGoodOne(String id, Long organId) { + return selectList(new LambdaQueryWrapper() .eq(PlateGoodDO::getGoodsId, id) .eq(PlateGoodDO::getDeleted, 0) .eq(PlateGoodDO::getOrganId, organId)); 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..9b4f5a4a3 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 @@ -48,6 +48,7 @@ import com.cf.imes.module.executor.enums.OrderDeletedEnum; import com.cf.imes.module.executor.enums.OrderStatusEnum; import com.cf.imes.module.executor.service.plan.PlanService; import com.cf.imes.module.executor.util.deviseData.structure.PlateDetail; +import com.cf.imes.module.executor.util.fileConversion.admin.SnowflakeIdWorker3rd; import com.cf.imes.module.executor.util.fileConversion.admin.api.webcad.ApiDataAchieve; import com.cf.imes.module.executor.util.fileConversion.admin.api.webcad.ApiTypeRealize; import com.cf.imes.module.executor.util.fileConversion.admin.files.excel.ExcelTypeRealize; @@ -125,6 +126,9 @@ public class OrderServiceImpl implements OrderService { @Resource private ApiDataAchieve apiDataAchieve; + @Resource + private SnowflakeIdWorker3rd idWorker; + @Resource private ApiTypeRealize apiTypeRealize; @@ -725,11 +729,11 @@ public class OrderServiceImpl implements OrderService { PlateGoodDO plateGoodDO = null; List plateGoodDOS = null; if (goodsDO.getGoodsId() != null) { // 有goodsId - plateGoodDO = plateGoodMapper.selectGoodOne(goodsDO.getGoodsId(), SecurityFrameworkUtils.getLoginUser().getOrganId()); + plateGoodDO = plateGoodMapper.selectGoodOne(goodsDO.getGoodsId(), OrganContextHolder.getOrganId()).get(0); } else { // 没有goodsId 其他信息匹配 plateGoodDOS = plateGoodMapper.selectGood(goodsDO.getGoodsName(), goodsDO.getMaterial(), goodsDO.getColor(), goodsDO.getTexture(), goodsDO.getWidth(), goodsDO.getThickness(), goodsDO.getHeight(), goodsDO.getBrand(), - goodsDO.getSpec(), SecurityFrameworkUtils.getLoginUser().getOrganId()); + goodsDO.getSpec(), OrganContextHolder.getOrganId()); } if (plateGoodDOS != null && plateGoodDOS.size() > 0) {//存在板材 @@ -738,10 +742,13 @@ public class OrderServiceImpl implements OrderService { goodsDO.setGoodsId(plateGoodDO.getGoodsId()); } else { // 不存在板材 Long plateGoods = (Long) identifierGenerator.nextId(null); - Long goodsId = (Long) identifierGenerator.nextId(null); + long plateNo = idWorker.nextId(); + long obtainingTime = idWorker.obtainingTime(); + +// Long goodsId = (Long) identifierGenerator.nextId(null); plateGoodDO = BeanUtils.toBean(goodsDO, PlateGoodDO.class) .setId(plateGoods) - .setGoodsId(String.valueOf(goodsId)); + .setGoodsId((obtainingTime) + Long.toString(plateNo).substring(2)); // 判断是否存在raw_goods_id if (goodsDO.getGoodsId() != null) { plateGoodDO.setGoodsId(goodsDO.getGoodsId()); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/IOriginModelingData.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/IOriginModelingData.java index 3b68e007a..44a1fe082 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/IOriginModelingData.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/IOriginModelingData.java @@ -39,4 +39,8 @@ public class IOriginModelingData { private Double addWidth; @Schema(description = "槽加深") private Double addDepth; + +// ============ 启用 api ============= + @Schema(description = "点列表") + private List pointList; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/ModelDetail.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/ModelDetail.java index 2267dacc3..69d90271b 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/ModelDetail.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/ModelDetail.java @@ -18,15 +18,34 @@ import java.util.List; @Schema(description = "管理后台 - 造型信息") public class ModelDetail { + @Schema(description = "造型ID") + private Integer id; + @Schema(description = "父ID") + private Integer parentId; + @Schema(description = "类型——矩形槽Rectangle、路径槽Path、内铣槽internalMilling、折返路径槽turnbackPath") private String type; @Schema(description = "使用字典进行解析 造型排版面 0正面, 1反面, 2侧面") private Integer faceType; + @Schema(description = "造型长度") + private Double width; + @Schema(description = "造型宽度") + private Double length; @Schema(description = "造型深度") private Double depth; + @Schema(description = "圆角半径") + private Double round; + + @Schema(description = "刀路冗余量(偏移重叠量)") + private Double redundance; + @Schema(description = "角度(二维刀路V型刀提角/清角用)") + private Double tangentAngle; + + @Schema(description = "造型数量") + private Integer count; @Schema(description = "造像使用刀具名称") private String knifeName; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/PlateDetail.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/PlateDetail.java index 2b947e41c..25d278ad7 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/PlateDetail.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/PlateDetail.java @@ -95,7 +95,8 @@ public class PlateDetail{ private List rawPointDetail ; //原始点明细(含封边) private List holeDetail ; //孔明细,表示板上的孔 - private List contourDetail ; //造型明细 + private List contourDetail ; //造型明细(凹槽) + private List isletsDetail ; //造型明细(孤岛) private List sideHoleDetail;//侧面孔明细 diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/ToolUtil.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/ToolUtil.java index c7c6075e3..7d90262e3 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/ToolUtil.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/ToolUtil.java @@ -57,7 +57,12 @@ public class ToolUtil { // 数据类型转换 public static Boolean convertToType(String str, Class targetType) { try { - Method method = targetType.getMethod("parse" + targetType.getSimpleName(), String.class); + Method method; + if (targetType.getSimpleName().equals("Integer")) { + method = targetType.getMethod("parseInt", String.class); + } else { + method = targetType.getMethod("parse" + targetType.getSimpleName(), String.class); + } method.invoke(null, str); return true; } catch (Exception e) { diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiTypeRealize.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiTypeRealize.java index b636bd253..188c24c3a 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiTypeRealize.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiTypeRealize.java @@ -931,6 +931,24 @@ public class ApiTypeRealize { .build()); } } + + List pointListInOrigin = new ArrayList<>(); + if (model.getJSONArray("OriginModeling") != null && !model.getJSONArray("OriginModeling").isEmpty()) { + for (int j = 0; j < model.getJSONArray("OriginModeling").size(); j++) { + JSONObject point = model.getJSONArray("OriginModeling").getJSONObject(j); + String[] points = splitAndTrim(point.getString("Pos")); + pointListInOrigin.add(PointList.builder() + .pointX(Double.valueOf(points[X])) + .pointY(Double.valueOf(points[Y])) + .pointZ(Double.valueOf(points[Z])) + .curve(Double.valueOf(point.getString("Curve"))) + .build()); + } + } + IOriginModelingData originModeling = IOriginModelingData.builder() + .pointList(pointListInOrigin) + .build(); + modelDetails.add(ModelDetail.builder() .depth(Double.valueOf(model.getString("Depth"))) .faceType(Integer.valueOf(model.getString("Face"))) @@ -938,6 +956,7 @@ public class ApiTypeRealize { .knifeRadius(Double.valueOf(model.getString("Diameter")) / 2) .pointList(pointLists) .offSetList(offSetLists) + .originModeling(originModeling) .build()); } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/AssemblyXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/AssemblyXmlVO.java index 56df3818d..01f5907fc 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/AssemblyXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/AssemblyXmlVO.java @@ -15,18 +15,14 @@ import java.io.Serializable; // 组件/部件信息 public class AssemblyXmlVO implements Serializable { - // 五金ID - @XmlAttribute(name = "组件/部件ID") - private String id; + // 五金物料编码 + @XmlAttribute(name = "itemCode") + private String itemCode; // 类型——抽屉Drawer、酒格WineGrid、框架/拼框门FrameDoor、线条(顶线、脚线、挡水条等)Line、桌面/台面TableTop、水槽Sink…… @XmlAttribute(name = "type") private String type; - // 物料编码 - @XmlAttribute(name = "itemNo") - private String itemNo; - // 厂家 @XmlAttribute(name = "manufacturer") private String manufacturer; @@ -67,7 +63,7 @@ public class AssemblyXmlVO implements Serializable { @XmlAttribute(name = "count") private String count; - // 单位 + // 长度单位 @XmlAttribute(name = "unit") private String unit; @@ -83,25 +79,37 @@ public class AssemblyXmlVO implements Serializable { @XmlAttribute(name = "shelf") private String shelf; - // 房间ID - @XmlAttribute(name = "roomId") - private String roomId; + // 房间名称 + @XmlAttribute(name = "roomName") + private String roomName; - // 柜体ID - @XmlAttribute(name = "boxId") - private String boxId; + // 房间号 + @XmlAttribute(name = "roomCode") + private String roomCode; - // 加工组ID - @XmlAttribute(name = "groupId") - private String groupId; + // 柜体名称 + @XmlAttribute(name = "boxName") + private String boxName; - // 模块ID - @XmlAttribute(name = "moduleId") - private String moduleId; + // 柜体号 + @XmlAttribute(name = "boxCode") + private String boxCode; - // 父ID - @XmlAttribute(name = "parentId") - private String parentId; + // 加工组号 + @XmlAttribute(name = "groupCode") + private String groupCode; + + // 模块名称 + @XmlAttribute(name = "moduleName") + private String moduleName; + + // 模块号 + @XmlAttribute(name = "moduleCode") + private String moduleCode; + + // 父物料编码 + @XmlAttribute(name = "parentCode") + private String parentCode; // 备注 @XmlElement(name = "Remarks") diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/BlockXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/BlockXmlVO.java index b8a4f6960..ab2976392 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/BlockXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/BlockXmlVO.java @@ -15,35 +15,35 @@ import java.io.Serializable; // 板件信息 public class BlockXmlVO implements Serializable { - // 板件ID - @XmlAttribute(name = "id") - private String id; - // 设计编号 - @XmlAttribute(name = "designNo") - private String designNo; + @XmlAttribute(name = "designCode") + private String designCode; // 生产编号 - @XmlAttribute(name = "productionNo") - private String productionNo; + @XmlAttribute(name = "productionCode") + private String productionCode; // 名称 @XmlAttribute(name = "name") private String name; - // 类型——类型——背板类、层板类、立板类 + // 类型——类型——背板类、层板类、立板类 -- order_plate_type @XmlAttribute(name = "type") private String type; - // 开向——左开、右开、上开(上翻)、下开(下翻)、非门板 + // 是否见光板/面板 ——是/否 + @XmlAttribute(name = "visible") + private String visible; + + // 开向——左开、右开、上开、下开、非门板 -- doorOpeningDirections @XmlAttribute(name = "openDirection") private String openDirection; - // 设计纹路——正纹、反纹、可翻转 + // 设计纹路——正纹、反纹、可翻转 -- grainType @XmlAttribute(name = "texture") private String texture; - // 设计饰面——无、单面贴皮/涂装(正面、反面)、双面贴皮/涂装(不同色、同色) + // 设计饰面——无、单面、双面 @XmlAttribute(name = "coatingType") private String coatingType; @@ -83,11 +83,11 @@ public class BlockXmlVO implements Serializable { @XmlAttribute(name = "cuttingThickness") private String cuttingThickness; - // 成倍数量 + // 成倍拆单数量 @XmlAttribute(name = "multipleNumber") private String multipleNumber; - // 成倍序号 + // 成倍拆单序号 @XmlAttribute(name = "multipleNo") private String multipleNo; @@ -99,7 +99,7 @@ public class BlockXmlVO implements Serializable { @XmlAttribute(name = "slotting") private String slotting; - // 排版面——设计正面、设计反面、随意面 + // 排版面——设计正面、设计反面、随意面 -- typographyType @XmlAttribute(name = "layoutFace") private String layoutFace; @@ -112,40 +112,42 @@ public class BlockXmlVO implements Serializable { private String coatingReverse; // 长度单位 - @XmlAttribute(name = "unitLength") - private String unitLength; - - // 面积单位 - @XmlAttribute(name = "unitArea") - private String unitArea; - - // 成品面积 - @XmlAttribute(name = "area") - private String area; - - // 开料面积 - @XmlAttribute(name = "areaCutting") - private String areaCutting; + @XmlAttribute(name = "unit") + private String unit; // 是否钻孔 @XmlAttribute(name = "drilling") private String drilling; - // 房间ID - @XmlAttribute(name = "roomId") - private String roomId; + // 房间名称 + @XmlAttribute(name = "roomName") + private String roomName; - // 柜体ID - @XmlAttribute(name = "boxId") - private String boxId; + // 房间号 + @XmlAttribute(name = "roomCode") + private String roomCode; + + // 房间名称 + @XmlAttribute(name = "boxName") + private String boxName; + + // 柜体号 + @XmlAttribute(name = "boxCode") + private String boxCode; + + // 加工组号 + @XmlAttribute(name = "groupCode") + private String groupCode; + + // 模块名称 + @XmlAttribute(name = "moduleName") + private String moduleName; + + // 模块号 + @XmlAttribute(name = "moduleCode") + private String moduleCode; - // 加工组ID - @XmlAttribute(name = "groupId") - private String groupId; - // 模块ID - @XmlAttribute(name = "moduleId") - private String moduleId; // 基点X坐标 @XmlAttribute(name = "basePointX") @@ -171,6 +173,8 @@ public class BlockXmlVO implements Serializable { @XmlAttribute(name = "axisZrotate") private String axisZrotate; + + // 成品(设计成型/已封边/贴皮或涂装的板件)轮廓信息 @XmlElement(name = "Outline") private OutlineXmlVO outlineXmlVO ; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/BoxXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/BoxXmlVO.java index e5429d8c9..e4ddfdd6a 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/BoxXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/BoxXmlVO.java @@ -17,10 +17,6 @@ import java.io.Serializable; @XmlAccessorType(XmlAccessType.FIELD) public class BoxXmlVO implements Serializable { - // 柜体ID - @XmlAttribute(name = "id") - private String id; - // 房间名称 @XmlAttribute(name = "name") private String name; @@ -41,6 +37,15 @@ public class BoxXmlVO implements Serializable { @XmlAttribute(name = "length") private String length; + // 成倍拆单数量 + @XmlAttribute(name = "multipleNumber") + private String multipleNumber; + + // 成倍拆单序号 + @XmlAttribute(name = "multipleNo") + private String multipleNo; + + // 基点X坐标 @XmlAttribute(name = "basePointX") private String basePointX; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/CorrelationXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/CorrelationXmlVO.java index f93cb9363..fea9be591 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/CorrelationXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/CorrelationXmlVO.java @@ -17,7 +17,59 @@ import java.io.Serializable; @XmlAccessorType(XmlAccessType.FIELD) public class CorrelationXmlVO implements Serializable { - // [关联五金ID/关联组件ID] - @XmlAttribute(name = "id") - private String id; + // 关联五金/关联组件物料编码 + @XmlAttribute(name = "itemCode") + private String itemCode; + + // 类型 + @XmlAttribute(name = "type") + private String type; + + // 厂家 + @XmlAttribute(name = "manufacturer") + private String manufacturer; + + // 品牌 + @XmlAttribute(name = "brand") + private String brand; + + // 名称 + @XmlAttribute(name = "name") + private String name; + + // 材质 + @XmlAttribute(name = "material") + private String material; + + // 颜色 + @XmlAttribute(name = "color") + private String color; + + // 规格/类型 + @XmlAttribute(name = "specs") + private String specs; + + // 长 + @XmlAttribute(name = "length") + private String length; + + // 宽 + @XmlAttribute(name = "width") + private String width; + + // 高 + @XmlAttribute(name = "height") + private String height; + + // 长度单位 + @XmlAttribute(name = "unit") + private String unit; + + // 数量 + @XmlAttribute(name = "count") + private String count; + + // 数量单位 + @XmlAttribute(name = "unitCount") + private String unitCount; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/CorrelationXmlVOS.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/CorrelationXmlVOS.java index c68736b2d..1d52e003c 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/CorrelationXmlVOS.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/CorrelationXmlVOS.java @@ -4,10 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.*; import java.io.Serializable; import java.util.List; @@ -18,6 +15,10 @@ import java.util.List; @XmlAccessorType(XmlAccessType.FIELD) public class CorrelationXmlVOS implements Serializable { + // 关联配件数量 + @XmlAttribute(name = "count") + private String count; + // 房间 @XmlElement(name = "correlation") private List correlationXmlVOList; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/EdgingXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/EdgingXmlVO.java index 8b55addd1..c38ec8913 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/EdgingXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/EdgingXmlVO.java @@ -15,13 +15,9 @@ import java.io.Serializable; // 封边条信息 public class EdgingXmlVO implements Serializable { - // 封边条ID - @XmlAttribute(name = "id") - private String id; - - // 物料编码 - @XmlAttribute(name = "itemNo") - private String itemNo; + // 封边条物料编码 + @XmlAttribute(name = "itemCode") + private String itemCode; // 厂家 @XmlAttribute(name = "manufacturer") @@ -79,25 +75,37 @@ public class EdgingXmlVO implements Serializable { @XmlAttribute(name = "unitCount") private String unitCount; - // 房间ID - @XmlAttribute(name = "roomId") - private String roomId; + // 房间名称 + @XmlAttribute(name = "roomName") + private String roomName; - // 柜体ID - @XmlAttribute(name = "boxId") - private String boxId; + // 房间号 + @XmlAttribute(name = "roomCode") + private String roomCode; - // 加工组ID - @XmlAttribute(name = "groupId") - private String groupId; + // 柜体名称 + @XmlAttribute(name = "boxName") + private String boxName; - // 模块ID - @XmlAttribute(name = "moduleId") - private String moduleId; + // 柜体号 + @XmlAttribute(name = "boxCode") + private String boxCode; - // 父ID - @XmlAttribute(name = "parentId") - private String parentId; + // 加工组名称 + @XmlAttribute(name = "groupName") + private String groupName; + + // 加工组号 + @XmlAttribute(name = "groupCode") + private String groupCode; + + // 模块名称 + @XmlAttribute(name = "moduleName") + private String moduleName; + + // 模块号 + @XmlAttribute(name = "moduleCode") + private String moduleCode; // 备注 @XmlElement(name = "Remarks") diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/GrooveXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/GrooveXmlVO.java index 49202225a..8802bed73 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/GrooveXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/GrooveXmlVO.java @@ -91,4 +91,7 @@ public class GrooveXmlVO implements Serializable { // 偏移刀路列表 @XmlElement(name = "offsetLines") private OffsetLineXmlVOS offsetLineXmlVOS; + + @XmlAttribute(name = "result") + private String result; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/GrooveXmlVOS.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/GrooveXmlVOS.java index 20946770f..736d446ee 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/GrooveXmlVOS.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/GrooveXmlVOS.java @@ -20,18 +20,34 @@ public class GrooveXmlVOS implements Serializable { @XmlAttribute(name = "count") private String count; - // 正面垂凹槽数量 + // 正面垂凹槽数量/凹槽数量 @XmlAttribute(name = "countFaceA") private String countFaceA; - // 反面凹槽数量 + // 反面凹槽数量/凹槽数量 @XmlAttribute(name = "countFaceB") private String countFaceB; - // 侧凹槽数量 + // 侧凹槽数量/凹槽数量 @XmlAttribute(name = "countSide") private String countSide; + // 左侧槽数量/凹槽数量 + @XmlAttribute(name = "countSideL") + private String countSideL; + + // 右侧槽数量/凹槽数量 + @XmlAttribute(name = "countSideR") + private String countSideR; + + // 上侧槽数量/凹槽数量 + @XmlAttribute(name = "countSideU") + private String countSideU; + + // 下侧槽数量/凹槽数量 + @XmlAttribute(name = "countSideD") + private String countSideD; + // 斜面凹槽数量 @XmlAttribute(name = "countBevelled") private String countBevelled; @@ -44,6 +60,14 @@ public class GrooveXmlVOS implements Serializable { @XmlAttribute(name = "countThrough") private String countThrough; + // 二维造型刀路数量 + @XmlAttribute(name = "count2V") + private String count2V; + + // 三维造型刀路(浮雕)数量 + @XmlAttribute(name = "count3D") + private String count3D; + // 凹槽信息 @XmlElement(name = "Groove") private List grooveXmlVOList; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/GroupXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/GroupXmlVO.java index 23b8751af..bf4de8884 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/GroupXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/GroupXmlVO.java @@ -17,10 +17,6 @@ import java.io.Serializable; @XmlAccessorType(XmlAccessType.FIELD) public class GroupXmlVO implements Serializable { - // 加工组ID - @XmlAttribute(name = "id") - private String id; - // 加工组名称 @XmlAttribute(name = "name") private String name; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/HardwareXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/HardwareXmlVO.java index 88329ff81..49eb4d426 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/HardwareXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/HardwareXmlVO.java @@ -15,18 +15,14 @@ import java.io.Serializable; // 五金信息 public class HardwareXmlVO implements Serializable { - // 五金ID - @XmlAttribute(name = "id") - private String id; + // 五金物料编码 + @XmlAttribute(name = "itemCode") + private String itemCode; // 类型——拉手Handle、铰链Hinge、导轨Track、衣杆/裤杆Pole、杆托/杆座PoleBase、拉直器Straightener、灯带LightBelt、螺丝(及螺母)Screw(Nut)…… @XmlAttribute(name = "type") private String type; - // 物料编码 - @XmlAttribute(name = "itemNo") - private String itemNo; - // 厂家 @XmlAttribute(name = "manufacturer") private String manufacturer; @@ -67,7 +63,7 @@ public class HardwareXmlVO implements Serializable { @XmlAttribute(name = "count") private String count; - // 单位 + // 长度单位 @XmlAttribute(name = "unit") private String unit; @@ -83,25 +79,37 @@ public class HardwareXmlVO implements Serializable { @XmlAttribute(name = "shelf") private String shelf; - // 房间ID - @XmlAttribute(name = "roomId") - private String roomId; + // 房间名称 + @XmlAttribute(name = "roomName") + private String roomName; - // 柜体ID - @XmlAttribute(name = "boxId") - private String boxId; + // 房间号 + @XmlAttribute(name = "roomCode") + private String roomCode; - // 加工组ID - @XmlAttribute(name = "groupId") - private String groupId; + // 柜体名称 + @XmlAttribute(name = "boxName") + private String boxName; - // 模块ID - @XmlAttribute(name = "moduleId") - private String moduleId; + // 柜体号 + @XmlAttribute(name = "boxCode") + private String boxCode; - // 父ID - @XmlAttribute(name = "parentId") - private String parentId; + // 加工组号 + @XmlAttribute(name = "groupCode") + private String groupCode; + + // 模块名称 + @XmlAttribute(name = "moduleName") + private String moduleName; + + // 模块号 + @XmlAttribute(name = "moduleCode") + private String moduleCode; + + // 父物料编码 + @XmlAttribute(name = "parentCode") + private String parentCode; // 备注 @XmlElement(name = "Remarks") diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/HoleXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/HoleXmlVO.java index caabba289..b7a0a3187 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/HoleXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/HoleXmlVO.java @@ -14,10 +14,6 @@ import java.io.Serializable; @XmlAccessorType(XmlAccessType.FIELD) public class HoleXmlVO implements Serializable { - // 孔ID - @XmlAttribute(name = "id") - private String id; - // 孔类型 @XmlAttribute(name = "type") private String type; @@ -74,6 +70,59 @@ public class HoleXmlVO implements Serializable { @XmlAttribute(name = "toolNo") private String toolNo; + // 起点坐标X + @XmlAttribute(name = "startX") + private String startX; + + // 起点坐标Y + @XmlAttribute(name = "startY") + private String startY; + + // 起点坐标Z + @XmlAttribute(name = "startZ") + private String startZ; + + // 刀具起点X轴旋转角度 + @XmlAttribute(name = "toolStartRotateX") + private String toolStartRotateX; + + // 刀具起点Y轴旋转角度 + @XmlAttribute(name = "toolStartRotateY") + private String toolStartRotateY; + + // 刀具起点Z轴旋转角度 + @XmlAttribute(name = "toolStartRotateZ") + private String toolStartRotateZ; + + // 终点坐标X + @XmlAttribute(name = "endX") + private String endX; + + // 终点坐标Y + @XmlAttribute(name = "endY") + private String endY; + + // 终点坐标Z + @XmlAttribute(name = "endZ") + private String endZ; + + // 刀具终点X轴旋转角度 + @XmlAttribute(name = "toolEndRotateX") + private String toolEndRotateX; + + // 刀具终点Y轴旋转角度 + @XmlAttribute(name = "toolEndRotateY") + private String toolEndRotateY; + + // 刀具终点Z轴旋转角度 + @XmlAttribute(name = "toolEndRotateZ") + private String toolEndRotateZ; + + + + + + // 是否不要 @XmlElement(name = "Begin") private PointBeginXmlVO pointBeginXmlVO; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/HoleXmlVOS.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/HoleXmlVOS.java index fd6fa2d0e..b57295e6f 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/HoleXmlVOS.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/HoleXmlVOS.java @@ -32,6 +32,22 @@ public class HoleXmlVOS implements Serializable { @XmlAttribute(name = "countSide") private String countSide; + // 左侧孔数量 + @XmlAttribute(name = "countSideL") + private String countSideL; + + // 右侧孔数量 + @XmlAttribute(name = "countSideR") + private String countSideR; + + // 上侧孔数量 + @XmlAttribute(name = "countSideU") + private String countSideU; + + // 下侧孔数量 + @XmlAttribute(name = "countSideD") + private String countSideD; + // 斜面孔数量 @XmlAttribute(name = "countBevelled") private String countBevelled; @@ -44,7 +60,11 @@ public class HoleXmlVOS implements Serializable { @XmlAttribute(name = "countBuildIn") private String countBuildIn; - // 挖穿孔数量 + // 铰链孔数量 + @XmlAttribute(name = "countHinge") + private String countHinge; + + // 挖穿孔数量(通孔/对成孔) @XmlAttribute(name = "countThrough") private String countThrough; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/IsletXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/IsletXmlVO.java index 54a96cf38..13ad7cafe 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/IsletXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/IsletXmlVO.java @@ -29,6 +29,6 @@ public class IsletXmlVO implements Serializable { private String grooveCount; // 孤岛点信息 - @XmlElement(name = "Point") - private List pointXmlVOList; + @XmlElement(name = "Points") + private PointXmlVOS pointXmlVOS; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/IsletXmlVOS.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/IsletXmlVOS.java index bcd177bba..503f1f5e2 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/IsletXmlVOS.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/IsletXmlVOS.java @@ -4,10 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.*; import java.io.Serializable; import java.util.List; @@ -19,6 +16,10 @@ import java.util.List; // 孤岛列表 public class IsletXmlVOS implements Serializable { + // 孤岛数量 + @XmlAttribute(name = "count") + private String count; + // 房间 @XmlElement(name = "Islet") private List isletXmlVOList; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/MaterialXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/MaterialXmlVO.java index 2af12034f..e5f490e54 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/MaterialXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/MaterialXmlVO.java @@ -10,7 +10,7 @@ import java.io.Serializable; @Data @AllArgsConstructor @NoArgsConstructor -@XmlRootElement(name = "Material") +@XmlRootElement(name = "Materials") @XmlAccessorType(XmlAccessType.FIELD) // 物料信息 public class MaterialXmlVO implements Serializable { diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/ModuleXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/ModuleXmlVO.java index b4de6bf05..42a9aa11c 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/ModuleXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/ModuleXmlVO.java @@ -14,10 +14,6 @@ import java.io.Serializable; @XmlAccessorType(XmlAccessType.FIELD) public class ModuleXmlVO implements Serializable { - // 模块ID - @XmlAttribute(name = "id") - private String id; - // 模块名称 @XmlAttribute(name = "name") private String name; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/OffsetLineXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/OffsetLineXmlVO.java index af152f525..6d0f1ea9b 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/OffsetLineXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/OffsetLineXmlVO.java @@ -18,10 +18,6 @@ import java.io.Serializable; // 偏移刀路信息 public class OffsetLineXmlVO implements Serializable { - // 偏移刀路ID - @XmlAttribute(name = "id") - private String id; - // 偏移值——正值外偏/右偏、负值内偏/左偏 @XmlAttribute(name = "offset") private String offset; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/OffsetLineXmlVOS.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/OffsetLineXmlVOS.java index 7e215727f..14189e2ff 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/OffsetLineXmlVOS.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/OffsetLineXmlVOS.java @@ -4,10 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.*; import java.io.Serializable; import java.util.List; @@ -19,6 +16,10 @@ import java.util.List; // 偏移刀路列表 public class OffsetLineXmlVOS implements Serializable { + // 偏移刀路数量 + @XmlAttribute(name = "count") + private String count; + @XmlElement(name = "offsetLine") private List offsetLineXmlVOList; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/OrderXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/OrderXmlVO.java index f87f036cf..09165b9c3 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/OrderXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/OrderXmlVO.java @@ -13,17 +13,14 @@ import java.io.Serializable; @XmlRootElement(name = "Order") @XmlAccessorType(XmlAccessType.FIELD) public class OrderXmlVO implements Serializable { - // 订单ID - @XmlAttribute(name = "id") - private String id; // 订单编号 @XmlAttribute(name = "orderNo") private String orderNo; // 订单自定义编号 - @XmlAttribute(name = "customOrderNo") - private String customOrderNo; + @XmlAttribute(name = "orderCode") + private String orderCode; // 客户 @XmlAttribute(name = "customer") @@ -110,7 +107,7 @@ public class OrderXmlVO implements Serializable { private GroupXmlVOS groupXmlVOS; // 材质信息 - @XmlElement(name = "Material") + @XmlElement(name = "Materials") private MaterialXmlVO materialXmlVO; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PlateXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PlateXmlVO.java index 7f768fdd6..2d4e48f12 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PlateXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PlateXmlVO.java @@ -15,13 +15,9 @@ import java.io.Serializable; // 板材信息 public class PlateXmlVO implements Serializable { - // 板材ID - @XmlAttribute(name = "id") - private String id; - // 物料编码 - @XmlAttribute(name = "itemNo") - private String itemNo; + @XmlAttribute(name = "itemCode") + private String itemCode; // 厂家 @XmlAttribute(name = "manufacturer") @@ -39,19 +35,19 @@ public class PlateXmlVO implements Serializable { @XmlAttribute(name = "material") private String material; - // 饰面类型——无、单面贴皮/涂装、双面贴皮/涂装 + // 饰面类型——无、单面、双面 @XmlAttribute(name = "coating") private String coating; - // 有无纹理 + // 有无纹理 有 无 @XmlAttribute(name = "grained") private String grained; - // 正面饰面颜色、无 + // 正面饰面颜色、无(空) @XmlAttribute(name = "coatingObverse") private String coatingObverse; - // 反面饰面颜色、无 + // 反面饰面颜色、无(空) @XmlAttribute(name = "coatingReverse") private String coatingReverse; @@ -115,6 +111,10 @@ public class PlateXmlVO implements Serializable { @XmlAttribute(name = "memo") private String memo; + // 数量 + @XmlAttribute(name = "count") + private String count; + @XmlElement(name = "Blocks") private BlockXmlVOS blockXmlVOS; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PlateXmlVOS.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PlateXmlVOS.java index 558c5531c..f69cff0f9 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PlateXmlVOS.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PlateXmlVOS.java @@ -21,7 +21,7 @@ public class PlateXmlVOS implements Serializable { @XmlElement( name = "Plate") private List plateXmlVOList; - // 上传结果 + // 上传结果 内置 @XmlElement( name = "result") private String result; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PointXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PointXmlVO.java index c213ce0bd..566e92a21 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PointXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PointXmlVO.java @@ -18,10 +18,6 @@ import java.io.Serializable; // 孤岛点信息 public class PointXmlVO implements Serializable { - // 点ID - @XmlAttribute(name = "id") - private String id; - // 点X坐标 @XmlAttribute(name = "pointX") private String pointX; @@ -30,7 +26,7 @@ public class PointXmlVO implements Serializable { @XmlAttribute(name = "pointY") private String pointY; - // 点Z坐标 + // 点Z坐标 (在outline中不用) @XmlAttribute(name = "pointZ") private String pointZ; @@ -46,13 +42,13 @@ public class PointXmlVO implements Serializable { @XmlAttribute(name = "process") private String process; - // 封边条ID - @XmlAttribute(name = "edgingId") - private String edgingId; + // 封边条物料编码 + @XmlAttribute(name = "itemCode") + private String itemCode; - // 封边条厚度 - @XmlAttribute(name = "edgingThickness") - private String edgingThickness; + // 封边条物料名称 + @XmlAttribute(name = "edgingName") + private String edgingName; // 封边条颜色 @XmlAttribute(name = "edgingColor") @@ -62,7 +58,19 @@ public class PointXmlVO implements Serializable { @XmlAttribute(name = "edgingMaterial") private String edgingMaterial; - // 封边条余量(两头) + // 封边条厚度 + @XmlAttribute(name = "edgingThickness") + private String edgingThickness; + + // 封边条宽度 + @XmlAttribute(name = "edgingWidth") + private String edgingWidth; + + // 封边条长度 + @XmlAttribute(name = "edgingLength") + private String edgingLength; + + // 封边条余量 @XmlAttribute(name = "edgingExtend") private String edgingExtend; @@ -70,7 +78,7 @@ public class PointXmlVO implements Serializable { @XmlAttribute(name = "preMilling") private String preMilling; - // 延展/收缩量 + // 延展/收缩量,预留边 @XmlAttribute(name = "scale") private String scale; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PointXmlVOS.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PointXmlVOS.java index 7fc7d6c58..379a48d97 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PointXmlVOS.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PointXmlVOS.java @@ -4,10 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.*; import java.io.Serializable; import java.util.List; @@ -18,6 +15,13 @@ import java.util.List; @XmlAccessorType(XmlAccessType.FIELD) public class PointXmlVOS implements Serializable { + // 刀路点阵数量 + @XmlAttribute(name = "count") + private String count; + @XmlElement(name = "Point") private List pointXmlVOList; + + @XmlAttribute(name = "result") + private String result; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/RemarkXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/RemarkXmlVO.java index 666df5d93..0e1570ab2 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/RemarkXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/RemarkXmlVO.java @@ -17,10 +17,6 @@ import java.io.Serializable; @XmlAccessorType(XmlAccessType.FIELD) public class RemarkXmlVO implements Serializable { - // 备注ID - @XmlAttribute(name = "id") - private String id; - // 备注名称 @XmlAttribute(name = "name") private String name; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/RoomXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/RoomXmlVO.java index d00b74640..e953cea17 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/RoomXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/RoomXmlVO.java @@ -15,10 +15,6 @@ import java.util.List; @XmlAccessorType(XmlAccessType.FIELD) public class RoomXmlVO implements Serializable { - // 房间ID - @XmlAttribute(name = "id") - private String id; - // 房间名称 @XmlAttribute(name = "name") private String name; @@ -39,10 +35,43 @@ public class RoomXmlVO implements Serializable { @XmlAttribute(name = "length") private String length; - // 房间数量 + // 成倍拆单数量 + @XmlAttribute(name = "multipleNumber") + private String multipleNumber; + + // 成倍拆单序号 + @XmlAttribute(name = "multipleNo") + private String multipleNo; + + // 柜体数量 @XmlAttribute(name = "count") private String count; + + // 基点X坐标 + @XmlAttribute(name = "basePointX") + private String basePointX; + + // 基点Y坐标 + @XmlAttribute(name = "basePointY") + private String basePointY; + + // 基点Z坐标 + @XmlAttribute(name = "basePointZ") + private String basePointZ; + + // 绕X轴旋转角度 + @XmlAttribute(name = "axisXrotate") + private String axisXrotate; + + // 绕Y轴旋转角度 + @XmlAttribute(name = "axisYrotate") + private String axisYrotate; + + // 绕Z轴旋转角度 + @XmlAttribute(name = "axisZrotate") + private String axisZrotate; + @XmlElement(name = "Box") private List boxXmlVOList; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XMLUtil.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XMLUtil.java index 36ad584c2..72cb28c8b 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XMLUtil.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XMLUtil.java @@ -88,22 +88,11 @@ public class XMLUtil { Map map = new HashMap<>(); boolean error = true; - if (orderXmlVO.getCustomOrderNo() == null) { - orderXmlVO.setCustomOrderNo("---< 客户不能为空 >---"); + if (orderXmlVO.getCustomer() == null) { + orderXmlVO.setCustomer("---< 客户名不能为空 >---"); error = false; } - if (orderXmlVO.getDealer() == null) { - orderXmlVO.setDealer("---< 经销商不能为空 >---"); - error = false; - } - if (orderXmlVO.getCustomerAddress() == null) { - orderXmlVO.setCustomerAddress("---< 客户地址不能为空 >---"); - error = false; - } - if (orderXmlVO.getCustomerPhone() == null) { - orderXmlVO.setCustomerPhone("---< 客户电话不能为空 >---"); - error = false; - } else { + if (orderXmlVO.getCustomerPhone() != null) { if (!ToolUtil.validatePhoneNumber(orderXmlVO.getCustomerPhone())) { orderXmlVO.setCustomerPhone("---< " + orderXmlVO.getCustomerPhone() + "客户电话格式错误 >---"); error = false; @@ -115,13 +104,30 @@ public class XMLUtil { error = false; } } + if (orderXmlVO.getSellerPhone() != null) { + if (!ToolUtil.validatePhoneNumber(orderXmlVO.getSellerPhone())) { + orderXmlVO.setSellerPhone("---< " + orderXmlVO.getSellerPhone() + "业务员电话格式错误 >---"); + error = false; + } + } + if (orderXmlVO.getDesignerPhone() != null) { + if (!ToolUtil.validatePhoneNumber(orderXmlVO.getDesignerPhone())) { + orderXmlVO.setDesignerPhone("---< " + orderXmlVO.getDesignerPhone() + "设计师电话格式错误 >---"); + error = false; + } + } + if (orderXmlVO.getAnalystPhone() != null) { + if (!ToolUtil.validatePhoneNumber(orderXmlVO.getAnalystPhone())) { + orderXmlVO.setAnalystPhone("---< " + orderXmlVO.getAnalystPhone() + "解单员电话格式错误 >---"); + error = false; + } + } LocalDate orderDate = null; LocalDate deliverDate = null; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); Map mapDate = ToolUtil.changeDate(orderXmlVO.getOrderDate(), formatter); if (orderXmlVO.getOrderDate() == null) { - orderXmlVO.setOrderDate("---< 订单日期不能为空 >---"); - error = false; + orderDate = LocalDate.now(); } else { if (mapDate.get("error") instanceof Integer && (Integer) mapDate.get("error") == -1) { orderXmlVO.setOrderDate("---< " + orderXmlVO.getOrderDate() + "订单日期格式错误 >---"); @@ -132,8 +138,7 @@ public class XMLUtil { } mapDate = ToolUtil.changeDate(orderXmlVO.getDeliveryDate(), formatter); if (orderXmlVO.getDeliveryDate() == null) { - orderXmlVO.setDeliveryDate("---< 出货日期不能为空 >---"); - error = false; + deliverDate = orderDate.plus(30, ChronoUnit.DAYS); } else { if (mapDate.get("error") instanceof Integer && (Integer) mapDate.get("error") == -1) { orderXmlVO.setDeliveryDate("---< " + orderXmlVO.getDeliveryDate() + "出货日期格式错误 >---"); @@ -152,7 +157,7 @@ public class XMLUtil { .organId(organId) .dataType(DataTypeEnum.FILE_IMPORT.getStatus()) .customer(orderXmlVO.getCustomer()) - .customOrderNo(orderXmlVO.getCustomOrderNo()) + .customOrderNo(orderXmlVO.getOrderCode()) .dealer(orderXmlVO.getDealer()) .dealerPhoneNumber(orderXmlVO.getDealerPhone()) .address(orderXmlVO.getCustomerAddress()) @@ -195,70 +200,254 @@ public class XMLUtil { MaterialXmlVO materialXmlVO = orderXmlVO.getMaterialXmlVO(); if ( materialXmlVO != null ) { PlateXmlVOS plateXmlVOS = materialXmlVO.getPlateXmlVOS(); - if (plateXmlVOS != null) { + if (plateXmlVOS != null && plateXmlVOS.getPlateXmlVOList().size() > 0) { + checkPlates(plateXmlVOS.getPlateXmlVOList(), flag); + } - } else { - materialXmlVO.setPlateXmlVOS(new PlateXmlVOS().setResult("---< 板材信息不能为空 >---")); + AccessoryXmlVO accessoryXmlVO = materialXmlVO.getAccessoryXmlVO(); //配件 + if (accessoryXmlVO != null ){ + checkEdgings(accessoryXmlVO.getEdgingXmlVOS(), flag); + checkHardwares(accessoryXmlVO.getHardwareXmlVOS(), flag); + } + + AssemblieXmlVOS assemblieXmlVOS = materialXmlVO.getAssemblieXmlVOS(); // 组件 + if (assemblieXmlVOS != null && assemblieXmlVOS.getAssemblyXmlVOList() != null && assemblieXmlVOS.getAssemblyXmlVOList().size() > 0) { + checkAssemblies(assemblieXmlVOS, flag); } } return flag; } + private void checkAssemblies(AssemblieXmlVOS assemblieXmlVOS, Boolean flag) { + if (assemblieXmlVOS != null && assemblieXmlVOS.getAssemblyXmlVOList().size() > 0) { + for (AssemblyXmlVO assemblyXmlVO : assemblieXmlVOS.getAssemblyXmlVOList()) { + if (StringUtils.isEmpty(assemblyXmlVO.getName())){ + assemblyXmlVO.setName("---< 组件名称不能为空 >---"); + flag = false; + } + if (StringUtils.isEmpty(assemblyXmlVO.getMaterial())){ + assemblyXmlVO.setMaterial("---< 组件材质不能为空 >---"); + flag = false; + } + if (StringUtils.isEmpty(assemblyXmlVO.getColor())){ + assemblyXmlVO.setColor("---< 组件颜色不能为空 >---"); + flag = false; + } + if (StringUtils.isEmpty(assemblyXmlVO.getCount())){ + assemblyXmlVO.setCount("---< 组件数量不能为空 >---"); + flag = false; + } else { + if (!checkNumber(assemblyXmlVO.getCount().trim(), Double.class)){ + assemblyXmlVO.setCount("---< " + assemblyXmlVO.getCount() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + flag = false; + } + } + if (StringUtils.isEmpty(assemblyXmlVO.getUnitCount())){ + assemblyXmlVO.setUnit("---< 组件数量单位不能为空 >---"); + flag = false; + } + } + } + } + + private void checkHardwares(HardwareXmlVOS hardwareXmlVOS, Boolean flag) { + if (hardwareXmlVOS != null && hardwareXmlVOS.getHardwareXmlVOList().size() > 0) { + for (HardwareXmlVO hardwareXmlVO : hardwareXmlVOS.getHardwareXmlVOList()) { + if (StringUtils.isEmpty(hardwareXmlVO.getName())){ + hardwareXmlVO.setName("---< 五金名称不能为空 >---"); + flag = false; + } + if (StringUtils.isEmpty(hardwareXmlVO.getMaterial())){ + hardwareXmlVO.setMaterial("---< 五金材质不能为空 >---"); + flag = false; + } + if (StringUtils.isEmpty(hardwareXmlVO.getColor())){ + hardwareXmlVO.setColor("---< 五金条颜色不能为空 >---"); + flag = false; + } + if (StringUtils.isEmpty(hardwareXmlVO.getCount())){ + hardwareXmlVO.setCount("---< 五金数量不能为空 >---"); + flag = false; + } else { + if (!checkNumber(hardwareXmlVO.getCount().trim() , Double.class)){ + hardwareXmlVO.setCount("---< " + hardwareXmlVO.getCount() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + flag = false; + } + } + if (StringUtils.isEmpty(hardwareXmlVO.getUnitCount())){ + hardwareXmlVO.setUnitCount("---< 五金数量单位不能为空 >---"); + flag = false; + } + if (StringUtils.isEmpty(hardwareXmlVO.getUnit())){ + hardwareXmlVO.setUnit("---< 五金单位不能为空 >---"); + flag = false; + } + } + } + } + + private void checkEdgings(EdgingXmlVOS edgingXmlVOS, Boolean flag) { + if (edgingXmlVOS != null && edgingXmlVOS.getEdgingXmlVOList().size() > 0) { + for (EdgingXmlVO edgingXmlVO : edgingXmlVOS.getEdgingXmlVOList()) { + if (StringUtils.isEmpty(edgingXmlVO.getName())){ + edgingXmlVO.setName("---< 封边条名称不能为空 >---"); + flag = false; + } + if (StringUtils.isEmpty(edgingXmlVO.getMaterial())){ + edgingXmlVO.setMaterial("---< 封边条材质不能为空 >---"); + flag = false; + } + if (StringUtils.isEmpty(edgingXmlVO.getColor())){ + edgingXmlVO.setColor("---< 封边条颜色不能为空 >---"); + flag = false; + } + if (StringUtils.isEmpty(edgingXmlVO.getLength())){ + edgingXmlVO.setLength("---< 封边条长度不能为空 >---"); + flag = false; + } else if (!checkNumber(edgingXmlVO.getLength().trim(), Double.class)){ + edgingXmlVO.setLength("---< " + edgingXmlVO.getLength() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + flag = false; + } + if (StringUtils.isEmpty(edgingXmlVO.getWidth())){ + edgingXmlVO.setWidth("---< 封边条宽度不能为空 >---"); + flag = false; + } else if (!checkNumber(edgingXmlVO.getWidth().trim(), Double.class)){ + edgingXmlVO.setWidth("---< " + edgingXmlVO.getWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + flag = false; + } + if (StringUtils.isEmpty(edgingXmlVO.getThickness())){ + edgingXmlVO.setThickness("---< 封边条厚度不能为空 >---"); + flag = false; + } else if (!checkNumber(edgingXmlVO.getThickness().trim(), Double.class)){ + edgingXmlVO.setThickness("---< " + edgingXmlVO.getThickness() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + } + if (StringUtils.isEmpty(edgingXmlVO.getUnit())){ + edgingXmlVO.setUnit("mm"); + } else { + DictDataRespDTO dictData = dictDataApi.parseDictData(DictTypeConstants.UNIT_LENGTH, edgingXmlVO.getUnit().trim()).getData(); + if (dictData == null) { + edgingXmlVO.setUnit("---< " + edgingXmlVO.getUnit().trim() + "封边条长度单位无效 >---"); + flag = false; + } + } + if (StringUtils.isEmpty(edgingXmlVO.getCount())){ + edgingXmlVO.setCount("---< 封边条数量不能为空 >---"); + flag = false; + } else if (!checkNumber(edgingXmlVO.getCount().trim(), Double.class)){ + edgingXmlVO.setCount("---< " + edgingXmlVO.getCount() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + flag = false; + } + if (StringUtils.isEmpty(edgingXmlVO.getUnitCount())){ + edgingXmlVO.setUnitCount("m"); + flag = false; + } else { + DictDataRespDTO dictData = dictDataApi.parseDictData(DictTypeConstants.UNIT_LENGTH, edgingXmlVO.getUnitCount().trim()).getData(); + if (dictData == null) { + edgingXmlVO.setUnitCount(edgingXmlVO.getUnitCount() + "---< " + "封边条数量单位无效 >---"); + } + } + } + } + } + // 房间数据格式验证 public void checkRoom(RoomXmlVOS roomXmlVOS, Boolean error) { - if (StringUtils.isEmpty(roomXmlVOS.getCount())) { - roomXmlVOS.setCount("---< 房间数量不能为空 >---"); - error = false; - } else { - if (ToolUtil.convertToType(roomXmlVOS.getCount(), Integer.class)){ - if (!ToolUtil.checkNumber(roomXmlVOS.getCount())){ - roomXmlVOS.setCount("---< " + roomXmlVOS.getCount() + POSITIVE_ERR + " >---"); + if (!StringUtils.isEmpty(roomXmlVOS.getCount())) { + if (ToolUtil.convertToType(roomXmlVOS.getCount().trim(), Integer.class)){ + if (!ToolUtil.checkNumber(roomXmlVOS.getCount().trim())){ + roomXmlVOS.setCount(roomXmlVOS.getCount() + "---< " + POSITIVE_ERR + " >---"); error = false; } } else { - roomXmlVOS.setCount("---< " + roomXmlVOS.getCount() + TYPE_ERR + " >---"); + roomXmlVOS.setCount(roomXmlVOS.getCount() + "---< " + roomXmlVOS.getCount() + TYPE_ERR + " >---"); error = false; } } for ( RoomXmlVO room : roomXmlVOS.getRoomXmlVOList() ) { if (room != null){ - if (StringUtils.isEmpty(room.getId())){ - room.setId("---< 房间编号不能为空 >---"); - error = false; - } - if (StringUtils.isEmpty(room.getName())){ - room.setName("---< 房间名称不能为空 >---"); - error = false; - } if (!StringUtils.isEmpty(room.getHeight()) ){ - Boolean flag = checkNumber(room.getHeight(), Double.class); + Boolean flag = checkNumber(room.getHeight().trim(), Double.class); if (!flag) { - room.setHeight("---< " + room.getHeight() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + room.setHeight(room.getHeight() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; } } else { room.setHeight("0"); } if (!StringUtils.isEmpty(room.getLength()) ){ - Boolean flag = checkNumber(room.getLength(), Double.class); + Boolean flag = checkNumber(room.getLength().trim(), Double.class); if (!flag) { - room.setLength("---< " + room.getLength() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + room.setLength(room.getLength() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; } } else { room.setLength("0"); } if (!StringUtils.isEmpty(room.getWidth()) ){ - Boolean flag = checkNumber(room.getWidth(), Double.class); + Boolean flag = checkNumber(room.getWidth().trim(), Double.class); if (!flag) { - room.setWidth("---< " + room.getWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + room.setWidth(room.getWidth() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; } }else { room.setWidth("0"); } - + if (!StringUtils.isEmpty(room.getMultipleNumber()) ){ + Boolean flag = checkNumber(room.getMultipleNumber().trim(), Integer.class); + if (!flag) { + room.setMultipleNumber(room.getMultipleNumber() +"---< " + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + }else { + room.setMultipleNumber("1"); + } + if (!StringUtils.isEmpty(room.getMultipleNo()) ){ + Boolean flag = checkNumber(room.getMultipleNo().trim(), Integer.class); + if (!flag) { + room.setMultipleNo(room.getMultipleNo() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + }else { + room.setMultipleNo("1"); + } + if (!StringUtils.isEmpty(room.getBasePointX()) ){ + if (!ToolUtil.convertToType(room.getBasePointX().trim(), Double.class)) { + room.setBasePointX("---< " + room.getBasePointX() + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(room.getBasePointY()) ){ + if (!ToolUtil.convertToType(room.getBasePointY().trim(), Double.class)) { + room.setBasePointY("---< " + room.getBasePointY() + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(room.getBasePointZ()) ){ + if (!ToolUtil.convertToType(room.getBasePointZ().trim(), Double.class)) { + room.setBasePointZ("---< " + room.getBasePointZ() + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(room.getAxisXrotate()) ){ + if (!ToolUtil.convertToType(room.getAxisXrotate().trim(), Double.class)) { + room.setAxisXrotate("---< " + room.getAxisXrotate() + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(room.getAxisYrotate()) ){ + if (!ToolUtil.convertToType(room.getAxisYrotate().trim(), Double.class)) { + room.setAxisYrotate("---< " + room.getAxisYrotate() + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(room.getAxisZrotate()) ){ + if (!ToolUtil.convertToType(room.getAxisZrotate().trim(), Double.class)) { + room.setAxisZrotate("---< " + room.getAxisZrotate() + TYPE_ERR + " >---"); + error = false; + } + } + // 柜体数据格式验证 if (room.getBoxXmlVOList() != null && room.getBoxXmlVOList().size() > 0){ checkBoxList(room.getBoxXmlVOList(), error); } @@ -268,16 +457,8 @@ public class XMLUtil { // 柜体数据格式验证 public void checkBoxList(List boxXmlVOList, Boolean error) { for ( BoxXmlVO box : boxXmlVOList ) { - if (StringUtils.isEmpty(box.getId())){ - box.setId("---< 柜体编号不能为空 >---"); - error = false; - } - if (StringUtils.isEmpty(box.getName())){ - box.setName("---< 柜体名称不能为空 >---"); - error = false; - } if (!StringUtils.isEmpty(box.getHeight()) ){ - Boolean flag = checkNumber(box.getHeight(), Double.class); + Boolean flag = checkNumber(box.getHeight().trim(), Double.class); if (!flag) { box.setHeight("---< " + box.getHeight() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; @@ -286,7 +467,7 @@ public class XMLUtil { box.setHeight("0"); } if (!StringUtils.isEmpty(box.getLength()) ){ - Boolean flag = checkNumber(box.getLength(), Double.class); + Boolean flag = checkNumber(box.getLength().trim(), Double.class); if (!flag) { box.setLength("---< " + box.getLength() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; @@ -295,7 +476,7 @@ public class XMLUtil { box.setLength("0"); } if (!StringUtils.isEmpty(box.getWidth()) ){ - Boolean flag = checkNumber(box.getWidth(), Double.class); + Boolean flag = checkNumber(box.getWidth().trim(), Double.class); if (!flag) { box.setWidth("---< " + box.getWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; @@ -304,58 +485,43 @@ public class XMLUtil { box.setWidth("0"); } if (!StringUtils.isEmpty(box.getBasePointX())){ - if (!ToolUtil.convertToType(box.getBasePointX(), Double.class)) { + if (!ToolUtil.convertToType(box.getBasePointX().trim(), Double.class)) { box.setBasePointX("---< " + box.getBasePointX() + TYPE_ERR + " >---"); } - } else { - box.setBasePointX("0"); } if (!StringUtils.isEmpty(box.getBasePointY())){ - if (!ToolUtil.convertToType(box.getBasePointY(), Double.class)) { + if (!ToolUtil.convertToType(box.getBasePointY().trim(), Double.class)) { box.setBasePointY("---< " + box.getBasePointY() + TYPE_ERR + " >---"); } - } else { - box.setBasePointY("0"); } if (!StringUtils.isEmpty(box.getBasePointZ())){ - if (!ToolUtil.convertToType(box.getBasePointZ(), Double.class)) { + if (!ToolUtil.convertToType(box.getBasePointZ().trim(), Double.class)) { box.setBasePointZ("---< " + box.getBasePointZ() + TYPE_ERR + " >---"); } - } else { - box.setBasePointZ("0"); } if (!StringUtils.isEmpty(box.getAxisYrotate())){ - if (!ToolUtil.convertToType(box.getAxisYrotate(), Double.class)) { + if (!ToolUtil.convertToType(box.getAxisYrotate().trim(), Double.class)) { box.setAxisYrotate("---< " + box.getAxisYrotate() + TYPE_ERR + " >---"); } - } else { - box.setAxisYrotate("0"); } if (!StringUtils.isEmpty(box.getAxisXrotate())){ - if (!ToolUtil.convertToType(box.getAxisXrotate(), Double.class)) { + if (!ToolUtil.convertToType(box.getAxisXrotate().trim(), Double.class)) { box.setAxisXrotate("---< " + box.getAxisXrotate() + TYPE_ERR + " >---"); } - } else { - box.setAxisXrotate("0"); } if (!StringUtils.isEmpty(box.getAxisZrotate())){ - if (!ToolUtil.convertToType(box.getAxisZrotate(), Double.class)) { + if (!ToolUtil.convertToType(box.getAxisZrotate().trim(), Double.class)) { box.setAxisZrotate("---< " + box.getAxisZrotate() + TYPE_ERR + " >---"); } - } else { - box.setAxisZrotate("0"); } } } // 模块数据格式验证 public void checkModules(ModuleXmlVOS moduleXmlVOS, Boolean error) { - if (StringUtils.isEmpty(moduleXmlVOS.getCount())) { - moduleXmlVOS.setCount("---< 模块数量不能为空 >---"); - error = false; - } else { - if (ToolUtil.convertToType(moduleXmlVOS.getCount(), Integer.class)){ - if (!ToolUtil.checkNumber(moduleXmlVOS.getCount())){ + if (!StringUtils.isEmpty(moduleXmlVOS.getCount())) { + if (ToolUtil.convertToType(moduleXmlVOS.getCount().trim(), Integer.class)){ + if (!ToolUtil.checkNumber(moduleXmlVOS.getCount().trim())){ moduleXmlVOS.setCount("---< " + moduleXmlVOS.getCount() + POSITIVE_ERR + " >---"); error = false; } @@ -372,16 +538,8 @@ public class XMLUtil { // 模块数据格式验证 public void checkModuleList(List moduleXmlVOSList, Boolean error) { for ( ModuleXmlVO module : moduleXmlVOSList ) { - if (StringUtils.isEmpty(module.getId())){ - module.setId("---< 柜体编号不能为空 >---"); - error = false; - } - if (StringUtils.isEmpty(module.getName())){ - module.setName("---< 柜体名称不能为空 >---"); - error = false; - } if (!StringUtils.isEmpty(module.getLength()) ){ - Boolean flag = checkNumber(module.getLength(), Double.class); + Boolean flag = checkNumber(module.getLength().trim(), Double.class); if (!flag) { module.setLength("---< " + module.getLength() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; @@ -390,7 +548,7 @@ public class XMLUtil { module.setLength("0"); } if (!StringUtils.isEmpty(module.getWidth()) ){ - Boolean flag = checkNumber(module.getWidth(), Double.class); + Boolean flag = checkNumber(module.getWidth().trim(), Double.class); if (!flag) { module.setWidth("---< " + module.getWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; @@ -399,7 +557,7 @@ public class XMLUtil { module.setWidth("0"); } if (!StringUtils.isEmpty(module.getHeight()) ){ - Boolean flag = checkNumber(module.getHeight(), Double.class); + Boolean flag = checkNumber(module.getHeight().trim(), Double.class); if (!flag) { module.setHeight("---< " + module.getHeight() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; @@ -412,12 +570,9 @@ public class XMLUtil { // 加工组数据格式验证 public void checkGroups(GroupXmlVOS groupXmlVOS, Boolean error) { - if (StringUtils.isEmpty(groupXmlVOS.getCount())) { - groupXmlVOS.setCount("---< 模块数量不能为空 >---"); - error = false; - } else { - if (ToolUtil.convertToType(groupXmlVOS.getCount(), Integer.class)){ - if (!ToolUtil.checkNumber(groupXmlVOS.getCount())){ + if (!StringUtils.isEmpty(groupXmlVOS.getCount())) { + if (ToolUtil.convertToType(groupXmlVOS.getCount().trim(), Integer.class)){ + if (!ToolUtil.checkNumber(groupXmlVOS.getCount().trim())){ groupXmlVOS.setCount("---< " + groupXmlVOS.getCount() + POSITIVE_ERR + " >---"); error = false; } @@ -433,16 +588,8 @@ public class XMLUtil { // 加工组数据格式验证 public void checkGroupList(List groupXmlVOList, Boolean error) { for ( GroupXmlVO group : groupXmlVOList ) { - if (StringUtils.isEmpty(group.getId())){ - group.setId("---< 加工组编号不能为空 >---"); - error = false; - } - if (StringUtils.isEmpty(group.getName())){ - group.setName("---< 加工组名称不能为空 >---"); - error = false; - } if (!StringUtils.isEmpty(group.getLength()) ){ - Boolean flag = checkNumber(group.getLength(), Double.class); + Boolean flag = checkNumber(group.getLength().trim(), Double.class); if (!flag) { group.setLength("---< " + group.getLength() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; @@ -451,7 +598,7 @@ public class XMLUtil { group.setLength("0"); } if (!StringUtils.isEmpty(group.getWidth()) ){ - Boolean flag = checkNumber(group.getWidth(), Double.class); + Boolean flag = checkNumber(group.getWidth().trim(), Double.class); if (!flag) { group.setWidth( "---< " + group.getWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; @@ -460,7 +607,7 @@ public class XMLUtil { group.setWidth("0"); } if (!StringUtils.isEmpty(group.getHeight()) ){ - Boolean flag = checkNumber(group.getHeight(), Double.class); + Boolean flag = checkNumber(group.getHeight().trim(), Double.class); if (!flag) { group.setHeight("---< " + group.getHeight() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; @@ -475,11 +622,11 @@ public class XMLUtil { public void checkPlates(List plateXmlVOList, Boolean error) { for ( PlateXmlVO plate : plateXmlVOList ) { if (StringUtils.isEmpty(plate.getName())){ - plate.setId("---< 板材名称不能为空 >---"); + plate.setName("---< 板材名称不能为空 >---"); error = false; } if (StringUtils.isEmpty(plate.getMaterial())){ - plate.setItemNo("---< 板材材质不能为空 >---"); + plate.setItemCode("---< 板材材质不能为空 >---"); error = false; } // 纹理有效性判断 @@ -491,19 +638,25 @@ public class XMLUtil { error = false; } } - if (StringUtils.isEmpty(plate.getCoatingObverse())) { - plate.setCoatingObverse("---< 板材正面颜色不可为空>---"); + if (StringUtils.isEmpty(plate.getCoating())) { + plate.setCoating("双面"); + } else { + if (!StringUtils.equals(plate.getCoating().trim(), "双面") && !StringUtils.equals(plate.getCoating().trim(), "单面") && + !StringUtils.equals(plate.getCoating().trim(), "无")) { + plate.setCoating("---< " + plate.getCoating() + " 板材纹理无效 >---"); + error = false; + } } if (StringUtils.isEmpty(plate.getLength())){ plate.setLength("---< 板材长度不可为空>---"); error = false; } else { - Boolean flag = checkNumber(plate.getLength(), Double.class); + Boolean flag = checkNumber(plate.getLength().trim(), Double.class); if (!flag) { plate.setLength("---< " + plate.getLength() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; } else { - if (!ToolUtil.checkPrecision(plate.getLength(), 5, 3)){ + if (!ToolUtil.checkPrecision(plate.getLength().trim(), 5, 3)){ plate.setLength("---< " + plate.getLength() + LONG_ERR + " >---"); error = false; } @@ -513,12 +666,12 @@ public class XMLUtil { plate.setWidth("---< 板材宽度不可为空>---"); error = false; } else { - Boolean flag = checkNumber(plate.getWidth(), Double.class); + Boolean flag = checkNumber(plate.getWidth().trim(), Double.class); if (!flag) { plate.setWidth("---< " + plate.getWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; } else { - if (!ToolUtil.checkPrecision(plate.getWidth(), 5, 3)){ + if (!ToolUtil.checkPrecision(plate.getWidth().trim(), 5, 3)){ plate.setWidth("---< " + plate.getWidth() + LONG_ERR + " >---"); error = false; } @@ -528,48 +681,48 @@ public class XMLUtil { plate.setThickness("---< 板材宽度不可为空>---"); error = false; } else { - Boolean flag = checkNumber(plate.getThickness(), Double.class); + Boolean flag = checkNumber(plate.getThickness().trim(), Double.class); if (!flag) { plate.setThickness("---< " + plate.getThickness() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; } else { - if (!ToolUtil.checkPrecision(plate.getThickness(), 5, 3)){ + if (!ToolUtil.checkPrecision(plate.getThickness().trim(), 5, 3)){ plate.setThickness("---< " + plate.getThickness() + LONG_ERR + " >---"); error = false; } } } if (!StringUtils.isEmpty(plate.getOddmentLength())){ - Boolean flag = checkNumber(plate.getOddmentLength(), Double.class); + Boolean flag = checkNumber(plate.getOddmentLength().trim(), Double.class); if (!flag) { plate.setOddmentLength("---< " + plate.getOddmentLength() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; } else { - if (!ToolUtil.checkPrecision(plate.getOddmentLength(), 5, 3)){ + if (!ToolUtil.checkPrecision(plate.getOddmentLength().trim(), 5, 3)){ plate.setOddmentLength("---< " + plate.getOddmentLength() + LONG_ERR + " >---"); error = false; } } } if (!StringUtils.isEmpty(plate.getOddmentWidth())){ - Boolean flag = checkNumber(plate.getOddmentWidth(), Double.class); + Boolean flag = checkNumber(plate.getOddmentWidth().trim(), Double.class); if (!flag) { plate.setOddmentWidth("---< " + plate.getOddmentWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; } else { - if (!ToolUtil.checkPrecision(plate.getOddmentWidth(), 5, 3)){ + if (!ToolUtil.checkPrecision(plate.getOddmentWidth().trim(), 5, 3)){ plate.setOddmentWidth("---< " + plate.getOddmentWidth() + LONG_ERR + " >---"); error = false; } } } if (!StringUtils.isEmpty(plate.getOddmentThickness())){ - Boolean flag = checkNumber(plate.getOddmentThickness(), Double.class); + Boolean flag = checkNumber(plate.getOddmentThickness().trim(), Double.class); if (!flag) { plate.setOddmentThickness("---< " + plate.getOddmentThickness() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; } else { - if (!ToolUtil.checkPrecision(plate.getOddmentThickness(), 5, 3)){ + if (!ToolUtil.checkPrecision(plate.getOddmentThickness().trim(), 5, 3)){ plate.setOddmentThickness("---< " + plate.getOddmentThickness() + LONG_ERR + " >---"); error = false; } @@ -577,25 +730,46 @@ public class XMLUtil { } if (!StringUtils.isEmpty(plate.getOddment())) { if (!StringUtils.equals(plate.getOddment().trim(), "是") && !StringUtils.equals(plate.getOddment().trim(), "否")) { - plate.setGrained("---< " + plate.getOddment() + "板材是否余料标识无效无效 >---"); + plate.setOddment(plate.getOddment() + "---< " + "板材是否余料标识无效无效 >---"); error = false; } } - if (StringUtils.isEmpty(plate.getUnitLength())){ - plate.setThickness("---< 板材长度单位不可为空>---"); - error = false; + if (StringUtils.isEmpty(plate.getUnitLength().trim())){ + plate.setUnitLength("mm"); + }else { + DictDataRespDTO dictData = dictDataApi.parseDictData(DictTypeConstants.UNIT_LENGTH, plate.getUnitLength().trim()).getData(); + if (dictData == null) { + plate.setUnitLength(plate.getUnitLength() + "---< " + "板块长度单位无效 >---"); + error = false; + } } - if (StringUtils.isEmpty(plate.getArea())){ - plate.setArea("---< 板材面积不可为空>---"); - error = false; - } else { + if (!StringUtils.isEmpty(plate.getArea())){ Boolean flag = checkNumber(plate.getArea(), Double.class); if (!flag) { - plate.setArea("---< " + plate.getArea() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + plate.setArea(plate.getArea() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(plate.getUnitArea())){ + plate.setUnitArea("m²"); + } else { + DictDataRespDTO dictData = dictDataApi.parseDictData(DictTypeConstants.UNIT_AREA, plate.getUnitArea().trim()).getData(); + if (dictData == null) { + plate.setUnitLength(plate.getUnitArea() + "---< " + "板块面积单位无效 >---"); + error = false; + } + } + if (!StringUtils.isEmpty(plate.getCount())) { + if (ToolUtil.convertToType(plate.getCount().trim(), Integer.class)){ + if (!ToolUtil.checkNumber(plate.getCount().trim())){ + plate.setCount(plate.getCount() + "---< " + POSITIVE_ERR + " >---"); + error = false; + } + } else { + plate.setCount(plate.getCount() + "---< " + TYPE_ERR + " >---"); error = false; } } - if (plate.getBlockXmlVOS() != null) { checkBlocks(plate.getBlockXmlVOS(), error); } @@ -603,42 +777,41 @@ public class XMLUtil { } // 小板数据格式验证 public void checkBlocks(BlockXmlVOS blockXmlVOS, Boolean error) { - if (StringUtils.isNotEmpty(blockXmlVOS.getCount())) { - blockXmlVOS.setCount("---< 小板片数不可为空>---"); - error = false; - } else { + if (!StringUtils.isEmpty(blockXmlVOS.getCount())) { Boolean flag = checkNumber(blockXmlVOS.getCount(), Integer.class); if (!flag) { - blockXmlVOS.setCount("---< " + blockXmlVOS.getCount() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + blockXmlVOS.setCount(blockXmlVOS.getCount() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; } else { if (!ToolUtil.checkNumber(blockXmlVOS.getCount())){ - blockXmlVOS.setCount("---< " + blockXmlVOS.getCount() + POSITIVE_ERR + " >---"); + blockXmlVOS.setCount(blockXmlVOS.getCount() + "---< " + POSITIVE_ERR + " >---"); error = false; } } } - if (StringUtils.isNotEmpty(blockXmlVOS.getArea())) { - blockXmlVOS.setArea("---< 小板总面积不可为空>---"); - error = false; - } else { + if (!StringUtils.isEmpty(blockXmlVOS.getArea())) { Boolean flag = checkNumber(blockXmlVOS.getArea(), Integer.class); if (!flag) { - blockXmlVOS.setArea("---< " + blockXmlVOS.getArea() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + blockXmlVOS.setArea(blockXmlVOS.getArea() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; } else { if (!ToolUtil.checkNumber(blockXmlVOS.getArea())){ - blockXmlVOS.setArea("---< " + blockXmlVOS.getArea() + POSITIVE_ERR + " >---"); + blockXmlVOS.setArea(blockXmlVOS.getArea() + "---< " + POSITIVE_ERR + " >---"); error = false; } } } - if (StringUtils.isNotEmpty(blockXmlVOS.getCount())) { - blockXmlVOS.setArea("---< 小板面积单位不可为空>---"); - error = false; + if (StringUtils.isEmpty(blockXmlVOS.getCount())) { + blockXmlVOS.setArea("m²"); + } else { + DictDataRespDTO dictData = dictDataApi.parseDictData(DictTypeConstants.UNIT_AREA, blockXmlVOS.getUnit().trim()).getData(); + if (dictData == null) { + blockXmlVOS.setUnit(blockXmlVOS.getUnit() + "---< " + "小板总面积单位无效 >---"); + error = false; + } } - if (blockXmlVOS.getBlockXmlVOList() != null) { + if (blockXmlVOS.getBlockXmlVOList() != null && blockXmlVOS.getBlockXmlVOList().size() > 0) { checkBlockList(blockXmlVOS.getBlockXmlVOList(), error); } } @@ -650,63 +823,62 @@ public class XMLUtil { blockXmlVO.setName("未命名"); } if (StringUtils.isEmpty(blockXmlVO.getType())) { - blockXmlVO.setType("---< 板块类型不可为空 >---"); - error = false; + blockXmlVO.setType("背板"); } else { DictDataRespDTO dictData = dictDataApi.parseDictData(DictTypeConstants.PLATE_TYPE, blockXmlVO.getType()).getData(); if (dictData == null) { - blockXmlVO.setType("---< " + blockXmlVO.getType() + "板块类型无效 >---"); + blockXmlVO.setType(blockXmlVO.getType() +"---< " + "板块类型无效 >---"); error = false; } } if (StringUtils.isEmpty(blockXmlVO.getOpenDirection())) { - blockXmlVO.setOpenDirection("---< 板块开门方向不可为空 >---"); - error = false; + blockXmlVO.setOpenDirection("非门板"); } else { DictDataRespDTO dictData = dictDataApi.parseDictData(DictTypeConstants.DOOR_OPENING_DIRECTIONS, blockXmlVO.getOpenDirection()).getData(); if (dictData == null) { - blockXmlVO.setOpenDirection("---< " + blockXmlVO.getOpenDirection() + "板块开门方向无效 >---"); + blockXmlVO.setOpenDirection(blockXmlVO.getOpenDirection() + "---< " + "板块开门方向无效 >---"); error = false; } } if (StringUtils.isEmpty(blockXmlVO.getTexture())) { - blockXmlVO.setTexture("---< 板块设计纹路不可为空 >---"); - error = false; + blockXmlVO.setTexture("正纹"); } else { - DictDataRespDTO dictData = dictDataApi.parseDictData(DictTypeConstants.DOOR_OPENING_DIRECTIONS, blockXmlVO.getTexture()).getData(); + DictDataRespDTO dictData = dictDataApi.parseDictData(DictTypeConstants.GRAIN_TYPE, blockXmlVO.getTexture()).getData(); if (dictData == null) { - blockXmlVO.setTexture("---< " + blockXmlVO.getTexture() + "板块设计纹路无效 >---"); + blockXmlVO.setTexture(blockXmlVO.getTexture() + "---< " + "板块设计纹路无效 >---"); error = false; } } if (StringUtils.isEmpty(blockXmlVO.getLayoutFace())) { - blockXmlVO.setLayoutFace("---< 板块排版面不可为空 >---"); - error = false; + blockXmlVO.setLayoutFace("随意面"); } else { DictDataRespDTO dictData = dictDataApi.parseDictData(DictTypeConstants.TYPOGRAPHY_TYPE, blockXmlVO.getLayoutFace()).getData(); if (dictData == null) { - blockXmlVO.setLayoutFace("---< " + blockXmlVO.getLayoutFace() + "板块排版面无效 >---"); + blockXmlVO.setLayoutFace(blockXmlVO.getLayoutFace() + "---< " + "板块排版面无效 >---"); error = false; } } if (StringUtils.isEmpty(blockXmlVO.getCoatingType())) { - blockXmlVO.setCoatingType("---< 板块设计饰面不可为空 >---"); - error = false; - } - if (StringUtils.isEmpty(blockXmlVO.getCoatingObverse())) { - blockXmlVO.setCoatingObverse("---< 板块正面颜色不可为空 >---"); - error = false; - } - if (StringUtils.isEmpty(blockXmlVO.getCoatingObverse())) { - blockXmlVO.setCoatingReverse("---< 板块反面颜色不可为空 >---"); + blockXmlVO.setCoatingType("双面"); + } else if (!StringUtils.equals(blockXmlVO.getCoatingType().trim(), "双面") && !StringUtils.equals(blockXmlVO.getCoatingType().trim(), "无") && + !StringUtils.equals(blockXmlVO.getCoatingType().trim(), "单面")) { + blockXmlVO.setCoatingType(blockXmlVO.getCoatingType() + "---< " + "小板设计饰面无效 >---"); error = false; } +// if (StringUtils.isEmpty(blockXmlVO.getCoatingObverse())) { +// blockXmlVO.setCoatingObverse("---< 板块正面颜色不可为空 >---"); +// error = false; +// } +// if (StringUtils.isEmpty(blockXmlVO.getCoatingObverse())) { +// blockXmlVO.setCoatingReverse("---< 板块反面颜色不可为空 >---"); +// error = false; +// } if (StringUtils.isEmpty(blockXmlVO.getLength())) { blockXmlVO.setLength("---< 板块长度不可为空 >---"); error = false; } else { if (!checkNumber(blockXmlVO.getLength(), Double.class,5, 3)){ - blockXmlVO.setLength("---< " + blockXmlVO.getLength() + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); + blockXmlVO.setLength(blockXmlVO.getLength() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); error = false; } } @@ -715,7 +887,7 @@ public class XMLUtil { error = false; } else { if (!checkNumber(blockXmlVO.getWidth(), Double.class,5, 3)){ - blockXmlVO.setWidth("---< " + blockXmlVO.getWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); + blockXmlVO.setWidth(blockXmlVO.getWidth() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); error = false; } } @@ -724,7 +896,7 @@ public class XMLUtil { error = false; } else { if (!checkNumber(blockXmlVO.getThickness(), Double.class,5, 3)){ - blockXmlVO.setThickness("---< " + blockXmlVO.getThickness() + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); + blockXmlVO.setThickness(blockXmlVO.getThickness() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); error = false; } } @@ -733,7 +905,7 @@ public class XMLUtil { error = false; } else { if (!checkNumber(blockXmlVO.getThickness(), Double.class,5, 3)){ - blockXmlVO.setCuttingLength("---< " + blockXmlVO.getCuttingLength() + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); + blockXmlVO.setCuttingLength(blockXmlVO.getCuttingLength() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); error = false; } } @@ -742,7 +914,7 @@ public class XMLUtil { error = false; } else { if (!checkNumber(blockXmlVO.getCuttingWidth(), Double.class,5, 3)){ - blockXmlVO.setCuttingWidth("---< " + blockXmlVO.getCuttingWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); + blockXmlVO.setCuttingWidth(blockXmlVO.getCuttingWidth() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); error = false; } } @@ -751,7 +923,7 @@ public class XMLUtil { error = false; } else { if (!checkNumber(blockXmlVO.getCuttingThickness(), Double.class,5, 3)){ - blockXmlVO.setCuttingThickness("---< " + blockXmlVO.getCuttingThickness() + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); + blockXmlVO.setCuttingThickness(blockXmlVO.getCuttingThickness() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); error = false; } } @@ -760,7 +932,7 @@ public class XMLUtil { error = false; } else { if (!checkNumber(blockXmlVO.getRawLength(), Double.class,5, 3)){ - blockXmlVO.setRawLength("---< " + blockXmlVO.getRawLength() + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); + blockXmlVO.setRawLength(blockXmlVO.getRawLength() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); error = false; } } @@ -769,7 +941,7 @@ public class XMLUtil { error = false; } else { if (!checkNumber(blockXmlVO.getRawWidth(), Double.class,5, 3)){ - blockXmlVO.setRawWidth("---< " + blockXmlVO.getRawWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); + blockXmlVO.setRawWidth(blockXmlVO.getRawWidth() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); error = false; } } @@ -778,133 +950,98 @@ public class XMLUtil { error = false; } else { if (!checkNumber(blockXmlVO.getRawThickness(), Double.class,5, 3)){ - blockXmlVO.setRawThickness("---< " + blockXmlVO.getRawThickness() + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); + blockXmlVO.setRawThickness(blockXmlVO.getRawThickness() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); error = false; } } - if (StringUtils.isEmpty(blockXmlVO.getUnitLength())) { - blockXmlVO.setRawThickness("---< 板块长度单位不可为空 >---"); - error = false; + if (StringUtils.isEmpty(blockXmlVO.getUnit())) { + blockXmlVO.setUnit("mm"); } else { - DictDataRespDTO dictData = dictDataApi.parseDictData(DictTypeConstants.UNIT_LENGTH, blockXmlVO.getUnitLength()).getData(); + DictDataRespDTO dictData = dictDataApi.parseDictData(blockXmlVO.getUnit(), DictTypeConstants.UNIT_LENGTH).getData(); if (dictData == null){ - blockXmlVO.setUnitLength("---< " + blockXmlVO.getUnitLength() + " 长度单位无效 >---"); + blockXmlVO.setUnit(blockXmlVO.getUnit() + "---< " + " 长度单位无效 >---"); error = false; } } - if (StringUtils.isEmpty(blockXmlVO.getArea())) { - blockXmlVO.setArea("---< 板块成品面积不可为空 >---"); - error = false; - } else { - if (!checkNumber(blockXmlVO.getArea(), Double.class)){ - blockXmlVO.setArea("---< " + blockXmlVO.getArea() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); - error = false; - } - } - if (StringUtils.isEmpty(blockXmlVO.getAreaCutting())){ - blockXmlVO.setAreaCutting("---< 板块开料面积不可为空 >---"); - error = false; - } else { - if (!checkNumber(blockXmlVO.getAreaCutting(), Double.class)){ - blockXmlVO.setAreaCutting("---< " + blockXmlVO.getAreaCutting() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); - error = false; - } - } - if (StringUtils.isEmpty(blockXmlVO.getUnitArea())) { - blockXmlVO.setUnitArea("---< 板块面积单位不可为空 >---"); - error = false; - } else { - DictDataRespDTO dictData = dictDataApi.parseDictData(DictTypeConstants.UNIT_AREA, blockXmlVO.getUnitArea()).getData(); - if (dictData == null){ - blockXmlVO.setUnitArea("---< " + blockXmlVO.getUnitArea() + "面积单位无效 >---"); - } - } if (StringUtils.isEmpty(blockXmlVO.getMultipleNumber())){ blockXmlVO.setMultipleNumber("1"); } else { - if (!checkNumber(blockXmlVO.getMultipleNumber(), Integer.class)){ - blockXmlVO.setMultipleNumber("---< " + blockXmlVO.getMultipleNumber() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + if (!checkNumber(blockXmlVO.getMultipleNumber().trim(), Integer.class)){ + blockXmlVO.setMultipleNumber(blockXmlVO.getMultipleNumber() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getMultipleNo())){ + blockXmlVO.setMultipleNo("1"); + } else { + if (!checkNumber(blockXmlVO.getMultipleNo().trim(), Integer.class)){ + blockXmlVO.setMultipleNo(blockXmlVO.getMultipleNo() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; } } if (StringUtils.isEmpty(blockXmlVO.getUnregular())){ - blockXmlVO.setUnregular("---< 板块是否异形不可为空 >---"); - error = false; + blockXmlVO.setUnregular("否"); } else { if (!StringUtils.equals(blockXmlVO.getUnregular().trim(), "是") && !StringUtils.equals(blockXmlVO.getUnregular().trim(), "否")) { - blockXmlVO.setUnregular("---< " + blockXmlVO.getUnregular() + "板材是否异形数据无效 >---"); + blockXmlVO.setUnregular(blockXmlVO.getUnregular() + "---< " + "板材是否异形数据无效 >---"); error = false; } } if (StringUtils.isEmpty(blockXmlVO.getDrilling())){ - blockXmlVO.setDrilling("---< 板块是否钻孔不可为空 >---"); - error = false; + blockXmlVO.setDrilling("否"); } else { if (!StringUtils.equals(blockXmlVO.getDrilling().trim(), "是") && !StringUtils.equals(blockXmlVO.getDrilling().trim(), "否")) { - blockXmlVO.setDrilling("---< " + blockXmlVO.getDrilling()+ "板材是否钻孔数据无效 >---"); + blockXmlVO.setDrilling(blockXmlVO.getDrilling()+ "---< " + "板材是否钻孔数据无效 >---"); error = false; } } if (StringUtils.isEmpty(blockXmlVO.getSlotting())){ - blockXmlVO.setSlotting("---< 板块是否挖槽不可为空 >---"); - error = false; + blockXmlVO.setSlotting("否"); } else { if (!StringUtils.equals(blockXmlVO.getSlotting().trim(), "是") && !StringUtils.equals(blockXmlVO.getSlotting().trim(), "否")) { - blockXmlVO.setSlotting("---< " + blockXmlVO.getSlotting() + "板材是否挖槽数据无效 >---"); + blockXmlVO.setSlotting(blockXmlVO.getSlotting() + "---< " + "板材是否挖槽数据无效 >---"); error = false; } } - if (StringUtils.isEmpty(blockXmlVO.getBasePointX())){ - blockXmlVO.setBasePointX("---< 板块基点X坐标不可为空 >---"); - error = false; - } else { + if (StringUtils.isEmpty(blockXmlVO.getRoomName())){ + blockXmlVO.setRoomName("未命名"); + } + if (StringUtils.isEmpty(blockXmlVO.getBoxName())){ + blockXmlVO.setBoxName("未命名"); + } + if (!StringUtils.isEmpty(blockXmlVO.getBasePointX())){ if (!ToolUtil.convertToType(blockXmlVO.getBasePointX(), Double.class)) { - blockXmlVO.setBasePointX("---< " + blockXmlVO.getBasePointX() + TYPE_ERR + " >---"); + blockXmlVO.setBasePointX(blockXmlVO.getBasePointX() + "---< " + TYPE_ERR + " >---"); error = false; } } - if (StringUtils.isEmpty(blockXmlVO.getBasePointY())){ - blockXmlVO.setBasePointY("---< 板块基点Y坐标不可为空 >---"); - error = false; - } else { + if (!StringUtils.isEmpty(blockXmlVO.getBasePointY())){ if (!ToolUtil.convertToType(blockXmlVO.getBasePointX(), Double.class)) { - blockXmlVO.setBasePointY("---< " + blockXmlVO.getBasePointY() + TYPE_ERR + " >---"); + blockXmlVO.setBasePointY(blockXmlVO.getBasePointY() + "---< " + TYPE_ERR + " >---"); error = false; } } - if (StringUtils.isEmpty(blockXmlVO.getBasePointZ())){ - blockXmlVO.setBasePointZ("---< 板块基点X坐标不可为空 >---"); - error = false; - } else { + if (!StringUtils.isEmpty(blockXmlVO.getBasePointZ())){ if (!ToolUtil.convertToType(blockXmlVO.getBasePointZ(), Double.class)) { - blockXmlVO.setBasePointZ("---< " + blockXmlVO.getBasePointZ() + TYPE_ERR + " >---"); + blockXmlVO.setBasePointZ(blockXmlVO.getBasePointZ() + "---< " + TYPE_ERR + " >---"); error = false; } } - if (StringUtils.isEmpty(blockXmlVO.getAxisXrotate())){ - blockXmlVO.setAxisXrotate("---< 板块绕X轴旋转角度不可为空 >---"); - error = false; - } else { + if (!StringUtils.isEmpty(blockXmlVO.getAxisXrotate())){ if (!ToolUtil.convertToType(blockXmlVO.getAxisXrotate(), Double.class)) { - blockXmlVO.setAxisXrotate("---< " + blockXmlVO.getAxisXrotate() + TYPE_ERR + " >---"); + blockXmlVO.setAxisXrotate(blockXmlVO.getAxisXrotate() + "---< " + TYPE_ERR + " >---"); error = false; } } - if (StringUtils.isEmpty(blockXmlVO.getAxisYrotate())){ - blockXmlVO.setAxisYrotate("---< 板块绕Y轴旋转角度不可为空 >---"); - error = false; - } else { + if (!StringUtils.isEmpty(blockXmlVO.getAxisYrotate())){ if (!ToolUtil.convertToType(blockXmlVO.getAxisYrotate(), Double.class)) { - blockXmlVO.setAxisYrotate("---< " + blockXmlVO.getAxisYrotate() + TYPE_ERR + " >---"); + blockXmlVO.setAxisYrotate(blockXmlVO.getAxisYrotate() + "---< " + TYPE_ERR + " >---"); error = false; } } - if (StringUtils.isEmpty(blockXmlVO.getAxisZrotate())){ - blockXmlVO.setAxisZrotate("---< 板块绕Z轴旋转角度不可为空 >---"); - error = false; - } else { + if (!StringUtils.isEmpty(blockXmlVO.getAxisZrotate())){ if (!ToolUtil.convertToType(blockXmlVO.getAxisZrotate(), Double.class)) { - blockXmlVO.setAxisZrotate("---< " + blockXmlVO.getAxisZrotate() + TYPE_ERR + " >---"); + blockXmlVO.setAxisZrotate(blockXmlVO.getAxisZrotate() + "---< " + TYPE_ERR + " >---"); error = false; } } @@ -913,65 +1050,858 @@ public class XMLUtil { checkOutline(blockXmlVO.getOutlineXmlVO(), error); } + if (blockXmlVO.getCuttingOutlineXmlVO() != null){ + checkCuttingOutline(blockXmlVO.getCuttingOutlineXmlVO(), error); + } + + if (blockXmlVO.getRawOutlineXmlVO() != null && blockXmlVO.getRawOutlineXmlVO().getPointXmlVOList() != null + && blockXmlVO.getRawOutlineXmlVO().getPointXmlVOList().size() > 0){ + checkRawOutline(blockXmlVO.getRawOutlineXmlVO(), error); + } + + if (blockXmlVO.getHoleXmlVOS() != null){ + checkHoles(blockXmlVO.getHoleXmlVOS(), error); + } + + if (blockXmlVO.getGrooveXmlVOS() != null){ + checkGrooves(blockXmlVO.getGrooveXmlVOS(), error); + } + + if (blockXmlVO.getIsletXmlVOS() != null && blockXmlVO.getIsletXmlVOS().getIsletXmlVOList() != null && + blockXmlVO.getIsletXmlVOS().getIsletXmlVOList().size() > 0){ + checkIslets(blockXmlVO.getIsletXmlVOS(), error); + } + + if (blockXmlVO.getCorrelationXmlVOS() != null){ + checkCorrelations(blockXmlVO.getCorrelationXmlVOS(), error); + } + } } } - // 成品轮廓数据验证 - public void checkOutline(OutlineXmlVO outlineXmlVO, Boolean error) { - if (!StringUtils.isNotEmpty(outlineXmlVO.getCount())){ - Boolean flag = checkNumber(outlineXmlVO.getCount(), Integer.class); - if (!flag) { - outlineXmlVO.setCount("---< " + outlineXmlVO.getCount() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + private void checkCorrelations(CorrelationXmlVOS correlationXmlVOS, Boolean error) { + if (!StringUtils.isEmpty(correlationXmlVOS.getCount())){ + if (!checkNumber(correlationXmlVOS.getCount(), Integer.class)) { + correlationXmlVOS.setCount("---< " + correlationXmlVOS.getCount() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); error = false; } } - if (outlineXmlVO.getPointXmlVOList() != null && outlineXmlVO.getPointXmlVOList().size() > 0){ - for (PointXmlVO pointXmlVO : outlineXmlVO.getPointXmlVOList()) { - if (StringUtils.isEmpty(pointXmlVO.getPointX())){ - pointXmlVO.setPointX("---< 板块轮廓起点坐标X不可为空 >---"); - error = false; - } else { - if (!ToolUtil.convertToType(pointXmlVO.getPointX(), Double.class)) { - pointXmlVO.setPointX("---< " + pointXmlVO.getPointX() + TYPE_ERR + " >---"); + if (correlationXmlVOS.getCorrelationXmlVOList() != null && correlationXmlVOS.getCorrelationXmlVOList().size() > 0){ + for (CorrelationXmlVO correlationXmlVO : correlationXmlVOS.getCorrelationXmlVOList()) { + if (StringUtils.isEmpty(correlationXmlVO.getItemCode())){ + if (StringUtils.isEmpty(correlationXmlVO.getName())){ + correlationXmlVO.setName("---< 关联配件(五金)/组件名称不可为空 >---"); + error = false; + } + if (StringUtils.isEmpty(correlationXmlVO.getUnitCount())){ + correlationXmlVO.setUnitCount("---< 关联配件(五金)/组件单位不可为空 >---"); + error = false; + } + if (!StringUtils.isEmpty(correlationXmlVO.getCount())){ + if (!checkNumber(correlationXmlVO.getCount(), Integer.class)) { + correlationXmlVO.setCount("---< " + correlationXmlVO.getCount() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } else { + correlationXmlVO.setCount("---< 关联配件(五金)/组件数量不可为空 >---"); error = false; } } - if (StringUtils.isEmpty(pointXmlVO.getPointY())){ - pointXmlVO.setPointY("---< 板块轮廓起点坐标Y不可为空 >---"); - error = false; - } else { - if (!ToolUtil.convertToType(pointXmlVO.getPointY(), Double.class)) { - pointXmlVO.setPointY("---< " + pointXmlVO.getPointY() + TYPE_ERR + " >---"); - error = false; - } - } - if (StringUtils.isEmpty(pointXmlVO.getCurvature())){ - pointXmlVO.setPointZ("---< 板块轮廓边圆弧凹凸度不可为空 >---"); - error = false; - } else { - if (!ToolUtil.convertToType(pointXmlVO.getCurvature(), Double.class)) { - pointXmlVO.setCurvature("---< " + pointXmlVO.getCurvature() + TYPE_ERR + " >---"); - error = false; - } - } - if (StringUtils.isEmpty(pointXmlVO.getRadius())){ - pointXmlVO.setRadius("---< 板块轮廓边圆弧半径不可为空 >---"); - error = false; - } else { - if (!ToolUtil.convertToType(pointXmlVO.getRadius(), Double.class)) { - pointXmlVO.setRadius("---< " + pointXmlVO.getRadius() + TYPE_ERR + " >---"); - error = false; - } - } - if (StringUtils.isEmpty(pointXmlVO.getEdgingId())){ - pointXmlVO.setProcess("---< 板块轮廓封边条ID不可为空 >---"); - error = false; - } - } } } + + private void checkIslets(IsletXmlVOS isletXmlVOS, Boolean error) { + Boolean index = true; + if (StringUtils.isEmpty(isletXmlVOS.getCount())){ + isletXmlVOS.setCount("---< 孤岛数量不可为空 >---"); + error = false; + index = false; + } else { + Boolean flag = checkNumber(isletXmlVOS.getCount().trim(), Integer.class); + if (!flag) { + isletXmlVOS.setCount("---< " + isletXmlVOS.getCount() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + index = false; + } + } + if (index) { + if (isletXmlVOS.getIsletXmlVOList() == null){ + isletXmlVOS.setCount("---< 孤岛数量与孤岛列表数量不一致 >---"); + error = false; + } else if (isletXmlVOS.getIsletXmlVOList().size() > 0){ + if (Integer.valueOf(isletXmlVOS.getCount()) != isletXmlVOS.getIsletXmlVOList().size()) { + isletXmlVOS.setCount("---< 孤岛数量与孤岛列表数量不一致 >---"); + error = false; + } else { + for (IsletXmlVO isletXmlVO : isletXmlVOS.getIsletXmlVOList()) { + checkIslet(isletXmlVO, error); + } + } + } + } + + } + + private void checkIslet(IsletXmlVO isletXmlVO, Boolean error) { + if (StringUtils.isEmpty(isletXmlVO.getId())){ + isletXmlVO.setId("---< 孤岛ID不可为空 >---"); + error = false; + } + // 造型内孤岛 两个 + + if (isletXmlVO.getPointXmlVOS() != null) { + Boolean index = true; + if (StringUtils.isEmpty(isletXmlVO.getPointXmlVOS().getCount())){ + isletXmlVO.getPointXmlVOS().setCount("---< 孤岛数量不可为空 >---"); + error = false; + index = false; + } else { + Boolean flag = checkNumber(isletXmlVO.getPointXmlVOS().getCount().trim(), Integer.class); + if (!flag) { + isletXmlVO.getPointXmlVOS().setCount("---< " + isletXmlVO.getPointXmlVOS().getCount() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + index = false; + } + } + + if (index) { + if (isletXmlVO.getPointXmlVOS().getPointXmlVOList() == null){ + isletXmlVO.getPointXmlVOS().setCount("---< 孤岛数量与孤岛列表数量不一致 >---"); + error = false; + } else if (isletXmlVO.getPointXmlVOS().getPointXmlVOList().size() > 0){ + if (Integer.valueOf(isletXmlVO.getPointXmlVOS().getCount()) != isletXmlVO.getPointXmlVOS().getPointXmlVOList().size()) { + isletXmlVO.getPointXmlVOS().setCount("---< 孤岛数量与孤岛列表数量不一致 >---"); + error = false; + } else { + for (PointXmlVO pointXmlVO : isletXmlVO.getPointXmlVOS().getPointXmlVOList()) { + checkPoint(pointXmlVO, error); + } + } + } + } + } + + } + + private void checkHoles(HoleXmlVOS holeXmlVOS, Boolean error) { + if (!StringUtils.isEmpty(holeXmlVOS.getCount()) ){ + Boolean flag = checkNumber(holeXmlVOS.getCount().trim(), Double.class); + if (!flag) { + holeXmlVOS.setCount("---< " + holeXmlVOS.getCount() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(holeXmlVOS.getCountFaceA())){ + Boolean flag = checkNumber(holeXmlVOS.getCountFaceA().trim(), Integer.class); + if (!flag) { + holeXmlVOS.setCountFaceA("---< " + holeXmlVOS.getCountFaceA() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(holeXmlVOS.getCountFaceB())){ + Boolean flag = checkNumber(holeXmlVOS.getCountFaceB().trim(), Integer.class); + if (!flag) { + holeXmlVOS.setCountFaceB("---< " + holeXmlVOS.getCountFaceB() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(holeXmlVOS.getCountSide())){ + Boolean flag = checkNumber(holeXmlVOS.getCountSide().trim(), Integer.class); + if (!flag) { + holeXmlVOS.setCountSide("---< " + holeXmlVOS.getCountSide() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(holeXmlVOS.getCountSideL())){ + Boolean flag = checkNumber(holeXmlVOS.getCountSideL().trim(), Integer.class); + if (!flag) { + holeXmlVOS.setCountSideL("---< " + holeXmlVOS.getCountSideL() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(holeXmlVOS.getCountSideR())){ + Boolean flag = checkNumber(holeXmlVOS.getCountSideR().trim(), Integer.class); + if (!flag) { + holeXmlVOS.setCountSideR("---< " + holeXmlVOS.getCountSideR() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(holeXmlVOS.getCountSideU())){ + Boolean flag = checkNumber(holeXmlVOS.getCountSideU().trim(), Integer.class); + if (!flag) { + holeXmlVOS.setCountSideU("---< " + holeXmlVOS.getCountSideU() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(holeXmlVOS.getCountSideD())){ + Boolean flag = checkNumber(holeXmlVOS.getCountSideD().trim(), Integer.class); + if (!flag) { + holeXmlVOS.setCountSideD("---< " + holeXmlVOS.getCountSideD() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(holeXmlVOS.getCountBevelled())){ + Boolean flag = checkNumber(holeXmlVOS.getCountBevelled().trim(), Integer.class); + if (!flag) { + holeXmlVOS.setCountBevelled("---< " + holeXmlVOS.getCountBevelled() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(holeXmlVOS.getCountLocking())){ + Boolean flag = checkNumber(holeXmlVOS.getCountLocking().trim(), Integer.class); + if (!flag) { + holeXmlVOS.setCountLocking("---< " + holeXmlVOS.getCountLocking() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(holeXmlVOS.getCountBuildIn())){ + Boolean flag = checkNumber(holeXmlVOS.getCountBuildIn().trim(), Integer.class); + if (!flag) { + holeXmlVOS.setCountBuildIn("---< " + holeXmlVOS.getCountBuildIn() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(holeXmlVOS.getCountHinge())){ + Boolean flag = checkNumber(holeXmlVOS.getCountHinge().trim(), Integer.class); + if (!flag) { + holeXmlVOS.setCountHinge("---< " + holeXmlVOS.getCountHinge() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(holeXmlVOS.getCountThrough())){ + Boolean flag = checkNumber(holeXmlVOS.getCountThrough().trim(), Integer.class); + if (!flag) { + holeXmlVOS.setCountThrough("---< " + holeXmlVOS.getCountThrough() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (holeXmlVOS.getHoleXmlVOList() != null && holeXmlVOS.getHoleXmlVOList().size() > 0){ + for (HoleXmlVO holeXmlVO : holeXmlVOS.getHoleXmlVOList()) { + checkHole(holeXmlVO, error); + } + } + } + + private void checkHole(HoleXmlVO holeXmlVO, Boolean error) { + if (StringUtils.isEmpty(holeXmlVO.getFace())){ + holeXmlVO.setFace("---< 小板孔加工面不可为空 >---"); + error = false; + } else { + DictDataRespDTO dictDataVO = dictDataApi.parseDictData(DictTypeConstants.HOLE_FACE, holeXmlVO.getFace()).getData(); + if (dictDataVO == null){ + holeXmlVO.setFace(holeXmlVO.getFace() + "---< " +" 小板孔加工面数据无效 >---"); + error = false; + } + } + if (StringUtils.isEmpty(holeXmlVO.getDirection())){ + holeXmlVO.setDirection("---< 小板孔加工方向不可为空 >---"); + error = false; + } else { + DictDataRespDTO dictDataVO = dictDataApi.parseDictData(DictTypeConstants.HOLE_DIRECTION, holeXmlVO.getDirection()).getData(); + if (dictDataVO == null){ + holeXmlVO.setDirection(holeXmlVO.getDirection() + "---< " + " 小板孔加工方向数据无效 >---"); + } + } + if (StringUtils.isEmpty(holeXmlVO.getDiameter())){ + holeXmlVO.setDiameter("---< 小板孔直径不可为空 >---"); + error = false; + } else { + Boolean flag = checkNumber(holeXmlVO.getDiameter().trim(), Double.class); + if (!flag) { + holeXmlVO.setDiameter(holeXmlVO.getDiameter() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isNotEmpty(holeXmlVO.getType()) && holeXmlVO.getType().equals("沉头孔")){ + if (StringUtils.isEmpty(holeXmlVO.getDiameterInner())){ + holeXmlVO.setDiameterInner("---< 当小板孔类型为沉头孔时,小板孔沉头孔内径不可为空 >---"); + error = false; + } else { + Boolean flag = checkNumber(holeXmlVO.getDiameterInner().trim(), Double.class); + if (!flag) { + holeXmlVO.setDiameterInner(holeXmlVO.getDiameterInner() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + } + } + if (StringUtils.isEmpty(holeXmlVO.getDepthInner())){ + holeXmlVO.setDepthInner("---< 当小板孔类型为沉头孔时,沉头孔的深度不可为空 >---"); + error = false; + } else { + Boolean flag = checkNumber(holeXmlVO.getDepthInner().trim(), Double.class); + if (!flag) { + holeXmlVO.setDepthInner(holeXmlVO.getDepthInner() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + } + } + } + if (StringUtils.isEmpty(holeXmlVO.getDepth())){ + holeXmlVO.setDepth("---< 小板孔深度不可为空 >---"); + error = false; + } else { + Boolean flag = checkNumber(holeXmlVO.getDepth().trim(), Double.class); + if (!flag) { + holeXmlVO.setDepth(holeXmlVO.getDepth() + "---< " + POSITIVE_ERR+ "或是" + TYPE_ERR + " >---"); + } + } + if (!StringUtils.isEmpty(holeXmlVO.getGroupNumber())){ + Boolean flag = checkNumber(holeXmlVO.getGroupNumber().trim(), Integer.class); + if (!flag) { + holeXmlVO.setGroupNumber(holeXmlVO.getGroupNumber() + "---< " + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(holeXmlVO.getGroupXoffset())){ + holeXmlVO.setGroupXoffset("0"); + } else { + Boolean flag = ToolUtil.convertToType(holeXmlVO.getGroupXoffset().trim(), Double.class); + if (!flag) { + holeXmlVO.setGroupXoffset(holeXmlVO.getGroupXoffset() + "---< " + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(holeXmlVO.getGroupYoffset())){ + holeXmlVO.setGroupYoffset("0"); + } else { + Boolean flag = ToolUtil.convertToType(holeXmlVO.getGroupYoffset().trim(), Double.class); + if (!flag) { + holeXmlVO.setGroupYoffset(holeXmlVO.getGroupYoffset() + "---< " + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(holeXmlVO.getGroupZoffset())){ + holeXmlVO.setGroupZoffset("0"); + } else { + Boolean flag = ToolUtil.convertToType(holeXmlVO.getGroupZoffset().trim(), Double.class); + if (!flag) { + holeXmlVO.setGroupZoffset(holeXmlVO.getGroupZoffset() + "---< " + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(holeXmlVO.getStartX())){ + holeXmlVO.setStartX("---< 小板孔起点坐标X不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(holeXmlVO.getStartX().trim(), Double.class)){ + holeXmlVO.setStartX(holeXmlVO.getStartX() + "---< " + " 小板孔起点坐标X数据无效 >---"); + } + } + if (StringUtils.isEmpty(holeXmlVO.getStartY())){ + holeXmlVO.setStartY("---< 小板孔起点坐标Y不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(holeXmlVO.getStartY().trim(), Double.class)){ + holeXmlVO.setStartY(holeXmlVO.getStartY() + "---< " + " 小板孔起点坐标Y数据无效 >---"); + } + } + if (StringUtils.isEmpty(holeXmlVO.getStartZ())){ + holeXmlVO.setStartZ("---< 小板孔起点坐标Z不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(holeXmlVO.getStartZ().trim(), Double.class)){ + holeXmlVO.setStartZ(holeXmlVO.getStartZ() + "---< " + " 小板孔起点坐标Z数据无效 >---"); + } + } + if (StringUtils.isEmpty(holeXmlVO.getEndX())){ + holeXmlVO.setEndX("---< 小板孔终点坐标X不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(holeXmlVO.getEndX().trim(), Double.class)){ + holeXmlVO.setEndX(holeXmlVO.getEndX() + "---< " + " 小板孔终点坐标X数据无效 >---"); + } + } + if (StringUtils.isEmpty(holeXmlVO.getEndY())){ + holeXmlVO.setEndY("---< 小板孔终点坐标Y不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(holeXmlVO.getEndY().trim(), Double.class)){ + holeXmlVO.setEndY(holeXmlVO.getEndY() + "---< " + " 小板孔终点坐标Y数据无效 >---"); + } + } + if (StringUtils.isEmpty(holeXmlVO.getEndZ())){ + holeXmlVO.setEndZ("---< 小板孔终点坐标Z不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(holeXmlVO.getEndZ().trim(), Double.class)){ + holeXmlVO.setEndZ(holeXmlVO.getEndZ() + "---< " + " 小板孔终点坐标Z数据无效 >---"); + } + } + if (!StringUtils.isEmpty(holeXmlVO.getToolStartRotateX())){ + if (!ToolUtil.convertToType(holeXmlVO.getToolStartRotateX().trim(), Double.class)){ + holeXmlVO.setToolStartRotateX(holeXmlVO.getToolStartRotateX() + "---< " + " 小板孔起点旋转角度X数据无效 >---"); + } + } + if (!StringUtils.isEmpty(holeXmlVO.getToolStartRotateY())){ + if (!ToolUtil.convertToType(holeXmlVO.getToolStartRotateY().trim(), Double.class)){ + holeXmlVO.setToolStartRotateY(holeXmlVO.getToolStartRotateY() + "---< " + " 小板孔起点旋转角度Y数据无效 >---"); + } + } + if (!StringUtils.isEmpty(holeXmlVO.getToolStartRotateZ())){ + if (!ToolUtil.convertToType(holeXmlVO.getToolStartRotateZ().trim(), Double.class)){ + holeXmlVO.setToolStartRotateZ("---< " + holeXmlVO.getToolStartRotateZ() + " 小板孔起点旋转角度Z数据无效 >---"); + } + } + if (!StringUtils.isEmpty(holeXmlVO.getToolEndRotateX())){ + if (!ToolUtil.convertToType(holeXmlVO.getToolEndRotateX().trim(), Double.class)){ + holeXmlVO.setToolEndRotateX("---< " + holeXmlVO.getToolEndRotateX() + " 小板孔终点旋转角度X数据无效 >---"); + } + } + if (!StringUtils.isEmpty(holeXmlVO.getToolEndRotateY())){ + if (!ToolUtil.convertToType(holeXmlVO.getToolEndRotateY().trim(), Double.class)){ + holeXmlVO.setToolEndRotateY("---< " + holeXmlVO.getToolEndRotateY() + " 小板孔终点旋转角度Y数据无效 >---"); + } + } + if (!StringUtils.isEmpty(holeXmlVO.getToolEndRotateZ())){ + if (!ToolUtil.convertToType(holeXmlVO.getToolEndRotateZ().trim(), Double.class)){ + holeXmlVO.setToolEndRotateZ("---< " + holeXmlVO.getToolEndRotateZ() + " 小板孔终点旋转角度Z数据无效 >---"); + } + } + } + + private void checkGrooves(GrooveXmlVOS grooveXmlVOS, Boolean error) { + if (!StringUtils.isEmpty(grooveXmlVOS.getCount()) ){ + Boolean flag = checkNumber(grooveXmlVOS.getCount().trim(), Double.class); + if (!flag) { + grooveXmlVOS.setCount("---< " + grooveXmlVOS.getCount() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(grooveXmlVOS.getCountFaceA())){ + Boolean flag = checkNumber(grooveXmlVOS.getCountFaceA().trim(), Integer.class); + if (!flag) { + grooveXmlVOS.setCountFaceA("---< " + grooveXmlVOS.getCountFaceA() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(grooveXmlVOS.getCountFaceB())){ + Boolean flag = checkNumber(grooveXmlVOS.getCountFaceB().trim(), Integer.class); + if (!flag) { + grooveXmlVOS.setCountFaceB("---< " + grooveXmlVOS.getCountFaceB() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(grooveXmlVOS.getCountSide())){ + Boolean flag = checkNumber(grooveXmlVOS.getCountSide().trim(), Integer.class); + if (!flag) { + grooveXmlVOS.setCountSide("---< " + grooveXmlVOS.getCountSide() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(grooveXmlVOS.getCountSideL())){ + Boolean flag = checkNumber(grooveXmlVOS.getCountSideL().trim(), Integer.class); + if (!flag) { + grooveXmlVOS.setCountSideL("---< " + grooveXmlVOS.getCountSideL() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(grooveXmlVOS.getCountSideR())){ + Boolean flag = checkNumber(grooveXmlVOS.getCountSideR().trim(), Integer.class); + if (!flag) { + grooveXmlVOS.setCountSideR("---< " + grooveXmlVOS.getCountSideR() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(grooveXmlVOS.getCountSideU())){ + Boolean flag = checkNumber(grooveXmlVOS.getCountSideU().trim(), Integer.class); + if (!flag) { + grooveXmlVOS.setCountSideU("---< " + grooveXmlVOS.getCountSideU() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(grooveXmlVOS.getCountSideD())){ + Boolean flag = checkNumber(grooveXmlVOS.getCountSideD().trim(), Integer.class); + if (!flag) { + grooveXmlVOS.setCountSideD("---< " + grooveXmlVOS.getCountSideD() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(grooveXmlVOS.getCountBevelled())){ + Boolean flag = checkNumber(grooveXmlVOS.getCountBevelled().trim(), Integer.class); + if (!flag) { + grooveXmlVOS.setCountBevelled("---< " + grooveXmlVOS.getCountBevelled() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(grooveXmlVOS.getCountRectangle())){ + Boolean flag = checkNumber(grooveXmlVOS.getCountRectangle().trim(), Integer.class); + if (!flag) { + grooveXmlVOS.setCountRectangle("---< " + grooveXmlVOS.getCountRectangle() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(grooveXmlVOS.getCountThrough())){ + Boolean flag = checkNumber(grooveXmlVOS.getCountThrough().trim(), Integer.class); + if (!flag) { + grooveXmlVOS.setCountThrough("---< " + grooveXmlVOS.getCountThrough() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(grooveXmlVOS.getCount2V())){ + Boolean flag = checkNumber(grooveXmlVOS.getCount2V().trim(), Integer.class); + if (!flag) { + grooveXmlVOS.setCount2V("---< " + grooveXmlVOS.getCount2V() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(grooveXmlVOS.getCount3D())){ + Boolean flag = checkNumber(grooveXmlVOS.getCount3D().trim(), Integer.class); + if (!flag) { + grooveXmlVOS.setCount3D("---< " + grooveXmlVOS.getCount3D() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + + if (grooveXmlVOS.getGrooveXmlVOList() != null && grooveXmlVOS.getGrooveXmlVOList().size() > 0){ + for (GrooveXmlVO grooveXmlVO : grooveXmlVOS.getGrooveXmlVOList()) { + checkGroove(grooveXmlVO, error); + } + } + } + + private void checkGroove(GrooveXmlVO grooveXmlVO, Boolean error) { + if (StringUtils.isEmpty(grooveXmlVO.getId())){ + grooveXmlVO.setId("---< 凹槽信息ID不可为空 >---"); + error = false; + } + // 父孤岛id + + if (StringUtils.isEmpty(grooveXmlVO.getType())){ + grooveXmlVO.setType("---< 槽类型数据不可以为空 >---"); + error = false; + } + if (StringUtils.isEmpty(grooveXmlVO.getFace())){ + grooveXmlVO.setFace("---< 槽面不可为空 >---"); + error = false; + } else { + DictDataRespDTO dictDataDO = dictDataApi.parseDictData(DictTypeConstants.HOLE_FACE, grooveXmlVO.getFace().trim()).getData(); + if (dictDataDO == null){ + grooveXmlVO.setFace(grooveXmlVO.getFace() + "---< 槽加工面数据无效 >---"); + error = false; + } + } + if (grooveXmlVO.getType().trim().equals("矩形槽")) { + if (StringUtils.isEmpty(grooveXmlVO.getWidth())){ + grooveXmlVO.setWidth("---< 当槽为矩形时,槽宽度不可为空 >---"); + error = false; + } + } + if (!StringUtils.isEmpty(grooveXmlVO.getWidth())) { + Boolean flag = checkNumber(grooveXmlVO.getWidth().trim(), Double.class); + if (!flag) { + grooveXmlVO.setWidth("---< " + grooveXmlVO.getWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(grooveXmlVO.getLength())) { + Boolean flag = checkNumber(grooveXmlVO.getLength().trim(), Double.class); + if (!flag) { + grooveXmlVO.setLength("---< " + grooveXmlVO.getLength() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(grooveXmlVO.getDepth())){ + grooveXmlVO.setDepth("---< 槽深度不可为空 >---"); + error = false; + } else { + Boolean flag = checkNumber(grooveXmlVO.getDepth().trim(), Double.class); + if (!flag) { + grooveXmlVO.setDepth("---< " + grooveXmlVO.getDepth() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(grooveXmlVO.getWidthExtend())){ + Boolean flag = checkNumber(grooveXmlVO.getWidthExtend().trim(), Double.class); + if (!flag) { + grooveXmlVO.setWidthExtend("---< " + grooveXmlVO.getWidthExtend() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + }else { + grooveXmlVO.setWidthExtend("0"); + } + if (!StringUtils.isEmpty(grooveXmlVO.getLengthExtend())){ + Boolean flag = checkNumber(grooveXmlVO.getLengthExtend().trim(), Double.class); + if (!flag) { + grooveXmlVO.setLengthExtend("---< " + grooveXmlVO.getLengthExtend() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } else { + grooveXmlVO.setLengthExtend("0"); + } + if (!StringUtils.isEmpty(grooveXmlVO.getDepthExtend())){ + Boolean flag = checkNumber(grooveXmlVO.getDepthExtend().trim(), Double.class); + if (!flag) { + grooveXmlVO.setDepthExtend("---< " + grooveXmlVO.getDepthExtend() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } else { + grooveXmlVO.setDepthExtend("0"); + } + if (!StringUtils.isEmpty(grooveXmlVO.getRound())){ + Boolean flag = checkNumber(grooveXmlVO.getRound().trim(), Double.class); + if (!flag) { + grooveXmlVO.setRound("---< " + grooveXmlVO.getRound() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } else { + grooveXmlVO.setRound("0"); + } + if (grooveXmlVO.getType().trim().equals("路径槽") || grooveXmlVO.getType().trim().equals("折返路径槽")){ + if (StringUtils.isEmpty(grooveXmlVO.getToolDiameter())){ + grooveXmlVO.setToolDiameter("---< 当槽为路径槽或是折返路径槽时,刀直径不可为空 >---"); + error = false; + } + } + if (!StringUtils.isEmpty(grooveXmlVO.getToolDiameter())){ + Boolean flag = checkNumber(grooveXmlVO.getToolDiameter().trim(), Double.class); + if (!flag) { + grooveXmlVO.setToolDiameter("---< " + grooveXmlVO.getToolDiameter() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(grooveXmlVO.getRedundance())){ + Boolean flag = checkNumber(grooveXmlVO.getRedundance().trim(), Double.class); + if (!flag) { + grooveXmlVO.setRedundance("---< " + grooveXmlVO.getRedundance() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } else { + grooveXmlVO.setRedundance("0"); + } + if (!StringUtils.isEmpty(grooveXmlVO.getTangentAngle())){ + Boolean flag = checkNumber(grooveXmlVO.getTangentAngle().trim(), Double.class); + if (!flag) { + grooveXmlVO.setTangentAngle("---< " + grooveXmlVO.getTangentAngle() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } else { + grooveXmlVO.setTangentAngle("0"); + } + if (!StringUtils.isEmpty(grooveXmlVO.getIsletCount())){ + Boolean flag = checkNumber(grooveXmlVO.getIsletCount().trim(), Integer.class); + if (!flag) { + grooveXmlVO.setIsletCount("---< " + grooveXmlVO.getIsletCount() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } else { + grooveXmlVO.setIsletCount("0"); + } + if (grooveXmlVO.getPointXmlVOS() == null || grooveXmlVO.getPointXmlVOS().getPointXmlVOList() == null || grooveXmlVO.getPointXmlVOS().getPointXmlVOList().size() < 1) { + grooveXmlVO.setResult("---< 槽点坐标列表不可为空 >---"); + error = false; + } else { + for (PointXmlVO pointXmlVO : grooveXmlVO.getPointXmlVOS().getPointXmlVOList()) { + checkPoint(pointXmlVO, error); + } + } + + if (grooveXmlVO.getOffsetLineXmlVOS() != null && grooveXmlVO.getOffsetLineXmlVOS().getOffsetLineXmlVOList() != null && grooveXmlVO.getOffsetLineXmlVOS().getOffsetLineXmlVOList().size() > 0){ + for (OffsetLineXmlVO offsetLineXmlVO : grooveXmlVO.getOffsetLineXmlVOS().getOffsetLineXmlVOList()) { + checkOffsetLine(offsetLineXmlVO, error); + } + } + } + + private void checkOffsetLine(OffsetLineXmlVO offsetLineXmlVO, Boolean error) { + if (StringUtils.isEmpty(offsetLineXmlVO.getOffset())){ + offsetLineXmlVO.setOffset("---< 偏移刀路偏移量不可为空 >---"); + error = false; + } else { + Boolean flag = ToolUtil.convertToType(offsetLineXmlVO.getOffset().trim(), Double.class); + if (!flag) { + offsetLineXmlVO.setOffset("---< " + offsetLineXmlVO.getOffset() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(offsetLineXmlVO.getDepth())){ + offsetLineXmlVO.setDepth("---< 偏移刀路深度不可为空 >---"); + error = false; + } else { + Boolean flag = ToolUtil.convertToType(offsetLineXmlVO.getDepth().trim(), Double.class); + if (!flag) { + offsetLineXmlVO.setDepth("---< " + offsetLineXmlVO.getDepth() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + } + } + if (StringUtils.isEmpty(offsetLineXmlVO.getToolDiameter())) { + offsetLineXmlVO.setToolDiameter("---< 偏移刀路所用刀的直径不可为空 >---"); + error = false; + } else { + Boolean flag = ToolUtil.convertToType(offsetLineXmlVO.getToolDiameter().trim(), Double.class); + if (!flag) { + offsetLineXmlVO.setToolDiameter("---< " + offsetLineXmlVO.getToolDiameter() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (!StringUtils.isEmpty(offsetLineXmlVO.getTangentAngle())){ + Boolean flag = checkNumber(offsetLineXmlVO.getTangentAngle().trim(), Double.class); + if (!flag) { + offsetLineXmlVO.setTangentAngle("---< " + offsetLineXmlVO.getTangentAngle() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } else { + offsetLineXmlVO.setTangentAngle("0"); + } + } + + private void checkRawOutline(RawOutlineXmlVO rawOutlineXmlVO, Boolean error) { + Boolean index = true; + if (StringUtils.isEmpty(rawOutlineXmlVO.getCount())){ + rawOutlineXmlVO.setCount("---< 小板坯料(精加工)轮廓点阵列表数量不可为空 >---"); + error = false; + index = false; + } else { + Boolean flag = checkNumber(rawOutlineXmlVO.getCount().trim(), Integer.class); + if (!flag) { + rawOutlineXmlVO.setCount("---< " + rawOutlineXmlVO.getCount() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + index = false; + } + } + if (StringUtils.isEmpty(rawOutlineXmlVO.getReferenceOffsetX())){ + rawOutlineXmlVO.setReferenceOffsetX("---< 小板开坯料(精加工)轮廓参考点X坐标不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(rawOutlineXmlVO.getReferenceOffsetX().trim(), Double.class)) { + rawOutlineXmlVO.setReferenceOffsetX("---< " + rawOutlineXmlVO.getReferenceOffsetX() + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(rawOutlineXmlVO.getReferenceOffsetY())){ + rawOutlineXmlVO.setReferenceOffsetY("---< 小板坯料(精加工)轮廓参考点Y坐标不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(rawOutlineXmlVO.getReferenceOffsetY().trim(), Double.class)) { + rawOutlineXmlVO.setReferenceOffsetY("---< " + rawOutlineXmlVO.getReferenceOffsetY() + TYPE_ERR + " >---"); + error = false; + } + } + + if (rawOutlineXmlVO.getPointXmlVOList() != null && rawOutlineXmlVO.getPointXmlVOList().size() > 0){ + if (index) { + if (Integer.parseInt(rawOutlineXmlVO.getCount()) != rawOutlineXmlVO.getPointXmlVOList().size()){ + rawOutlineXmlVO.setCount("---< 小板坯料(精加工)点阵数量与实际数量不一致 >---"); + error = false; + } + } else { + for (PointXmlVO pointXmlVO : rawOutlineXmlVO.getPointXmlVOList()) { + checkPoint(pointXmlVO, error); + } + } + } + } + + private void checkCuttingOutline(CuttingOutlineXmlVO cuttingOutlineXmlVO, Boolean error) { + Boolean index = true; + if (StringUtils.isEmpty(cuttingOutlineXmlVO.getCount())){ + cuttingOutlineXmlVO.setCount("---< 小板开料轮廓点阵列表数量不可为空 >---"); + error = false; + index = false; + } else { + Boolean flag = checkNumber(cuttingOutlineXmlVO.getCount().trim(), Integer.class); + if (!flag) { + cuttingOutlineXmlVO.setCount("---< " + cuttingOutlineXmlVO.getCount() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + index = false; + } + } + if (StringUtils.isEmpty(cuttingOutlineXmlVO.getReferenceOffsetX())){ + cuttingOutlineXmlVO.setReferenceOffsetX("---< 小板开料轮廓参考点X坐标不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(cuttingOutlineXmlVO.getReferenceOffsetX().trim(), Double.class)) { + cuttingOutlineXmlVO.setReferenceOffsetX("---< " + cuttingOutlineXmlVO.getReferenceOffsetX() + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(cuttingOutlineXmlVO.getReferenceOffsetY())){ + cuttingOutlineXmlVO.setReferenceOffsetY("---< 小板开料轮廓参考点Y坐标不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(cuttingOutlineXmlVO.getReferenceOffsetY().trim(), Double.class)) { + cuttingOutlineXmlVO.setReferenceOffsetY("---< " + cuttingOutlineXmlVO.getReferenceOffsetY() + TYPE_ERR + " >---"); + error = false; + } + } + + if (cuttingOutlineXmlVO.getPointXmlVOList() != null && cuttingOutlineXmlVO.getPointXmlVOList().size() > 0){ + if (index) { + if (Integer.parseInt(cuttingOutlineXmlVO.getCount()) != cuttingOutlineXmlVO.getPointXmlVOList().size()){ + cuttingOutlineXmlVO.setCount("---< 小板轮廓点阵数量与实际数量不一致 >---"); + error = false; + } + } else { + for (PointXmlVO pointXmlVO : cuttingOutlineXmlVO.getPointXmlVOList()) { + checkPoint(pointXmlVO, error); + } + } + } + } + + public void checkOutline(OutlineXmlVO outlineXmlVO, Boolean error) { + Boolean index = true; + if (StringUtils.isEmpty(outlineXmlVO.getCount())){ + outlineXmlVO.setCount("---< 小板成品轮廓点阵列表数量不可为空 >---"); + error = false; + index = false; + } else { + Boolean flag = checkNumber(outlineXmlVO.getCount().trim(), Integer.class); + if (!flag) { + outlineXmlVO.setCount("---< " + outlineXmlVO.getCount() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + index = false; + } + } + if (outlineXmlVO.getPointXmlVOList() != null && outlineXmlVO.getPointXmlVOList().size() > 0){ + if (index){ + if (Integer.parseInt(outlineXmlVO.getCount()) != outlineXmlVO.getPointXmlVOList().size()){ + outlineXmlVO.setCount("---< 小板轮廓点阵数量与实际数量不一致 >---"); + error = false; + } + } else { + for (PointXmlVO pointXmlVO : outlineXmlVO.getPointXmlVOList()) { + checkPoint(pointXmlVO, error); + if (StringUtils.isEmpty(pointXmlVO.getItemCode())){ + if (StringUtils.isEmpty(pointXmlVO.getEdgingName()) || StringUtils.isEmpty(pointXmlVO.getEdgingColor()) || + StringUtils.isEmpty(pointXmlVO.getEdgingMaterial())){ + pointXmlVO.setItemCode("---< 当封边条没有物料编码时,封边条名称、颜色、材质不可为空 >---"); + error = false; + } + } + if (StringUtils.isEmpty(pointXmlVO.getEdgingThickness())){ + pointXmlVO.setEdgingThickness("0"); + } else { + if (!checkNumber(pointXmlVO.getEdgingThickness().trim(), Double.class)) { + pointXmlVO.setEdgingThickness("---< " + pointXmlVO.getEdgingThickness() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(pointXmlVO.getEdgingExtend())){ + pointXmlVO.setEdgingExtend("0"); + } else { + if (!checkNumber(pointXmlVO.getEdgingExtend().trim(), Double.class)) { + pointXmlVO.setEdgingExtend("---< " + pointXmlVO.getEdgingExtend() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(pointXmlVO.getPreMilling())){ + pointXmlVO.setPreMilling("0"); + } else { + if (!checkNumber(pointXmlVO.getPreMilling().trim(), Double.class)) { + pointXmlVO.setPreMilling("---< " + pointXmlVO.getPreMilling() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(pointXmlVO.getScale())){ + pointXmlVO.setScale("0"); + } else { + if (!ToolUtil.convertToType(pointXmlVO.getScale().trim(), Double.class)) { + pointXmlVO.setScale("---< " + pointXmlVO.getScale() + TYPE_ERR + " >---"); + error = false; + } + } + } + } + } + } + // 数据格式+数据正数判断 private Boolean checkNumber(String numberStr, Class targetType) { boolean error = true; @@ -996,4 +1926,43 @@ public class XMLUtil { } return true; } + // point 验证 + private void checkPoint(PointXmlVO pointXmlVO, Boolean error) { + if (StringUtils.isEmpty(pointXmlVO.getPointX())){ + pointXmlVO.setPointX("---< 小板轮廓起点坐标X不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(pointXmlVO.getPointX(), Double.class)) { + pointXmlVO.setPointX("---< " + pointXmlVO.getPointX() + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(pointXmlVO.getPointY())){ + pointXmlVO.setPointY("---< 小板轮廓起点坐标Y不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(pointXmlVO.getPointY(), Double.class)) { + pointXmlVO.setPointY("---< " + pointXmlVO.getPointY() + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(pointXmlVO.getCurvature())){ + pointXmlVO.setPointZ("---< 小板轮廓边圆弧凹凸度不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(pointXmlVO.getCurvature(), Double.class)) { + pointXmlVO.setCurvature("---< " + pointXmlVO.getCurvature() + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(pointXmlVO.getRadius())){ + pointXmlVO.setRadius("---< 小板轮廓边圆弧半径不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(pointXmlVO.getRadius(), Double.class)) { + pointXmlVO.setRadius("---< " + pointXmlVO.getRadius() + TYPE_ERR + " >---"); + error = false; + } + } + } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XmlTypeRealize.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XmlTypeRealize.java index 682d5ebeb..c94e50164 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XmlTypeRealize.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XmlTypeRealize.java @@ -3,6 +3,7 @@ package com.cf.imes.module.executor.util.fileConversion.admin.files.xml; import com.alibaba.fastjson.JSONObject; import com.alibaba.nacos.common.utils.StringUtils; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; +import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator; import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRemark; import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO; import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyDO; @@ -46,6 +47,8 @@ public class XmlTypeRealize { final String NOT_ASSIGNED = "未命名"; + @Resource + private SnowFlakeGenerator snowFlakeGenerator; @Resource private IdentifierGenerator identifierGenerator; @@ -58,7 +61,7 @@ public class XmlTypeRealize { for (RoomXmlVO roomXmlVO : roomXmlVOS.getRoomXmlVOList()) { Map bodyInfos = new HashMap<>(); - Long roomId = Long.valueOf(roomXmlVO.getId()); + Long roomId = (Long) snowFlakeGenerator.nextId(null); for (BoxXmlVO boxXmlVO : roomXmlVO.getBoxXmlVOList()) { OrderBodyDO orderBodyDO = OrderBodyDO.builder() .id((Long) identifierGenerator.nextId(null)) @@ -73,9 +76,9 @@ public class XmlTypeRealize { .plateNum(0) .unregularNum(0) .build(); - bodyInfos.put(boxXmlVO.getId(), orderBodyDO); + bodyInfos.put(boxXmlVO.getCode(), orderBodyDO); } - roomInfos.put(roomXmlVO.getId(), bodyInfos); + roomInfos.put(roomXmlVO.getCode(), bodyInfos); } } return roomInfos; @@ -96,9 +99,9 @@ public class XmlTypeRealize { .axisYrotate(Double.valueOf(boxXmlVO.getAxisYrotate())) .axisZrotate(Double.valueOf(boxXmlVO.getAxisZrotate())) .build(); - basePositions.put(boxXmlVO.getId(), basePosition); + basePositions.put(boxXmlVO.getCode(), basePosition); } - roomInfos.put(roomXmlVO.getId(), basePositions); + roomInfos.put(roomXmlVO.getCode(), basePositions); } } return roomInfos; @@ -122,7 +125,7 @@ public class XmlTypeRealize { .plateNum(0) .unregularNum(0) .build(); - groupInfos.put(groupXmlVO.getId(), groupDO); + groupInfos.put(groupXmlVO.getCode(), groupDO); } } return groupInfos; @@ -179,7 +182,7 @@ public class XmlTypeRealize { .id(rawGoodsId) .organId(organId) .orderId(orderId) - .rawGoodsId(plateXmlVO.getItemNo()) + .rawGoodsId(plateXmlVO.getItemCode()) .goodsName(plateXmlVO.getName()) .material(plateXmlVO.getMaterial()) .color(plateXmlVO.getCoatingObverse()) @@ -195,7 +198,7 @@ public class XmlTypeRealize { .organId(organId) .orderId(orderId) .rawGoodsId(String.valueOf(rawGoodsId)) - .goodsId(plateXmlVO.getItemNo()) + .goodsId(plateXmlVO.getItemCode()) .goodsName(plateXmlVO.getName()) .material(plateXmlVO.getMaterial()) .color(plateXmlVO.getCoatingObverse()) @@ -304,14 +307,14 @@ public class XmlTypeRealize { EdgingXmlVOS edgingXmlVOS = accessoryXmlVO.getEdgingXmlVOS(); for (EdgingXmlVO edgingXmlVO : edgingXmlVOS.getEdgingXmlVOList()) { - Map idMap = getId(edgingXmlVO.getRoomId(), edgingXmlVO.getBoxId(), roomInfos, edgingXmlVO.getGroupId(), groupInfos, 0.0, 0.0, orderId, organId); + Map idMap = getId(edgingXmlVO.getRoomCode(), edgingXmlVO.getBoxCode(), roomInfos, edgingXmlVO.getGroupCode(), groupInfos, 0.0, 0.0, orderId, organId); Long partsId = (Long) identifierGenerator.nextId(null); - orderPartsMap.put(edgingXmlVO.getId(), OrderPartsAddVO.builder() + orderPartsMap.put(edgingXmlVO.getItemCode(), OrderPartsAddVO.builder() .id(partsId) .organId(organId) .orderId(orderId) - .goodsId(edgingXmlVO.getItemNo()) + .goodsId(edgingXmlVO.getItemCode()) .factory(edgingXmlVO.getManufacturer()) .brand(edgingXmlVO.getBrand()) .name(edgingXmlVO.getName()) @@ -328,7 +331,7 @@ public class XmlTypeRealize { .num(Double.valueOf(edgingXmlVO.getCount())) .build()); - orderItemMap.put(edgingXmlVO.getId(), OrderItemDO.builder() + orderItemMap.put(edgingXmlVO.getItemCode(), OrderItemDO.builder() .id((Long) identifierGenerator.nextId(null)) .organId(organId) .orderId(orderId) @@ -339,7 +342,7 @@ public class XmlTypeRealize { .bodyId(idMap.get("bodyId")) .num(Double.valueOf(edgingXmlVO.getCount())) .build()); - orderPartsDOMap.put(edgingXmlVO.getId(), OrderPartsDO.builder() + orderPartsDOMap.put(edgingXmlVO.getItemCode(), OrderPartsDO.builder() .id(partsId) .organId(organId) .orderId(orderId) @@ -353,7 +356,7 @@ public class XmlTypeRealize { .build()); if (edgingXmlVO.getRemarkXmlVOS() != null && edgingXmlVO.getRemarkXmlVOS().getRemarkXmlVOList() != null && edgingXmlVO.getRemarkXmlVOS().getRemarkXmlVOList().size() > 0) { - orderPartsRemarks.put(edgingXmlVO.getId(), OrderPartsRemark.builder() + orderPartsRemarks.put(edgingXmlVO.getItemCode(), OrderPartsRemark.builder() .partsId(partsId) .orderId(orderId) .remark(edgingXmlVO.getRemarkXmlVOS().toString()) @@ -365,15 +368,15 @@ public class XmlTypeRealize { HardwareXmlVOS hardwareXmlVOS = accessoryXmlVO.getHardwareXmlVOS(); for (HardwareXmlVO hardwareXmlVO : hardwareXmlVOS.getHardwareXmlVOList()) { - Map idMap = getId(hardwareXmlVO.getRoomId(), hardwareXmlVO.getBoxId(), roomInfos, hardwareXmlVO.getGroupId(), groupInfos, 0.0, 0.0,orderId, organId); + Map idMap = getId(hardwareXmlVO.getRoomCode(), hardwareXmlVO.getBoxCode(), roomInfos, hardwareXmlVO.getGroupCode(), groupInfos, 0.0, 0.0,orderId, organId); Long partsId = (Long) identifierGenerator.nextId(null); - orderPartsMap.put(hardwareXmlVO.getId(), OrderPartsAddVO.builder() + orderPartsMap.put(hardwareXmlVO.getItemCode(), OrderPartsAddVO.builder() .id(partsId) .organId(organId) .type(hardwareXmlVO.getType()) .orderId(orderId) - .goodsId(hardwareXmlVO.getItemNo()) + .goodsId(hardwareXmlVO.getItemCode()) .factory(hardwareXmlVO.getManufacturer()) .brand(hardwareXmlVO.getBrand()) .name(hardwareXmlVO.getName()) @@ -387,11 +390,11 @@ public class XmlTypeRealize { .shelf(hardwareXmlVO.getShelf()) .color(hardwareXmlVO.getColor()) .num(Double.valueOf(hardwareXmlVO.getCount())) - .roomId(hardwareXmlVO.getRoomId()) - .bodyId(hardwareXmlVO.getBoxId()) + .roomId(hardwareXmlVO.getRoomCode()) + .bodyId(hardwareXmlVO.getBoxCode()) .isComposite(false) .build()); - orderItemMap.put(hardwareXmlVO.getId(), OrderItemDO.builder() + orderItemMap.put(hardwareXmlVO.getItemCode(), OrderItemDO.builder() .id((Long) identifierGenerator.nextId(null)) .organId(organId) .orderId(orderId) @@ -402,7 +405,7 @@ public class XmlTypeRealize { .bodyId(idMap.get("bodyId")) .num(Double.valueOf(hardwareXmlVO.getCount())) .build()); - orderPartsDOMap.put(hardwareXmlVO.getId(), OrderPartsDO.builder() + orderPartsDOMap.put(hardwareXmlVO.getItemCode(), OrderPartsDO.builder() .id(partsId) .organId(organId) .orderId(orderId) @@ -415,7 +418,7 @@ public class XmlTypeRealize { .isComposite(false) .build()); if (hardwareXmlVO.getRemarkXmlVOS() != null && hardwareXmlVO.getRemarkXmlVOS().getRemarkXmlVOList() != null && hardwareXmlVO.getRemarkXmlVOS().getRemarkXmlVOList().size() > 0) { - orderPartsRemarks.put(hardwareXmlVO.getId(), OrderPartsRemark.builder() + orderPartsRemarks.put(hardwareXmlVO.getItemCode(), OrderPartsRemark.builder() .partsId(partsId) .orderId(orderId) .remark(hardwareXmlVO.getRemarkXmlVOS().toString()) @@ -429,15 +432,15 @@ public class XmlTypeRealize { for (AssemblyXmlVO assemblyXmlVO : assemblieXmlVOS.getAssemblyXmlVOList()) { if (assemblyXmlVO != null && assemblyXmlVO.toString().length() > 0) { - Map idMap = getId(assemblyXmlVO.getRoomId(), assemblyXmlVO.getBoxId(), roomInfos, assemblyXmlVO.getGroupId(), groupInfos, 0.0, 0.0, orderId, organId); + Map idMap = getId(assemblyXmlVO.getRoomCode(), assemblyXmlVO.getBoxCode(), roomInfos, assemblyXmlVO.getGroupCode(), groupInfos, 0.0, 0.0, orderId, organId); Long partsId = (Long) identifierGenerator.nextId(null); - orderPartsMap.put(assemblyXmlVO.getId(), OrderPartsAddVO.builder() + orderPartsMap.put(assemblyXmlVO.getItemCode(), OrderPartsAddVO.builder() .id(partsId) .organId(organId) .orderId(orderId) .type(assemblyXmlVO.getType()) - .goodsId(assemblyXmlVO.getItemNo()) + .goodsId(assemblyXmlVO.getItemCode()) .factory(assemblyXmlVO.getManufacturer()) .brand(assemblyXmlVO.getBrand()) .name(assemblyXmlVO.getName()) @@ -451,11 +454,11 @@ public class XmlTypeRealize { .unit((assemblyXmlVO.getUnit())) .warehouse(assemblyXmlVO.getWarehouse()) .shelf(assemblyXmlVO.getShelf()) - .roomId(assemblyXmlVO.getRoomId()) - .bodyId(assemblyXmlVO.getBoxId()) + .roomId(assemblyXmlVO.getRoomCode()) + .bodyId(assemblyXmlVO.getBoxCode()) .isComposite(true) .build()); - orderItemMap.put(assemblyXmlVO.getId(), OrderItemDO.builder() + orderItemMap.put(assemblyXmlVO.getItemCode(), OrderItemDO.builder() .id((Long) identifierGenerator.nextId(null)) .organId(organId) .orderId(orderId) @@ -466,7 +469,7 @@ public class XmlTypeRealize { .bodyId(idMap.get("bodyId")) .num(Double.valueOf(assemblyXmlVO.getCount())) .build()); - orderPartsDOMap.put(assemblyXmlVO.getId(), OrderPartsDO.builder() + orderPartsDOMap.put(assemblyXmlVO.getItemCode(), OrderPartsDO.builder() .id(partsId) .organId(organId) .orderId(orderId) @@ -479,7 +482,7 @@ public class XmlTypeRealize { .isComposite(true) .build()); if (assemblyXmlVO.getRemarkXmlVOS() != null && assemblyXmlVO.getRemarkXmlVOS().getRemarkXmlVOList() != null && assemblyXmlVO.getRemarkXmlVOS().getRemarkXmlVOList().size() > 0) { - orderPartsRemarks.put(assemblyXmlVO.getId(), OrderPartsRemark.builder() + orderPartsRemarks.put(assemblyXmlVO.getItemCode(), OrderPartsRemark.builder() .partsId(partsId) .orderId(orderId) .remark(assemblyXmlVO.getRemarkXmlVOS().toString()) @@ -521,8 +524,8 @@ public class XmlTypeRealize { }else { plateNum = 1.0; } - Map idMap = getId(blockXmlVO.getRoomId(), blockXmlVO.getBoxId(), roomInfos, blockXmlVO.getGroupId(), groupInfos, plateNum, unregularNum, orderId, organId); - BasePosition boxBasePoint = boxBasePositionMap.get(blockXmlVO.getRoomId()).get(blockXmlVO.getBoxId()).setBasePoint(String.valueOf(idMap.get("bodyId"))); + Map idMap = getId(blockXmlVO.getRoomCode(), blockXmlVO.getBoxCode(), roomInfos, blockXmlVO.getGroupCode(), groupInfos, plateNum, unregularNum, orderId, organId); + BasePosition boxBasePoint = boxBasePositionMap.get(blockXmlVO.getRoomCode()).get(blockXmlVO.getBoxCode()).setBasePoint(String.valueOf(idMap.get("bodyId"))); PlateDO plateDO = PlateDO.builder() .id(plateId) @@ -547,7 +550,7 @@ public class XmlTypeRealize { .isSpecialShaped(convertToBoolean(blockXmlVO.getUnregular())) .build(); - orderItemMap.put(blockXmlVO.getId(), OrderItemDO.builder() + orderItemMap.put(blockXmlVO.getProductionCode(), OrderItemDO.builder() .id((Long) identifierGenerator.nextId(null)) .organId(organId) .orderId(orderId) @@ -561,7 +564,7 @@ public class XmlTypeRealize { // 基点坐标获取 BasePosition plateBasePosition = BasePosition.builder() - .basePoint(blockXmlVO.getId()) + .basePoint(blockXmlVO.getProductionCode()) .basePointX(Double.valueOf(blockXmlVO.getBasePointX())) .basePointY(Double.valueOf(blockXmlVO.getBasePointY())) .basePointZ(Double.valueOf(blockXmlVO.getBasePointZ())) @@ -573,7 +576,7 @@ public class XmlTypeRealize { .plateId(plateId) .plateNo(plateDO.getPlateNo()) .name(plateDO.getName()) - .customPlateNo(blockXmlVO.getDesignNo()) + .customPlateNo(blockXmlVO.getDesignCode()) .texture(plateDO.getTexture()) .typographicFace(plateDO.getHoleFace()) .openDoorType(plateDO.getOpenDoorType()) @@ -602,8 +605,10 @@ public class XmlTypeRealize { addPointDetail(plateDO, plateDetail, blockXmlVO.getCuttingOutlineXmlVO()); // 孔数据 addHole(plateDO, plateDetail, blockXmlVO.getHoleXmlVOS()); - // 造型数据 + // 造型数据 (槽) addContourDetail(plateDO, plateDetail, blockXmlVO.getGrooveXmlVOS()); + // 造型数据(孤岛) + addIslandDetail(plateDetail, blockXmlVO.getIsletXmlVOS()); // 小板备注信息 addRemark(plateDO, plateDetail, blockXmlVO); @@ -616,6 +621,20 @@ public class XmlTypeRealize { return plateDetails; } + private void addIslandDetail(PlateDetail plateDetail, IsletXmlVOS isletXmlVOS) { + if (isletXmlVOS != null && ObjectUtils.allNull(isletXmlVOS)) { + if (isletXmlVOS.getIsletXmlVOList() != null && isletXmlVOS.getIsletXmlVOList().size() > 0) { + for (IsletXmlVO isletXmlVO : isletXmlVOS.getIsletXmlVOList()) { + ModelDetail modelDetail = ModelDetail.builder() + .id(Integer.valueOf(isletXmlVO.getId())) + .parentId(Integer.valueOf(isletXmlVO.getParentId())) + .pointList(addPointDetail(isletXmlVO.getPointXmlVOS())).build(); + plateDetail.getContourDetail().add(modelDetail); + } + } + } + } + // 是否转换布尔值 public Boolean convertToBoolean(String str) { Boolean isTrue = false; @@ -642,7 +661,7 @@ public class XmlTypeRealize { for (PointXmlVO pointXmlVO : outlineXmlVO.getPointXmlVOList()) { Double x = Double.parseDouble(pointXmlVO.getPointX()); Double y = Double.parseDouble(pointXmlVO.getPointY()); - OrderPartsAddVO edging = (OrderPartsAddVO) edgIng.get(pointXmlVO.getEdgingId()); + OrderPartsAddVO edging = (OrderPartsAddVO) edgIng.get(pointXmlVO.getItemCode()); if (edging != null){ size = edging.getThickness(); } @@ -663,7 +682,7 @@ public class XmlTypeRealize { } plateDetail.getRawPointDetail().add(PointDetail.builder() - .id(pointXmlVO.getId()) +// .id(pointXmlVO.getId()) .pointX(x) .pointY(y) .curve(Double.parseDouble(pointXmlVO.getCurvature())) @@ -686,7 +705,7 @@ public class XmlTypeRealize { if (cuttingOutlineXmlVO.getPointXmlVOList() != null && cuttingOutlineXmlVO.getPointXmlVOList().size() > 0) { for (PointXmlVO pointXmlVO : cuttingOutlineXmlVO.getPointXmlVOList()) { plateDetail.getPointDetail().add(PointDetail.builder() - .id(pointXmlVO.getId()) +// .id(pointXmlVO.getId()) .pointX(Double.parseDouble(pointXmlVO.getPointX())) .pointY(Double.parseDouble(pointXmlVO.getPointY())) .curve(Double.parseDouble(pointXmlVO.getCurvature())) @@ -709,8 +728,8 @@ public class XmlTypeRealize { if (holeXmlVOS.getHoleXmlVOList() != null && holeXmlVOS.getHoleXmlVOList().size() > 0) { for (HoleXmlVO holeXmlVO : holeXmlVOS.getHoleXmlVOList()) { DictDataRespDTO faceType = dictDataApi.parseDictData(DictTypeConstants.HOLE_FACE, holeXmlVO.getFace()).getData(); - Integer faceTypeValue = faceType != null ? Integer.valueOf(faceType.getValue()) : 2; - Integer direction = Integer.valueOf(dictDataApi.parseDictData(DictTypeConstants.HOLE_DIR, holeXmlVO.getDirection()).getData().getValue()); + Integer faceTypeValue = faceType != null ? Integer.parseInt(faceType.getValue()) : 2; + Integer direction = Integer.valueOf(dictDataApi.parseDictData(DictTypeConstants.HOLE_DIRECTION, holeXmlVO.getDirection()).getData().getValue()); DictDataRespDTO holeType = holeXmlVO.getType() == null ? null : dictDataApi.parseDictData(DictTypeConstants.HOLE_TYPE, holeXmlVO.getType()).getData(); Double radius = holeXmlVO.getDiameter() != null ? Double.parseDouble(holeXmlVO.getDiameter()) / 2 : 0; Double depth = holeXmlVO.getDepth() != null ? Double.parseDouble(holeXmlVO.getDepth()) : 0; @@ -748,14 +767,21 @@ public class XmlTypeRealize { } if (grooveXmlVOS.getGrooveXmlVOList() != null && grooveXmlVOS.getGrooveXmlVOList().size() > 0) { for (GrooveXmlVO grooveXmlVO : grooveXmlVOS.getGrooveXmlVOList()) { - Integer faceType = Integer.valueOf(dictDataApi.parseDictData(DictTypeConstants.HOLE_FACE, grooveXmlVO.getFace()).getData().getValue()); + int faceType = Integer.parseInt(dictDataApi.parseDictData(DictTypeConstants.HOLE_FACE, grooveXmlVO.getFace()).getData().getValue()); faceType = faceType == 0 || faceType == 1 ? faceType : 2; ModelDetail modelDetail = ModelDetail.builder() + .id(Integer.valueOf(grooveXmlVO.getId())) + .parentId(Integer.valueOf(grooveXmlVO.getParentId())) .type(grooveXmlVO.getType()) .faceType(faceType) + .width(Double.parseDouble(grooveXmlVO.getWidth())) + .length(Double.parseDouble(grooveXmlVO.getLength())) .depth(Double.parseDouble(grooveXmlVO.getDepth())) .knifeName(grooveXmlVO.getToolName()) .knifeRadius(Double.parseDouble(grooveXmlVO.getToolDiameter()) / 2) + .round(Double.parseDouble(grooveXmlVO.getRound())) + .redundance(Double.parseDouble(grooveXmlVO.getRedundance())) + .tangentAngle(Double.parseDouble(grooveXmlVO.getTangentAngle())) .originModeling(getOriginModelingData(grooveXmlVO)) .pointList(addPointDetail(grooveXmlVO.getPointXmlVOS())) .offSetList(addOffSetDetail(grooveXmlVO.getOffsetLineXmlVOS())).build(); @@ -782,7 +808,7 @@ public class XmlTypeRealize { if (pointXmlVOS != null && pointXmlVOS.getPointXmlVOList() != null && pointXmlVOS.getPointXmlVOList().size() > 0) { for (PointXmlVO pointXmlVO : pointXmlVOS.getPointXmlVOList()) { pointLists.add(PointList.builder() - .pointId(Integer.valueOf(pointXmlVO.getId())) +// .pointId(Integer.valueOf(pointXmlVO.getId())) .pointX(Double.parseDouble(pointXmlVO.getPointX())). pointY(Double.parseDouble(pointXmlVO.getPointY())) .pointZ(Double.parseDouble(pointXmlVO.getPointZ())) @@ -801,7 +827,7 @@ public class XmlTypeRealize { if (offsetLineXmlVOS != null && offsetLineXmlVOS.getOffsetLineXmlVOList() != null && offsetLineXmlVOS.getOffsetLineXmlVOList().size() > 0) { for (OffsetLineXmlVO offsetLineXmlVO : offsetLineXmlVOS.getOffsetLineXmlVOList()) { offSetList.add(OffSetList.builder() - .id(offsetLineXmlVO.getId()) +// .id(offsetLineXmlVO.getId()) .value(Double.parseDouble(offsetLineXmlVO.getOffset())) .depth(Double.parseDouble(offsetLineXmlVO.getDepth())) .angle(Double.parseDouble(offsetLineXmlVO.getTangentAngle())) diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlateRespVO.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlateRespVO.java index 9da84d1cb..a5c0c1b90 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlateRespVO.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlateRespVO.java @@ -60,7 +60,7 @@ public class RemainPlateRespVO { @Schema(description = "纹理 有 无", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("纹理 有 无") - private String texture; + private Boolean texture; @Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("宽度") diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/plate/PlateMapper.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/plate/PlateMapper.java index 3520d6805..421991b50 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/plate/PlateMapper.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/plate/PlateMapper.java @@ -71,4 +71,11 @@ public interface PlateMapper extends BaseMapperX { } PlateDO selectOneById(@Param("id") Long id, @Param("organId") Long organId); + + default Boolean isByGoodID(String goodId , Long organId) { + if (selectOne(PlateDO::getGoodsId, goodId, PlateDO::getOrganId, organId) != null) { + return true; + } + return false; + } } diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/plate/PlateServiceImpl.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/plate/PlateServiceImpl.java index 330e139fd..d43935e5b 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/plate/PlateServiceImpl.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/plate/PlateServiceImpl.java @@ -25,6 +25,7 @@ import java.util.List; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getLoginUser; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.PLATE_GOODS_ID_NOT_SAME; import static com.cf.imes.module.system.enums.ErrorCodeConstants.REMAIN_PLATE_NOT_EXISTS; /** @@ -73,6 +74,10 @@ public class PlateServiceImpl implements PlateService { validatePlateExists(updateReqVO.getId(), getOrganId(BASE_PLATE_UPDATE_PERMISSION, getLoginUser().getId(), updateReqVO.getOrganId())); PlateDO updateObj = BeanUtils.toBean(updateReqVO, PlateDO.class); + // 校验板材goods_id是否相同 + if (!plateMapper.isByGoodID(updateReqVO.getGoodsId(), getLoginUser().getId())) { + throw exception(PLATE_GOODS_ID_NOT_SAME); + } plateMapper.updateById(updateObj); } 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..477bd420b 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 @@ -250,6 +250,7 @@ public interface ErrorCodeConstants { ErrorCode RAW_GOODS_NOT_EXISTS = new ErrorCode(1_002_033_006, "设计板材不存在"); ErrorCode RAW_GOODS_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_002_033_007, "生产板材导入数据不可以为空"); ErrorCode PLATENO_ERROR = new ErrorCode(1_002_033_008, "当前板编号无对应包裹信息"); + ErrorCode PLATE_GOODS_ID_NOT_SAME = new ErrorCode(1_002_033_009, "板材商品编号存在,请重新命名商品编号"); 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 5/8] =?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 6/8] =?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 7/8] =?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 8/8] =?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 zcmZsDcOaGT`@gfDa~yjM*&&-`XYV}A-kqf^ISAD3sQ*Xgu-6$PMefaK;vm#QSjqGx^pF!nScTA&|3*Mh zk-w@?Ir2A;j*J8tQR65H`A|x7VY;k}w5T+?X120qZ5opnzV#j{6oGo%_u5@F%>9yh(v0jC)_$} zAjO@`0jP1{Q2!N1Qosq5)C>eH4isg@sgrH|fs+T0*Z&{2ht287{)O=ar$d&>p%DjY zrzz3E>L~i(GwINRXbueBzkJT2kp=ue;4uGcmOSF7cXbYQmiXUke3+z%eXDmc%!E`L z(BvE%Jutj9hDWB01CrhtEKtjhL;RPs5wr$mj!s%#^7qiFSNhn08}$Px4jgC2QWMhY zKn;0x(q#U_U^z12fcrc+%Kri;0TCqWImk>V^x)JW6J9Ris6fkP8s(t}7x2!u^~ zS~4?f=nk0(5)9yE2K)artmM9uqrSt8Jp_ze!%-7f8U70pSY5**38IW(V?Js8&2D4= zJtq#EX}|oR=4uQn&CID#gq|aDa^9I!Q4ugqARY^o7TH=yCN=UmpGoF$DJ6_BiIBfA z=2PUaGP5QfX^3p|KaQG7!6+!gQ4|!s1PD7La9s#TSND`z2}XU`AB`RQr46N^;6V^- zRappAf+%202**|@$8HKeR8W_6YzIyz;&|i{Wa5RO6O2r7i%3GqAiaY#27x4y7&sYZ z1%d_gg>g)E8KO}j2$T3jP_{|tI@qFhstrO0!JN(jTOKMxKt;u>$3WtZ#uZRXL6076 zF)`|glHDrT7pJiyX|zC6P>2)EZCJ_6cb&0mAPDxxJQrk?KmVxf7KDN#1x`UBOJY1; zmu^)HYSy#~15sbusUQz+dEzWb-bdX z{Y9|FFkcEqb_rjq3kImOLJq`%RGk6|#hMwA;Ck{9jNJ#O3&BLv0GXi()pywrw+oB?LJ+WOsQLjYwO+5i4*z z8Nv;iDdEt>IWEX0azYc$gdqm#LnDcK(hzM*vIukFuec;q!Wu9Dt-qkGAU3NKq?jCE z;wufv2T=Hy@jsN~ImjI-Sy)YW&QOh%8p22*;4S({SkNAF0dytV0dkA%I+4Q_qKPGI zcD@XeAol`<0LV7EDeVeG6PzJ8BADi`lkm#mz+)9kG9C)>Pk>MYudYClM5|iW+OChe{7(3TO1i)NKehRS!si|g&6g7F= zd8K#5a!HPG08+VFHlR-%$3?X2gcO7J{e2HPP0m81d^e;TlwBBr$b!h+;}AcPFMR^S zgCURC(|)JRizG`E=m3Zo$x?kBGjU}e0-i#Mzkfo+L6j3)5HpYp--Z0bk!{H{D!Gm# zO`aNHO#muHET)8>00Y*Cg;s-#VyL0LShAvHO&^guqywlW{ox1*0_=u37Gf?t)C{!k z2QTy&C^9bqy$ZrO2t#c^ZyH3PFR96y5uyNPVkA@P#?TPg5p$IgY zFJ0}aMLH=?O*H@FGchCaeYyk90mn8t2kHaP!MXd;SD;m85243FKi(HWmqGiQ%Aj0e z?^p#?52OUDpmtnjZKrMBAID%xvxx0*)^Y(+qfjIuYDpTKckiJ$zWO@ZyWS5bOw5~7HrQ!UxV>{u?Rf??RdEir2^Y}en17lwqHM?FTknU@C$kY zY-8Jo`hk2Yf1n;;(ljn?6wSq{+Jz}U#=W+2iYM?(xZgMqsy@vj981&SeUU?boNO`U@o zgOr3lEC5`IA?CA7TqM0(KtBhZA5d~2S^vcWb~F`m&ahST3~%s(C4x&b@CNb}OA?4f z0p-RFJq2Rr)=uS6U>7UCo* zU&cnkS%)0<3af`Vb+p6nKg$`M(!9{_lO3Gc%5sAxmi0oT^^+w#{9`wcaJy%o-|da< zEA8D1OWdmLo=v9H#eWDLWz}&BRreWpH-4Whro<_s$NI*MmIon{$o8#wpzAFvs>D-H zu>){GX&%JbHdIobd`H7>Etx3UcIJKUloH4OxgLet=GcI!SPS}e`IWH#OY5on2+KzG z+tzhHw4So)o|Oq(U0qnxEv)j49wl@$82*u;S8Ms388 zv$L(sk*#n_MX};G>uaaBZk%E(V6o&qVBYdPD5}lCHeaC=)s)2twbfSI>~L;9@%yMl zc%z@|Ui@%8<8|#^^#*;PVIc3&m0R!66f31b>bC4|vZnS?2c=%jd#cvJAkjD54^L2P z4io3Zq1%4hUYqp3^t@|(YJ9%xj(k;co$GVy(7LuC>4+$*63;JxUis6gJ_)?N5ZC{% z=22}RzN4$&bP5+Xi7(C6$-2E_dMqxI$yq848Gn^NAWX!Bf?n^=mJ9Vp{CsD)Yox0# z{&-`aa$>y{a60}<{Ou-**~8%w#r-&Rx8~qI6F9 z_TPk7KBH&lFE%*Eg35$WW+o}dH6+fzu0B8<{@!6E{j&un#o-C%b091TTw1L{Ve8=H zpdSva1Q(j$(J(C>d6`g6gZYA!v^pJTO73mQf*tLPN&svQT#vR-3;QmS)}wpy!!?$b z^m~_)Xm=L|1x1~5VN4+KwS3rfaPK))1G7Vs*XMz-Nt4H<-G74uh)JSi1Zb0B6Accg(Cqdul z5%31EEuRwp1f;C7@HUX*poYH$sR>&6Baphu01pErgl30715w^_z{9}xR*M^M0mgaj z#Orx!K?;iT3*@DeY}q?OI4d4?;n;Bh{m^TrnLkFBo<#n5QP#-E!NzgTep=i|vLvsF z5YfQi%+RnX_V71zQap7*0;{Bl4@0fgM=61NGiW?Br2rfXhrT^`Ab)pJS>?it)ys`wB1_)yvQV1)K`y!Md$_IChmW6bW$x!Ze!mr$OLe8_c9KzC zSaya9n~}C}snu>JJRrZN=f1qqSZjtKq}#iq-1d9rmW-Rk%>Wx_FRCGHQzk`QK{rck zOPfA!yZe#?m#xMX3eRF(Lh*uIMUF<*NT;}$w>>|;rv79vVwQ7nv`BRb5N4Xqvb(CA zw$$Z%!w*kD_MN#Nm^yV#KD~Ux?99uzE9FUQzx#!N5Cmc>g%#yE{R6%M)fY!Oq87 z2aM9>JddTm^TWi3EZj3so-VLskfL3_|LNnx_z4%koHNwwXMF}-)jc}gM{8&drXC7r z>OJ6ytXuZZ@mh{Wav~G1^Vm&et8Hh!{RgcK#c1R`6HmVSM0t!WN4pM}<1%nQ2W4Vk zmykz&;Zuv5%A4`4Lkp*?4e=}c}Wijkbo1GnpGQ^uI#$7*+W}Wtem8 zqvhH7rD6y;|1n+sOuXMTLEco0S~hE{e7x<609- z(oe;mD)1R6XiYxZWG8r`sXJZ`cr z>LXH~S~!2_C5Wd=7z5;A#vjdAi&}J&*4HWtE&*lcEMzgn; zjM+JT)q%A16fGl8bG~x3x%S5CZ=rgzEYNDL&W;lk3WeMB3-uBWfug1q2fgWRKT zZ@5jg->F4rNEh{6DQ1qA?xJzG)AAovGOyoM4lLEbmMkwV!aKSAqbJSqeQ*1Cq|Ai( zKxCkr4}I|ER2k!iMEs)t)e=kv%4qk+_h6l%H^p|;XR)1W(>z?d; zK|J0(E=n8WRYV=^4vw(TyDi;ru*`9BLF?M2^rG*sC=@03Ff7*yg-V)Kde1l|x2O`v zol9Lh)E@c{qlw4MENbp{T$#7A`nX$^nt12gq6+De(nwled6mo9Ch;udO! zls-u+WDcHu+@5&%t&rOUcS7w`kyCCJNh&_iL|7_d>BR!B zD$Zx$dmozahu4mD=s@Y-h?AeR>~{R>eX?!lXHDhmjT{#P2|{=si=W&_GX~1Vq9Wg= zI>oz_;f*z&dyOxPf7gw|y+rtSDVhm70(a|ct%owVPq2TPi4mmv(t296KC%5na(Oj@ zU!b*;-&R-t#eg4|*SaJZ^&s)}r#IT}PgCN${!%^?6~-is`qkMH9r(9rdSYu_Rrq~PvPIxXYx zI=23DHh9ykCRo*GbiX7|@|b6Q(4yLTWnyBs=laPQJ(jZ^Z78`y%L{*%M`uG{6XH=f zs`$HK*`%0MiEp}f*ZKvy`4EX#E5Ao~V%Wr= zdlcC8cvVzr#J{Q3Qg2va6MXPW$gaPFQm=-&>HOI=D?Cm~F86w*AaE5C+%Q7yq0x1k z!E$m^R;i1!t`8@~qUnr=RL61@YA(L)v_7A@{bsap8rUqXHN0At&^glsA&hqI%r#^@ ze$;wa=#QPt6|qs<)`nsUU6hEXckNc8fuSzo&TuvEy-j%WQh9vEYN(*K>6O zjWtFVW$<-^W)7o>RBLozI_mojsZ+DSm2)-dFfeoDH8uS(3ZM zTYw`Xq4R84za;-#IlHIRLyF^K{J$1|P{Ub9licx;Kg~W@Y(F@-tUrxyPBMAEq_Gk4 zG$tqYQ^rNy)P?mL*BdIo{MmRjeWV-Jk(Xt6l!&z&l^v%Gw2hq-0gYWZVD@=5DB{)gp&oedr8T<`?lLe6{m&%8G`nKrctEEKJHf9n#)s8S6BpO{jy1?L3VnLC`_`axebmvK16PG3*Lc8gyrqG(32c5GluAl4alRL`Zu}6NIJ?ko~xomgB%83Ia z8G2cS4>BY3X8wiqy3;09V~g2W!GBVE$9KQ7nst|5bmR=dn{FZSq%*c2lYhFNudX)z z+Kvi7Zc2U!hJL3+ZAd7%{$}+lZYyY2y47l*_I^pZu$eIO;96}j_qF?_V^`$1E#Y+z zZoCFo5!-4;`}Ypml4ZU_6zJdcdJg_IdEMZeO^{lgG2J#K90-hmq2H)6nycYSTtDL= z@P(@nv%{hC{N91@I+52pKs%T{x^Y^~NTxXqU%_o|>v&uF)OJjHRGa-MwQS{VW74{*q{~tz;Faty-EBDC1*^Sdc}CL3OfMQ@ zrLBJU6!hD?6_XaN^1hT}d&hpuBGPDB{z}<+5miFHx5-&L39kw?g5B$HCwkK|@Iy!OKZ>_LHWyS9W<~C7#X&92gWBKjIPThUe!*bW_rpA)%LMpvd`H$TmVnLp4s8+Q&QSRYb&gs#U z;c%LlPO0+4a5~S#5-vhXZcZo*HDl2A@|0oMd(x@>1vciyD^}`P%E}FftU~uj7Jfg# zBq`w^yD)CZo`dpg8n=yj(;=50XT7C}y=NIYN3ZRQ-1=(ZPu<5C54S(~s=m=cc(C|Kv)vsd*|Jdw0T>=b=`0z{wS^ zG!qM>RO!cOM$la!4b4=>pFJ-ZXDr*Qp@PFc;*0JE1#R(g#vu7btma@9Z*hGep0=a} zspqe1$Gqi=nIBkEjQ{d#?w*5Fa#dG)Mq9-wx0`Rouh+Yn@6TwS-ST)g$Y#etar<$e zkLK&}o$`@Ch)NDyJyg&&ERtdO+BpPDXl~c-oI&B_6|H9z{Zt|KJrxrdns^JS^28fc z$D;8sF~0pU#p+XW1|6g4e1U!AN>1TU4yG*iS3Bb{b~hX2N|8Eb2UYuMR+R!%KfMGr zKE+jg#^md0QL(F}ugzPgb9BnV#qk_Y1VjoIe%Zjg^f`Z3FVx(|W!%6{M}r49S;ecL zjMb<}7L_W|PB@`GbSdbWhs7u7C(DdC*8bwF&(_{<8sdL0vDojmtX1eM8&QGIv{1+DjxS zXT)xztK!mJUyxJph@+c}=9{_?3$eOBmYlbiN`r4`+W*{j_I0@!!#FhDp>q0; zEk5Nq`#3^N>YbpBU|?wCN+mswqMl-u_3fJDiUP{>FJIBU>k3G|)NI}Ov(HJ8>mB;M z&ZKOh{D%c|=GRhaS35RbP^gDn`sv)nx0<42XJ^VTX=HRlO78JXoS_Pm^YOW@R$tO0 zt=b&*WP>Phu*Z9#_S<#S;H1ilnzz<&W>#zXmnZXGbkAq1N2VAb{Jbc(!>Cp9^Gm@+ zrfKo#22Uz3?z-6-7m2UbrM%7ikd}FKCf4-ve53alk!EGnEA*9TM5o%cm&zZe=AU%~ zOk1VaX%Bp`9k$hmg$nwZ!u*R&0#bZ-(OMo&4s^#Ri!bsuh@a~jdiFx2u8wB14?W5IkjXg4AXj)9-)0c6+giddo3_nnYdc_k2R5DFGvS+S zQSrfk$EkU-C`ZNN=M|#OsQCS4hgXAPxvnEsg;80`Q6okDYL=T#t^9~86PlYQB7U#N zYZ~HW@4iVmxbd1}VfNh5I(w$HZ02iA=FhCJr<^{H*VCQ)k=R(vSNX*EVQ*P2#?gp? zcgGh~**KP;l`eU9FPJv6;j*D`(C_==3x4wz$0MUOY`3c09S} z`X9Z)-E^zT?zqaW;8zS(JN$G(3%~bmhkfxPJeRk>Ps!X|`0iV{6^C4IH~KEq5-{=S zkuGm{{nAHM7Qt&ePxGe4&z*bZx9nyYanABH8-8T==T`KIkL>-k)uXvzS37udm4a}> zz5Z`kmw&LRGra6w7DPICaEckllzy6+6ZUinGLipe5UX`M_mi*tm|*n!-L(BQW_7!3 zO$KiSm5X&9iMHH=Qkg*v-t*e7#wCg|AJ%_#6^OQb`HK8nPS8}8NiC9K{XPZ#bUH=p zaY_;X1n+y_t?+!$2?sw7p2#ryYsJHXzD#a*7dD`GY`zJMym&`>CB8{-Sfkafu%@+Z zFOE$(O_tcUvdT(5ID18xro>rFm$OU>AzZoATGdPZwj-jkm8wUBXF4btMb@W_uMS&} zY{#`RkBruMd+Dw3xr8$mBLR3s(0HLspgkkLE>bU(?un^!kn8j;_f_5pSxX(U=Qrsr zUgLOf&g$K^RL$(~^hXzp(#&@X@4q$6e|?r=bi#0{P|xYc$hoO$y$39|o=r6u9fDj` z2F7{w)jjtDuwtWQ`PK-P*zGV`VwmQbvyklw})H}LuloF z@T`oSTwO!&xcus~JylfCZ$EjfxrIwE)mtw`_6AzutrPwuMap0~5A^EN;1_mWy(>YBc#V zyQ;67-(Qp1RWQ=dRITJ&bPWAqwdE2`2$ zxpX=T{-Z51orzlB}s%G_mvC^J+0OOUUMwqmb`>nVmVK80ViF&vimeiAOE z;1=35e=Ys7muRur$&M+FAChieD)L4z<|ZYK;$~G(8u88D=Pr>_x&)mT5_|IV1{TwX z57bjP&o23%U%qhH=1U;svt#YTX&2kf@1@ud68nux?#NyqJC)O0pX``1!dsG8|LDz1 z5KP@Rx%AcYTI_zmv)xM2(nw)o!DwCTUus3W`=goJj#p_M7Uj4Lb|vL}3!)ItV<(P# zoKRHko!g3E{7y)5=(ggMe0lx#dDaB|$If_*9M70n=jjuglrb(JC3R$Q4B3^kH(4Y{ zb(}4HvxmNAy^d8ro9%a^!w@}~iU`%o_7mwa#0^%_1r({nubtz4b0}Zt<*zsQS3ssEm$KA9)d6Uao-{rZT9s5@sI;-r4%+1wi ze9Yq{F^$r|eF!VD|10Lgd`3}tc*tPeX3_cm6aG(5nIS*dNj1(JNK*iGC2E~>b0?1F zJAN{>y@HRFC}s)?k6$#7j6{8?PL*6vmh$ehldUV&fA8LaI>kj$y)M0!l_mJX{v4dm zKmBo1Sm>Zs79AUQa4J{0JGbW&<8gtrRMah=2$GUb`@C<<)#&@ z*XQW;2gs(Sl?n$!|86GB0wx7~W%s(upr)CDr*;-KDhj;Ia()!a1*#zy)a?v!^(*f3 z4fj=A8U8fqj5OKWgvr$sOuiX;&F(YKnlpaUA9^$B3F|FNReoSHrya-+^e;Y7>A_E5 zQ6%&h)@{=(=GK&6-S$%ieim+oVDoxw1|+t9cLneoEUS=aGld1-OnsJ0=fGr2!iG+shCo2wYVwC?RUUJ_`w zjnpDm;QLmVu+43^)vqarS=PB6pTMuMYW_aW-2Wo2a6$E*SMyW=RAqW~@F(Zf`cHHP zD9+M;&9tkF&hOmn+XKW@zBDE@DE=t+O^d8=Tk{C}u*S33x+bMEvz-#G*iz_VBBZjo z+2`jWs4}-XFxaDBKYG{n&ppBd+x)}LM^{x<=Fc1TD!pGY?fJTZ@IbtneN=oFe-F1= zA){BLP*XgbN9^b5315)tK`j{1^KCY4NbOc$WqI-SFW-y#h^$FKGxfo1g-{-o2_`Rv zp0z(bsnVF4G9?c7tBgfo6XX93MtTX{P5xB~vQuqQDJ9Q2z*&<9 zJCB^jHz;z=KS%3}TM1E!bFSa3#G7b2A^8=|^5Sg-XF2=)RgTNSl+3g~r8_r^oMp;D zlowYT%;_%IFDyKLWm{Y!j9q7YC^fHP02^j!%2)1qv-CdB6={d)vAvT@hEssMr(wM3GZ0&LnW8T&B-J8~)NHFPY8rdHamD$HO@r)kpI_^~y`f z%#<^Y4AauR8w6xLKdmcBh-Bh7jx)XR3yN}`SYk;}{ARf){kpXIc-MTwZ2h7WV=+D; zV_zU2FD&bc!g(K`-h^rsTcSGj6n6>pioEpsED~c+BMqda~ zGyao&A?SHpJY^^vV2h?s6riilWBy5ooJw^d7$52dGm`6rvpzvq+6Ov-_+{M`|0E9r|`G6 z!#0snDOAnfI=YwlWWi;9K&V4qwO!#CTXzAzkN%#H=;DLZ6D_aMzXVM16*d05k(wU; zFBe62nIE=YJN5RnW?s~)~D%2Yq^)ti~PRyt(8iZc1cH9nY+uy3&w z66*EB=LZ@_#A}8pMy$y+;90KssnKkTZ5tM>vcR~qjNS{+Q55@Q;rTd22NzE|&7irO zg|w<_Ej#>t{eaWiO8tTm@gT9)U;eK?-BIK?=y|Oss_=}uS^hezFsR5e1@`55PBhg_ zX1jKHXL~MPFW#(->6LXn>b~WdO+_qmEke6l^d)5>tY8MCm5sa>kDpCr`kV=Smw6-X z3TEq@75ghs*_;WhS0$6x`pi$uP6%Dn?P(U!jei|NcWmEvRWAC<@YcuErOXwsaW=i7 z3v`d&(!WMi`cw)x^tf#13}z^Dy?->UzZ74z9PvVF`54gHV`S9*T5*o$MAJDBu8~jJ zt?0Erxu)xSh$}iOQ!^{oAZ8+m8|jc3*Bfvp$5AU^@i_6lJ3Ci_yR(xEZ+EQL{4{tEDhGt zm19`ez+Aq}>7iWOl_9|`Z(CINErZaOW^;g3e0Vu#Xt(VTb<)dW-ngjAvf+yXTIYL? z<#%ZS9;ljFP5T#;>=U|Ktxk+O8h_gRZhtknXCc0QLFs`O)PE?=JqcI(ncP1)O85CH>G-1*8!miy9TbOiH{`8E9rsXyD8o1Z^0eZKi8^80*JV+s*^MWSYg z#UGzAx}N(yZEB8v|Bm;LTH`^-R#z)dB*AnfD~RLH2WXV$p3WXK{+r|jZcF(^ik)*U zx)YE5T6sRc0V?hLrE44Vn~f*ZG}j#+i+@BvEp~Po9L~Gc^tj^TlK6+M3l4WH*dhf> z2Z>95K{OVC@~+0j4I9PZg|~(yFS#ABdTu>Y6NREq+)&aBc*Fhr7@zu!D`lvmpT0M$ z3vNDm1F0UkJ>!-9LU{yFxR-b=o>rcoGhell`*_VjRp9b21Jh$_xGqP;tu1-^-xR5` z+x@rsbQ_|txj7GJzU^L87d>@#PJ{aH^ra^bbaqr~zumK^VmLZxUM@~AnD3XpnG5>y z@aqecagHo~Lj!ni)Hp{^dRB1Kg9Tdg4-a^vWg6C4nwzsLd><1>1@P+Q-<>QKc@=Js zwb#AlO~_+h2@Q?xo(|7$G4Oupj_{8?y{$C^*I*l9gfO-#H6SUgZu6~m6YgP z^1dv1V)D`pPo*8DMl>;@I>}0I)1pM*u<(!L5{FVKUSH=nV+6INr%q8?CXeA?PX_&% zlM^D%azy2a-tj3fgdOp9l8^3zOs``cil4_yc2?=}nfkrh4ezeRPDX+^WQaY)f>{?2SceOMFx}9vGO2U|ae6e$lNZ zc5+^HQD*yZ&5qY@OwG(>gc!~2atN;*>=NS3QqqNw<$-wU);!Hq*f}kip*An<>*N?&Bb9>JlHVt-@*662>Ae1)ne)mW zqdx0z9Jo2qabk3-pYwFJTH&oBmyQvYP3gU&{pc(XQB(6KPE<}Fa^B&$}ICg86KSHZOI_?JE4$JPv7W!5PWhUY)49TO@{Zr`~6NOc}R_V~+O zdIH>|4HI1MDA^gCS24=_@xe72#a&y@y&{)a?vwXuDSyNYs-Po3;S59BXSTR5jXAQv z{!|JQxhbP1u?q-G~k0R)=Jon)t^9vr*C$zft)d-pcQs`Cnd%E_kY+y`f#<`$X$D_E;AE1+4 zZ}j~HXuDdBB55yD&7XZ(T;thOYF|`v-oy&uP)}cV_Nk3~^u}nt4RvYYR&$tUQZw}y z%a-7XF#BmeLu>aIJX2nigyPi)dFCaz4U~>+=T&q#@_aO}(fPgP`9cYA7$32VS2MU@(}v?`@?pNs=m5!dX-xWr&YtKqa+}! z;*&3vcSCRi3#%^?&T`fKRkR)%dM!zV_agzv+i)eL<`|}nYZSMbg6rp?rTc* zH>VOdB5s{p{S(NHr;z!>;n2$6Km1q9;oSqT8Hv&4$dceQ<$;h78#NY_g~;p|jl7qX z#fJUfX(tVctOWC~yyR(ikY6yq_@PDP@|_gHKgWa7$coUm14E(-$AKz~z&~WzWt7@;No+qM3c?J<2Rl!C-uQ3$gtFhZP=q#JkZ?9JN z2rzIoxW62%sQhcBC;fzmVN`bgcVck4h1{-#W0%V z`N}G6cU^yj#oyLRqv=5V(_f|!Yu-6MQ+?2Vd9k^lv^czW<@O(Z*}YQBhOo1oaWOq@_|ZMIBqzhI_bbPCU+8rMO>Q+CEHJ8-Z#L~k zQPzR^lfOa2BdlR|X88WO;sxTW&t(Cw_|lh^w+O2lxvvOU1n0_Wwv69e`th2UXA?%K zP1m*0WR%{|DK%Yq+MrynpR9aWKQzofGACY0PWX1I(T7fh9>TsN&ufCnh;n4f{%tLj zJ^IitcouiKrf@2`_FEx+*h znnm?bz1c8}XZZ8@8!dNc&rjX%*kb&kQqNia)2nUE!OQXH^0NZ?%eGY+{iew~9b3*T zSN6Cs?5iq_+S51Pk7<$_pHcjrxLljV@Ky1cz&1?rw~#=GAw9YW(%Q6gV)BVr>~o{; zTjgJ#oFJue=<&PRA^HW`%=Mxr529y}zn*P~x?;e4C!x~^->pt<@=d6ee{9U+gY8J# zgN&N$f~Y52h1UAN)zog67LM6xx5cysbdvrGP)ck4Y`yXw@0`0QVTHZ;$B9*7fj_CO z*j|`glkj~;uiao^OU}}%ZcFa0Q}~ki<;a!7n!U}S=oadMQJ!5zBPZR{I-ZH2q{hsr zPw@UcfRJt_GX3whL|gUF$WCigCB_9(B_z$^H9{=lV+?1++xS{?STjb6!?PaU(8AOs zZVYMUvba`SRVG>(((0r8=yU9r#|4`b#omk8JrlN6+s6J~K;h%Lmu?z+EZzL-fzSBb zbWI*|3Om&4+B*^68`^Vq(r>-@Wz9a+AA4S#CX9(+cJtu_o~<__UJF^y@|)dD42~OY zyDUcIn=EW$_`$m=v5>^%oVwDpDi3}x83R9+s%w5K1o=s5 zZ+Mmewm4F?$Gb85M!mV*cg42Mf%3F0Jz)t+A=&4thE#Zrv$+2I%EeJhTtrKuvjIFa zFfT6kn`7oP=(+>$EWDd8_H$r&q9@0QjlFYrg=FE3NVU|xDVgBV*2mt72Ys8@F3s&E zu7pz+GFmUzO1n+Ttt8Io_NQx$cR*sQ*E}?y*~?p!E}Vt4f6JG-ge&JXOHU9>`TAQf zB03aW82uZM11>93?Xt~qi<+xiTCMUVge|;0{_ti+JJV;M2ia+k->N;&eY^D~eyoR3 z!}KEzzLDQ(B-ip@@?(#Bdu`71-aiUkgF|-7c2ef~Q7)_^cTdq2e58&}G&D)|r_w0= z?JqO)GdrXG(*XlID7TyDl4;5DvA0rsdFbPVa5)MEBfR#?iQ(!q&jS~v{ti1BcZID_0f+Ni}T~{h`@`(ESfj<;^>*4ewUqKcam}gIO}p41Tz)| z-mR%j$^DAMXM}6+ZCkYSMHEjzW?idcE1_Y_`DN(=ByF%6?WLG+Z~}tcqlHpQDUbyb zfwx~K13LqPbN}r8P*>|TlQqA&`!#zuSd)?Jy-2QVFU_=lA{StuccYo=p> zUzr+hTlG}u^+4;K7iZXjMVqCEy|{>Y_}eupRY+SYKG5^maZ{&ezd1!FgXVSpiXzRI z?wilGFDvTnJdyZA|NUBdgI;e`lS0h+<`5JSk*LJaa83jAVqlx)&I|sU1N5Bv4}m+& zb)VGopGuybJ%|0OVbb7l+jTY@X{Xn#DwONE=y6XursBaHIo`X1v1}MoLzV!O-TRnT z&8dq|Z}#GoZ}mB~vb+g?+Gci-$usC|t=lH_QD?M4y@C**3YV1mt{DAeE(WPKMIC)Z zR*9~7LU8aGgdojEao0rXlO`Uzx6mr;pHa3qsfohqXLRrNZ(M0+d+*7ApTInqA(WfI zaJo3{ih=$|NUWm!=hqxMWn=I`tM8JV zkKqml(;ZmRetOH)^fUkOExJrW=l|0D_r>T}=KtKk4Yh*b0Pp^yY~c#v?OxMxFBcV3 zxdDa}=*uNlWTmr^%19#Y;9wacanb=U0$#htI>RC0rCb^h_!xL8_xmMyC)nHQ1OE&{ z0|9U?kZ&=pTt<`cQbuLJN4i4u7{IA22L}Cow0)(MTfXjd-SbW-c@0Mg5QA{^#Ov4L&p~e8n{YGm#&Av=ybGi}Zo^B!UfN9f9BAft z7Tf?-FKAg8)<(Kr4f&_I;u?-VD}+?ok$e~44FcHSgSV3@fad{xg?wY1E}vu-nbIvh zie*CyJQ(yhv;zJYEH(*w1~0>rFMwCbvdD-rQBXV*1X@)|7r5RX9WtQ^7-lx>tpbb^{%PldS^lAH)ZAJ!yE0MSV}IB+Zpha>hX zA*w(*yc&WP#Lv-0#Di@-x`?A(>M}r#fo-KGh#fG@mGO)1Z6wrCAYg-%?Qo1)h!Ylw zX^`)g4Z;$%gV~n!2mpE9ZO$VCL8{y7AHODD{?U=-foKPNO}!BoF!W*B(}DI1-De;g zj*tatQgLiRHylAlgk44)UDBTpK+u9NYSD~&d?y7HhXSWD*&4AR1P(-02|<{E)})0Y zjwbZ8NW=ozTM~na1}WhLL^w#5UPsV?RMU-rtd_imkO$km?jV9e#Sb!X#|)7ayP*D) zAk0M0EW`n*j{7b`77VLR9zqW+H+WcpIJ(NuRe}%)0Zq#hz99AT5yH=i94^Tnga%lK zI3e@J=Q61nqYw(#oZiAAF+g@Ej-B`%h71KK`Dq059!QNMkshFSbu_a6XbHd|1Hd*P z9I^;p`Y4zuRINy+H^L8#8`*(q1|%i%3=Q(A!mE`I34p@(49HfH;$}kbfD{J{G7E%Z zGs#o-{t<9E?D^`vg3 zz~Sf}bzc@j4uO?zI;FBB_FNgbPe)(km3qz-k4K8n`8kL=X?!Q68WLp8Y6NE#_f;livi&ijf>+ z5mD%p8tEs68YNgENc#xKLqxBm^x@?0DPhH5_erJb=hY4?h`5116-pXn+AmZiI9B>N zN+YlcG@F@nAJlS}m(mE-vLH_R3@m3VQK4i2%PF55QLccId1Os_lp~)mQUY{jbr04^ z|8+weaRdS!@xvE30FheKSk(qnx`F{>xkmX648d?b6N*}OS;T0tj#L9_l zm3~TkHGqKzkg^~>w{ZAM22o^yvhQe!K2jc4HoYIGWCXoERTOR)OPV^xBu8`6Cl4Rv zKoO5mQ$7G^)~4Owm;niqkLIw{8tiUZp>zcSJvJy;$y2A)ZkrNJCWk%Bqs8Oh0i_;T zl9@*1;9p7#IDq*N2!d#WK(~P=EHk}OOhZsmyrlwWJkckKh8T1$2)0jyrUEtLn9)99 z#znB8)xczF;X>`f~byn0dpzj=-8OVNyV;~M0qSHWt zge~?H07Muq55S+3ic_DMpl^aG>gH&7(9()?XiCtQr{~eTAo7FHHhO1BK^X@gn;_VL z3w~%e;tyxEJ;-O|j!ptS8u3KCf^8~(=#L;WYXFHNXHW4L@hO0W;)4cDmSPW4*DvX{q4EvIZ(DLAANL;z!#wnz)|{8jJ^zxp=#wnRBbJK0kl824lN3L*V%w} z0QrQUqwj#dEiLF25ZSN|%?k3lzeUG^eBa-rTS30s9<(vp(uQI5QH5O7C^{AF)E`4H zfZ0d95df(qdA@)Fcoaw}eE4b%VB3XbBqmOypMr{1=g@CKc+@gF0Ytd9@(&jGDmnm3 z4tLs%2QEZXoq7W!aDj*sK73P#lSrx%Z3V}~SK{?E2aFnu7WB5S_U#ekn zpbNd4m_aaC@3O1Hb4iZ@2yp;(QW$aKqz>i{_$J21kNYAbB$aPqhZ`#Ct)|0gb(}0P zXyUvnMj6y6Xn|P%N1b2B9XiG36k9 z%6&{GXq(6xZI=#u3W|rKhdConbSl8C(v#C}sG%adfHac#V8EF_q*KAGNgNk&FhN>| zN}ggKfrDyI#KeMrkG;gqf^Ds>m|Sp&a_Yt${lGifhdC;r4H_X0J{fm z(+ijnptm*4m~=2vQ`OgvoJh=Kr1wD%f6pDh&_oPg!CVCyzyHJ-fniblg>eH->O8Ng zu1PX!90SDUke*376ag;(BK^!hGfNt%xowOwIK3HCoD5t^*hKjMG7>%aF%e|!rwiCb zaOVu5#;$?t+~}~rF!I`u@)B=8cX1;ax)23g_J7h1Rgp; zz)TuT2~2&%2@i4i4od+TX+jDn)q27Du;?>p`U zvDX;uNPY*5DCvb|07Z0su}7!&=F8Zlh0)*&HUSKASdq?EX_Au`a54<}(I?U?QhY?t zAnehk`=7S11e~hw>q~~X_aO5;D?=GV8I!3&DGeklL#2=@BqcXODMN&#NXSs36eUw5 zNg+xjX_Q2URBsyet#i)iy8fT%dEd@mzqQt0d#%0q+4I>LLJOsu`{xH}3#O4{s$KGF zhu{LPLo~$-qez-PJ4peS6PZif+K5I61;3dNGRYpUYUaoSHRcmLtExzy9_ z44N_Zv@MIqPq{zjG|fEn(^mlt)f z(UOmx@guib(eb#Vmh#l~L^@Y!J z`Kw+PK7O|HnJp>r#Tkn>T3R&72SxOjW%sQt>+quOu-_KMk(}={QtKIH>MR&iV-dOT z&YIhYZ#q`}d&(bd-k^GyBe!~Yv-ga{xmLEHmcGrsxv1gm=3in-K{{(?>$Yud(>}L_ zcRgp!sx@okUR~HAH@}N_#kY6*&AVScKfBY}e({|9ho1#Cxu!*7)ptKI>eCj5J-$$3 zo5;gE=X>wQxqqwKqpz@6K9yO%`Kr4Hcx4rzsx@M0TK|Y}ahDw|7c+`5d zY!O|0DvHr*n74G{rJ9(v`#h>V9(L-nyi*gE%l}Z-Dg$Z zqnc)J`li-bi)G8_c!bCnNsh!Y?4Leg@lSf0U*o-4+rmDFk|kH0cC^lRPBC;%+s_-2 za%ZEVY`Mi{Pp=-wNSjns?)drKaaw+@BS#j-F5k*8f4Or1j(tbAW%X%?98Iws<^%?H-S)XKZzxbDHOfqT$mloc%V{w-3`5Dr zi{cOWI~-P;Iil=x)8LM5?9%U6pXilKj~?fl9ahvR#^=8ivxDvQr$1JWVzqzv6bIXgy{mTEb2U&y;&MXU?li_Ih zDBa7|?&fOiYO9;CPZs>v?_Tw!JTCRIo~^=v-s%Endt+u9u81g*u-@l#YlOkZGVOS^ znYM|l53Ubs=vE}dg3C>_`CyoIIrsw>)VA;t$ zADiR?+lruNVmqeisP$SrwpL#^tFipVyc24=$9+?5)iV0!9XD86y-*k4Vd<k`(Ja$0>7>mYr_BhQ5t*|GFbU~bfB^)bKk&+7pwRe^15cte|(U> zwd(Dor0AUtY*eZ?qc(n;pTFh%%PsNOFPx3(uN=!ZGjg%?@OkC6AZCYZvc>+@jO+k& zgZ@`f2NJDJ{grgND_dWQpI73)qZc>8`+ffI#ktpYC4b+(Zkyv@erZAb7n!b^PUo!o=WHC+W(49P29SP&S`hrjC>RS&5@ofEZq@~yBWR!>4G{wsF z*bTl-Put=QCBF(bx4inXJH%V{oR4=!bzNrF6WOLaVG9zT1W1eSP+eZxmNQqfQ!1=2 zx=X&z%d79@aqH^+ebI+TEpIJWn7>5ZyDh+ErTmk_jOtZYn=?KwWUOvbEN`2=%-38# z+ihLk>8&e^IF=q;8uo)VV_@Hu9 zr%J)j*0$+p@kf6!}Juk9B_@%-i@@5h6#ubgsrXC!MgF}9dPJb0I z3`^sh_{Hel2Vzg(BprOfc`WAKxf4Zk#tlgiqm49g*C#)m6=A5kKTcC@P5JBmpXa6U z-fJ7{deb8cwHwl%+XX+<7IW668eL%Aej~@gIcla$f`6TV{C!WEvxQ7+fStuTC6^%6-1o-}9`CB&Tl02@^F{x? zZU6Sm9O_fYs=vO)UdlW)R? z9ZwYR>~gF&`{excSw}DJqA-uu&(O0Eq#VCszw0a7dXN10+3RXQUB&sA{KL&z+;DU~ zu=ucyJLBq>#WY&uk@85Z{1kV!me&I3t{H6$)!!{pFLHeKlJ<^Zu6Pan{oRX=J~u;~ zE-Vjg%MwUDsjbVVlUVBR;PL|H{Kp1@%7w)tpbHyDpI;X?HENC0WL{>Yfs-5+%8>j)6}o9 z!#>tY?{C-k(bR-Xy;imZm6wklu`jUiJ+C-3^4-;~r?g#FtXh1ZuC#giM8)On-JF%N zb3#Y6k3WjK|LO9aO+O5`D=ipH^$)Q3jJWVLHCNNyv})^H$F9bjq>H@vecOuVb3O_^ z)4_UP{vI1_+!1$c1%paZn`}{m>*Yyd1Y5vi5%l%p7@|0B~3(v3cj(wuO zMdt7POHQj*G7al>_?24(Bx!YHFKjX*m+o@8{iM+#SouBXVK_hh%_F<^E$XwJ->~ z+FBFwZCQso&v*{a5!_X#{V6xkrRa!aLhZX`x8M0TjkEsyoU%#cH_x(7Nk;E(NP3E& z+t}V)cs?nq-SXp{j#cZQZdhg+?V#zgy)LKBAgSPmOhA8&j!%PRXtu$!fZ6gk$_ewl z4?I}KD{v{v@Z(3-dydYVS2Es<(dxgIiJbX5&pTSZ_{u4s$a}>vA983F@Lni+`kYeyo7e>-@0)Y?l;tf9l(VTnV_|Z>Zp+TFJti5!J6AqG6tgGr z>)+%%i9a)WPdyCqzobupti!9j1K*Gy$M6`qvvFb1dq?R*?=Q`GP%7^2S<+)*xqj#H zmOoK`m|6XZm9R$TNsY#L)is?@OmBp171*yZI3RH%y*072`NEoKYyDqoecNvH_souI z*$02EU-M6Wpxf(5$=j?`ir-hPcZ`v3+dIwdc-4d9z_D%qAD7nLbC}grHB9@HYwMD!YQpVZm^vg}MepnM%*E$E{b@dcL{7;^<)8wyn+zpJZ=ZU=?oZd0qZ&B_|w} zepV^Jwou!ze!4J+tdXKh|m z;sR{#XD;i5by8uqYIA?2d0sl4QDFZ|<>qzcXh{hx5>9WdSX?EgwQz;!ppAE|ZJ^To88O~o&o1lTslEO4jQRNt zRmH#dX*|o9S-=&YqQ?u(dp?-XfBd~oIKwlgB-ti5Qv2Mx`(GX@PxFX()9Lmq9ErPxqPDx}mEeAz{YuWe2TG#?(j@LO?z+%Fj*NQ1Wd31}G=-SuKt z<<1i=wg-!oOBwZ|oJBsfwk-I)TSumNL+)IaD~;byKb}`gtG~MhFKukf4{?o3YDj6X zo9?)3LB>*-*Xa@Z95eK)e|ENK=Id`?o0rqRO+K~mx^jEf$9`k&`}e|i8XxWCTz_)Y zNquwuJ|59mJ~6)-7QZz8r>(C#o}y)?!(S@7F*5d=a9Mza=$l=chc!w$*1H=DH5wIM z*A19^^}Ug7(6h4OgXOJ?S6m-kR1aM*w-fDN_@*uS*0A@`0^g8X!w&a2dKA5k$69_i zDejh9_`$>D!8KK#?$g;dlE1kdqI6Skf9LV){8=cadvsy_iUl7l83C82`fS`ghOc)f zG++86A1I>tWaF==D%h&ra&x2JxhB3p+-uyto((iz+hDVG@%5yK8R8}jbfHe%hBuzU-CWfguLs`TSGSaQdp+CW z0o#VV6~|_VUwyCk;pwx%hDyfoQp>QHN<%9pM>XeNZ;0Hq(={WYFeU8%t$$wHkKXU{ z?(9F@Vdkz9KHW!e?!l(^^O}0X^H;qw+Wq5wa`;9! zy^FmK-xrTa{k`^LN7u{5j_9J-63z^hYfF}|-+xTMW3ymq!{5Fo(~HX0p0C2q7_JIk zI|cpHf=?|QQM?rBRPb@vQj6*@#{V5&EBNSg`OZS+@{X)1zQC3(YH?~_%Z@*;6@1#f z#rVWyS>wV68AGgXSEj+2OM!b&24*e0wX8j9Rw1`?@sbC@Z^|FH^cps7-Cxl=ohNhm zOGDF#hFW=VK9q)3ZE3f?8n{=-zTMN3CmHt3pAy+xBl96YMLv#m?(3ObPs)5qO_As1 zPz&N~_WaQr79Z%c$}PVjuXU&UE032Yjq4n(qU#fi#X2_JIFbC_KQhIjZ1c|TfBAZ@ zXG8|?6YSe9x^`CI?zL}cs7v?Wd%0!%-_1_WxKY`U=NoQ3tdz@hJ%!g9J@o3U;c!me z1?MIFw*Pf=db+Kpc;rj5*}KlfwWXRX+&AsmwkiE)RcBIg(y8xB<;5D(<~BR!B_Bn` z-R0pMEexu_>blc~G&T%9A6X^gcjoG!GguDit~Jj~RybUaNxiSUGgYaO*Le1;q_tOc z;h`|>v&Pa}=N{cZx8`<2z=w6)de-&d^DNdaR5xZ6Cbh3W8TnXTqfke1ccxO|rQIvL z6EeLr4dbr_p3lAhSvb?HIMYkHf6o_j?v?w#tTb#%T3h1K6O{D@@cipl!kKk`%V!ma z^EeOQ^Sp6t?LnnNo|eoX9fr0A*VWVvWXg9Lsk%u?KYV`ZOJ+eKy(^aEM4rA;cgZ22 z(B&D{wJXck`mepQdc(+5g{RuHIxGurH?A|N*XcI#+HSf)rSBZaiI15+a#zY0Cj1i1 zbKP&C)*zqHc1jVn1&$e?4cGIZu8`Ip?LX4vN!mAHC#iFM4^WsKxwO za}>|$hPO(XeflZ&XIglvZgPUrd;Xy%hFO6jJZ_b0e0RF`J@nFl5WyJxJL1PS zc*ob8&DM>>UQa16+pocBsn2@p{bs>C7=7Cw>|Vp|uvx2Mp2xEF0w=YX7wDeLR?E6) z-5R-6yhQzFw)!U@;VLf~wH;T2OAIb%EWWimJJ0ayCTngZ5e}cev$@&2Wrh3C<@3oL zFSE}acKF)szInaK#`xc_t46EszxjW)GhY;VuTQ<}W(KdK$SXrz@wh@E!|)e{xu;zg z_cFS@;%6#tS{op<;9jt^Mz=`k{f%>GUmV;uT3~Nun{-@$&+>ZbYbEk44y;w&r9Eb5 zvFV3j(P1U?{$&xIe;v(n=WVMsB+ltK%wHa}bY9*&nVP<|^3RpK8?=5^omCT2DsB{c zFdr++6H(jRJLKwIA>qBQev^azV#f#b4*gc|x+BgA&jiJ2x$P zxUQ(EXq5LIzrD$A12=nRM@xK0FjwlmE2}TAj2VtN((u#H{P(Db{Alx<&HubYpA|m% z`XlSQWv${bAE$bHpP-s|OqK`ZYRkDjk)f9doOU}X8PY#Lv<)9gI>I>|^SAIUV4DE9Uc+vlX0c@zN4{| zPT`ALr%kuCs-*|5{^i0`l-(27A26zSJ#cjhufxKk7cV0QKFxQF|26nzTc(hq*R$ks zWzFyUo(tLoJukn|a?kwk6X&j}cY*y$aDcVIh{~6{r#8FoX57mPH!yN&k-2lX_j~pJ z4Tp~WF3fH&ZaTF;;C@AKy)HZF|DiWLy4Ym4#Rarf7v%<#Xr@Ji!DWM9dnK^-re#nDU3%&!ob|XFevg9ZJxec zYSyM1j{>8zrXPO8_fqGG{^f7i+#DMk4m_{y-BrHcGkETXm-{V#dwkyOv{7?aHesF;td>sGexv}MY7jyIQ=N0U|QB&-9%@b z%-Ds6rpspv-fdvNTXN;a!PR?q9e;M@!0vqPQtm-5ueOrgMwU8d!B!UfDwgjop9LMI zJ%2bH-QXG5X}B%rip^L=EL)`W4aTo)&CddkKE3AiWYK5Z(b0ptk8Xdu*dKj+?<#>2 zv9$d3RIcdnGuB-!m7P|!%+Pk!uw=QR&jaGYG(SC_E7Rk%Ve^dVG9Oejx&B~7EAGdR znH|%=dEoS8(fS>j!7z3)pi0vcf&&~qW{L-n05EHo@=MWYagG;;fQthaW3_K`RZvO)II)W zUO$sQDCO^Tetp2Qn@*3M4f}h(9ZY$=Nwae0o$!@rYnoPJ2J!8EdWx7VOdr%_YnwO1Tv3gD;FE1tZi{Yo1)Blir zDl%8l`6!8!)pU$n!l_+Pm!@c)8|jOw+^D$HM=6?u2Yo(8bMmD7lV2pLXx>LJpgghr z5d8-=>FIZbu0t)k_FEU};V^qYgNwS@dT1YAF!d#$SjFHmdJg4;9o4l)4e*xgp;7B0 z1WU!eQaXL>0*Gak}Wx7T-U5i>g*px#TqgG-< zF4Ai$gBO(1(XPE~SLrd-s)+eb`U1+e`x@w5sVx(q1^nOEKuFeb<1-y#)k1)aj|<<- z!N*@A*-pPpxm9S%k!}Vog_h4e?gF=I6D$?<=kya)NY1{Yt591aTZibw)Djxk&3nS7 zumt#u9Usbq^)OQF4Nkt96=PrNRg~4$-{_YqtNo{A{_NA&!nT+9oEWTQ!dEo#F!8Az-lC>O{lERZkFm3Wzs}e}O5kUbUlhqYP$&y&OD8gLCfU`{$ zBR2x!BsN=&iLE8ofo)QFs~DzB{vyMuAdbRFhGCmH3Iljh3co0hsgayuxDC@DO9`a6 zR1%odB%tIFo4APl;GZN=hDclWB$2Ho#*jo9$gLtpNPA?YkUgY`uM`r=lEPM#Ov|M~ zFD8uw3BMeef~_MT$aw!#LGdPKSI+`XL`xDj3o{}gpx#U2?Xxfq@)zk}nc2wOjEAvFF+Z4tGNd>cr5-*P1^&fcq}f;#^CA_V9e)tf!gi3916rtX zbZH@RBW-Lm31w(w+sOw`9b|_4_`?ky%$0-`=OKIcj6bxDKPc;>GQUR`IiXb->6xpC z5}4Ukyq6gAj+Nvh;nxUs#$Vpr{gfomWQC!y;HOPC7kyxiO3Ydin zww3hDITI9JK2yZwZ;B{SOpzDnEksUCU5I&-Qq#;(RCbyng^$dTi8_mrc-kUl{eO!P z&n9z}#0_)gaUly76;BJ~#Ci*)S=$n2?4%{OjZBo?3O#sPA$yvw5VL_b%FbzP6qUc@ z56+8GqP2@r*-~GEa*?)#N+NA3O3G^~vi;#w#A~t)^B@z?UxpxF8hT9jdsKyk?UC`#_Q)O`2Nb0g2c+8voB-A?#`*2G_4 zgk31Evl&ysMO`pCl6AP_nW!W5mG{hKV>6gwWMj*Vu--?phVFxNDv2%_Iq1N%Tres2 zkpp;=J2o4i8!=rHPxL|%%@rV{1PWROKgekL5Y+R>DC&n}@S(*Cfer%tlS)ByZkQ68 z!-$)F*hw&+IM$@iV$lNJ%?&dn&1Qa10yed?Fv*>u^ldmXogcUL#^|KdpPeJamEg8Z z@Zkk>7Jg@3!5y7#)wqmnL z)^o9+`%l6sh}flP!ooV|2E{tK6_Y1fnP0$|8e#d{6f5yL3_RKw6DIljOh(2=!A)1i z+1Tc@s6JIU!7oY1wsRZgCsFN!^QlLCYN}3JUYZ$nRd_nFMu_+ys>e=d?!!g!y3< zHa1F{P39+QD#ME9#Ws$go)cy{BUMnh}m!)?C7Wp1mn;Ck6)|tHb3N7nm^bV zv<|%EKtXYj$99%B}!vYmuJ4SabZCQDkqGZ5@c4xmzL z4S+IKs)HQh`pj={GE_-9fvN53ix7%mA_!HpX-5Yi+Cv2Fp*>~w)q`+~wP_4;z1|Hu zm`u7f2$Bwuz;%K#6&w!T3gH9RDCt*9-7C96Uk_{;W-T$?(FDIa=?mte+^H{fQ#>gc zz05@(WLW$K-(CfOu)d)!;;5we#c_z>TD#F}c;RlaDm8(E4!{r6)+~bRoOX=?OQon*sT?!$#$cqzEd-#EGz$6`f^p(!;czc0RZBpNPE0_QF4;XmU6)BwUH4$( zB=0_gDt(%w*6u+y_N{Pn$wzR{6>v9e2Zf$Zu}XxZhC}CJ_l9l2N;J@{uOo{y6zje- z;Q6>vWOoJ#vj5JfpjV+Nqkjl$(0QWri4ccwdGG~$F)`A@)q4R7te$}Q@uF&Q#L83@ zO6K9?sV$dm<0PSxaedf6&<8g`jwdCG+wa2^$fQCE=;_-@kjOh|H|%0iQWJ-kp>D7i zd;ac8LYiTy?5_#~eIGteKw@}$7^=3_1Qgmo399Vp5XQBlP*TOwH@yeIt^c5Y7_ro_ zw4q5t{`-*w6X8TNd*=u%1Ya56k0#-G!vRnJ@BhJR_~!`pRtY1Rw0}=#`VF5`?FvV+ z`$8)DI|-l9z~+)I0`r758{0w_du3oMIuTlg3k*zwWEFR_9efU1%Z993u&@SmP^^*% zFcp%Oc^rFcSEPiSV(sVVR3HOH2C(V?WWbX~L4Fa?BG4i*2~w5TMfvH6pj|r;ABkjb zLF%vxeyWG-`TjqSMZjtXVP<7LhhK`oR+0K}FCq0&$i;kUL9AJFu|$N@cRdoL;SQ0Q z49UOoS;@mw!2buT)M6I?GvX8c)Rf-mNXSK=)C3hizbVBjMTUV?#XLzq)q$JjCJDi@ zazUoh=EEfwS0PiMA^)Z<={qP=LQ+wvY%Yv~^tZ!dSt4vPQJ50x+hT$mr%q8HsB=P- zHeOiwWqYTEg6^jOsTXZ?DSp>zR3##!LCYB(ib@_#ZytvR2xyJ|B*-WRQzX-Ni2R+)gVO2N?HG>fATeaSX5_)(T zQzlt`<4f1&0&5opigoCayOLsE7>hcHuCb8!tThxB&f*J^At60>pMa_zDCn01=S-$8 zYfgT)`~)Sj=6{-&nHwm6yA6n+RCV$Qs9L>|f{tzEgwG~JgGfRGM*+I$G68Yon~tLH z+I|9hv4w(+;-D(D9z|o?h1Gp=J0XXW;0#u0M{b|sr&{FAaiGP+4d z|7}K2`%?UHg#guzOh3r?y8>8KAjhl;b_7tYjCd4X=EVY2%gjI!#R|6!h>^}DJuou? z3^dq7Kyz>>_(8_-x9oH5AtcBH#fi1##qK3ob?}zGlS7hyOGP0bJQDstjnmcr6#wu2 zh@b43d@(Y#R|fuDpr5rk<>3B_sFPN;{qGquVEPP9%UBAkax|fIE{+{TZwI4ekc-^I z6I2?WcnlLIvm!{p`-va4`~xklqrvi{6a2jRzoXC~Oq2`xB+#dkNZ~sZIc1se(6{d5 z(?vmF9q40iH@78I`~}G{ESPxb@Fs(*u2cfjz~Q0=suG|@3O2R_*WiQcEWxP4Z>CUdBWbCSlEx?@sf?Sa zViIKfn+U4^bbMw8Ox7MtMZ@J=1XY)Ff=W+ILxsI2a^R5&l)X=280+Bm5nMupl+f`R z++1S#8+DZb_%u*w!b9OV(@?SaLQqF|DXKh<&8K{Y19dw_QHe_=@DmuEyC-y!VPW1g zF|`5X`fk_1JAT)t1Gt)~=mimR{0~o}vf(${~wst0{;@wPHVY8Ww z##D81zUl8CxXI@ebP-s)odxa`e`hA@asDQ>bnl_4Dxq9LX(h;>>k=`_Um-vCvQwK| z{RoQv;wd!wCAX$xkpWa+Yq_bd!NIr*Rvx@54&|4uOU(N`rp~#@;%-@JRi!u!%sY}# zDY>7|B}!(JEWnbd0kSHipe?5{YO?GANv)=+ji)hbvM_&2STG|W#-~nmrWWS<28xyQ z9@y4(5#_x|Rc}rl+(r?gHPwN2&k247{8%RL?WHN)?Qf?WNflTe# zjp64+%McAsA?q-9gUw{AcpGkETnh3=N^uAO%oc{W;Q`pl+5vM|FGGU}1K!=f{p4211LG6C()nPX{C-@6FAD*A}3m=vx94bYWtgxNIRd zi!{(j_5Rx1kS%q{mIX_LH|)g}P{TbJpd6j{uJ)6f4TaKf>dQyShbh31j}>BqWDWZl z*0Qn&G_yl0AUE-s7qJ)DI*ZLGtA-t0r2cO3(@pS`#smwoG_fxg*FK9W;b+gHf#t2U zkQ<|Pl-B53R8l0*0r~1_MD9L~qClDuJHuC|5xPU#&>FEWq#VVQ&S6%hC%R0!M5SR? zI89}0Q(jn%v}P|ob92CK66-v$=PRbb98%9~LeI@%L?-U5!N-QVsaBX| zSX2xQc0VRFz=bvf%x3z}6O-jXh@ph!)E3_g!*woUV#g2A`SAni;oh$=#i&i;FM;Of zxabu4W(f?ET}n_7DU{$zQT$&XYM;bs0)DSK1=hI$))EW-tKfk>$8-w(+H}UGwzrz# zsaP?Ehy5aIgyk**TxdT9_PB^ilZ8Uw#O|&Itc3jstubq3)sE*}M0+B>5ITH=#&z%z zxARDnCHCW}-?6PwT-L$chP7r3hA`R9q@aCV9s+lqP1Mv&rJ%AkY6=fe^bA4V_6%CW z%3dv=s{+-5Xh^}liNCyvdR+Sw+IQl62^8twBoxWxMesk;aV-ROppBr)k(U7Ba0$>% z{9h${sdVNkjSw~M8q6KAX8Y&!NkV%rBYhc{LEqhuNzj|iXzazjKWJ*V>6qsU9SQ4KULhk2D)$Ouc1Np zeS-Q}gQ5yoVzOj1?48Em#B9VI{;9<}5?@`3wuzjs1kss>lxS}ynpokh0;-rfMRlyg zWSDm>4d1{-*@rDD=r%y4`>pGJ-#bEN<^LzLO^Yd3YzdDL(_Jg8A%O$SDF|+2qE@!5 z2&(H!iVD{-QSQ1aRQ`t#hEjW=zr{L5Wr8oNL0e)HYd|#Lkr36yU)CUne+X*nMvA(m z78yHnXVd>orIff)X~PXpR6QeO+g1x&mUvK*)b;V{uFkmLGsRn-B44&5RJPeFJ5NaRXEj1XA+aL6aTVPeAYX zP^r$piE_le7HX>2+I)@v%hGO*w zR?-_sZ-IiJ&<($h&BwcLVM1iSC0j}^;m2-aqSJD4f!k>B;ilWbYLiT`>f;x0qh3U& z&Q|p!P*(h)tSp*n4~Y)KP5jMmG>X_Ysg`5e0=80Yt=%%yBOP6_p}gr98sS za_m$OP+A!Ub(EpTg_LR}pt`FR#8ZLNB5TX4QZ;#fC&|{ipmE!g^|(KYyxV+4}vO}Hl0@h z-`j-RoJ;~aGsZ+dHDPL`ubH=rO`S7q#ojB9_zhlOL7ZlfeD#Zj zpeIK{7_TxO--MvOEg+>LNI+Wn-4@ipeoas}K;Mp_W{UDEFa?|+0^}$~Kq~kt_(A5X znxNK8Q`9kOUKPBn4W*#d3eZeB3bK*oh4r6tD1(6HiR-Jl`0gZ^$2-;)gz!5sFKv;%f+4(M?MChE|R z#&Hn@Qf0SZs~wWTcP+_z*Aq{ad}pMc8j#Y_Zl zSz{XdmPA)EQR0#{JV_I61-iWN)tVE~T7SS)|y%#?9?hSn*9=UiU$0y1gf@(L54 zC7Up2LK7Zu2-pr@pj4@# z;{a2o(&+^t-g}rx=^kD|LM?g!)jl{ibqK%l2oqti2q$^)p>SU52}`xVWVy_MUPBFx zK3PW!8L*!K6+wLeOH??sUlLXxVIsyysce&#jkg2Plz1lkD4xn8>6GF3gTcfkML9Tz zwaveIj43j9j8|mBDQ^jd_mY{YYA2>jDGT-9X$>Wh2YQ^WbN(;VNp{?|6-p3XRmX+r zb)uEM`<H{R-)2ZpwsrsBslR3uNWTdh^nAM7vOdk zlklBg$eD=*^yJ1Q=w%lgz+IbhF_4(;*A<`o(yO^OiGS=CulR(sJYR!4r{+m;W;3ra zb1R5o+)s0&vbsW#$bzL%&TgF$BC90nVZ|rqVZ?Qd-$BHNh28(@1UnC&{02=s+;{`Y zZ+bBaI{kuIVxpjZ++(&l0@Qs3b*v*Lsn?_o*$RffMg8@xx1jCkTT0uTx0n`b)5PU| zu)ej3#inDQCRj1@zCRr9`{SDM&4G8I?mTRlBVG=--=Ue^w*=Mn3q@6WkKQpR?}6Gg zNKxg7cxPzXEuY3NJRMq#88g_3sl>=-8M0!Kmslvttea})+kW_512if@`1}HHSu6x9k`mc zZtUd4+de=K{sJFO20zw~is(g2nV2w5Tk zy^N2TE6Frl_v9=&FdzU7Si{03ifi{^ZX{Ey?lhe%(56d4c37><$4h(0&%k^FBW@`Y zR?o%lKcRZOkD%%)Q`GuTm>DGXa|?L+nzCE4OSD% zDC>LC!;)f+??X*@WgjRwxR|2WEvCsa&CuxwD18|Lso;VANZ>R* z4x7;1kgO^s%ep;D!;9dT!#8`;B=BSXDCpi_K$W=a8pGL>` ztVWqm`Ua{P%@m~8OrtS3E2nMRWAzrydJL_uB8#fm4=H|$?`SQbc_HD{RM{R8tnzqi z8;uKpaT?8G+_frWw*%EUxJ#8qwI`na9a}*9ljY6{7N&o138hlF;15igjJ4Vi$c1?i z<*@NX*3>#%hFs|VZSZDShc`RxyQ6Sq690c+X(D*bPvpf<-Y)JPkZlF%`m=^|)4xeV zC1W%}eC}T)^j5dRli1yr4*gcvnfjRNxZ8hdR<7tjFja<|AZXxwxZo5up@7VV#7}?( zgb7FCAVVUquR`b?%kEdiyPQP3~=K?aRmAXxD( zR8H~#nP@1q#B;_V&#u4G5^Y~xh@>R=s}ovK3zqoaTS~D$_>Hz6FeXl)Pj#)u3W^nu zq6;uR>GTI|+h;og@#1e*&}q1=9tzbx#`>u9P)!@4V6eV3;?__?e1G9EBeC{i@)uNP zI#Se*T^KK(@E2`yJx4&*nooj5^|Z&N6nk;hX;1~TazHKo3PU6!+~O3 zDIU5`5oXv-p&4V<=X7t95Dy0*RS%h$4@~91)jo+It|Oq*4}%Bx+s`LKa1DU~GyNMW zo;qE`GJxXLMW{n>CkgRz@==p$b2vfY#oo_wqNeC`Bpk~Wn z6Z%empMaXlU-_-Zabed6i^JeCVGd7BHv