From 1f07b59a3dc89342f1d33b6e2d728b4f1624e27d Mon Sep 17 00:00:00 2001 From: zds <2388969634@qq.com> Date: Tue, 20 May 2025 16:50:35 +0800 Subject: [PATCH] =?UTF-8?q?del:=E5=88=A0=E9=99=A4=E4=B8=80=E6=9C=9F?= =?UTF-8?q?=E5=AF=86=E9=9B=86=E5=BA=93=E7=9B=B8=E5=85=B3=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/nl/b_lms/sch/tasks/TwoInTask.java | 12 - .../impl/StIvtIostorinvServiceImpl.java | 10 - .../nl/config/CustomJsonConfiguration.java | 50 - .../modules/generator/domain/ColumnInfo.java | 99 - .../modules/generator/domain/GenConfig.java | 80 - .../generator/domain/vo/TableInfo.java | 59 - .../repository/ColumnInfoRepository.java | 36 - .../repository/GenConfigRepository.java | 34 - .../generator/rest/GenConfigController.java | 50 - .../generator/rest/GeneratorController.java | 111 - .../generator/service/GenConfigService.java | 42 - .../generator/service/GeneratorService.java | 107 - .../service/impl/GenConfigServiceImpl.java | 71 - .../service/impl/GeneratorServiceImpl.java | 203 - .../nl/modules/generator/utils/ColUtil.java | 56 - .../nl/modules/generator/utils/GenUtil.java | 426 -- .../org/nl/modules/logging/domain/Log.java | 104 - .../logging/repository/LogRepository.java | 40 - .../modules/logging/rest/LogController.java | 89 - .../modules/logging/service/LogService.java | 87 - .../logging/service/impl/LogServiceImpl.java | 161 - .../logicflow/rest/StageController.java | 88 - .../logicflow/rest/StageImageController.java | 72 - .../logicflow/service/StageImageService.java | 59 - .../logicflow/service/StageService.java | 75 - .../logicflow/service/dto/StageDto.java | 63 - .../logicflow/service/dto/StageImageDto.java | 68 - .../service/impl/StageImageServiceImpl.java | 112 - .../service/impl/StageServiceImpl.java | 134 - .../rest/MobileAuthorizationController.java | 90 - .../system/rest/CodeDetailController.java | 57 - .../system/rest/GenCodeController.java | 67 - .../modules/system/rest/LimitController.java | 46 - .../system/rest/MonitorController.java | 45 - .../modules/system/rest/RedisController.java | 56 - .../system/service/CodeDetailService.java | 23 - .../modules/system/service/DataService.java | 37 - .../system/service/GenCodeService.java | 50 - .../system/service/MonitorService.java | 32 - .../modules/system/service/ParamService.java | 81 - .../modules/system/service/RedisService.java | 39 - .../system/service/convert/RedisConvert.java | 36 - .../modules/system/service/dto/ParamDto.java | 40 - .../system/service/entity/RedisKeyDefine.java | 112 - .../service/entity/RedisKeyRegistry.java | 28 - .../service/impl/CodeDetailServiceImpl.java | 80 - .../service/impl/GenCodeServiceImpl.java | 184 - .../service/impl/MonitorServiceImpl.java | 194 - .../system/service/impl/RedisServiceImpl.java | 83 - .../service/vo/RedisKeyDefineRespVO.java | 38 - .../system/service/vo/RedisMonitorRespVO.java | 46 - .../nl/modules/system/service/vo/UserVo.java | 9 - .../org/nl/modules/system/util/CodeUtil.java | 19 - .../org/nl/modules/system/util/YamlUtil.java | 11 - .../java/org/nl/modules/system/wql/sys.xls | Bin 220160 -> 95232 bytes .../main/java/org/nl/sql/add_column0320.sql | 7 - .../src/main/java/org/nl/ssosql-1228.sql | 1026 --- .../master/rest/SupplierbaseController.java | 61 - .../master/service/SupplierbaseService.java | 71 - .../master/service/dto/SupplierbaseDto.java | 158 - .../service/impl/SupplierbaseServiceImpl.java | 165 - .../master/wql/QMD_PB_STORAGEVEHICLEEXT.wql | 114 - .../org/nl/wms/basedata/master/wql/mdcs.xls | Bin 184320 -> 159232 bytes .../wms/ext/acs/rest/AcsToWmsController.java | 15 - .../wms/ext/acs/service/AcsToWmsService.java | 17 - .../acs/service/impl/AcsToWmsServiceImpl.java | 655 -- .../mes/service/impl/MesToLmsServiceImpl.java | 55 - .../sap/service/impl/SapToLmsServiceImpl.java | 203 - .../mps/service/impl/FeedingServiceImpl.java | 57 - .../impl/ProductInstorServiceImpl.java | 9 - .../service/impl/VirtualOutServiceImpl.java | 5 - .../org/nl/wms/pdm/wql/PDM_BI_DEVICE01.wql | 58 - .../src/main/java/org/nl/wms/pdm/wql/em.xls | Bin 182272 -> 57344 bytes .../src/main/java/org/nl/wms/pdm/wql/pdm.xls | Bin 254976 -> 247808 bytes .../sch/service/impl/PointServiceImpl.java | 15 - .../java/org/nl/wms/sch/tasks/InTask.java | 257 - .../java/org/nl/wms/sch/tasks/OutTask.java | 188 - .../inbill/rest/RawAssistIStorController.java | 299 - .../inbill/service/CheckOutBillService.java | 331 - .../inbill/service/RawAssistIStorService.java | 82 - .../impl/RawAssistIStorServiceImpl.java | 2955 -------- .../instor/rest/HandMoveStorController.java | 7 - .../instor/service/HandMoveStorService.java | 5 - .../service/impl/HandMoveStorServiceImpl.java | 747 +- .../service/impl/ProductScrapServiceImpl.java | 8 - .../service/impl/RecutPlanServiceImpl.java | 11 - .../outbill/rest/CheckOutBillController.java | 465 -- .../service/impl/CheckOutBillServiceImpl.java | 6391 ----------------- .../rest/InAndOutReturnlController.java | 4 +- .../main/resources/config/application-dev.yml | 8 +- .../src/main/resources/config/application.yml | 2 +- 91 files changed, 19 insertions(+), 18533 deletions(-) delete mode 100644 lms/nladmin-system/src/main/java/org/nl/config/CustomJsonConfiguration.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/generator/domain/ColumnInfo.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/generator/domain/GenConfig.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/generator/domain/vo/TableInfo.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/generator/repository/ColumnInfoRepository.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/generator/repository/GenConfigRepository.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/generator/rest/GenConfigController.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/generator/rest/GeneratorController.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/generator/service/GenConfigService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/generator/service/GeneratorService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/generator/service/impl/GenConfigServiceImpl.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/generator/service/impl/GeneratorServiceImpl.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/generator/utils/ColUtil.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/generator/utils/GenUtil.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/logging/domain/Log.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/logging/repository/LogRepository.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/logging/rest/LogController.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/logging/service/LogService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/logging/service/impl/LogServiceImpl.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/logicflow/rest/StageController.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/logicflow/rest/StageImageController.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/StageImageService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/StageService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/dto/StageDto.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/dto/StageImageDto.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/impl/StageImageServiceImpl.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/impl/StageServiceImpl.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/security/rest/MobileAuthorizationController.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/rest/CodeDetailController.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/rest/GenCodeController.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/rest/LimitController.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/rest/MonitorController.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/rest/RedisController.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/service/CodeDetailService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/service/DataService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/service/GenCodeService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/service/MonitorService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/service/ParamService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/service/RedisService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/service/convert/RedisConvert.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/service/dto/ParamDto.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/service/entity/RedisKeyDefine.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/service/entity/RedisKeyRegistry.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/service/impl/CodeDetailServiceImpl.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/service/impl/GenCodeServiceImpl.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/service/impl/MonitorServiceImpl.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/service/impl/RedisServiceImpl.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/service/vo/RedisKeyDefineRespVO.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/service/vo/RedisMonitorRespVO.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/service/vo/UserVo.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/util/CodeUtil.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/system/util/YamlUtil.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/sql/add_column0320.sql delete mode 100644 lms/nladmin-system/src/main/java/org/nl/ssosql-1228.sql delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/SupplierbaseController.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/SupplierbaseService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/SupplierbaseDto.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/SupplierbaseServiceImpl.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_STORAGEVEHICLEEXT.wql delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/PDM_BI_DEVICE01.wql delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/InTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/OutTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/rest/RawAssistIStorController.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/CheckOutBillService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/RawAssistIStorService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/RawAssistIStorServiceImpl.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoInTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoInTask.java index f9930c5..a745cb7 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoInTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoInTask.java @@ -2,37 +2,25 @@ package org.nl.b_lms.sch.tasks; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; -import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvdisService; import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis; -import org.nl.b_lms.storage_manage.ios.service.iostorInv.impl.StIvtIostorinvServiceImpl; import org.nl.b_lms.storage_manage.ios.service.iostorInv.impl.StIvtIostorinvdisServiceImpl; import org.nl.common.utils.SecurityUtils; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.SpringContextHolder; -import org.nl.wms.basedata.st.service.dto.StructattrDto; -import org.nl.wms.basedata.st.service.impl.StructattrServiceImpl; import org.nl.wms.sch.AcsTaskDto; import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.st.inbill.service.impl.InbillServiceImpl; -import org.nl.wms.st.inbill.service.impl.RawAssistIStorServiceImpl; -import org.nl.wms.st.inbill.service.impl.StorPublicServiceImpl; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import static org.nl.wms.util.TaskUtil.getRoutePlanCode; diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvServiceImpl.java index 8a92a07..cd6da7a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvServiceImpl.java @@ -3,7 +3,6 @@ package org.nl.b_lms.storage_manage.ios.service.iostorInv.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -16,10 +15,7 @@ import com.github.pagehelper.PageHelper; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.nl.b_lms.pdm.bi.slittingproductionplan.service.IPdmBiSlittingproductionplanService; -import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.mapper.PdmBiSlittingproductionplanMapper; import org.nl.b_lms.pdm.subpackagerelation.dao.PdmBiSubpackagerelation; -import org.nl.b_lms.pdm.subpackagerelation.dao.mapper.PdmBiSubpackagerelationMapper; import org.nl.b_lms.pdm.subpackagerelation.service.IpdmBiSubpackagerelationService; import org.nl.b_lms.pdm_manage.enums.SUBEnum; import org.nl.b_lms.sch.tasks.TwoInTask; @@ -51,7 +47,6 @@ import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.sch.service.PointService; import org.nl.wms.sch.service.dto.PointDto; -import org.nl.wms.sch.tasks.InTask; import org.nl.wms.st.inbill.service.StorPublicService; import org.nl.wms.st.returns.service.impl.InAndOutRetrunServiceImpl; import org.redisson.api.RLock; @@ -60,12 +55,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.TransactionDefinition; -import org.springframework.transaction.TransactionStatus; -import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.support.DefaultTransactionDefinition; import javax.annotation.Resource; import java.math.BigDecimal; diff --git a/lms/nladmin-system/src/main/java/org/nl/config/CustomJsonConfiguration.java b/lms/nladmin-system/src/main/java/org/nl/config/CustomJsonConfiguration.java deleted file mode 100644 index 66c472f..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/config/CustomJsonConfiguration.java +++ /dev/null @@ -1,50 +0,0 @@ -/* -package org.nl.config; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -import java.util.List; - -*/ -/** - * 处理前端和后端Long类型失去精度问题. - * https://blog.51cto.com/u_15127549/3519757 - *

- * 序列换成json时,将所有的long变成string - * 因为js中得数字类型不能包含所有的java long值 - *

- * 序列换成json时,将所有的long变成string - * 因为js中得数字类型不能包含所有的java long值 - *//* - -@Configuration -@EnableWebMvc -public class CustomJsonConfiguration implements WebMvcConfigurer { - @Override - public void configureMessageConverters(List> converters) { - MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); - - ObjectMapper objectMapper = new ObjectMapper(); - */ -/** - * 序列换成json时,将所有的long变成string - * 因为js中得数字类型不能包含所有的java long值 - *//* - - SimpleModule simpleModule = new SimpleModule(); - simpleModule.addSerializer(Long.class, ToStringSerializer.instance); - simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); - objectMapper.registerModule(simpleModule); - - jackson2HttpMessageConverter.setObjectMapper(objectMapper); - converters.add(jackson2HttpMessageConverter); - } -} -*/ diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/generator/domain/ColumnInfo.java b/lms/nladmin-system/src/main/java/org/nl/modules/generator/domain/ColumnInfo.java deleted file mode 100644 index 71f527e..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/generator/domain/ColumnInfo.java +++ /dev/null @@ -1,99 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.generator.domain; -// -// -//import lombok.Getter; -//import lombok.NoArgsConstructor; -//import lombok.Setter; -//import org.nl.common.utils.GenUtil; -// -//import javax.persistence.*; -//import java.io.Serializable; -// -///** -// * 列的数据信息 -// * -// * @author Zheng Jie -// * @date 2019-01-02 -// */ -//@Getter -//@Setter -//@Entity -//@NoArgsConstructor -//@Table(name = "code_column_config") -//public class ColumnInfo implements Serializable { -// -// @Id -// @Column(name = "column_id") -// -// @GeneratedValue(strategy = GenerationType.IDENTITY) -// private Long id; -// -// -// private String tableName; -// -// -// private String columnName; -// -// -// private String columnType; -// -// -// private String keyType; -// -// -// private String extra; -// -// -// private String remark; -// -// -// private Boolean notNull; -// -// -// private Boolean listShow; -// -// -// private Boolean formShow; -// -// -// private String formType; -// -// -// private String queryType; -// -// -// private String dictName; -// -// -// private String dateAnnotation; -// -// public ColumnInfo(String tableName, String columnName, Boolean notNull, String columnType, String remark, String keyType, String extra) { -// this.tableName = tableName; -// this.columnName = columnName; -// this.columnType = columnType; -// this.keyType = keyType; -// this.extra = extra; -// this.notNull = notNull; -// if (GenUtil.PK.equalsIgnoreCase(keyType) && GenUtil.EXTRA.equalsIgnoreCase(extra)) { -// this.notNull = false; -// } -// this.remark = remark; -// this.listShow = true; -// this.formShow = true; -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/generator/domain/GenConfig.java b/lms/nladmin-system/src/main/java/org/nl/modules/generator/domain/GenConfig.java deleted file mode 100644 index b239ca2..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/generator/domain/GenConfig.java +++ /dev/null @@ -1,80 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.generator.domain; -// -// -//import lombok.Getter; -//import lombok.NoArgsConstructor; -//import lombok.Setter; -// -//import javax.persistence.*; -//import javax.validation.constraints.NotBlank; -//import java.io.Serializable; -// -///** -// * 代码生成配置 -// * -// * @author Zheng Jie -// * @date 2019-01-03 -// */ -//@Getter -//@Setter -//@Entity -//@NoArgsConstructor -//@Table(name = "code_gen_config") -//public class GenConfig implements Serializable { -// -// public GenConfig(String tableName) { -// this.tableName = tableName; -// } -// -// @Id -// @Column(name = "config_id") -// -// @GeneratedValue(strategy = GenerationType.IDENTITY) -// private Long id; -// -// @NotBlank -// -// private String tableName; -// -// -// private String apiAlias; -// -// @NotBlank -// -// private String pack; -// -// @NotBlank -// -// private String moduleName; -// -// @NotBlank -// -// private String path; -// -// -// private String apiPath; -// -// -// private String author; -// -// -// private String prefix; -// -// -// private Boolean cover = false; -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/generator/domain/vo/TableInfo.java b/lms/nladmin-system/src/main/java/org/nl/modules/generator/domain/vo/TableInfo.java deleted file mode 100644 index 29cffd3..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/generator/domain/vo/TableInfo.java +++ /dev/null @@ -1,59 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.generator.domain.vo; -// -//import lombok.AllArgsConstructor; -//import lombok.Data; -//import lombok.NoArgsConstructor; -// -///** -// * 表的数据信息 -// * -// * @author Zheng Jie -// * @date 2019-01-02 -// */ -//@Data -//@AllArgsConstructor -//@NoArgsConstructor -//public class TableInfo { -// -// /** -// * 表名称 -// */ -// private Object tableName; -// -// /** -// * 创建日期 -// */ -// private Object createTime; -// -// /** -// * 数据库引擎 -// */ -// private Object engine; -// -// /** -// * 编码集 -// */ -// private Object coding; -// -// /** -// * 备注 -// */ -// private Object remark; -// -// -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/generator/repository/ColumnInfoRepository.java b/lms/nladmin-system/src/main/java/org/nl/modules/generator/repository/ColumnInfoRepository.java deleted file mode 100644 index 2ff37d2..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/generator/repository/ColumnInfoRepository.java +++ /dev/null @@ -1,36 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.generator.repository; -// -//import org.nl.modules.generator.domain.ColumnInfo; -//import org.springframework.data.jpa.repository.JpaRepository; -// -//import java.util.List; -// -///** -// * @author Zheng Jie -// * @date 2019-01-14 -// */ -//public interface ColumnInfoRepository extends JpaRepository { -// -// /** -// * 查询表信息 -// * -// * @param tableName 表格名 -// * @return 表信息 -// */ -// List findByTableNameOrderByIdAsc(String tableName); -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/generator/repository/GenConfigRepository.java b/lms/nladmin-system/src/main/java/org/nl/modules/generator/repository/GenConfigRepository.java deleted file mode 100644 index 35fee49..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/generator/repository/GenConfigRepository.java +++ /dev/null @@ -1,34 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.generator.repository; -// -//import org.nl.modules.generator.domain.GenConfig; -//import org.springframework.data.jpa.repository.JpaRepository; -// -///** -// * @author Zheng Jie -// * @date 2019-01-14 -// */ -//public interface GenConfigRepository extends JpaRepository { -// -// /** -// * 查询表配置 -// * -// * @param tableName 表名 -// * @return / -// */ -// GenConfig findByTableName(String tableName); -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/generator/rest/GenConfigController.java b/lms/nladmin-system/src/main/java/org/nl/modules/generator/rest/GenConfigController.java deleted file mode 100644 index 0f1b142..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/generator/rest/GenConfigController.java +++ /dev/null @@ -1,50 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.generator.rest; -// -// -//import lombok.RequiredArgsConstructor; -//import org.nl.modules.generator.domain.GenConfig; -//import org.nl.modules.generator.service.GenConfigService; -//import org.springframework.http.HttpStatus; -//import org.springframework.http.ResponseEntity; -//import org.springframework.validation.annotation.Validated; -//import org.springframework.web.bind.annotation.*; -// -///** -// * @author Zheng Jie -// * @date 2019-01-14 -// */ -//@RestController -//@RequiredArgsConstructor -//@RequestMapping("/api/genConfig2") -// -//public class GenConfigController { -// -// private final GenConfigService genConfigService; -// -// -// @GetMapping(value = "/{tableName}") -// public ResponseEntity query(@PathVariable String tableName) { -// return new ResponseEntity<>(genConfigService.find(tableName), HttpStatus.OK); -// } -// -// -// @PutMapping -// public ResponseEntity update(@Validated @RequestBody GenConfig genConfig) { -// return new ResponseEntity<>(genConfigService.update(genConfig.getTableName(), genConfig), HttpStatus.OK); -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/generator/rest/GeneratorController.java b/lms/nladmin-system/src/main/java/org/nl/modules/generator/rest/GeneratorController.java deleted file mode 100644 index 0abe055..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/generator/rest/GeneratorController.java +++ /dev/null @@ -1,111 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.generator.rest; -// -// -//import lombok.RequiredArgsConstructor; -//import org.nl.modules.common.exception.BadRequestException; -//import org.nl.modules.common.utils.PageUtil; -//import org.nl.modules.generator.domain.ColumnInfo; -//import org.nl.modules.generator.service.GenConfigService; -//import org.nl.modules.generator.service.GeneratorService; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.http.HttpStatus; -//import org.springframework.http.ResponseEntity; -//import org.springframework.web.bind.annotation.*; -// -//import javax.servlet.http.HttpServletRequest; -//import javax.servlet.http.HttpServletResponse; -//import java.util.List; -// -///** -// * @author Zheng Jie -// * @date 2019-01-02 -// */ -//@RestController -//@RequiredArgsConstructor -//@RequestMapping("/api/generator2") -// -//public class GeneratorController { -// -// private final GeneratorService generatorService; -// private final GenConfigService genConfigService; -// -// @Value("${generator.enabled}") -// private Boolean generatorEnabled; -// -// -// @GetMapping(value = "/tables/all") -// public ResponseEntity queryTables() { -// return new ResponseEntity<>(generatorService.getTables(), HttpStatus.OK); -// } -// -// -// @GetMapping(value = "/tables") -// public ResponseEntity queryTables(@RequestParam(defaultValue = "") String name, -// @RequestParam(defaultValue = "0") Integer page, -// @RequestParam(defaultValue = "10") Integer size) { -// int[] startEnd = PageUtil.transToStartEnd(page, size); -// return new ResponseEntity<>(generatorService.getTables(name, startEnd), HttpStatus.OK); -// } -// -// -// @GetMapping(value = "/columns") -// public ResponseEntity queryColumns(@RequestParam String tableName) { -// List columnInfos = generatorService.getColumns(tableName); -// return new ResponseEntity<>(PageUtil.toPage(columnInfos, columnInfos.size()), HttpStatus.OK); -// } -// -// -// @PutMapping -// public ResponseEntity save(@RequestBody List columnInfos) { -// generatorService.save(columnInfos); -// return new ResponseEntity<>(HttpStatus.OK); -// } -// -// -// @PostMapping(value = "sync") -// public ResponseEntity sync(@RequestBody List tables) { -// for (String table : tables) { -// generatorService.sync(generatorService.getColumns(table), generatorService.query(table)); -// } -// return new ResponseEntity<>(HttpStatus.OK); -// } -// -// -// @PostMapping(value = "/{tableName}/{type}") -// public ResponseEntity generator(@PathVariable String tableName, @PathVariable Integer type, HttpServletRequest request, HttpServletResponse response) { -// if (!generatorEnabled && type == 0) { -// throw new BadRequestException("此环境不允许生成代码,请选择预览或者下载查看!"); -// } -// switch (type) { -// // 生成代码 -// case 0: -// generatorService.generator(genConfigService.find(tableName), generatorService.getColumns(tableName)); -// break; -// // 预览 -// case 1: -// return generatorService.preview(genConfigService.find(tableName), generatorService.getColumns(tableName)); -// // 打包 -// case 2: -// generatorService.download(genConfigService.find(tableName), generatorService.getColumns(tableName), request, response); -// break; -// default: -// throw new BadRequestException("没有这个选项"); -// } -// return new ResponseEntity<>(HttpStatus.OK); -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/generator/service/GenConfigService.java b/lms/nladmin-system/src/main/java/org/nl/modules/generator/service/GenConfigService.java deleted file mode 100644 index 009ba59..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/generator/service/GenConfigService.java +++ /dev/null @@ -1,42 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.generator.service; -// -//import org.nl.modules.generator.domain.GenConfig; -// -///** -// * @author Zheng Jie -// * @date 2019-01-14 -// */ -//public interface GenConfigService { -// -// /** -// * 查询表配置 -// * -// * @param tableName 表名 -// * @return 表配置 -// */ -// GenConfig find(String tableName); -// -// /** -// * 更新表配置 -// * -// * @param tableName 表名 -// * @param genConfig 表配置 -// * @return 表配置 -// */ -// GenConfig update(String tableName, GenConfig genConfig); -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/generator/service/GeneratorService.java b/lms/nladmin-system/src/main/java/org/nl/modules/generator/service/GeneratorService.java deleted file mode 100644 index d055154..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/generator/service/GeneratorService.java +++ /dev/null @@ -1,107 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.generator.service; -// -//import org.nl.modules.generator.domain.ColumnInfo; -//import org.nl.modules.generator.domain.GenConfig; -//import org.springframework.http.ResponseEntity; -//import org.springframework.scheduling.annotation.Async; -// -//import javax.servlet.http.HttpServletRequest; -//import javax.servlet.http.HttpServletResponse; -//import java.util.List; -// -///** -// * @author Zheng Jie -// * @date 2019-01-02 -// */ -//public interface GeneratorService { -// -// /** -// * 查询数据库元数据 -// * -// * @param name 表名 -// * @param startEnd 分页参数 -// * @return / -// */ -// Object getTables(String name, int[] startEnd); -// -// /** -// * 得到数据表的元数据 -// * -// * @param name 表名 -// * @return / -// */ -// List getColumns(String name); -// -// /** -// * 同步表数据 -// * -// * @param columnInfos / -// * @param columnInfoList / -// */ -// @Async -// void sync(List columnInfos, List columnInfoList); -// -// /** -// * 保持数据 -// * -// * @param columnInfos / -// */ -// void save(List columnInfos); -// -// /** -// * 获取所有table -// * -// * @return / -// */ -// Object getTables(); -// -// /** -// * 代码生成 -// * -// * @param genConfig 配置信息 -// * @param columns 字段信息 -// */ -// void generator(GenConfig genConfig, List columns); -// -// /** -// * 预览 -// * -// * @param genConfig 配置信息 -// * @param columns 字段信息 -// * @return / -// */ -// ResponseEntity preview(GenConfig genConfig, List columns); -// -// /** -// * 打包下载 -// * -// * @param genConfig 配置信息 -// * @param columns 字段信息 -// * @param request / -// * @param response / -// */ -// void download(GenConfig genConfig, List columns, HttpServletRequest request, HttpServletResponse response); -// -// /** -// * 查询数据库的表字段数据数据 -// * -// * @param table / -// * @return / -// */ -// List query(String table); -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/generator/service/impl/GenConfigServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/modules/generator/service/impl/GenConfigServiceImpl.java deleted file mode 100644 index 0728b97..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/generator/service/impl/GenConfigServiceImpl.java +++ /dev/null @@ -1,71 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.generator.service.impl; -// -//import cn.hutool.core.util.StrUtil; -//import lombok.RequiredArgsConstructor; -//import org.nl.modules.generator.domain.GenConfig; -//import org.nl.modules.generator.repository.GenConfigRepository; -//import org.nl.modules.generator.service.GenConfigService; -//import org.springframework.stereotype.Service; -// -//import java.io.File; -// -///** -// * @author Zheng Jie -// * @date 2019-01-14 -// */ -//@Service -//@RequiredArgsConstructor -//public class GenConfigServiceImpl implements GenConfigService { -// -// private final GenConfigRepository genConfigRepository; -// -// @Override -// public GenConfig find(String tableName) { -// GenConfig genConfig = genConfigRepository.findByTableName(tableName); -// if (genConfig == null) { -// return new GenConfig(tableName); -// } -// return genConfig; -// } -// -// @Override -// public GenConfig update(String tableName, GenConfig genConfig) { -// // 如果 api 路径为空,则自动生成路径 -// if (StrUtil.isEmpty(genConfig.getApiPath())) { -// String separator = File.separator; -// String[] paths; -// String symbol = "\\"; -// if (symbol.equals(separator)) { -// paths = genConfig.getPath().split("\\\\"); -// } else { -// paths = genConfig.getPath().split(File.separator); -// } -// StringBuilder api = new StringBuilder(); -// for (String path : paths) { -// api.append(path); -// api.append(separator); -// if ("src".equals(path)) { -// api.append("api"); -// break; -// } -// } -// genConfig.setApiPath(api.toString()); -// } -// return genConfigRepository.save(genConfig); -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/generator/service/impl/GeneratorServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/modules/generator/service/impl/GeneratorServiceImpl.java deleted file mode 100644 index 2ca2614..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/generator/service/impl/GeneratorServiceImpl.java +++ /dev/null @@ -1,203 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.generator.service.impl; -// -//import cn.hutool.core.collection.CollectionUtil; -//import cn.hutool.core.util.ObjectUtil; -//import cn.hutool.core.util.StrUtil; -//import cn.hutool.core.util.ZipUtil; -//import lombok.RequiredArgsConstructor; -//import org.nl.modules.common.exception.BadRequestException; -//import org.nl.modules.common.utils.FileUtil; -//import org.nl.modules.common.utils.PageUtil; -//import org.nl.modules.generator.domain.ColumnInfo; -//import org.nl.modules.generator.domain.GenConfig; -//import org.nl.modules.generator.domain.vo.TableInfo; -//import org.nl.modules.generator.repository.ColumnInfoRepository; -//import org.nl.modules.generator.service.GeneratorService; -//import org.nl.modules.generator.utils.GenUtil; -//import org.slf4j.Logger; -//import org.slf4j.LoggerFactory; -//import org.springframework.http.HttpStatus; -//import org.springframework.http.ResponseEntity; -//import org.springframework.stereotype.Service; -// -//import javax.persistence.EntityManager; -//import javax.persistence.PersistenceContext; -//import javax.persistence.Query; -//import javax.servlet.http.HttpServletRequest; -//import javax.servlet.http.HttpServletResponse; -//import java.io.File; -//import java.io.IOException; -//import java.util.ArrayList; -//import java.util.List; -//import java.util.Map; -//import java.util.stream.Collectors; -// -///** -// * @author Zheng Jie -// * @date 2019-01-02 -// */ -//@Service -//@RequiredArgsConstructor -//public class GeneratorServiceImpl implements GeneratorService { -// private static final Logger log = LoggerFactory.getLogger(GeneratorServiceImpl.class); -// @PersistenceContext -// private EntityManager em; -// -// private final ColumnInfoRepository columnInfoRepository; -// -// @Override -// public Object getTables() { -// // 使用预编译防止sql注入 -// String sql = "select table_name ,create_time , engine, table_collation, table_comment from information_schema.tables " + -// "where table_schema = (select database()) " + -// "order by create_time desc"; -// Query query = em.createNativeQuery(sql); -// return query.getResultList(); -// } -// -// @Override -// public Object getTables(String name, int[] startEnd) { -// // 使用预编译防止sql注入 -// String sql = "select table_name ,create_time , engine, table_collation, table_comment from information_schema.tables " + -// "where table_schema = (select database()) " + -// "and table_name like ? order by create_time desc"; -// Query query = em.createNativeQuery(sql); -// query.setFirstResult(startEnd[0]); -// query.setMaxResults(startEnd[1] - startEnd[0]); -// query.setParameter(1, StrUtil.isNotEmpty(name) ? ("%" + name + "%") : "%%"); -// List result = query.getResultList(); -// List tableInfos = new ArrayList<>(); -// for (Object obj : result) { -// Object[] arr = (Object[]) obj; -// tableInfos.add(new TableInfo(arr[0], arr[1], arr[2], arr[3], ObjectUtil.isNotEmpty(arr[4]) ? arr[4] : "-")); -// } -// Query query1 = em.createNativeQuery("SELECT COUNT(*) from information_schema.tables where table_schema = (select database())"); -// Object totalElements = query1.getSingleResult(); -// return PageUtil.toPage(tableInfos, totalElements); -// } -// -// @Override -// public List getColumns(String tableName) { -// List columnInfos = columnInfoRepository.findByTableNameOrderByIdAsc(tableName); -// if (CollectionUtil.isNotEmpty(columnInfos)) { -// return columnInfos; -// } else { -// columnInfos = query(tableName); -// return columnInfoRepository.saveAll(columnInfos); -// } -// } -// -// @Override -// public List query(String tableName) { -// // 使用预编译防止sql注入 -// String sql = "select column_name, is_nullable, data_type, column_comment, column_key, extra from information_schema.columns " + -// "where table_name = ? and table_schema = (select database()) order by ordinal_position"; -// Query query = em.createNativeQuery(sql); -// query.setParameter(1, tableName); -// List result = query.getResultList(); -// List columnInfos = new ArrayList<>(); -// for (Object obj : result) { -// Object[] arr = (Object[]) obj; -// columnInfos.add( -// new ColumnInfo( -// tableName, -// arr[0].toString(), -// "NO".equals(arr[1]), -// arr[2].toString(), -// ObjectUtil.isNotNull(arr[3]) ? arr[3].toString() : null, -// ObjectUtil.isNotNull(arr[4]) ? arr[4].toString() : null, -// ObjectUtil.isNotNull(arr[5]) ? arr[5].toString() : null) -// ); -// } -// return columnInfos; -// } -// -// @Override -// public void sync(List columnInfos, List columnInfoList) { -// // 第一种情况,数据库类字段改变或者新增字段 -// for (ColumnInfo columnInfo : columnInfoList) { -// // 根据字段名称查找 -// List columns = columnInfos.stream().filter(c -> c.getColumnName().equals(columnInfo.getColumnName())).collect(Collectors.toList()); -// // 如果能找到,就修改部分可能被字段 -// if (CollectionUtil.isNotEmpty(columns)) { -// ColumnInfo column = columns.get(0); -// column.setColumnType(columnInfo.getColumnType()); -// column.setExtra(columnInfo.getExtra()); -// column.setKeyType(columnInfo.getKeyType()); -// if (StrUtil.isEmpty(column.getRemark())) { -// column.setRemark(columnInfo.getRemark()); -// } -// columnInfoRepository.save(column); -// } else { -// // 如果找不到,则保存新字段信息 -// columnInfoRepository.save(columnInfo); -// } -// } -// // 第二种情况,数据库字段删除了 -// for (ColumnInfo columnInfo : columnInfos) { -// // 根据字段名称查找 -// List columns = columnInfoList.stream().filter(c -> c.getColumnName().equals(columnInfo.getColumnName())).collect(Collectors.toList()); -// // 如果找不到,就代表字段被删除了,则需要删除该字段 -// if (CollectionUtil.isEmpty(columns)) { -// columnInfoRepository.delete(columnInfo); -// } -// } -// } -// -// @Override -// public void save(List columnInfos) { -// columnInfoRepository.saveAll(columnInfos); -// } -// -// @Override -// public void generator(GenConfig genConfig, List columns) { -// if (genConfig.getId() == null) { -// throw new BadRequestException("请先配置生成器"); -// } -// try { -// GenUtil.generatorCode(columns, genConfig); -// } catch (IOException e) { -// log.error(e.getMessage(), e); -// throw new BadRequestException("生成失败,请手动处理已生成的文件"); -// } -// } -// -// @Override -// public ResponseEntity preview(GenConfig genConfig, List columns) { -// if (genConfig.getId() == null) { -// throw new BadRequestException("请先配置生成器"); -// } -// List> genList = GenUtil.preview(columns, genConfig); -// return new ResponseEntity<>(genList, HttpStatus.OK); -// } -// -// @Override -// public void download(GenConfig genConfig, List columns, HttpServletRequest request, HttpServletResponse response) { -// if (genConfig.getId() == null) { -// throw new BadRequestException("请先配置生成器"); -// } -// try { -// File file = new File(GenUtil.download(columns, genConfig)); -// String zipPath = file.getPath() + ".zip"; -// ZipUtil.zip(file.getPath(), zipPath); -// FileUtil.downloadFile(request, response, new File(zipPath), true); -// } catch (IOException e) { -// throw new BadRequestException("打包失败"); -// } -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/generator/utils/ColUtil.java b/lms/nladmin-system/src/main/java/org/nl/modules/generator/utils/ColUtil.java deleted file mode 100644 index 908decf..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/generator/utils/ColUtil.java +++ /dev/null @@ -1,56 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.generator.utils; -// -//import org.apache.commons.configuration.Configuration; -//import org.apache.commons.configuration.ConfigurationException; -//import org.apache.commons.configuration.PropertiesConfiguration; -//import org.slf4j.Logger; -//import org.slf4j.LoggerFactory; -// -///** -// * sql字段转java -// * -// * @author Zheng Jie -// * @date 2019-01-03 -// */ -//public class ColUtil { -// private static final Logger log = LoggerFactory.getLogger(ColUtil.class); -// -// /** -// * 转换mysql数据类型为java数据类型 -// * -// * @param type 数据库字段类型 -// * @return String -// */ -// static String cloToJava(String type) { -// Configuration config = getConfig(); -// assert config != null; -// return config.getString(type, "unknowType"); -// } -// -// /** -// * 获取配置信息 -// */ -// public static PropertiesConfiguration getConfig() { -// try { -// return new PropertiesConfiguration("generator.properties"); -// } catch (ConfigurationException e) { -// log.error(e.getMessage(), e); -// } -// return null; -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/generator/utils/GenUtil.java b/lms/nladmin-system/src/main/java/org/nl/modules/generator/utils/GenUtil.java deleted file mode 100644 index 6c2c285..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/generator/utils/GenUtil.java +++ /dev/null @@ -1,426 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.generator.utils; -// -//import cn.hutool.core.util.StrUtil; -//import cn.hutool.extra.template.*; -//import lombok.extern.slf4j.Slf4j; -//import org.nl.modules.common.utils.FileUtil; -//import org.nl.modules.common.utils.StringUtils; -//import org.nl.modules.generator.domain.ColumnInfo; -//import org.nl.modules.generator.domain.GenConfig; -//import org.springframework.util.ObjectUtils; -// -//import java.io.File; -//import java.io.FileWriter; -//import java.io.IOException; -//import java.io.Writer; -//import java.time.LocalDate; -//import java.util.ArrayList; -//import java.util.HashMap; -//import java.util.List; -//import java.util.Map; -// -//import static org.nl.modules.common.utils.FileUtil.SYS_TEM_DIR; -// -// -///** -// * 代码生成 -// * -// * @author Zheng Jie -// * @date 2019-01-02 -// */ -//@Slf4j -//@SuppressWarnings({"unchecked", "all"}) -//public class GenUtil { -// -// private static final String TIMESTAMP = "Timestamp"; -// -// private static final String BIGDECIMAL = "BigDecimal"; -// -// public static final String PK = "PRI"; -// -// public static final String EXTRA = "auto_increment"; -// -// /** -// * 获取后端代码模板名称 -// * -// * @return List -// */ -// private static List getAdminTemplateNames() { -// List templateNames = new ArrayList<>(); -// // templateNames.add("Entity"); -// templateNames.add("Dto"); -// // templateNames.add("Mapper"); -// templateNames.add("Controller"); -// //templateNames.add("QueryCriteria"); -// templateNames.add("Service"); -// templateNames.add("ServiceImpl"); -// // templateNames.add("Repository"); -// return templateNames; -// } -// -// /** -// * 获取前端代码模板名称 -// * -// * @return List -// */ -// private static List getFrontTemplateNames() { -// List templateNames = new ArrayList<>(); -// templateNames.add("index"); -// templateNames.add("api"); -// return templateNames; -// } -// -// public static List> preview(List columns, GenConfig genConfig) { -// Map genMap = getGenMap(columns, genConfig); -// List> genList = new ArrayList<>(); -// // 获取后端模版 -// List templates = getAdminTemplateNames(); -// TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig("template", TemplateConfig.ResourceMode.CLASSPATH)); -// for (String templateName : templates) { -// Map map = new HashMap<>(1); -// Template template = engine.getTemplate("generator/admin/" + templateName + ".ftl"); -// map.put("content", template.render(genMap)); -// map.put("name", templateName); -// genList.add(map); -// } -// // 获取前端模版 -// templates = getFrontTemplateNames(); -// for (String templateName : templates) { -// Map map = new HashMap<>(1); -// Template template = engine.getTemplate("generator/front/" + templateName + ".ftl"); -// map.put(templateName, template.render(genMap)); -// map.put("content", template.render(genMap)); -// map.put("name", templateName); -// genList.add(map); -// } -// return genList; -// } -// -// public static String download(List columns, GenConfig genConfig) throws IOException { -// // 拼接的路径:/tmpnladmin-gen-temp/,这个路径在Linux下需要root用户才有权限创建,非root用户会权限错误而失败,更改为: /tmp/nladmin-gen-temp/ -// // String tempPath =SYS_TEM_DIR + "nladmin-gen-temp" + File.separator + genConfig.getTableName() + File.separator; -// String tempPath = SYS_TEM_DIR + "nladmin-gen-temp" + File.separator + genConfig.getTableName() + File.separator; -// Map genMap = getGenMap(columns, genConfig); -// TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig("template", TemplateConfig.ResourceMode.CLASSPATH)); -// // 生成后端代码 -// List templates = getAdminTemplateNames(); -// for (String templateName : templates) { -// Template template = engine.getTemplate("generator/admin/" + templateName + ".ftl"); -// String filePath = getAdminFilePath(templateName, genConfig, genMap.get("className").toString(), tempPath + "eladmin" + File.separator); -// assert filePath != null; -// File file = new File(filePath); -// // 如果非覆盖生成 -// if (!genConfig.getCover() && FileUtil.exist(file)) { -// continue; -// } -// // 生成代码 -// genFile(file, template, genMap); -// } -// // 生成前端代码 -// templates = getFrontTemplateNames(); -// for (String templateName : templates) { -// Template template = engine.getTemplate("generator/front/" + templateName + ".ftl"); -// String path = tempPath + "nladmin-web" + File.separator; -// String apiPath = path + "src" + File.separator + "api" + File.separator; -// String srcPath = path + "src" + File.separator + "views" + File.separator + genMap.get("changeClassName").toString() + File.separator; -// String filePath = getFrontFilePath(templateName, apiPath, srcPath, genMap.get("changeClassName").toString()); -// assert filePath != null; -// File file = new File(filePath); -// // 如果非覆盖生成 -// if (!genConfig.getCover() && FileUtil.exist(file)) { -// continue; -// } -// // 生成代码 -// genFile(file, template, genMap); -// } -// return tempPath; -// } -// -// public static void generatorCode(List columnInfos, GenConfig genConfig) throws IOException { -// Map genMap = getGenMap(columnInfos, genConfig); -// TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig("template", TemplateConfig.ResourceMode.CLASSPATH)); -// // 生成后端代码 -// List templates = getAdminTemplateNames(); -// for (String templateName : templates) { -// Template template = engine.getTemplate("generator/admin/" + templateName + ".ftl"); -// String filePath = getAdminFilePath(templateName, genConfig, genMap.get("className").toString(), System.getProperty("user.dir")); -// -// assert filePath != null; -// File file = new File(filePath); -// -// // 如果非覆盖生成 -// if (!genConfig.getCover() && FileUtil.exist(file)) { -// continue; -// } -// // 生成代码 -// genFile(file, template, genMap); -// } -// -// // 生成前端代码 -// templates = getFrontTemplateNames(); -// for (String templateName : templates) { -// Template template = engine.getTemplate("generator/front/" + templateName + ".ftl"); -// String filePath = getFrontFilePath(templateName, genConfig.getApiPath(), genConfig.getPath(), genMap.get("changeClassName").toString()); -// -// assert filePath != null; -// File file = new File(filePath); -// -// // 如果非覆盖生成 -// if (!genConfig.getCover() && FileUtil.exist(file)) { -// continue; -// } -// // 生成代码 -// genFile(file, template, genMap); -// } -// } -// -// // 获取模版数据 -// private static Map getGenMap(List columnInfos, GenConfig genConfig) { -// // 存储模版字段数据 -// Map genMap = new HashMap<>(16); -// // 接口别名 -// genMap.put("apiAlias", genConfig.getApiAlias()); -// // 包名称 -// genMap.put("package", genConfig.getPack()); -// // 模块名称 -// genMap.put("moduleName", genConfig.getModuleName()); -// // 作者 -// genMap.put("author", genConfig.getAuthor()); -// // 创建日期 -// genMap.put("date", LocalDate.now().toString()); -// // 表名 -// genMap.put("tableName", genConfig.getTableName()); -// // 大写开头的类名 -// String className = StringUtils.toCapitalizeCamelCase(genConfig.getTableName()); -// // 小写开头的类名 -// String changeClassName = StringUtils.toCamelCase(genConfig.getTableName()); -// // 判断是否去除表前缀 -// if (StrUtil.isNotEmpty(genConfig.getPrefix())) { -// className = StringUtils.toCapitalizeCamelCase(StrUtil.removePrefix(genConfig.getTableName(), genConfig.getPrefix())); -// changeClassName = StringUtils.toCamelCase(StrUtil.removePrefix(genConfig.getTableName(), genConfig.getPrefix())); -// } -// // 保存类名 -// genMap.put("className", className); -// // 保存小写开头的类名 -// genMap.put("changeClassName", changeClassName); -// // 存在 Timestamp 字段 -// genMap.put("hasTimestamp", false); -// // 查询类中存在 Timestamp 字段 -// genMap.put("queryHasTimestamp", false); -// // 存在 BigDecimal 字段 -// genMap.put("hasBigDecimal", false); -// // 查询类中存在 BigDecimal 字段 -// genMap.put("queryHasBigDecimal", false); -// // 是否需要创建查询 -// genMap.put("hasQuery", false); -// // 自增主键 -// genMap.put("auto", false); -// // 存在字典 -// genMap.put("hasDict", false); -// // 存在日期注解 -// genMap.put("hasDateAnnotation", false); -// // 保存字段信息 -// List> columns = new ArrayList<>(); -// // 保存查询字段的信息 -// List> queryColumns = new ArrayList<>(); -// // 存储字典信息 -// List dicts = new ArrayList<>(); -// // 存储 between 信息 -// List> betweens = new ArrayList<>(); -// // 存储不为空的字段信息 -// List> isNotNullColumns = new ArrayList<>(); -// -// for (ColumnInfo column : columnInfos) { -// Map listMap = new HashMap<>(16); -// // 字段描述 -// listMap.put("remark", column.getRemark()); -// // 字段类型 -// listMap.put("columnKey", column.getKeyType()); -// // 主键类型 -// String colType = ColUtil.cloToJava(column.getColumnType()); -// // 小写开头的字段名 -// //String changeColumnName = StringUtils.toCamelCase(column.getColumnName()); -// String changeColumnName = column.getColumnName(); -// // 大写开头的字段名 -// String capitalColumnName = StringUtils.toCapitalizeCamelCase(column.getColumnName()); -// if (PK.equals(column.getKeyType())) { -// // 存储主键类型 -// genMap.put("pkColumnType", colType); -// // 存储小写开头的字段名 -// genMap.put("pkChangeColName", changeColumnName); -// // 存储大写开头的字段名 -// genMap.put("pkCapitalColName", capitalColumnName); -// } -// // 是否存在 Timestamp 类型的字段 -// if (TIMESTAMP.equals(colType)) { -// genMap.put("hasTimestamp", true); -// } -// // 是否存在 BigDecimal 类型的字段 -// if (BIGDECIMAL.equals(colType)) { -// genMap.put("hasBigDecimal", true); -// } -// // 主键是否自增 -// if (EXTRA.equals(column.getExtra())) { -// genMap.put("auto", true); -// } -// // 主键存在字典 -// if (StrUtil.isNotEmpty(column.getDictName())) { -// genMap.put("hasDict", true); -// dicts.add(column.getDictName()); -// } -// -// // 存储字段类型 -// listMap.put("columnType", colType); -// // 存储字原始段名称 -// listMap.put("columnName", column.getColumnName()); -// // 不为空 -// listMap.put("istNotNull", column.getNotNull()); -// // 字段列表显示 -// listMap.put("columnShow", column.getListShow()); -// // 表单显示 -// listMap.put("formShow", column.getFormShow()); -// // 表单组件类型 -// listMap.put("formType", StrUtil.isNotEmpty(column.getFormType()) ? column.getFormType() : "Input"); -// // 小写开头的字段名称 -// listMap.put("changeColumnName", changeColumnName); -// //大写开头的字段名称 -// listMap.put("capitalColumnName", capitalColumnName); -// // 字典名称 -// listMap.put("dictName", column.getDictName()); -// // 日期注解 -// listMap.put("dateAnnotation", column.getDateAnnotation()); -// if (StrUtil.isNotEmpty(column.getDateAnnotation())) { -// genMap.put("hasDateAnnotation", true); -// } -// // 添加非空字段信息 -// if (column.getNotNull()) { -// isNotNullColumns.add(listMap); -// } -// // 判断是否有查询,如有则把查询的字段set进columnQuery -// if (!StrUtil.isEmpty(column.getQueryType())) { -// // 查询类型 -// listMap.put("queryType", column.getQueryType()); -// // 是否存在查询 -// genMap.put("hasQuery", true); -// if (TIMESTAMP.equals(colType)) { -// // 查询中存储 Timestamp 类型 -// genMap.put("queryHasTimestamp", true); -// } -// if (BIGDECIMAL.equals(colType)) { -// // 查询中存储 BigDecimal 类型 -// genMap.put("queryHasBigDecimal", true); -// } -// if ("between".equalsIgnoreCase(column.getQueryType())) { -// betweens.add(listMap); -// } else { -// // 添加到查询列表中 -// queryColumns.add(listMap); -// } -// } -// // 添加到字段列表中 -// columns.add(listMap); -// } -// // 保存字段列表 -// genMap.put("columns", columns); -// // 保存查询列表 -// genMap.put("queryColumns", queryColumns); -// // 保存字段列表 -// genMap.put("dicts", dicts); -// // 保存查询列表 -// genMap.put("betweens", betweens); -// // 保存非空字段信息 -// genMap.put("isNotNullColumns", isNotNullColumns); -// return genMap; -// } -// -// /** -// * 定义后端文件路径以及名称 -// */ -// private static String getAdminFilePath(String templateName, GenConfig genConfig, String className, String rootPath) { -// String projectPath = rootPath + File.separator + genConfig.getModuleName(); -// String packagePath = projectPath + File.separator + "src" + File.separator + "main" + File.separator + "java" + File.separator; -// if (!ObjectUtils.isEmpty(genConfig.getPack())) { -// packagePath += genConfig.getPack().replace(".", File.separator) + File.separator; -// } -// -// if ("Entity".equals(templateName)) { -// return packagePath + "domain" + File.separator + className + ".java"; -// } -// -// if ("Controller".equals(templateName)) { -// return packagePath + "rest" + File.separator + className + "Controller.java"; -// } -// -// if ("Service".equals(templateName)) { -// return packagePath + "service" + File.separator + className + "Service.java"; -// } -// -// if ("ServiceImpl".equals(templateName)) { -// return packagePath + "service" + File.separator + "impl" + File.separator + className + "ServiceImpl.java"; -// } -// -// if ("Dto".equals(templateName)) { -// return packagePath + "service" + File.separator + "dto" + File.separator + className + "Dto.java"; -// } -// -// if ("QueryCriteria".equals(templateName)) { -// return packagePath + "service" + File.separator + "dto" + File.separator + className + "QueryCriteria.java"; -// } -// -// if ("Mapper".equals(templateName)) { -// return packagePath + "service" + File.separator + "mapstruct" + File.separator + className + "Mapper.java"; -// } -// -// if ("Repository".equals(templateName)) { -// return packagePath + "repository" + File.separator + className + "Repository.java"; -// } -// -// return null; -// } -// -// /** -// * 定义前端文件路径以及名称 -// */ -// private static String getFrontFilePath(String templateName, String apiPath, String path, String apiName) { -// -// if ("api".equals(templateName)) { -// return apiPath + File.separator + apiName + ".js"; -// } -// -// if ("index".equals(templateName)) { -// return path + File.separator + "index.vue"; -// } -// -// return null; -// } -// -// private static void genFile(File file, Template template, Map map) throws IOException { -// // 生成目标文件 -// Writer writer = null; -// try { -// FileUtil.touch(file); -// writer = new FileWriter(file); -// template.render(map, writer); -// } catch (TemplateException | IOException e) { -// throw new RuntimeException(e); -// } finally { -// assert writer != null; -// writer.close(); -// } -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/logging/domain/Log.java b/lms/nladmin-system/src/main/java/org/nl/modules/logging/domain/Log.java deleted file mode 100644 index 4cc7eb0..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/logging/domain/Log.java +++ /dev/null @@ -1,104 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.logging.domain; -// -//import lombok.Getter; -//import lombok.NoArgsConstructor; -//import lombok.Setter; -//import org.hibernate.annotations.CreationTimestamp; -// -//import javax.persistence.*; -//import java.io.Serializable; -//import java.sql.Timestamp; -// -///** -// * @author Zheng Jie -// * @date 2018-11-24 -// */ -//@Entity -//@Getter -//@Setter -//@Table(name = "sys_log") -//@NoArgsConstructor -//public class Log implements Serializable { -// -// @Id -// @Column(name = "log_id") -// @GeneratedValue(strategy = GenerationType.IDENTITY) -// private Long id; -// -// /** -// * 操作用户 -// */ -// private String username; -// -// /** -// * 描述 -// */ -// private String description; -// -// /** -// * 方法名 -// */ -// private String method; -// -// /** -// * 参数 -// */ -// private String params; -// -// /** -// * 日志类型 -// */ -// private String logType; -// -// /** -// * 请求ip -// */ -// private String requestIp; -// -// /** -// * 地址 -// */ -// private String address; -// -// /** -// * 浏览器 -// */ -// private String browser; -// -// /** -// * 请求耗时 -// */ -// private Long time; -// -// /** -// * 异常详细 -// */ -// private byte[] exceptionDetail; -// -// /** -// * 创建日期 -// */ -// @CreationTimestamp -// private Timestamp createTime; -// -// public Log(String logType, Long time) { -// this.logType = logType; -// this.time = time; -// } -// -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/logging/repository/LogRepository.java b/lms/nladmin-system/src/main/java/org/nl/modules/logging/repository/LogRepository.java deleted file mode 100644 index 7e2c9c8..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/logging/repository/LogRepository.java +++ /dev/null @@ -1,40 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.logging.repository; -// -//import org.nl.modules.logging.domain.Log; -//import org.springframework.data.jpa.repository.JpaRepository; -//import org.springframework.data.jpa.repository.JpaSpecificationExecutor; -//import org.springframework.data.jpa.repository.Modifying; -//import org.springframework.data.jpa.repository.Query; -//import org.springframework.stereotype.Repository; -// -///** -// * @author Zheng Jie -// * @date 2018-11-24 -// */ -//@Repository -//public interface LogRepository extends JpaRepository, JpaSpecificationExecutor { -// -// /** -// * 根据日志类型删除信息 -// * -// * @param logType 日志类型 -// */ -// @Modifying -// @Query(value = "delete from sys_log where log_type = ?1", nativeQuery = true) -// void deleteByLogType(String logType); -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/logging/rest/LogController.java b/lms/nladmin-system/src/main/java/org/nl/modules/logging/rest/LogController.java deleted file mode 100644 index 42fc567..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/logging/rest/LogController.java +++ /dev/null @@ -1,89 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.logging.rest; -// -// -//import lombok.RequiredArgsConstructor; -//import org.nl.common.utils.SecurityUtils; -//import org.nl.modules.logging.annotation.Log; -//import org.nl.modules.logging.service.LogService; -//import org.nl.modules.logging.service.dto.LogQueryCriteria; -//import org.springframework.data.domain.Pageable; -//import org.springframework.http.HttpStatus; -//import org.springframework.http.ResponseEntity; -//import org.springframework.web.bind.annotation.*; -// -///** -// * @author Zheng Jie -// * @date 2018-11-24 -// */ -//@RestController -//@RequiredArgsConstructor -//@RequestMapping("/api/logs") -// -//public class LogController { -// -// private final LogService logService; -// -// @GetMapping -// -// //@SaCheckPermission("@el.check()") -// public ResponseEntity query(LogQueryCriteria criteria, Pageable pageable) { -// criteria.setLogType("INFO"); -// return new ResponseEntity<>(logService.queryAll(criteria, pageable), HttpStatus.OK); -// } -// -// @GetMapping(value = "/user") -// // -// public ResponseEntity queryUserLog(LogQueryCriteria criteria, Pageable pageable) { -// criteria.setLogType("INFO"); -// criteria.setBlurry(SecurityUtils.getCurrentUsername()); -// return new ResponseEntity<>(logService.queryAllByUser(criteria, pageable), HttpStatus.OK); -// } -// -// @GetMapping(value = "/error") -// -// // @SaCheckPermission("@el.check()") -// public ResponseEntity queryErrorLog(LogQueryCriteria criteria, Pageable pageable) { -// criteria.setLogType("ERROR"); -// return new ResponseEntity<>(logService.queryAll(criteria, pageable), HttpStatus.OK); -// } -// -// @GetMapping(value = "/error/{id}") -// -// // @SaCheckPermission("@el.check()") -// public ResponseEntity queryErrorLogs(@PathVariable Long id) { -// return new ResponseEntity<>(logService.findByErrDetail(id), HttpStatus.OK); -// } -// -// @DeleteMapping(value = "/del/error") -// @Log("删除所有ERROR日志") -// -// // @SaCheckPermission("@el.check()") -// public ResponseEntity delAllErrorLog() { -// logService.delAllByError(); -// return new ResponseEntity<>(HttpStatus.OK); -// } -// -// @DeleteMapping(value = "/del/info") -// @Log("删除所有INFO日志") -// -// // @SaCheckPermission("@el.check()") -// public ResponseEntity delAllInfoLog() { -// logService.delAllByInfo(); -// return new ResponseEntity<>(HttpStatus.OK); -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/logging/service/LogService.java b/lms/nladmin-system/src/main/java/org/nl/modules/logging/service/LogService.java deleted file mode 100644 index 84c81bb..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/logging/service/LogService.java +++ /dev/null @@ -1,87 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.logging.service; -// -//import org.aspectj.lang.ProceedingJoinPoint; -//import org.nl.modules.logging.domain.Log; -//import org.nl.modules.logging.service.dto.LogQueryCriteria; -//import org.springframework.data.domain.Pageable; -//import org.springframework.scheduling.annotation.Async; -// -//import java.util.List; -// -///** -// * @author Zheng Jie -// * @date 2018-11-24 -// */ -//public interface LogService { -// -// /** -// * 分页查询 -// * -// * @param criteria 查询条件 -// * @param pageable 分页参数 -// * @return / -// */ -// Object queryAll(LogQueryCriteria criteria, Pageable pageable); -// -// /** -// * 查询全部数据 -// * -// * @param criteria 查询条件 -// * @return / -// */ -// List queryAll(LogQueryCriteria criteria); -// -// /** -// * 查询用户日志 -// * -// * @param criteria 查询条件 -// * @param pageable 分页参数 -// * @return - -// */ -// Object queryAllByUser(LogQueryCriteria criteria, Pageable pageable); -// -// /** -// * 保存日志数据 -// * -// * @param username 用户 -// * @param browser 浏览器 -// * @param ip 请求IP -// * @param joinPoint / -// * @param log 日志实体 -// */ -// @Async -// void save(String username, String browser, String ip, ProceedingJoinPoint joinPoint, Log log); -// -// /** -// * 查询异常详情 -// * -// * @param id 日志ID -// * @return Object -// */ -// Object findByErrDetail(Long id); -// -// /** -// * 删除所有错误日志 -// */ -// void delAllByError(); -// -// /** -// * 删除所有INFO日志 -// */ -// void delAllByInfo(); -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/logging/service/impl/LogServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/modules/logging/service/impl/LogServiceImpl.java deleted file mode 100644 index 5cf139e..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/logging/service/impl/LogServiceImpl.java +++ /dev/null @@ -1,161 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.logging.service.impl; -// -//import cn.hutool.core.date.DateUtil; -//import cn.hutool.core.lang.Dict; -//import cn.hutool.core.util.ObjectUtil; -//import cn.hutool.core.util.StrUtil; -//import cn.hutool.json.JSONUtil; -//import lombok.RequiredArgsConstructor; -//import lombok.extern.slf4j.Slf4j; -//import org.aspectj.lang.ProceedingJoinPoint; -//import org.aspectj.lang.reflect.MethodSignature; -//import org.nl.modules.common.utils.PageUtil; -//import org.nl.modules.common.utils.QueryHelp; -//import org.nl.modules.common.utils.StringUtils; -//import org.nl.modules.common.utils.ValidationUtil; -//import org.nl.modules.logging.domain.Log; -//import org.nl.modules.logging.repository.LogRepository; -//import org.nl.modules.logging.service.LogService; -//import org.nl.modules.logging.service.dto.LogQueryCriteria; -//import org.nl.modules.logging.service.mapstruct.LogErrorMapper; -//import org.nl.modules.logging.service.mapstruct.LogSmallMapper; -//import org.springframework.data.domain.Page; -//import org.springframework.data.domain.Pageable; -//import org.springframework.stereotype.Service; -//import org.springframework.transaction.annotation.Transactional; -//import org.springframework.web.bind.annotation.RequestBody; -//import org.springframework.web.bind.annotation.RequestParam; -// -//import java.lang.reflect.Method; -//import java.lang.reflect.Parameter; -//import java.sql.Timestamp; -//import java.util.ArrayList; -//import java.util.HashMap; -//import java.util.List; -//import java.util.Map; -// -///** -// * @author Zheng Jie -// * @date 2018-11-24 -// */ -//@Service -//@RequiredArgsConstructor -//@Slf4j -//public class LogServiceImpl implements LogService { -// private final LogRepository logRepository; -// private final LogErrorMapper logErrorMapper; -// private final LogSmallMapper logSmallMapper; -// -// @Override -// public Object queryAll(LogQueryCriteria criteria, Pageable pageable) { -// Page page = logRepository.findAll(((root, criteriaQuery, cb) -> QueryHelp.getPredicate(root, criteria, cb)), pageable); -// String status = "ERROR"; -// if (status.equals(criteria.getLogType())) { -// return PageUtil.toPage(page.map(logErrorMapper::toDto)); -// } -// return page; -// } -// -// @Override -// public List queryAll(LogQueryCriteria criteria) { -// return logRepository.findAll(((root, criteriaQuery, cb) -> QueryHelp.getPredicate(root, criteria, cb))); -// } -// -// @Override -// public Object queryAllByUser(LogQueryCriteria criteria, Pageable pageable) { -// Page page = logRepository.findAll(((root, criteriaQuery, cb) -> QueryHelp.getPredicate(root, criteria, cb)), pageable); -// return PageUtil.toPage(page.map(logSmallMapper::toDto)); -// } -// -// @Override -// @Transactional(rollbackFor = Exception.class) -// public void save(String username, String browser, String ip, ProceedingJoinPoint joinPoint, Log logDto) { -// -// MethodSignature signature = (MethodSignature) joinPoint.getSignature(); -// Method method = signature.getMethod(); -// org.nl.modules.logging.annotation.Log aopLog = method.getAnnotation(org.nl.modules.logging.annotation.Log.class); -// -// // 方法路径 -// String methodName = joinPoint.getTarget().getClass().getName() + "." + signature.getName() + "()"; -// -// // 描述 -// if (logDto != null) { -// logDto.setDescription(aopLog.value()); -// } -// assert logDto != null; -// logDto.setRequestIp(ip); -// -// logDto.setAddress(StringUtils.getCityInfo(logDto.getRequestIp())); -// logDto.setMethod(methodName); -// logDto.setUsername(username); -// logDto.setParams(getParameter(method, joinPoint.getArgs())); -// logDto.setBrowser(browser); -// logDto.setCreateTime(Timestamp.valueOf(DateUtil.now())); -// logRepository.save(logDto); -// } -// -// /** -// * 根据方法和传入的参数获取请求参数 -// */ -// private String getParameter(Method method, Object[] args) { -// List argList = new ArrayList<>(); -// Parameter[] parameters = method.getParameters(); -// for (int i = 0; i < parameters.length; i++) { -// //将RequestBody注解修饰的参数作为请求参数 -// RequestBody requestBody = parameters[i].getAnnotation(RequestBody.class); -// if (requestBody != null) { -// argList.add(args[i]); -// } -// //将RequestParam注解修饰的参数作为请求参数 -// RequestParam requestParam = parameters[i].getAnnotation(RequestParam.class); -// if (requestParam != null) { -// Map map = new HashMap<>(); -// String key = parameters[i].getName(); -// if (!StrUtil.isEmpty(requestParam.value())) { -// key = requestParam.value(); -// } -// map.put(key, args[i]); -// argList.add(map); -// } -// } -// if (argList.size() == 0) { -// return ""; -// } -// return argList.size() == 1 ? JSONUtil.toJsonStr(argList.get(0)) : JSONUtil.toJsonStr(argList); -// } -// -// @Override -// public Object findByErrDetail(Long id) { -// Log log = logRepository.findById(id).orElseGet(Log::new); -// ValidationUtil.isNull(log.getId(), "Log", "id", id); -// byte[] details = log.getExceptionDetail(); -// return Dict.create().set("exception", new String(ObjectUtil.isNotNull(details) ? details : "".getBytes())); -// } -// -// @Override -// @Transactional(rollbackFor = Exception.class) -// public void delAllByError() { -// logRepository.deleteByLogType("ERROR"); -// } -// -// @Override -// @Transactional(rollbackFor = Exception.class) -// public void delAllByInfo() { -// logRepository.deleteByLogType("INFO"); -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/rest/StageController.java b/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/rest/StageController.java deleted file mode 100644 index cfdc00a..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/rest/StageController.java +++ /dev/null @@ -1,88 +0,0 @@ -//package org.nl.modules.logicflow.rest; -// -// -//import lombok.RequiredArgsConstructor; -//import lombok.extern.slf4j.Slf4j; -//import org.nl.modules.logging.annotation.Log; -//import org.nl.modules.logicflow.service.StageService; -//import org.nl.modules.logicflow.service.dto.StageDto; -//import org.springframework.data.domain.Pageable; -//import org.springframework.http.HttpStatus; -//import org.springframework.http.ResponseEntity; -//import org.springframework.validation.annotation.Validated; -//import org.springframework.web.bind.annotation.*; -// -//import java.util.Map; -// -///** -// * @Author: lyd -// * @Description: 舞台管理 -// * @Date: 2022-07-29 10:49 -// */ -//@RestController -//@RequiredArgsConstructor -// -//@RequestMapping("/api/stage") -//@Slf4j -//public class StageController { -// private final StageService stageService; -// -// @GetMapping -// @Log("查询舞台") -// -// //@SaCheckPermission("stage:list") -// public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { -// return new ResponseEntity<>(stageService.queryAll(whereJson, page), HttpStatus.OK); -// } -// -// @PostMapping -// @Log("新增舞台") -// -// //@SaCheckPermission("stage:add") -// public ResponseEntity create(@Validated @RequestBody StageDto dto) { -// stageService.create(dto); -// return new ResponseEntity<>(HttpStatus.CREATED); -// } -// -// @PutMapping -// @Log("修改舞台") -// -// //@SaCheckPermission("stage:edit") -// public ResponseEntity update(@Validated @RequestBody StageDto dto) { -// stageService.update(dto); -// return new ResponseEntity<>(HttpStatus.NO_CONTENT); -// } -// -// @Log("删除舞台") -// -// //@SaCheckPermission("stage:del") -// @DeleteMapping -// public ResponseEntity delete(@RequestBody String[] ids) { -// stageService.deleteAll(ids); -// return new ResponseEntity<>(HttpStatus.OK); -// } -// -// @GetMapping("/selectList") -// @Log("下拉选舞台") -// -// //@SaCheckPermission("routePlan:list") -// public ResponseEntity selectList() { -// return new ResponseEntity<>(stageService.selectList(), HttpStatus.OK); -// } -// -// @PostMapping("/addNewStage") -// @Log("保存舞台数据") -// -// public ResponseEntity addNewStage(@Validated @RequestBody StageDto dto) { -// log.info("dto{}", dto); -// stageService.addNewStage(dto); -// return new ResponseEntity<>(HttpStatus.CREATED); -// } -// -// @PostMapping("/getNewStageDataByCode") -// @Log("根据stage_code获取舞台数据") -// -// public ResponseEntity getNewStageDataByCode(@RequestBody String code) { -// return new ResponseEntity<>(stageService.findByCode(code), HttpStatus.CREATED); -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/rest/StageImageController.java b/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/rest/StageImageController.java deleted file mode 100644 index 210efa0..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/rest/StageImageController.java +++ /dev/null @@ -1,72 +0,0 @@ -//package org.nl.modules.logicflow.rest; -// -// -//import lombok.RequiredArgsConstructor; -//import lombok.extern.slf4j.Slf4j; -//import org.nl.modules.logging.annotation.Log; -//import org.nl.modules.logicflow.service.StageImageService; -//import org.nl.modules.logicflow.service.dto.StageImageDto; -//import org.springframework.data.domain.Pageable; -//import org.springframework.http.HttpStatus; -//import org.springframework.http.ResponseEntity; -//import org.springframework.validation.annotation.Validated; -//import org.springframework.web.bind.annotation.*; -// -//import java.util.Map; -// -///** -// * @Author: lyd -// * @Description: 舞台图标控制层 -// * @Date: 2022-07-29 -// */ -//@RestController -//@RequiredArgsConstructor -// -//@RequestMapping("/api/stageImage") -//@Slf4j -//public class StageImageController { -// private final StageImageService stageImageService; -// -// @GetMapping -// @Log("查询舞台") -// -// //@SaCheckPermission("stageImage:list") -// public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { -// return new ResponseEntity<>(stageImageService.queryAll(whereJson, page), HttpStatus.OK); -// } -// -// @PostMapping -// @Log("新增舞台") -// -// //@SaCheckPermission("stageImage:add") -// public ResponseEntity create(@Validated @RequestBody StageImageDto dto) { -// stageImageService.create(dto); -// return new ResponseEntity<>(HttpStatus.CREATED); -// } -// -// @PutMapping -// @Log("修改舞台") -// -// //@SaCheckPermission("stageImage:edit") -// public ResponseEntity update(@Validated @RequestBody StageImageDto dto) { -// stageImageService.update(dto); -// return new ResponseEntity<>(HttpStatus.NO_CONTENT); -// } -// -// @Log("删除舞台") -// -// //@SaCheckPermission("stageImage:del") -// @DeleteMapping -// public ResponseEntity delete(@RequestBody String[] ids) { -// stageImageService.deleteAll(ids); -// return new ResponseEntity<>(HttpStatus.OK); -// } -// -// @GetMapping("/selectList") -// @Log("下拉选设备图标") -// -// //@SaCheckPermission("routePlan:list") -// public ResponseEntity selectList() { -// return new ResponseEntity<>(stageImageService.selectList(), HttpStatus.OK); -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/StageImageService.java b/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/StageImageService.java deleted file mode 100644 index 6d72ad5..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/StageImageService.java +++ /dev/null @@ -1,59 +0,0 @@ -//package org.nl.modules.logicflow.service; -// -//import com.alibaba.fastjson.JSONArray; -//import org.nl.modules.logicflow.service.dto.StageImageDto; -//import org.springframework.data.domain.Pageable; -// -//import java.util.Map; -// -///** -// * @Author: lyd -// * @Description: 舞台图标的服务层 -// * @Date: 2022-07-29 -// */ -//public interface StageImageService { -// /** -// * 查询数据分页 -// * -// * @param whereJson 条件 -// * @param page 分页参数 -// * @return Map -// */ -// Map queryAll(Map whereJson, Pageable page); -// -// /** -// * 创建 -// * -// * @param dto / -// */ -// void create(StageImageDto dto); -// -// /** -// * 编辑 -// * -// * @param dto / -// */ -// void update(StageImageDto dto); -// -// /** -// * 根据ID查询 -// * -// * @param image_uuid ID -// * @return StageImage -// */ -// StageImageDto findById(String image_uuid); -// -// /** -// * 多选删除 -// * -// * @param ids / -// */ -// void deleteAll(String[] ids); -// -// /** -// * 前端舞台编辑选择设备图标下拉选列表 -// * -// * @return -// */ -// JSONArray selectList(); -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/StageService.java b/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/StageService.java deleted file mode 100644 index 06f1f6a..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/StageService.java +++ /dev/null @@ -1,75 +0,0 @@ -//package org.nl.modules.logicflow.service; -// -//import com.alibaba.fastjson.JSONArray; -//import org.nl.modules.logicflow.service.dto.StageDto; -//import org.springframework.data.domain.Pageable; -// -//import java.util.Map; -// -///** -// * @Author: lyd -// * @Description: -// * @Date: 2022-07-29 10:50 -// */ -//public interface StageService { -// /** -// * 查询数据分页 -// * -// * @param whereJson 条件 -// * @param page 分页参数 -// * @return Map -// */ -// Map queryAll(Map whereJson, Pageable page); -// -// /** -// * 创建 -// * -// * @param dto / -// */ -// void create(StageDto dto); -// -// /** -// * 编辑 -// * -// * @param dto / -// */ -// void update(StageDto dto); -// -// /** -// * 根据ID查询 -// * -// * @param stage_uuid ID -// * @return Stage -// */ -// StageDto findById(String stage_uuid); -// -// /** -// * 多选删除 -// * -// * @param ids / -// */ -// void deleteAll(String[] ids); -// -// /** -// * 前端舞台下拉选列表 -// * -// * @return -// */ -// JSONArray selectList(); -// -// /** -// * 新增舞台信息 -// * 将数据保存到remark---保存数据 -// * -// * @param dto -// */ -// void addNewStage(StageDto dto); -// -// /** -// * 根据编码查询 -// * -// * @param code code -// * @return Stage -// */ -// StageDto findByCode(String code); -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/dto/StageDto.java b/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/dto/StageDto.java deleted file mode 100644 index 8e1d72b..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/dto/StageDto.java +++ /dev/null @@ -1,63 +0,0 @@ -//package org.nl.modules.logicflow.service.dto; -// -//import lombok.Data; -// -//import java.io.Serializable; -// -///** -// * @Author: lyd -// * @Description: 舞台数据的Dto -// * @Date: 2022-07-29 13:28 -// */ -//@Data -//public class StageDto implements Serializable { -// /** -// * 舞台标识 -// */ -// private String stage_uuid; -// -// /** -// * 舞台编码 -// */ -// private String stage_code; -// -// /** -// * 舞台名字 -// */ -// private String stage_name; -// -// /** -// * 舞台数据 -// */ -// private String stage_data; -// -// /** -// * 是否启用 -// */ -// private String is_active; -// -// /** -// * 是否删除 -// */ -// private String is_delete; -// -// /** -// * 创建者 -// */ -// private String create_by; -// -// /** -// * 创建时间 -// */ -// private String create_time; -// -// /** -// * 修改者 -// */ -// private String update_by; -// -// /** -// * 修改时间 -// */ -// private String update_time; -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/dto/StageImageDto.java b/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/dto/StageImageDto.java deleted file mode 100644 index c43309d..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/dto/StageImageDto.java +++ /dev/null @@ -1,68 +0,0 @@ -//package org.nl.modules.logicflow.service.dto; -// -//import lombok.Data; -// -//import java.io.Serializable; -// -///** -// * @Author: lyd -// * @Description: 设备图标dto -// * @Date: 2022-07-29 -// */ -//@Data -//public class StageImageDto implements Serializable { -// /** -// * 设备标识 -// */ -// private String image_uuid; -// -// /** -// * 设备名字 -// */ -// private String image_name; -// -// /** -// * 适用驱动 -// */ -// private String driver_code_json; -// -// /** -// * 备注 -// */ -// private String remark; -// -// /** -// * 是否启用 -// */ -// private String is_active; -// -// /** -// * 是否删除 -// */ -// private String is_delete; -// -// /** -// * 创建者 -// */ -// private String create_by; -// -// /** -// * 创建时间 -// */ -// private String create_time; -// -// /** -// * 修改者 -// */ -// private String update_by; -// -// /** -// * 修改时间 -// */ -// private String update_time; -// -// /** -// * 图标编码 -// */ -// private String image_code; -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/impl/StageImageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/impl/StageImageServiceImpl.java deleted file mode 100644 index 52b1e59..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/impl/StageImageServiceImpl.java +++ /dev/null @@ -1,112 +0,0 @@ -//package org.nl.modules.logicflow.service.impl; -// -//import cn.hutool.core.date.DateUtil; -//import cn.hutool.core.util.IdUtil; -//import com.alibaba.fastjson.JSONArray; -//import com.alibaba.fastjson.JSONObject; -//import lombok.RequiredArgsConstructor; -//import lombok.extern.slf4j.Slf4j; -//import org.nl.common.utils.SecurityUtils; -//import org.nl.modules.common.exception.BadRequestException; -//import org.nl.modules.logicflow.service.StageImageService; -//import org.nl.modules.logicflow.service.dto.StageImageDto; -//import org.nl.modules.wql.core.bean.ResultBean; -//import org.nl.modules.wql.core.bean.WQLObject; -//import org.nl.modules.wql.util.WqlUtil; -//import org.springframework.data.domain.Pageable; -//import org.springframework.stereotype.Service; -//import org.springframework.transaction.annotation.Transactional; -// -//import java.util.Map; -// -///** -// * @Author: lyd -// * @Description: 舞台图标的服务实现 -// * @Date: 2022-07-29 -// */ -//@Service -//@RequiredArgsConstructor -//@Slf4j -//public class StageImageServiceImpl implements StageImageService { -// @Override -// public Map queryAll(Map whereJson, Pageable page) { -// String where = "1=1"; -// if (whereJson.get("device_type") != null) { -// where = "driver_code_json like ('%" + whereJson.get("device_type") + "%')"; -// } -// WQLObject wo = WQLObject.getWQLObject("stage_image"); -// ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), where, "update_time desc"); -// final JSONObject json = rb.pageResult(); -// return json; -// } -// -// @Override -// @Transactional(rollbackFor = Exception.class) -// public void create(StageImageDto dto) { -// String currentUsername = SecurityUtils.getCurrentUsername(); -// String now = DateUtil.now(); -// -// dto.setImage_uuid(IdUtil.simpleUUID()); -// dto.setCreate_by(currentUsername); -// dto.setUpdate_by(currentUsername); -// dto.setUpdate_time(now); -// dto.setCreate_time(now); -// -// WQLObject wo = WQLObject.getWQLObject("stage_image"); -// JSONObject json = (JSONObject) JSONObject.toJSON(dto); -// -// wo.insert(json); -// } -// -// @Override -// @Transactional(rollbackFor = Exception.class) -// public void update(StageImageDto dto) { -// StageImageDto entity = this.findById(dto.getImage_uuid()); -// if (entity == null) { -// throw new BadRequestException("被删除或无权限,操作失败!"); -// } -// -// String currentUsername = SecurityUtils.getCurrentUsername(); -// String now = DateUtil.now(); -// dto.setUpdate_time(now); -// dto.setUpdate_by(currentUsername); -// -// WQLObject wo = WQLObject.getWQLObject("stage_image"); -// JSONObject json = (JSONObject) JSONObject.toJSON(dto); -// -// wo.update(json); -// } -// -// @Override -// public StageImageDto findById(String image_uuid) { -// WQLObject wo = WQLObject.getWQLObject("stage_image"); -// JSONObject json = wo.query("image_uuid ='" + image_uuid + "'").uniqueResult(0); -// final StageImageDto obj = json.toJavaObject(StageImageDto.class); -// return obj; -// } -// -// @Override -// @Transactional(rollbackFor = Exception.class) -// public void deleteAll(String[] ids) { -// WQLObject wo = WQLObject.getWQLObject("stage_image"); -// for (String image_uuid : ids) { -// wo.delete("image_uuid = '" + image_uuid + "'"); -// } -// } -// -// @Override -// public JSONArray selectList() { -// //设备基础信息表【acs_stage_image】 -// JSONArray arr = WQLObject.getWQLObject("stage_image").query("is_delete= '0' AND is_active= '1'", "update_time desc").getResultJSONArray(0); -// JSONArray result = new JSONArray(); -// for (int i = 0; i < arr.size(); i++) { -// JSONObject obj = arr.getJSONObject(i); -// JSONObject json = new JSONObject(); -// json.put("image_uuid", obj.getString("image_uuid")); -// json.put("image_code", obj.getString("image_code")); -// json.put("image_name", obj.getString("image_code").toString().split("-")[0]); -// result.add(json); -// } -// return result; -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/impl/StageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/impl/StageServiceImpl.java deleted file mode 100644 index c6dcd96..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/logicflow/service/impl/StageServiceImpl.java +++ /dev/null @@ -1,134 +0,0 @@ -//package org.nl.modules.logicflow.service.impl; -// -//import cn.hutool.core.date.DateUtil; -//import cn.hutool.core.util.IdUtil; -//import com.alibaba.fastjson.JSONArray; -//import com.alibaba.fastjson.JSONObject; -//import lombok.RequiredArgsConstructor; -//import lombok.extern.slf4j.Slf4j; -//import org.nl.common.utils.SecurityUtils; -//import org.nl.modules.common.exception.BadRequestException; -//import org.nl.modules.logicflow.service.StageService; -//import org.nl.modules.logicflow.service.dto.StageDto; -//import org.nl.modules.wql.core.bean.ResultBean; -//import org.nl.modules.wql.core.bean.WQLObject; -//import org.nl.modules.wql.util.WqlUtil; -//import org.springframework.data.domain.Pageable; -//import org.springframework.stereotype.Service; -//import org.springframework.transaction.annotation.Transactional; -// -//import java.util.Map; -// -///** -// * @Author: lyd -// * @Description: -// * @Date: 2022-07-29 10:51 -// */ -//@Service -//@RequiredArgsConstructor -//@Slf4j -//public class StageServiceImpl implements StageService { -// @Override -// public Map queryAll(Map whereJson, Pageable page) { -// log.info("分页查找"); -// WQLObject wo = WQLObject.getWQLObject("stage"); -// ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), "", "update_time desc"); -// final JSONObject json = rb.pageResult(); -// return json; -// } -// -// @Override -// @Transactional(rollbackFor = Exception.class) -// public void create(StageDto dto) { -// String currentUsername = SecurityUtils.getCurrentUsername(); -// String now = DateUtil.now(); -// -// dto.setStage_uuid(IdUtil.simpleUUID()); -// dto.setCreate_by(currentUsername); -// dto.setUpdate_by(currentUsername); -// dto.setUpdate_time(now); -// dto.setCreate_time(now); -// -// WQLObject wo = WQLObject.getWQLObject("stage"); -// JSONObject json = (JSONObject) JSONObject.toJSON(dto); -// -// wo.insert(json); -// } -// -// @Override -// @Transactional(rollbackFor = Exception.class) -// public void update(StageDto dto) { -// StageDto entity = this.findById(dto.getStage_uuid()); -// if (entity == null) { -// throw new BadRequestException("被删除或无权限,操作失败!"); -// } -// -// String currentUsername = SecurityUtils.getCurrentUsername(); -// String now = DateUtil.now(); -// dto.setUpdate_time(now); -// dto.setUpdate_by(currentUsername); -// -// WQLObject wo = WQLObject.getWQLObject("stage"); -// JSONObject json = (JSONObject) JSONObject.toJSON(dto); -// -// wo.update(json); -// } -// -// @Override -// public StageDto findById(String stage_uuid) { -// WQLObject wo = WQLObject.getWQLObject("stage"); -// JSONObject json = wo.query("stage_uuid ='" + stage_uuid + "'").uniqueResult(0); -// final StageDto obj = json.toJavaObject(StageDto.class); -// return obj; -// } -// -// @Override -// @Transactional(rollbackFor = Exception.class) -// public void deleteAll(String[] ids) { -// WQLObject wo = WQLObject.getWQLObject("stage"); -// for (String stage_uuid : ids) { -// wo.delete("stage_uuid = '" + stage_uuid + "'"); -// } -// } -// -// @Override -// public JSONArray selectList() { -// //设备基础信息表【stage】 -// JSONArray arr = WQLObject.getWQLObject("stage").query("is_delete= '0' AND is_active= '1'").getResultJSONArray(0); -// JSONArray result = new JSONArray(); -// for (int i = 0; i < arr.size(); i++) { -// JSONObject obj = arr.getJSONObject(i); -// JSONObject json = new JSONObject(); -// json.put("stage_id", obj.getString("stage_id")); -// json.put("stage_code", obj.getString("stage_code")); -// json.put("stage_name", obj.getString("stage_name")); -// result.add(json); -// } -// return result; -// } -// -// @Override -// public void addNewStage(StageDto dto) { -// // 根据dto的code找到数据 -// StageDto stageDto = this.findByCode(dto.getStage_code()); -// // 设置内容 -// stageDto.setStage_data(dto.getStage_data()); -// // 获取当前用户与时间 -// String currentUsername = SecurityUtils.getCurrentUsername(); -// String now = DateUtil.now(); -// stageDto.setUpdate_time(now); -// stageDto.setUpdate_by(currentUsername); -// System.out.println(stageDto); -// WQLObject wo = WQLObject.getWQLObject("stage"); -// JSONObject json = (JSONObject) JSONObject.toJSON(stageDto); -// wo.update(json); -// } -// -// @Override -// public StageDto findByCode(String code) { -// WQLObject wo = WQLObject.getWQLObject("stage"); -// JSONObject json = wo.query("stage_code ='" + code + "'").uniqueResult(0); -// final StageDto obj = json.toJavaObject(StageDto.class); -// return obj; -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/security/rest/MobileAuthorizationController.java b/lms/nladmin-system/src/main/java/org/nl/modules/security/rest/MobileAuthorizationController.java deleted file mode 100644 index c30e91b..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/security/rest/MobileAuthorizationController.java +++ /dev/null @@ -1,90 +0,0 @@ -//package org.nl.modules.security.rest; -// -//import cn.dev33.satoken.annotation.SaIgnore; -//import cn.dev33.satoken.secure.SaSecureUtil; -//import cn.dev33.satoken.stp.SaLoginModel; -//import cn.dev33.satoken.stp.StpUtil; -//import com.alibaba.fastjson.JSON; -//import com.alibaba.fastjson.JSONObject; -//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -//import lombok.RequiredArgsConstructor; -//import lombok.extern.slf4j.Slf4j; -//import org.nl.common.utils.dto.CurrentUser; -//import org.nl.modules.common.config.RsaProperties; -//import org.nl.modules.common.exception.BadRequestException; -//import org.nl.modules.common.utils.RedisUtils; -//import org.nl.modules.common.utils.RsaUtils; -//import org.nl.system.service.role.ISysRoleService; -//import org.nl.system.service.secutiry.dto.AuthUserDto; -//import org.nl.system.service.user.ISysUserService; -//import org.nl.system.service.user.dao.SysUser; -//import org.springframework.http.ResponseEntity; -//import org.springframework.validation.annotation.Validated; -//import org.springframework.web.bind.annotation.PostMapping; -//import org.springframework.web.bind.annotation.RequestBody; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.RestController; -// -//import javax.servlet.http.HttpServletRequest; -//import java.util.HashMap; -//import java.util.List; -//import java.util.Map; -// -///** -// * @author: lyd -// * @description: 手持登录鉴权 -// * @Date: 2022/10/10 -// */ -//@Slf4j -//@RestController -//@RequestMapping("/mobile/auth") -//@RequiredArgsConstructor -// -//public class MobileAuthorizationController { -// private final RedisUtils redisUtils; -// private final ISysUserService userService; -// private final ISysRoleService roleService; -// -// -// @PostMapping(value = "/login") -// @SaIgnore -// public ResponseEntity login(@Validated @RequestBody AuthUserDto authUser, HttpServletRequest request) throws Exception { -// // 密码解密 - 前端的加密规则: encrypt(根据实际更改) -//// String password = authUser.getPassword(); -// String password = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, authUser.getPassword()); -// // 校验数据库 -// // 根据用户名查询,在比对密码 -// SysUser userDto = userService.getOne(new QueryWrapper().eq("username", authUser.getUsername()));// 拿不到已经抛出异常 -// if (userDto == null || !userDto.getPassword().equals(SaSecureUtil.md5BySalt(password, "salt"))) { // 这里需要密码加密 -// throw new BadRequestException("账号或密码错误"); -// } -// // 获取权限列表 - 登录查找权限 -// List permissionList = roleService.getPermissionList(JSONObject.parseObject(JSON.toJSONString(userDto))); -// -// // 登录输入,登出删除 -// CurrentUser user = new CurrentUser(); -// user.setId(userDto.getUser_id()); -// user.setUsername(userDto.getUsername()); -// user.setPresonName(userDto.getPerson_name()); -// user.setUser(userDto); -// user.setPermissions(permissionList); -// -// // SaLoginModel 配置登录相关参数 -// StpUtil.login(userDto.getUser_id(), new SaLoginModel() -// .setDevice("PE") // 此次登录的客户端设备类型, 用于[同端互斥登录]时指定此次登录的设备类型 -// .setExtra("loginInfo", user) // Token挂载的扩展参数 (此方法只有在集成jwt插件时才会生效) -// ); -// -// // 返回 token 与 用户信息 -// JSONObject jsonObject = new JSONObject(); -// jsonObject.put("user", userDto); -// Map authInfo = new HashMap(2) {{ -// put("token", StpUtil.getTokenValue()); -// put("user", jsonObject); -// }}; -// -// redisUtils.set("pe-satoken", StpUtil.getTokenValue(), StpUtil.getTokenTimeout()); -// -// return ResponseEntity.ok(authInfo); -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/CodeDetailController.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/CodeDetailController.java deleted file mode 100644 index 40da2ca..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/CodeDetailController.java +++ /dev/null @@ -1,57 +0,0 @@ -//package org.nl.modules.system.rest; -// -//import cn.dev33.satoken.annotation.SaCheckPermission; -//import com.alibaba.fastjson.JSONObject; -//import lombok.RequiredArgsConstructor; -//import org.nl.modules.logging.annotation.Log; -//import org.nl.modules.system.service.CodeDetailService; -//import org.springframework.data.domain.Pageable; -//import org.springframework.http.HttpStatus; -//import org.springframework.http.ResponseEntity; -//import org.springframework.validation.annotation.Validated; -//import org.springframework.web.bind.annotation.*; -// -//import java.util.Map; -// -//@RestController -// -//@RequiredArgsConstructor -//@RequestMapping("/api/codeDetail") -//public class CodeDetailController { -// -// private final CodeDetailService codeDetailService; -// -// -// @GetMapping -// @SaCheckPermission("genCode:list") -// public ResponseEntity queryAll(@RequestParam Map form, Pageable pageable) { -// return new ResponseEntity<>(codeDetailService.queryAll(form, pageable), HttpStatus.OK); -// } -// -// @Log("新增编码") -// -// @PostMapping -// @SaCheckPermission("genCode:add") -// public ResponseEntity create(@Validated @RequestBody Map form) { -// codeDetailService.create(form); -// return new ResponseEntity<>(HttpStatus.CREATED); -// } -// -// @Log("删除编码") -// -// @DeleteMapping(value = "/{id}") -// @SaCheckPermission("genCode:del") -// public ResponseEntity delete(@PathVariable String id) { -// codeDetailService.delete(id); -// return new ResponseEntity<>(HttpStatus.OK); -// } -// -// @Log("修改字典") -// -// @PutMapping -// @SaCheckPermission("dict:edit") -// public ResponseEntity update(@RequestBody JSONObject json) { -// codeDetailService.update(json); -// return new ResponseEntity<>(HttpStatus.NO_CONTENT); -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/GenCodeController.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/GenCodeController.java deleted file mode 100644 index ef7a52a..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/GenCodeController.java +++ /dev/null @@ -1,67 +0,0 @@ -//package org.nl.modules.system.rest; -// -//import cn.dev33.satoken.annotation.SaCheckPermission; -//import com.alibaba.fastjson.JSONObject; -//import lombok.RequiredArgsConstructor; -//import org.nl.modules.logging.annotation.Log; -//import org.nl.modules.system.service.GenCodeService; -//import org.springframework.data.domain.Pageable; -//import org.springframework.http.HttpStatus; -//import org.springframework.http.ResponseEntity; -//import org.springframework.validation.annotation.Validated; -//import org.springframework.web.bind.annotation.*; -// -//import java.io.IOException; -//import java.util.Map; -//import java.util.Set; -// -//@RestController -// -//@RequiredArgsConstructor -//@RequestMapping("/api/genCode") -//public class GenCodeController { -// private final GenCodeService genCodeService; -// -// -// @GetMapping -// @SaCheckPermission("genCode:list") -// public ResponseEntity queryAll(@RequestParam Map form, Pageable pageable) { -// return new ResponseEntity<>(genCodeService.queryAll(form, pageable), HttpStatus.OK); -// } -// -// @Log("新增编码") -// -// @PostMapping -// @SaCheckPermission("genCode:add") -// public ResponseEntity create(@Validated @RequestBody Map form) { -// genCodeService.create(form); -// -// return new ResponseEntity<>(HttpStatus.CREATED); -// } -// -// @Log("删除编码") -// -// @DeleteMapping -// @SaCheckPermission("genCode:del") -// public ResponseEntity delete(@RequestBody Set ids) { -// genCodeService.delete(ids); -// return new ResponseEntity<>(HttpStatus.OK); -// } -// -// @Log("修改字典") -// -// @PutMapping -// @SaCheckPermission("genCode:edit") -// public ResponseEntity update(@RequestBody JSONObject json) { -// genCodeService.update(json); -// return new ResponseEntity<>(HttpStatus.NO_CONTENT); -// } -// -// -// @GetMapping(value = "/codeDemo") -// @SaCheckPermission("genCode:list") -// public ResponseEntity CodeDemo(@RequestParam Map form) throws IOException { -// return new ResponseEntity<>(genCodeService.codeDemo(form), HttpStatus.OK); -// } -// -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/LimitController.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/LimitController.java deleted file mode 100644 index 753479c..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/LimitController.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2019-2020 Zheng Jie - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.nl.modules.system.rest; - - -import org.nl.modules.common.annotation.Limit; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author / - * 接口限流测试类 - */ -@RestController -@RequestMapping("/api/limit") - -public class LimitController { - - private static final AtomicInteger ATOMIC_INTEGER = new AtomicInteger(); - - /** - * 测试限流注解,下面配置说明该接口 60秒内最多只能访问 10次,保存到redis的键名为 limit_test, - */ - @GetMapping - - @Limit(key = "test", period = 60, count = 10, name = "testLimit", prefix = "limit") - public int test() { - return ATOMIC_INTEGER.incrementAndGet(); - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/MonitorController.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/MonitorController.java deleted file mode 100644 index 0923ece..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/MonitorController.java +++ /dev/null @@ -1,45 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.system.rest; -// -// -//import lombok.RequiredArgsConstructor; -//import org.nl.modules.system.service.MonitorService; -//import org.springframework.http.HttpStatus; -//import org.springframework.http.ResponseEntity; -//import org.springframework.web.bind.annotation.GetMapping; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.RestController; -// -///** -// * @author Zheng Jie -// * @date 2020-05-02 -// */ -//@RestController -//@RequiredArgsConstructor -// -//@RequestMapping("/api/monitor") -//public class MonitorController { -// -// private final MonitorService serverService; -// -// @GetMapping -// -//// @SaCheckPermission("monitor:list") -// public ResponseEntity query() { -// return new ResponseEntity<>(serverService.getServers(), HttpStatus.OK); -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/RedisController.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/RedisController.java deleted file mode 100644 index 4fd49bb..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/RedisController.java +++ /dev/null @@ -1,56 +0,0 @@ -//package org.nl.modules.system.rest; -// -// -//import lombok.RequiredArgsConstructor; -//import lombok.extern.slf4j.Slf4j; -//import org.nl.modules.logging.annotation.Log; -//import org.nl.modules.system.service.RedisService; -//import org.springframework.http.HttpStatus; -//import org.springframework.http.ResponseEntity; -//import org.springframework.web.bind.annotation.*; -// -///** -// * @Author: lyd -// * @Description: Redis监控管理 -// * @Date: 2022-08-04 -// */ -//@RestController -//@RequiredArgsConstructor -// -//@RequestMapping("/api/redis") -//@Slf4j -//public class RedisController { -// -// private final RedisService redisService; -// -// @GetMapping("/get-monitor-info") -// @Log("查询redis的信息") -// -// public ResponseEntity getRedisMonitorInfo() { -// return new ResponseEntity<>(redisService.getRedisMonitorInfo(), HttpStatus.OK); -// } -// -// @GetMapping("/get-key-define-list") -// @Log("获得 Redis Key 模板列表") -// -// public ResponseEntity getKeyDefineList() { -// return new ResponseEntity<>(redisService.getKeyDefineList(), HttpStatus.OK); -// } -// -// @GetMapping("/get-key-value-list") -// @Log("获得 Redis Key Value列表") -// -// public ResponseEntity getKeyValueList() { -// return new ResponseEntity<>(redisService.getKeyValueList(), HttpStatus.OK); -// } -// -// @Log("根据key删除Redis数据") -// -// @DeleteMapping -// public ResponseEntity deleteByKey(@RequestBody String[] ids) { -// redisService.deleteByKey(ids); -// return new ResponseEntity<>(HttpStatus.OK); -// } -// -// -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/CodeDetailService.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/service/CodeDetailService.java deleted file mode 100644 index d9ea439..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/CodeDetailService.java +++ /dev/null @@ -1,23 +0,0 @@ -//package org.nl.modules.system.service; -// -//import com.alibaba.fastjson.JSONObject; -//import org.springframework.data.domain.Pageable; -// -//import java.util.Map; -// -//public interface CodeDetailService { -// /** -// * 分页查询 -// * -// * @param form 条件 -// * @param pageable 分页参数 -// * @return / -// */ -// JSONObject queryAll(Map form, Pageable pageable); -// -// public void create(Map form); -// -// public void delete(String id); -// -// public void update(JSONObject json); -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/DataService.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/service/DataService.java deleted file mode 100644 index 6b30861..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/DataService.java +++ /dev/null @@ -1,37 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.system.service; -// -//import org.nl.system.service.user.dto.UserDto; -// -//import java.util.List; -// -///** -// * 数据权限服务类 -// * -// * @author Zheng Jie -// * @date 2020-05-07 -// */ -//public interface DataService { -// -// /** -// * 获取数据权限 -// * -// * @param user / -// * @return / -// */ -// List getDeptIds(UserDto user); -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/GenCodeService.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/service/GenCodeService.java deleted file mode 100644 index 4dde92a..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/GenCodeService.java +++ /dev/null @@ -1,50 +0,0 @@ -//package org.nl.modules.system.service; -// -//import com.alibaba.fastjson.JSONObject; -//import org.springframework.data.domain.Pageable; -// -//import java.util.Map; -//import java.util.Set; -// -//public interface GenCodeService { -// /** -// * 分页查询 -// * -// * @param form 条件 -// * @param pageable 分页参数 -// * @return / -// */ -// JSONObject queryAll(Map form, Pageable pageable); -// -// /** -// * 新增编码 -// * -// * @param form -// */ -// public void create(Map form); -// -// /** -// * 删除编码 -// * -// * @param ids -// */ -// public void delete(Set ids); -// -// /** -// * 更新编码 -// * -// * @param json -// */ -// public void update(JSONObject json); -// -// public String codeDemo(Map form); -// -// /** -// * 根据编码获取id -// * -// * @param code -// * @return -// */ -// public String queryIdByCode(String code); -// -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/MonitorService.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/service/MonitorService.java deleted file mode 100644 index 8f4f536..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/MonitorService.java +++ /dev/null @@ -1,32 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.system.service; -// -//import java.util.Map; -// -///** -// * @author Zheng Jie -// * @date 2020-05-02 -// */ -//public interface MonitorService { -// -// /** -// * 查询数据分页 -// * -// * @return Map -// */ -// Map getServers(); -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/ParamService.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/service/ParamService.java deleted file mode 100644 index 9690620..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/ParamService.java +++ /dev/null @@ -1,81 +0,0 @@ -//package org.nl.modules.system.service; -// -//import org.nl.modules.system.service.dto.ParamDto; -//import org.springframework.data.domain.Pageable; -// -//import javax.servlet.http.HttpServletResponse; -//import java.io.IOException; -//import java.util.List; -//import java.util.Map; -// -///** -// * @author ldjun -// * @description 服务接口 -// * @date 2021-03-16 -// **/ -//public interface ParamService { -// -// /** -// * 查询数据分页 -// * -// * @param whereJson 条件 -// * @param page 分页参数 -// * @return Map -// */ -// Map queryAll(Map whereJson, Pageable page); -// -// /** -// * 查询所有数据不分页 -// * -// * @param whereJson 条件参数 -// * @return List -// */ -// List queryAll(Map whereJson); -// -// /** -// * 根据ID查询 -// * -// * @param id ID -// * @return Param -// */ -// ParamDto findById(String id); -// -// /** -// * 根据编码查询 -// * -// * @param code code -// * @return Param -// */ -// ParamDto findByCode(String code); -// -// -// /** -// * 创建 -// * -// * @param dto / -// */ -// void create(ParamDto dto); -// -// /** -// * 编辑 -// * -// * @param dto / -// */ -// void update(ParamDto dto); -// -// /** -// * 多选删除 -// * -// * @param ids / -// */ -// void deleteAll(String[] ids); -// -// /** -// * 导出数据 -// * -// * @param dtos 待导出的数据 -// * @param response / -// * @throws IOException / -// */ -// void download(List dtos, HttpServletResponse response) throws IOException; -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/RedisService.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/service/RedisService.java deleted file mode 100644 index 61b10aa..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/RedisService.java +++ /dev/null @@ -1,39 +0,0 @@ -//package org.nl.modules.system.service; -// -//import com.alibaba.fastjson.JSONArray; -//import com.alibaba.fastjson.JSONObject; -// -///** -// * @Author: lyd -// * @Description: Redis监控的服务 -// * @Date: 2022-08-04 -// */ -//public interface RedisService { -// /** -// * 获取redis的信息 -// * -// * @return -// */ -// JSONObject getRedisMonitorInfo(); -// -// /** -// * 获得 Redis Key 模板列表 -// * -// * @return -// */ -// JSONObject getKeyDefineList(); -// -// /** -// * 获取所有的键值信息 -// * -// * @return -// */ -// JSONArray getKeyValueList(); -// -// /** -// * 删除redis缓存数据 -// * -// * @param ids -// */ -// void deleteByKey(String[] ids); -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/convert/RedisConvert.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/service/convert/RedisConvert.java deleted file mode 100644 index d0e739b..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/convert/RedisConvert.java +++ /dev/null @@ -1,36 +0,0 @@ -//package org.nl.modules.system.service.convert; -// -//import cn.hutool.core.util.StrUtil; -//import org.mapstruct.Mapper; -//import org.mapstruct.factory.Mappers; -//import org.nl.modules.system.service.vo.RedisMonitorRespVO; -// -//import java.util.ArrayList; -//import java.util.Properties; -// -///** -// * @Author: lyd -// * @Description: redis---Spring Boot 对象转换 MapStruct -// * @Date: 2022-08-04 -// */ -//@Mapper -//public interface RedisConvert { -// -// RedisConvert INSTANCE = Mappers.getMapper(RedisConvert.class); -// -// default RedisMonitorRespVO build(Properties info, Long dbSize, Properties commandStats) { -// RedisMonitorRespVO respVO = RedisMonitorRespVO.builder().info(info).dbSize(dbSize) -// .commandStats(new ArrayList<>(commandStats.size())).build(); -// commandStats.forEach((key, value) -> { -// respVO.getCommandStats().add(RedisMonitorRespVO.CommandStat.builder() -// .command(StrUtil.subAfter((String) key, "cmdstat_", false)) -// .calls(Integer.valueOf(StrUtil.subBetween((String) value, "calls=", ","))) -// .usec(Long.valueOf(StrUtil.subBetween((String) value, "usec=", ","))) -// .build()); -// }); -// return respVO; -// } -// -//// List convertList(List list); -// -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/dto/ParamDto.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/service/dto/ParamDto.java deleted file mode 100644 index 646dcee..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/dto/ParamDto.java +++ /dev/null @@ -1,40 +0,0 @@ -//package org.nl.modules.system.service.dto; -// -//import lombok.Data; -// -//import java.io.Serializable; -// -///** -// * @author ldjun -// * @description / -// * @date 2021-01-14 -// **/ -//@Data -//public class ParamDto implements Serializable { -// -// private String id; -// -// private String code; -// -// private String name; -// -// private String value; -// -// private String remark; -// -// private String is_active; -// -// private String is_delete; -// -// private String create_id; -// -// private String update_optid; -// -// private String create_name; -// -// private String create_time; -// -// private String update_optname; -// -// private String update_time; -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/entity/RedisKeyDefine.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/service/entity/RedisKeyDefine.java deleted file mode 100644 index 63b69c7..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/entity/RedisKeyDefine.java +++ /dev/null @@ -1,112 +0,0 @@ -//package org.nl.modules.system.service.entity; -// -//import com.fasterxml.jackson.annotation.JsonValue; -//import lombok.AllArgsConstructor; -//import lombok.Data; -//import lombok.Getter; -// -//import java.time.Duration; -// -///** -// * @Author: lyd -// * @Description: Redis Key 定义类 -// * @Date: 2022-08-04 -// */ -//@Data -//public class RedisKeyDefine { -// -// @Getter -// @AllArgsConstructor -// public enum KeyTypeEnum { -// -// STRING("String"), -// LIST("List"), -// HASH("Hash"), -// SET("Set"), -// ZSET("Sorted Set"), -// STREAM("Stream"), -// PUBSUB("Pub/Sub"); -// -// /** -// * 类型 -// */ -// @JsonValue -// private final String type; -// -// } -// -// @Getter -// @AllArgsConstructor -// public enum TimeoutTypeEnum { -// -// FOREVER(1), // 永不超时 -// DYNAMIC(2), // 动态超时 -// FIXED(3); // 固定超时 -// -// /** -// * 类型 -// */ -// @JsonValue -// private final Integer type; -// -// } -// -// /** -// * Key 模板 -// */ -// private final String keyTemplate; -// /** -// * Key 类型的枚举 -// */ -// private final KeyTypeEnum keyType; -// /** -// * Value 类型 -// *

-// * 如果是使用分布式锁,设置为 {@link java.util.concurrent.locks.Lock} 类型 -// */ -// private final Class valueType; -// /** -// * 超时类型 -// */ -// private final TimeoutTypeEnum timeoutType; -// /** -// * 过期时间 -// */ -// private final Duration timeout; -// /** -// * 备注 -// */ -// private final String memo; -// -// private RedisKeyDefine(String memo, String keyTemplate, KeyTypeEnum keyType, Class valueType, -// TimeoutTypeEnum timeoutType, Duration timeout) { -// this.memo = memo; -// this.keyTemplate = keyTemplate; -// this.keyType = keyType; -// this.valueType = valueType; -// this.timeout = timeout; -// this.timeoutType = timeoutType; -// // 添加注册表 -// RedisKeyRegistry.add(this); -// } -// -// public RedisKeyDefine(String memo, String keyTemplate, KeyTypeEnum keyType, Class valueType, Duration timeout) { -// this(memo, keyTemplate, keyType, valueType, TimeoutTypeEnum.FIXED, timeout); -// } -// -// public RedisKeyDefine(String memo, String keyTemplate, KeyTypeEnum keyType, Class valueType, TimeoutTypeEnum timeoutType) { -// this(memo, keyTemplate, keyType, valueType, timeoutType, Duration.ZERO); -// } -// -// /** -// * 格式化 Key -// *

-// * 注意,内部采用 {@link String#format(String, Object...)} 实现 -// * -// * @param args 格式化的参数 -// * @return Key -// */ -// public String formatKey(Object... args) { -// return String.format(keyTemplate, args); -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/entity/RedisKeyRegistry.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/service/entity/RedisKeyRegistry.java deleted file mode 100644 index 6e5d0bc..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/entity/RedisKeyRegistry.java +++ /dev/null @@ -1,28 +0,0 @@ -//package org.nl.modules.system.service.entity; -// -//import java.util.ArrayList; -//import java.util.List; -// -///** -// * @Author: lyd -// * @Description: {@link RedisKeyDefine} 注册表 -// * @Date: 2022-08-04 -// */ -//public class RedisKeyRegistry { -// /** -// * Redis RedisKeyDefine 数组 -// */ -// private static final List defines = new ArrayList<>(); -// -// public static void add(RedisKeyDefine define) { -// defines.add(define); -// } -// -// public static List list() { -// return defines; -// } -// -// public static int size() { -// return defines.size(); -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/impl/CodeDetailServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/service/impl/CodeDetailServiceImpl.java deleted file mode 100644 index f2c32bd..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/impl/CodeDetailServiceImpl.java +++ /dev/null @@ -1,80 +0,0 @@ -//package org.nl.modules.system.service.impl; -// -//import cn.hutool.core.date.DateUtil; -//import cn.hutool.core.util.IdUtil; -//import com.alibaba.fastjson.JSONObject; -//import lombok.RequiredArgsConstructor; -//import org.nl.common.utils.SecurityUtils; -//import org.nl.modules.system.service.CodeDetailService; -//import org.nl.modules.wql.core.bean.ResultBean; -//import org.nl.modules.wql.core.bean.WQLObject; -//import org.nl.modules.wql.util.WqlUtil; -//import org.springframework.cache.annotation.CacheConfig; -//import org.springframework.data.domain.Pageable; -//import org.springframework.stereotype.Service; -// -//import java.util.Date; -//import java.util.Map; -// -//@Service -//@RequiredArgsConstructor -//@CacheConfig(cacheNames = "codeDetail") -//public class CodeDetailServiceImpl implements CodeDetailService { -// @Override -// public JSONObject queryAll(Map form, Pageable pageable) { -// String where = "code_rule_id = '" + form.get("id") + "'"; -// ResultBean rb = WQLObject.getWQLObject("sys_code_rule_detail").pagequery(WqlUtil.getHttpContext(pageable), where, "sort_num desc "); -// final JSONObject json = rb.pageResult(); -// return json; -// } -// -// @Override -// public void create(Map form) { -// JSONObject json = new JSONObject(); -// String id = IdUtil.simpleUUID(); -// String now = DateUtil.now(); -// json.put("id", id); -// json.put("type", form.get("type")); -// json.put("init_value", form.get("init_value")); -// json.put("current_value", form.get("init_value")); -// json.put("max_value", form.get("max_value")); -// json.put("step", form.get("step")); -// json.put("fillchar", form.get("fillchar")); -// json.put("format", form.get("format")); -// json.put("length", form.get("length")); -// json.put("sort_num", form.get("sort_num") + ""); -// json.put("remark", form.get("remark")); -// Map dict = (Map) form.get("dict"); -// json.put("code_rule_id", dict.get("id")); -// json.put("is_active", "1"); -// json.put("is_delete", "0"); -// json.put("create_id", SecurityUtils.getCurrentUserId()); -// json.put("create_name", SecurityUtils.getCurrentNickName()); -// json.put("create_time", now); -// json.put("update_id", SecurityUtils.getCurrentUserId()); -// json.put("update_name", SecurityUtils.getCurrentNickName()); -// json.put("update_time", now); -// if (form.get("type").equals("02")) { -// Date date = DateUtil.date(); -// String format = (String) form.get("format"); -// String now_date = DateUtil.format(date, format); -// json.put("init_value", now_date); -// json.put("current_value", now_date); -// } -// WQLObject.getWQLObject("sys_code_rule_detail").insert(json); -// } -// -// @Override -// public void delete(String id) { -// WQLObject.getWQLObject("sys_code_rule_detail").delete("id = '" + id + "'"); -// } -// -// @Override -// public void update(JSONObject json) { -// String now = DateUtil.now(); -// json.put("update_time", now); -// json.put("update_id", SecurityUtils.getCurrentUserId()); -// json.put("update_name", SecurityUtils.getCurrentNickName()); -// WQLObject.getWQLObject("sys_code_rule_detail").update(json); -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/impl/GenCodeServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/service/impl/GenCodeServiceImpl.java deleted file mode 100644 index 17a82a6..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/impl/GenCodeServiceImpl.java +++ /dev/null @@ -1,184 +0,0 @@ -//package org.nl.modules.system.service.impl; -// -//import cn.hutool.core.date.DateUtil; -//import cn.hutool.core.util.IdUtil; -//import cn.hutool.core.util.StrUtil; -//import com.alibaba.fastjson.JSONArray; -//import com.alibaba.fastjson.JSONObject; -//import lombok.RequiredArgsConstructor; -//import org.nl.common.utils.SecurityUtils; -//import org.nl.modules.common.exception.BadRequestException; -//import org.nl.modules.system.service.GenCodeService; -//import org.nl.modules.wql.core.bean.ResultBean; -//import org.nl.modules.wql.core.bean.WQLObject; -//import org.nl.modules.wql.util.WqlUtil; -//import org.springframework.cache.annotation.CacheConfig; -//import org.springframework.data.domain.Pageable; -//import org.springframework.stereotype.Service; -// -//import javax.transaction.Transactional; -//import java.util.Date; -//import java.util.HashMap; -//import java.util.Map; -//import java.util.Set; -// -//@Service -//@RequiredArgsConstructor -//@CacheConfig(cacheNames = "genCode") -//public class GenCodeServiceImpl implements GenCodeService { -// @Override -// public JSONObject queryAll(Map form, Pageable pageable) { -// String where = "1=1"; -// if (form.get("blurry") != null) { -// where = "code like '%" + (String) form.get("blurry") + "%' OR name = '%" + form.get("blurry") + "%'"; -// } -// ResultBean rb = WQLObject.getWQLObject("sys_code_rule").pagequery(WqlUtil.getHttpContext(pageable), where, "code desc "); -// final JSONObject json = rb.pageResult(); -// JSONArray ja = json.getJSONArray("content"); -// JSONArray new_ja = new JSONArray(); -// for (int i = 0; i < ja.size(); i++) { -// JSONObject jo = ja.getJSONObject(i); -// HashMap map = new HashMap(); -// map.put("code", jo.getString("code")); -// map.put("flag", "0"); -// String demo = this.codeDemo(map); -// jo.put("demo", demo); -// new_ja.add(jo); -// } -// json.put("content", new_ja); -// return json; -// } -// -// @Override -// public void create(Map form) { -// String currentUserId = SecurityUtils.getCurrentUserId(); -// String currentUsername = SecurityUtils.getCurrentUsername(); -// WQLObject wql = WQLObject.getWQLObject("sys_code_rule"); -// JSONObject json = new JSONObject(); -// String id = IdUtil.simpleUUID(); -// String now = DateUtil.now(); -// String code = (String) form.get("code"); -// JSONObject jo = wql.query("code = '" + code + "'").uniqueResult(0); -// if (jo != null) { -// throw new BadRequestException("该编码code已存在,请校验!"); -// } -// json.put("id", id); -// json.put("code", form.get("code")); -// json.put("name", form.get("name")); -// json.put("create_id", currentUserId); -// json.put("update_optid", currentUserId); -// json.put("create_name", currentUsername); -// json.put("update_optname", currentUsername); -// json.put("create_time", now); -// json.put("update_time", now); -// WQLObject.getWQLObject("sys_code_rule").insert(json); -// } -// -// @Override -// public void delete(Set ids) { -// for (String code : ids) { -// WQLObject.getWQLObject("sys_code_rule").delete("id = '" + code + "'"); -// WQLObject.getWQLObject("sys_code_rule_detail").delete("code_rule_id = '" + code + "'"); -// } -// } -// -// @Override -// public void update(JSONObject json) { -// WQLObject wql = WQLObject.getWQLObject("sys_code_rule"); -// String code = json.getString("code"); -// String id = json.getString("id"); -// JSONObject jo = wql.query("id<>'" + id + "code = '" + code + "'").uniqueResult(0); -// if (jo != null) { -// throw new BadRequestException("该编码code已存在,请校验!"); -// } -// String now = DateUtil.now(); -// json.put("update_optid", SecurityUtils.getCurrentUserId()); -// json.put("update_time", now); -// json.put("update_optname", SecurityUtils.getCurrentUsername()); -// WQLObject.getWQLObject("sys_code_rule").update(json); -// } -// -// @Override -// @Transactional(Transactional.TxType.`REQUIRES_NEW`) -// public String codeDemo(Map form) { -// String code = (String) form.get("code"); -// String id = this.queryIdByCode(code); -// //如果flag=1就执行更新数据库的操作 -// String flag = (String) form.get("flag"); -// WQLObject wo = WQLObject.getWQLObject("sys_code_rule_detail"); -// JSONArray ja = wo.query("code_rule_id = '" + id + "' order by sort_num FOR UPDATE").getResultJSONArray(0); -// String demo = ""; -// boolean is_same = true; -// for (int i = 0; i < ja.size(); i++) { -// String value = ""; -// JSONObject jo = ja.getJSONObject(i); -// //固定直接取值 -// if (jo.getString("type").equals("01")) { -// value = jo.getString("init_value"); -// } -// //日期判断数据库的值与当前值是否相同来决定顺序的值 -// if (jo.getString("type").equals("02")) { -// String current_value = jo.getString("current_value"); -// Date date = DateUtil.date(); -// String format = jo.getString("format"); -// String now_date = DateUtil.format(date, format); -// if (!now_date.equals(current_value)) { -// is_same = false; -// } -// if (flag.equals("1")) { -// jo.put("init_value", now_date); -// jo.put("current_value", now_date); -// } -// value = now_date; -// } -// //顺序的值:如果日期一样就+步长,等于最大值就归为初始值;日期不一样就归为初始值 -// if (jo.getString("type").equals("03")) { -// String num_value = ""; -// int step = jo.getInteger("step"); -// Long max_value = jo.getLong("max_value"); -// if (!is_same || (jo.getLongValue("current_value") + step > max_value)) { -// num_value = jo.getString("init_value"); -// } else { -// num_value = (jo.getInteger("current_value") + step) + ""; -// } -// int size = num_value.length(); -// int length = jo.getInteger("length"); -// String fillchar = jo.getString("fillchar"); -// for (int m = 0; m < (length - size); m++) { -// value += fillchar; -// } -// value += num_value; -// if (flag.equals("1")) { -// if (!is_same) { -// int init_value = jo.getInteger("init_value"); -// if (StrUtil.isEmpty((init_value + ""))) { -// throw new BadRequestException("请完善编码数值的初始值!"); -// } -// jo.put("current_value", init_value + ""); -// } else { -// int num_curr = jo.getInteger("current_value"); -// if (num_curr >= max_value) { -// num_curr = jo.getInteger("init_value"); -// jo.put("current_value", num_curr + ""); -// } else { -// jo.put("current_value", (num_curr + step) + ""); -// } -// } -// } -// } -// demo += value; -// if (flag.equals("1")) { -// wo.update(jo); -// } -// } -// return demo; -// } -// -// @Override -// public String queryIdByCode(String code) { -// JSONObject jo = WQLObject.getWQLObject("sys_code_rule").query("code = '" + code + "'").uniqueResult(0); -// String id = jo.getString("id"); -// return id; -// } -// -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/impl/MonitorServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/service/impl/MonitorServiceImpl.java deleted file mode 100644 index a6fda68..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/impl/MonitorServiceImpl.java +++ /dev/null @@ -1,194 +0,0 @@ -///* -// * Copyright 2019-2020 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package org.nl.modules.system.service.impl; -// -//import cn.hutool.core.date.BetweenFormatter; -//import cn.hutool.core.date.DateUtil; -//import org.nl.modules.common.utils.ElAdminConstant; -//import org.nl.modules.common.utils.FileUtil; -//import org.nl.modules.common.utils.StringUtils; -//import org.nl.modules.system.service.MonitorService; -//import org.springframework.stereotype.Service; -//import oshi.SystemInfo; -//import oshi.hardware.CentralProcessor; -//import oshi.hardware.GlobalMemory; -//import oshi.hardware.HardwareAbstractionLayer; -//import oshi.hardware.VirtualMemory; -//import oshi.software.os.FileSystem; -//import oshi.software.os.OSFileStore; -//import oshi.software.os.OperatingSystem; -//import oshi.util.FormatUtil; -//import oshi.util.Util; -// -//import java.lang.management.ManagementFactory; -//import java.text.DecimalFormat; -//import java.util.Date; -//import java.util.LinkedHashMap; -//import java.util.List; -//import java.util.Map; -// -///** -// * @author Zheng Jie -// * @date 2020-05-02 -// */ -//@Service -//public class MonitorServiceImpl implements MonitorService { -// -// private final DecimalFormat df = new DecimalFormat("0.00"); -// -// @Override -// public Map getServers() { -// Map resultMap = new LinkedHashMap<>(8); -// try { -// SystemInfo si = new SystemInfo(); -// OperatingSystem os = si.getOperatingSystem(); -// HardwareAbstractionLayer hal = si.getHardware(); -// // 系统信息 -// resultMap.put("sys", getSystemInfo(os)); -// // cpu 信息 -// resultMap.put("cpu", getCpuInfo(hal.getProcessor())); -// // 内存信息 -// resultMap.put("memory", getMemoryInfo(hal.getMemory())); -// // 交换区信息 -// resultMap.put("swap", getSwapInfo(hal.getMemory())); -// // 磁盘 -// resultMap.put("disk", getDiskInfo(os)); -// resultMap.put("time", DateUtil.format(new Date(), "HH:mm:ss")); -// } catch (Exception e) { -// e.printStackTrace(); -// } -// return resultMap; -// } -// -// /** -// * 获取磁盘信息 -// * -// * @return / -// */ -// private Map getDiskInfo(OperatingSystem os) { -// Map diskInfo = new LinkedHashMap<>(); -// FileSystem fileSystem = os.getFileSystem(); -// List fsArray = fileSystem.getFileStores(); -// String osName = System.getProperty("os.name"); -// long available = 0, total = 0; -// for (OSFileStore fs : fsArray) { -// // windows 需要将所有磁盘分区累加,linux 和 mac 直接累加会出现磁盘重复的问题,待修复 -// if (osName.toLowerCase().startsWith(ElAdminConstant.WIN)) { -// available += fs.getUsableSpace(); -// total += fs.getTotalSpace(); -// } else { -// available = fs.getUsableSpace(); -// total = fs.getTotalSpace(); -// break; -// } -// } -// long used = total - available; -// diskInfo.put("total", total > 0 ? FileUtil.getSize(total) : "?"); -// diskInfo.put("available", FileUtil.getSize(available)); -// diskInfo.put("used", FileUtil.getSize(used)); -// diskInfo.put("usageRate", df.format(used / (double) total * 100)); -// return diskInfo; -// } -// -// /** -// * 获取交换区信息 -// * -// * @param memory / -// * @return / -// */ -// private Map getSwapInfo(GlobalMemory memory) { -// Map swapInfo = new LinkedHashMap<>(); -// VirtualMemory virtualMemory = memory.getVirtualMemory(); -// long total = virtualMemory.getSwapTotal(); -// long used = virtualMemory.getSwapUsed(); -// swapInfo.put("total", FormatUtil.formatBytes(total)); -// swapInfo.put("used", FormatUtil.formatBytes(used)); -// swapInfo.put("available", FormatUtil.formatBytes(total - used)); -// if (used == 0) { -// swapInfo.put("usageRate", 0); -// } else { -// swapInfo.put("usageRate", df.format(used / (double) total * 100)); -// } -// return swapInfo; -// } -// -// /** -// * 获取内存信息 -// * -// * @param memory / -// * @return / -// */ -// private Map getMemoryInfo(GlobalMemory memory) { -// Map memoryInfo = new LinkedHashMap<>(); -// memoryInfo.put("total", FormatUtil.formatBytes(memory.getTotal())); -// memoryInfo.put("available", FormatUtil.formatBytes(memory.getAvailable())); -// memoryInfo.put("used", FormatUtil.formatBytes(memory.getTotal() - memory.getAvailable())); -// memoryInfo.put("usageRate", df.format((memory.getTotal() - memory.getAvailable()) / (double) memory.getTotal() * 100)); -// return memoryInfo; -// } -// -// /** -// * 获取Cpu相关信息 -// * -// * @param processor / -// * @return / -// */ -// private Map getCpuInfo(CentralProcessor processor) { -// Map cpuInfo = new LinkedHashMap<>(); -// cpuInfo.put("name", processor.getProcessorIdentifier().getName()); -// cpuInfo.put("package", processor.getPhysicalPackageCount() + "个物理CPU"); -// cpuInfo.put("core", processor.getPhysicalProcessorCount() + "个物理核心"); -// cpuInfo.put("coreNumber", processor.getPhysicalProcessorCount()); -// cpuInfo.put("logic", processor.getLogicalProcessorCount() + "个逻辑CPU"); -// // CPU信息 -// long[] prevTicks = processor.getSystemCpuLoadTicks(); -// // 等待1秒... -// Util.sleep(1000); -// long[] ticks = processor.getSystemCpuLoadTicks(); -// long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()]; -// long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()]; -// long sys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()]; -// long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()]; -// long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()]; -// long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()]; -// long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()]; -// long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()]; -// long totalCpu = user + nice + sys + idle + iowait + irq + softirq + steal; -// cpuInfo.put("used", df.format(100d * user / totalCpu + 100d * sys / totalCpu)); -// cpuInfo.put("idle", df.format(100d * idle / totalCpu)); -// return cpuInfo; -// } -// -// /** -// * 获取系统相关信息,系统、运行天数、系统IP -// * -// * @param os / -// * @return / -// */ -// private Map getSystemInfo(OperatingSystem os) { -// Map systemInfo = new LinkedHashMap<>(); -// // jvm 运行时间 -// long time = ManagementFactory.getRuntimeMXBean().getStartTime(); -// Date date = new Date(time); -// // 计算项目运行时间 5.4.3:BetweenFormater, 5.7.14改名为BetweenFormatter -// String formatBetween = DateUtil.formatBetween(date, new Date(), BetweenFormatter.Level.HOUR); -// // 系统信息 -// systemInfo.put("os", os.toString()); -// systemInfo.put("day", formatBetween); -// systemInfo.put("ip", StringUtils.getLocalIp()); -// return systemInfo; -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/impl/RedisServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/service/impl/RedisServiceImpl.java deleted file mode 100644 index 2e5df0a..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/impl/RedisServiceImpl.java +++ /dev/null @@ -1,83 +0,0 @@ -//package org.nl.modules.system.service.impl; -// -//import com.alibaba.fastjson.JSONArray; -//import com.alibaba.fastjson.JSONObject; -//import lombok.RequiredArgsConstructor; -//import lombok.extern.slf4j.Slf4j; -//import org.nl.modules.system.service.RedisService; -//import org.nl.modules.system.service.convert.RedisConvert; -//import org.nl.modules.system.service.entity.RedisKeyDefine; -//import org.nl.modules.system.service.entity.RedisKeyRegistry; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.data.redis.connection.DataType; -//import org.springframework.data.redis.connection.RedisServerCommands; -//import org.springframework.data.redis.core.RedisCallback; -//import org.springframework.data.redis.core.StringRedisTemplate; -//import org.springframework.stereotype.Service; -// -//import java.util.*; -// -///** -// * @Author: lyd -// * @Description: Redis监控的实现类 -// * @Date: 2022-08-04 -// */ -//@Service -//@RequiredArgsConstructor -//@Slf4j -//public class RedisServiceImpl implements RedisService { -// -// @Autowired -// private StringRedisTemplate stringRedisTemplate; -// -// @Override -// public JSONObject getRedisMonitorInfo() { -// // 获得 Redis 统计信息 -// Properties info = stringRedisTemplate.execute((RedisCallback) RedisServerCommands::info); -// Long dbSize = stringRedisTemplate.execute(RedisServerCommands::dbSize); -// Properties commandStats = stringRedisTemplate.execute(( -// RedisCallback) connection -> connection.info("commandstats")); -// assert commandStats != null; // 断言,避免警告 -//// System.out.println("info:" + info + " dbsize:" + dbSize + " com:" + commandStats); -// // 拼接结果返回 -// // 转成实体 -// JSONObject json = new JSONObject(); -// json.put("info", RedisConvert.INSTANCE.build(info, dbSize, commandStats)); -// return json; -// } -// -// @Override -// public JSONObject getKeyDefineList() { -// List keyDefines = RedisKeyRegistry.list(); -// JSONObject json = new JSONObject(); -// System.out.println(keyDefines); -//// json.put("info", RedisConvert.INSTANCE.convertList(keyDefines)); -// return json; -// } -// -// @Override -// public JSONArray getKeyValueList() { -// JSONArray result = new JSONArray(); -// Set keys = stringRedisTemplate.keys("*"); -// // 迭代 -// Iterator it = keys.iterator(); -// while (it.hasNext()) { -// String key = it.next(); -// JSONObject redis = new JSONObject(); -// DataType dataType = stringRedisTemplate.type(key); // 数据类型 -// String s = stringRedisTemplate.opsForValue().get(key); // 获取值 -// Long expire = stringRedisTemplate.getExpire(key); // 获取剩余时间 -// redis.put("dataType", dataType); -// redis.put("key", key); -// redis.put("value", s); -// redis.put("expire", expire); -// result.add(redis); -// } -// return result; -// } -// -// @Override -// public void deleteByKey(String[] ids) { -// stringRedisTemplate.delete(Arrays.asList(ids)); -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/vo/RedisKeyDefineRespVO.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/service/vo/RedisKeyDefineRespVO.java deleted file mode 100644 index 7ecc842..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/vo/RedisKeyDefineRespVO.java +++ /dev/null @@ -1,38 +0,0 @@ -//package org.nl.modules.system.service.vo; -// -// -//import lombok.AllArgsConstructor; -//import lombok.Builder; -//import lombok.Data; -//import org.nl.modules.system.service.entity.RedisKeyDefine; -// -//import java.time.Duration; -// -///** -// * @Author: lyd -// * @Description: 管理后台 - Redis Key 信息 Response VO -// * @Date: 2022-08-04 -// */ -// -//@Data -//@Builder -//@AllArgsConstructor -//public class RedisKeyDefineRespVO { -// -// private String keyTemplate; -// -// -// private RedisKeyDefine.KeyTypeEnum keyType; -// -// -// private Class valueType; -// -// -// private RedisKeyDefine.TimeoutTypeEnum timeoutType; -// -// -// private Duration timeout; -// -// -// private String memo; -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/vo/RedisMonitorRespVO.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/service/vo/RedisMonitorRespVO.java deleted file mode 100644 index 4a585d8..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/vo/RedisMonitorRespVO.java +++ /dev/null @@ -1,46 +0,0 @@ -//package org.nl.modules.system.service.vo; -// -// -//import lombok.AllArgsConstructor; -//import lombok.Builder; -//import lombok.Data; -// -//import java.util.List; -//import java.util.Properties; -// -///** -// * @Author: lyd -// * @Description: 管理后台 - Redis 监控信息 Response VO -// * @Date: 2022-08-04 -// */ -// -//@Data -//@Builder -//@AllArgsConstructor -//public class RedisMonitorRespVO { -// -// private Properties info; -// -// -// private Long dbSize; -// -// -// private List commandStats; -// -// -// @Data -// @Builder -// @AllArgsConstructor -// public static class CommandStat { -// -// -// private String command; -// -// -// private Integer calls; -// -// -// private Long usec; -// -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/vo/UserVo.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/service/vo/UserVo.java deleted file mode 100644 index 5dde888..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/service/vo/UserVo.java +++ /dev/null @@ -1,9 +0,0 @@ -//package org.nl.modules.system.service.vo; -// -///** -// * @author: lyd -// * @description: -// * @Date: 2022/9/26 -// */ -//public class UserVo { -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/util/CodeUtil.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/util/CodeUtil.java deleted file mode 100644 index 84d44f3..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/util/CodeUtil.java +++ /dev/null @@ -1,19 +0,0 @@ -//package org.nl.modules.system.util; -// -//import org.nl.modules.system.service.GenCodeService; -//import org.nl.modules.wql.util.SpringContextHolder; -// -//import java.util.HashMap; -// -//public class CodeUtil { -// -// public static String getNewCode(String ruleCode) { -// GenCodeService bean = SpringContextHolder.getBean(GenCodeService.class); -// String flag = "1"; -// HashMap map = new HashMap<>(); -// map.put("flag", flag); -// map.put("code", ruleCode); -// return bean.codeDemo(map); -// } -// -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/util/YamlUtil.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/util/YamlUtil.java deleted file mode 100644 index 19e55aa..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/util/YamlUtil.java +++ /dev/null @@ -1,11 +0,0 @@ -//package org.nl.modules.system.util; -// -//import java.util.Properties; -// -//public class YamlUtil { -// public static Properties properties; -// -// public static String getValue(String key) { -// return (String) properties.get(key); -// } -//} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/wql/sys.xls b/lms/nladmin-system/src/main/java/org/nl/modules/system/wql/sys.xls index 85261669e7747ab7c9fa80f05c5712ffa6600b83..4543abe382bca0723e8e44bd4eabbe6fc0b146d7 100644 GIT binary patch delta 29914 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 Gz<&UqNeI&b diff --git a/lms/nladmin-system/src/main/java/org/nl/sql/add_column0320.sql b/lms/nladmin-system/src/main/java/org/nl/sql/add_column0320.sql deleted file mode 100644 index 63cd7d7..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/sql/add_column0320.sql +++ /dev/null @@ -1,7 +0,0 @@ -ALTER TABLE pdm_bi_subpackagerelation -ADD COLUMN `box_group` varchar(20) NULL DEFAULT '0' COMMENT '木箱组'; -ALTER TABLE pdm_bi_slittingproductionplan -ADD COLUMN `level` char(1) NULL DEFAULT NULL COMMENT '子卷等级'; -INSERT INTO `sys_menu` (`menu_id`, `pid`, `sub_count`, `type`, `title`, `component_name`, `component`, `menu_sort`, `icon`, `path`, `iframe`, `cache`, `hidden`, `permission`, `create_name`, `update_name`, `create_time`, `update_time`, `is_pc`, `system_type`, `create_id`, `category`, `update_id`) VALUES ('1765714619160203264', '329', 0, 4, '子卷装箱', NULL, 'wms/pdm/sub/index', 998, 'zujian', 'wms/pdm/sub/index', 0, b'0', b'0', NULL, NULL, NULL, NULL, NULL, 1, '1', 1, NULL, NULL); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `dict_type`, `para1`, `para2`, `para3`, `create_id`, `create_name`, `create_time`, `update_id`, `update_name`, `update_time`) VALUES ('1765997086853173248', 'sub_package_relation', '子卷包装关系状态', '未分配', '99', 0, NULL, NULL, NULL, NULL, '1', '管理员', '2024-03-08 15:04:50', '1', '管理员', '2024-03-08 15:04:50'); - diff --git a/lms/nladmin-system/src/main/java/org/nl/ssosql-1228.sql b/lms/nladmin-system/src/main/java/org/nl/ssosql-1228.sql deleted file mode 100644 index 1f82392..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/ssosql-1228.sql +++ /dev/null @@ -1,1026 +0,0 @@ --- 部门关系表 -CREATE TABLE `sys_user_dept` -( - `user_id` char(19) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '用户标识', - `dept_id` char(19) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '部门标识', - UNIQUE KEY `uni_idx` (`user_id`,`dept_id`) USING BTREE COMMENT '联合唯一索引' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='部门关系表'; -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (1, 2); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (2, 2); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (17, 2); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (18, 2); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (21, 2); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (32, 2); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (33, 2); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (35, 2); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (19, 5); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (20, 5); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (24, 5); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (25, 5); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (26, 5); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (27, 5); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (28, 5); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (29, 5); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (30, 5); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (16, 18); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (22, 18); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (23, 18); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (31, 18); -INSERT INTO `sys_user_dept`(`user_id`, `dept_id`) -VALUES (34, 18); - --- 用户表 -DROP TABLE IF EXISTS `sys_user`; -CREATE TABLE `sys_user` -( - `user_id` varchar(31) COLLATE utf8_bin NOT NULL COMMENT '用户标识', - `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '登录账号', - `person_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '姓名', - `gender` varchar(2) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '性别', - `phone` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '电话', - `email` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '电子邮箱', - `avatar_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '头像地址', - `avatar_path` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '头像真实路径', - `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '密码', - `is_admin` tinyint(1) DEFAULT NULL COMMENT '是否为admin账号', - `is_used` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用', - `pwd_reset_user_id` varchar(31) COLLATE utf8_bin DEFAULT NULL COMMENT '密码重置者', - `pwd_reset_time` datetime DEFAULT NULL COMMENT '密码重置时间', - `create_id` varchar(31) COLLATE utf8_bin DEFAULT NULL COMMENT '创建人标识', - `create_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '创建人', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_id` varchar(31) COLLATE utf8_bin DEFAULT NULL COMMENT '修改人标识', - `update_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '修改人', - `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - `extperson_id` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '外部人员标识', - `extuser_id` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '外部用户标识', - PRIMARY KEY (`user_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='用户表'; -INSERT INTO `sys_user`(`user_id`, `username`, `person_name`, `gender`, `phone`, `email`, `avatar_name`, `avatar_path`, - `password`, `is_admin`, `is_used`, `create_name`, `update_name`, `pwd_reset_time`, `create_time`, - `update_time`, `create_id`, `update_id`) -VALUES (1, 'admin', '管理员', '男', '18888888888', '201507802@qq.com', 'avatar-20200806032259161.png', - '/Users/jie/Documents/work/me/admin/eladmin/~/avatar/avatar-20200806032259161.png', - 'c4457adc568049cc0074615f095033ae', b'1', 1, NULL, 'admin', '2022-12-05 11:54:33', '2018-08-23 09:11:56', - '2020-09-05 10:43:31', 1, NULL); -INSERT INTO `sys_user`(`user_id`, `username`, `person_name`, `gender`, `phone`, `email`, `avatar_name`, `avatar_path`, - `password`, `is_admin`, `is_used`, `create_name`, `update_name`, `pwd_reset_time`, `create_time`, - `update_time`, `create_id`, `update_id`) -VALUES (2, 'default', '默认用户', '男', '18888888888', NULL, NULL, NULL, '', b'0', 1, NULL, 'admin', NULL, - '2018-08-23 09:11:56', '2020-09-05 10:43:31', 1, NULL); -INSERT INTO `sys_user`(`user_id`, `username`, `person_name`, `gender`, `phone`, `email`, `avatar_name`, `avatar_path`, - `password`, `is_admin`, `is_used`, `create_name`, `update_name`, `pwd_reset_time`, `create_time`, - `update_time`, `create_id`, `update_id`) -VALUES (16, '88540521', '汪东升', '男', NULL, NULL, NULL, NULL, 'f52020dca765fd3943ed40a615dc2c5c', b'0', 1, 'System', - 'System', NULL, '2022-12-01 09:46:10', '2022-12-02 09:48:57', 1, NULL); -INSERT INTO `sys_user`(`user_id`, `username`, `person_name`, `gender`, `phone`, `email`, `avatar_name`, `avatar_path`, - `password`, `is_admin`, `is_used`, `create_name`, `update_name`, `pwd_reset_time`, `create_time`, - `update_time`, `create_id`, `update_id`) -VALUES (17, '88540154', '彭明清', '男', NULL, NULL, NULL, NULL, 'f52020dca765fd3943ed40a615dc2c5c', b'0', 1, 'System', - 'System', NULL, '2022-12-01 09:47:23', '2022-12-22 14:07:34', 1, NULL); -INSERT INTO `sys_user`(`user_id`, `username`, `person_name`, `gender`, `phone`, `email`, `avatar_name`, `avatar_path`, - `password`, `is_admin`, `is_used`, `create_name`, `update_name`, `pwd_reset_time`, `create_time`, - `update_time`, `create_id`, `update_id`) -VALUES (18, '88540060', '高小盼', '男', NULL, NULL, NULL, NULL, 'f52020dca765fd3943ed40a615dc2c5c', b'0', 1, 'System', - 'System', NULL, '2022-12-02 09:45:00', '2022-12-02 09:45:00', 1, NULL); -INSERT INTO `sys_user`(`user_id`, `username`, `person_name`, `gender`, `phone`, `email`, `avatar_name`, `avatar_path`, - `password`, `is_admin`, `is_used`, `create_name`, `update_name`, `pwd_reset_time`, `create_time`, - `update_time`, `create_id`, `update_id`) -VALUES (19, '88540369', '王天山', '男', NULL, NULL, NULL, NULL, 'f52020dca765fd3943ed40a615dc2c5c', b'0', 1, 'System', - 'System', NULL, '2022-12-02 09:45:53', '2022-12-02 09:48:38', 1, NULL); -INSERT INTO `sys_user`(`user_id`, `username`, `person_name`, `gender`, `phone`, `email`, `avatar_name`, `avatar_path`, - `password`, `is_admin`, `is_used`, `create_name`, `update_name`, `pwd_reset_time`, `create_time`, - `update_time`, `create_id`, `update_id`) -VALUES (20, '88540168', '梁万荣', '男', NULL, NULL, NULL, NULL, 'f52020dca765fd3943ed40a615dc2c5c', b'0', 1, 'System', - 'System', NULL, '2022-12-02 09:48:21', '2022-12-02 09:48:21', 1, NULL); -INSERT INTO `sys_user`(`user_id`, `username`, `person_name`, `gender`, `phone`, `email`, `avatar_name`, `avatar_path`, - `password`, `is_admin`, `is_used`, `create_name`, `update_name`, `pwd_reset_time`, `create_time`, - `update_time`, `create_id`, `update_id`) -VALUES (21, '88540566', '张龙龙', '男', NULL, NULL, NULL, NULL, 'f52020dca765fd3943ed40a615dc2c5c', b'0', 1, 'System', - 'System', NULL, '2022-12-02 09:50:51', '2022-12-02 09:50:51', 1, NULL); -INSERT INTO `sys_user`(`user_id`, `username`, `person_name`, `gender`, `phone`, `email`, `avatar_name`, `avatar_path`, - `password`, `is_admin`, `is_used`, `create_name`, `update_name`, `pwd_reset_time`, `create_time`, - `update_time`, `create_id`, `update_id`) -VALUES (22, '88541303', '林立洲', '男', NULL, NULL, NULL, NULL, 'f52020dca765fd3943ed40a615dc2c5c', b'0', 1, 'System', - 'System', NULL, '2022-12-02 10:09:24', '2022-12-02 10:09:24', 1, NULL); -INSERT INTO `sys_user`(`user_id`, `username`, `person_name`, `gender`, `phone`, `email`, `avatar_name`, `avatar_path`, - `password`, `is_admin`, `is_used`, `create_name`, `update_name`, `pwd_reset_time`, `create_time`, - `update_time`, `create_id`, `update_id`) -VALUES (23, '88540302', '曾发玲', '男', NULL, NULL, NULL, NULL, 'f52020dca765fd3943ed40a615dc2c5c', b'0', 1, 'System', - 'System', NULL, '2022-12-02 10:09:55', '2022-12-02 10:09:55', 1, NULL); -INSERT INTO `sys_user`(`user_id`, `username`, `person_name`, `gender`, `phone`, `email`, `avatar_name`, `avatar_path`, - `password`, `is_admin`, `is_used`, `create_name`, `update_name`, `pwd_reset_time`, `create_time`, - `update_time`, `create_id`, `update_id`) -VALUES (24, '88541643', '甄亮霞', '女', NULL, NULL, NULL, NULL, '28e09b3a21d6d5e2cc00ae725c61c233', b'0', 1, 'System', - 'System', '2022-12-20 20:53:49', '2022-12-04 15:41:14', '2022-12-04 15:41:14', 1, NULL); -INSERT INTO `sys_user`(`user_id`, `username`, `person_name`, `gender`, `phone`, `email`, `avatar_name`, `avatar_path`, - `password`, `is_admin`, `is_used`, `create_name`, `update_name`, `pwd_reset_time`, `create_time`, - `update_time`, `create_id`, `update_id`) -VALUES (25, '88541932', '朱小宁', '男', NULL, NULL, NULL, NULL, 'aafb322898a8c49aea83041d71868c34', b'0', 1, 'System', - 'System', '2022-12-17 17:17:12', '2022-12-04 15:42:09', '2022-12-04 15:42:09', 1, NULL); -INSERT INTO `sys_user`(`user_id`, `username`, `person_name`, `gender`, `phone`, `email`, `avatar_name`, `avatar_path`, - `password`, `is_admin`, `is_used`, `create_name`, `update_name`, `pwd_reset_time`, `create_time`, - `update_time`, `create_id`, `update_id`) -VALUES (26, '88541972', '颜周鲁', '男', NULL, NULL, NULL, NULL, 'c62ab3a7db00bb0a41270ae4933062bb', b'0', 1, 'System', - 'System', '2022-12-05 15:14:51', '2022-12-04 15:42:43', '2022-12-04 15:42:43', 1, NULL); -INSERT INTO `sys_user`(`user_id`, `username`, `person_name`, `gender`, `phone`, `email`, `avatar_name`, `avatar_path`, - `password`, `is_admin`, `is_used`, `create_name`, `update_name`, `pwd_reset_time`, `create_time`, - `update_time`, `create_id`, `update_id`) -VALUES (27, '88540245', '田晓英', '女', '18919831471', NULL, NULL, NULL, 'cfdddd828134b157e82760390c159cbe', b'0', 1, - 'System', 'System', '2022-12-18 17:31:25', '2022-12-04 15:43:01', '2022-12-18 17:32:33', 1, NULL); -INSERT INTO `sys_user`(`user_id`, `username`, `person_name`, `gender`, `phone`, `email`, `avatar_name`, `avatar_path`, - `password`, `is_admin`, `is_used`, `create_name`, `update_name`, `pwd_reset_time`, `create_time`, - `update_time`, `create_id`, `update_id`) -VALUES (28, '88541240', '祁复秀', '男', '17352283290', NULL, NULL, NULL, '060ed1f34df1e604b7eaa86491a26716', b'0', 1, - 'System', 'System', '2022-12-20 20:02:45', '2022-12-04 15:43:43', '2022-12-04 17:29:33', 1, NULL); -INSERT INTO `sys_user`(`user_id`, `username`, `person_name`, `gender`, `phone`, `email`, `avatar_name`, `avatar_path`, - `password`, `is_admin`, `is_used`, `create_name`, `update_name`, `pwd_reset_time`, `create_time`, - `update_time`, `create_id`, `update_id`) -VALUES (29, '88541242', '刘武能', '男', NULL, NULL, NULL, NULL, '999dacac48f973c6845ed228298250c7', b'0', 1, 'System', - 'System', '2022-12-17 18:14:52', '2022-12-14 13:58:16', '2022-12-14 13:58:16', 1, NULL); - --- 部门 表结构修改 -alter table `sys_dept` - ADD COLUMN `code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '部门编号'; -alter table `sys_dept` - ADD COLUMN `ext_id` varchar(255) DEFAULT NULL; -alter table `sys_dept` - ADD COLUMN `create_id` bigint DEFAULT 1; -alter table `sys_dept` - ADD COLUMN `update_id` char(19) DEFAULT NULL; -alter table `sys_dept` CHANGE `dept_id` `dept_id` char (19) NOT NULL COMMENT 'ID'; -alter table `sys_dept` CHANGE `enabled` `is_used` tinyint(1) NOT NULL COMMENT '状态'; -alter table `sys_dept` CHANGE `create_by` `create_name` varchar (255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建者'; -alter table `sys_dept` CHANGE `update_by` `update_name` varchar (255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '修改者'; - --- sys_menu -alter table `sys_menu` CHANGE `menu_id` `menu_id` char (19) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '菜单标识'; -alter table `sys_menu` CHANGE `pid` `pid` char (19) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '上级菜单ID'; -alter table `sys_menu` - ADD COLUMN `system_type` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '所属系统'; -alter table `sys_menu` CHANGE `i_frame` `iframe` tinyint(1) DEFAULT NULL COMMENT '是否外链'; -alter table `sys_menu` - ADD COLUMN `create_id` bigint DEFAULT 1; -alter table `sys_menu` - ADD COLUMN `category` char(1) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '菜单分类'; -alter table `sys_menu` - ADD COLUMN `update_id` char(19) DEFAULT NULL; -alter table `sys_menu` CHANGE `create_by` `create_name` varchar (255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建者'; -alter table `sys_menu` CHANGE `update_by` `update_name` varchar (255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '修改者'; -alter table `sys_menu` CHANGE `name` `component_name` varchar (255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '组件名称'; -ALTER TABLE `sys_menu` DROP INDEX uniq_name; -ALTER TABLE `sys_menu` DROP INDEX uniq_title; --- 初始化数据 -INSERT INTO `sys_menu`(`menu_id`, `pid`, `sub_count`, `type`, `system_type`, `category`, `title`, `component_name`, - `component`, `menu_sort`, `icon`, `path`, `iframe`, `cache`, `hidden`, `permission`, `create_id`, - `create_name`, `create_time`, `update_id`, `update_name`, `update_time`) -VALUES ('1324783485328', NULL, 7, '1', '1', '', 'LMS系统', '', '', 1, 'system', 'system', 0, 0, 0, '', NULL, '', - '2022-12-20 09:54:42', NULL, '', '2022-12-20 09:54:54'); -update sys_menu -set pid = '1324783485328' -where pid is null - and menu_id <> '1324783485328'; -update sys_menu -set system_type =1; --- sys_dict -DROP TABLE IF EXISTS `sys_dict`; -CREATE TABLE `sys_dict` -( - `dict_id` char(19) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '字典标识', - `code` varchar(30) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '编码', - `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '名称', - `label` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '字典标签', - `value` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '字典值', - `dict_sort` decimal(5, 0) DEFAULT NULL COMMENT '排序号', - `dict_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '字典类型', - `para1` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '参数1', - `para2` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '参数2', - `para3` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '参数3', - `create_id` char(19) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '创建人', - `create_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '创建人', - `create_time` varchar(25) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '创建时间', - `update_id` char(19) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '修改人', - `update_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '修改人', - `update_time` varchar(25) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`dict_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='字典表'; - - -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('1', 'user_status', '用户状态', '激活', 'true', '1', '2019/10/27 20:31', '2019/10/27 20:31'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('2', 'user_status', '用户状态', '禁用', 'false', '2', '2019/10/27 20:31', '2019/10/27 20:31'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('3', 'dept_status', '部门状态', '启用', 'true', '1', '2019/10/27 20:31', '2019/10/27 20:31'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('4', 'dept_status', '部门状态', '停用', 'false', '2', '2019/10/27 20:31', '2019/10/27 20:31'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('5', 'job_status', '岗位状态', '启用', 'true', '1', '2019/10/27 20:31', '2019/10/27 20:31'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('6', 'job_status', '岗位状态', '停用', 'false', '2', '2019/10/27 20:31', '2019/10/27 20:31'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('52', 'sch_point_type', '点位类型', '点位', '1', '1', '2021/8/23 15:25', '2022/11/1 10:18'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('53', 'sch_point_type', '点位类型', '仓位', '2', '2', '2021/8/23 15:25', '2022/11/1 10:18'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('54', 'sch_point_status', '点位状态', '空位', '1', '1', '2021/8/23 15:31', '2022/11/1 10:17'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('55', 'sch_point_status', '点位状态', '空载具', '3', '3', '2021/8/23 15:32', '2022/11/1 10:17'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('56', 'sch_point_status', '点位状态', '有箱有料', '2', '2', '2021/8/23 15:32', '2022/11/1 16:00'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('61', 'd_lock_type', '锁定类型', '未锁定', '1', '1', '2021/8/24 9:27', '2022/11/1 10:16'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('62', 'd_lock_type', '锁定类型', '出入库锁', '2', '2', '2021/8/24 9:27', '2022/11/1 10:17'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('63', 'is_used', '是否启用', '启用', '1', '0', '2021/8/24 12:17', '2021/12/6 15:47'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('64', 'is_used', '是否启用', '禁用', '0', '1', '2021/8/24 12:17', '2021/12/6 15:47'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('73', 'base_data', '数据类别', '物料', '03', '3', '2021/12/7 18:07', '2021/12/7 18:07'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('74', 'base_data', '数据类别', '供应商', '04', '4', '2021/12/7 18:07', '2021/12/7 18:07'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('75', 'base_data', '数据类别', '客户', '05', '5', '2021/12/7 18:08', '2021/12/7 18:08'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('96', 'st_stor_type', '仓库性质', '常温库', '01', '1', '2021/12/8 17:09', '2021/12/8 17:09'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('97', 'st_stor_type', '仓库性质', '冷冻库', '02', '2', '2021/12/8 17:09', '2021/12/8 17:09'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('98', 'st_stor_type', '仓库性质', '冷藏库', '03', '3', '2021/12/8 17:09', '2021/12/8 17:09'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('99', 'st_sect_type', '库区类型', '主存区', '00', '1', '2021/12/9 9:24', '2021/12/9 9:24'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('100', 'st_sect_type', '库区类型', '暂存区', '01', '2', '2021/12/9 9:24', '2021/12/9 9:24'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('101', 'st_sect_type', '库区类型', '虚拟区', '09', '999', '2021/12/9 9:24', '2021/12/9 9:24'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('103', 'storagevehicle_type', '载具类型', '木托盘', '00', '2', '2021/12/9 9:33', '2022/8/8 15:16'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('104', 'storagevehicle_type', '载具类型', '铁托盘', '01', '3', '2021/12/9 9:33', '2022/8/8 15:17'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('111', 'IS_OR_NOT', '是否', '否', '0', '0', '2021/12/9 17:03', '2021/12/9 17:03'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('112', 'IS_OR_NOT', '是否', '是', '1', '2', '2021/12/9 17:03', '2021/12/9 17:03'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('127', 'ST_CREATE_MODE', '创建方式', 'PC产生', '01', '1', '2021/12/13 10:44', '2021/12/13 10:45'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('128', 'ST_CREATE_MODE', '创建方式', '终端产生', '02', '2', '2021/12/13 10:44', '2021/12/13 10:44'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('129', 'ST_CREATE_MODE', '创建方式', '外部接口产生', '03', '3', '2021/12/13 10:45', '2021/12/13 10:45'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('131', 'ST_PRIOR_LEVEL', '库存优先等级', '一级', '01', '999', '2021/12/20 13:46', '2021/12/20 13:46'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('132', 'ST_PRIOR_LEVEL', '库存优先等级', '二级', '02', '999', '2021/12/20 13:46', '2021/12/20 13:46'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('133', 'ST_PRIOR_LEVEL', '库存优先等级', '三级', '03', '999', '2021/12/20 13:46', '2021/12/20 13:46'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('155', 'sch_point_type', '点位类型', '共用', '3', '3', '2021/12/21 16:08', '2022/11/1 10:18'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('163', 'work_status', '执行状态', '未生成', '00', '1', '2021/12/23 10:17', '2021/12/23 10:17'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('164', 'work_status', '执行状态', '生成', '01', '2', '2021/12/23 10:17', '2021/12/23 10:17'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('165', 'work_status', '执行状态', '执行中', '02', '3', '2021/12/23 10:18', '2021/12/23 10:18'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('166', 'work_status', '执行状态', '完成', '99', '999', '2021/12/23 10:18', '2021/12/23 10:18'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('187', 'task_status', '任务状态', '生成', '01', '1', '2021/12/26 17:13', '2022/10/27 14:08'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('188', 'task_status', '任务状态', '确定起点', '02', '2', '2021/12/26 17:13', '2022/10/27 14:08'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('189', 'task_status', '任务状态', '确定终点', '03', '3', '2021/12/26 17:14', '2022/10/27 14:08'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('190', 'task_status', '任务状态', '完成', '07', '7', '2021/12/26 17:14', '2022/10/27 14:08'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('191', 'SCH_TASK_TYPE', '业务类型', '入库', '01', '1', '2021/12/27 9:18', '2021/12/27 9:18'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('192', 'SCH_TASK_TYPE', '业务类型', '出库', '02', '2', '2021/12/27 9:18', '2021/12/27 9:18'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('196', 'SCH_TASK_TYPE', '业务类型', '空盘入库', '03', '3', '2021/12/27 9:19', '2022/8/10 9:24'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('197', 'SCH_TASK_TYPE', '业务类型', '空盘出库', '04', '4', '2021/12/27 9:19', '2022/8/10 9:25'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('201', 'SCH_TASK_TYPE', '业务类型', '其他', '05', '5', '2021/12/27 9:20', '2022/8/10 9:25'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('226', 'is_usable', '是否可用', '可用', '1', '1', '2021/12/28 17:32', '2021/12/28 17:32'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('227', 'is_usable', '是否可用', '不可用', '0', '2', '2021/12/28 17:32', '2021/12/28 17:32'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('311', 'io_type', '出入类型', '入库', '0', '1', '2022/2/11 14:18', '2022/2/11 14:18'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('312', 'io_type', '出入类型', '出库', '1', '2', '2022/2/11 14:18', '2022/2/11 14:18'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('317', 'd_lock_type', '锁定类型', '空托盘出入库锁', '3', '3', '2022/2/17 10:21', '2022/11/1 10:17'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('318', 'd_lock_type', '锁定类型', '移库锁', '4', '4', '2022/2/17 10:22', '2022/11/1 10:17'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('321', 'd_lock_type', '锁定类型', '其它', '99', '99', '2022/2/17 10:23', '2022/11/1 10:17'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('328', 'work_status', '执行状态', '确认', '03', '999', '2022/3/5 14:07', '2022/3/5 14:07'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('364', 'base_data', '数据类别', '产品系列', '07', '7', '2022/5/20 16:47', '2022/5/20 16:47'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('383', 'task_finished_type', '任务完成类型', '自动', '00', '1', '2022/5/23 15:52', '2022/5/23 15:52'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('384', 'task_finished_type', '任务完成类型', '手动', '01', '2', '2022/5/23 15:52', '2022/5/23 15:52'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('385', 'ST_STOREMODE_TYPE', '仓库类型', '平库堆放', '01', '1', '2022/5/23 16:49', '2022/5/23 16:49'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('386', 'ST_STOREMODE_TYPE', '仓库类型', '多层货架', '02', '2', '2022/5/23 16:49', '2022/5/23 16:49'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('387', 'ST_STOREMODE_TYPE', '仓库类型', '立库', '03', '3', '2022/5/23 16:49', '2022/5/23 16:49'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('453', 'ST_INV_TYPE', '出入库单据类型', '成品入库', '001001', '999', '2022/6/15 14:43', '2022/6/15 14:43'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('454', 'ST_INV_TYPE', '出入库单据类型', '半成品入库', '001002', '999', '2022/6/15 14:44', '2022/6/15 14:44'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('455', 'ST_INV_TYPE', '出入库单据类型', '成品出库', '011001', '999', '2022/6/15 14:44', '2022/6/15 14:44'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('456', 'ST_INV_TYPE', '出入库单据类型', '半成品出库', '011002', '999', '2022/6/15 14:44', '2022/6/15 14:44'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('457', 'st_bill_status', '单据状态', '生成', '10', '999', '2022/6/15 16:52', '2022/6/15 16:52'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('458', 'st_bill_status', '单据状态', '分配', '20', '999', '2022/6/15 16:52', '2022/6/15 16:52'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('459', 'st_bill_status', '单据状态', '下发', '30', '999', '2022/6/15 16:52', '2022/6/15 16:52'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('460', 'st_bill_status', '单据状态', '执行中', '40', '999', '2022/6/15 16:53', '2022/6/15 16:53'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('461', 'st_bill_status', '单据状态', '确认', '50', '999', '2022/6/15 16:53', '2022/6/15 16:53'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('462', 'task_status', '任务状态', '起点和终点都确认', '04', '4', '2022/6/16 16:03', '2022/10/27 14:08'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('463', 'task_status', '任务状态', '下发', '05', '5', '2022/6/16 16:03', '2022/10/27 14:08'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('464', 'task_status', '任务状态', '执行中', '06', '6', '2022/6/16 16:04', '2022/10/27 14:08'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('477', 'ST_QUALITY_SCODE', '品质类型', '待检品', '00', '1', '2022/8/11 16:38', '2022/8/11 16:38'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('478', 'ST_QUALITY_SCODE', '品质类型', '合格品', '01', '2', '2022/8/11 16:38', '2022/8/11 16:38'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('479', 'ST_QUALITY_SCODE', '品质类型', '不合格', '02', '3', '2022/8/11 16:38', '2022/8/11 16:38'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('483', 'device_point_type', '设备点位类型', '空料位', '1', '1', '2022/9/1 16:28', '2022/9/1 16:28'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('484', 'device_point_type', '设备点位类型', '满料位', '2', '2', '2022/9/1 16:28', '2022/9/1 16:28'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('485', 'device_point_type', '设备点位类型', '上料位', '3', '3', '2022/9/1 16:28', '2022/9/1 16:28'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('489', 'product_area', '生产区域', 'A1', 'A1', '1', '2022/9/19 18:45', '2022/12/4 17:21'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('490', 'product_area', '生产区域', 'A2', 'A2', '2', '2022/9/19 18:45', '2022/12/4 17:21'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('491', 'product_area', '生产区域', 'A3', 'A3', '3', '2022/9/19 18:45', '2022/12/4 17:21'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('492', 'product_area', '生产区域', 'A4', 'A4', '4', '2022/9/19 18:45', '2022/12/4 17:21'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('493', 'point_location', '点位位置', '上', '0', '1', '2022/9/20 15:03', '2022/9/20 15:03'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('494', 'point_location', '点位位置', '下', '1', '2', '2022/9/20 15:03', '2022/9/20 15:03'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('495', 'product_status', '生箔工序工单状态', '开始', '01', '1', '2022/10/9 9:06', '2022/11/1 13:37'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('496', 'product_status', '生箔工序工单状态', '结束', '09', '99', '2022/10/9 9:06', '2022/11/1 13:38'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('497', 'sch_cool_ivt_status', '冷却库存状态', '未裹膜', '01', '10', '2022/10/9 9:31', '2022/10/9 9:49'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('498', 'sch_cool_ivt_status', '冷却库存状态', '已裹膜', '02', '20', '2022/10/9 9:31', '2022/12/13 15:23'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('499', 'sch_cool_ivt_status', '冷却库存状态', '已烘烤', '04', '40', '2022/10/9 9:31', '2022/12/13 15:24'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('500', 'sch_full_point_status', '满轴位状态', '空位', '01', '10', '2022/10/9 10:13', '2022/10/9 10:13'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('501', 'sch_full_point_status', '满轴位状态', '满轴', '02', '20', '2022/10/9 10:13', '2022/10/9 10:13'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('502', 'sch_empty_point_status', '空轴位状态', '空位', '01', '10', '2022/10/9 10:17', '2022/10/9 10:17'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('503', 'sch_empty_point_status', '空轴位状态', '空轴', '02', '20', '2022/10/9 10:17', '2022/10/9 15:36'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('504', 'order_type', '分切订单类型', '常规', '1', '1', '2022/10/9 14:11', '2022/10/9 14:11'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('505', 'order_type', '分切订单类型', '改制', '2', '2', '2022/10/9 14:11', '2022/10/9 14:11'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('508', 'ware_house', '来源卷位置', '线边库/线边呆滞库', '0', '1', '2022/10/9 16:08', '2022/10/9 16:08'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('509', 'ware_house', '来源卷位置', '半成品暂存库', '1', '2', '2022/10/9 16:08', '2022/10/9 16:08'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('510', 'ware_house', '来源卷位置', '立库', '2', '3', '2022/10/9 16:08', '2022/10/9 16:08'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('511', 'paper_tube_or_frp', '管件类型', '纸管', '1', '1', '2022/10/9 16:14', '2022/10/9 16:14'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('512', 'paper_tube_or_frp', '管件类型', 'FRP管', '2', '2', '2022/10/9 16:14', '2022/10/9 16:14'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('513', 'delivery_point_status', '分切输送线点位状态', '空', '01', '10', '2022/10/11 18:52', '2022/10/11 18:52'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('514', 'delivery_point_status', '分切输送线点位状态', '空载具', '02', '20', '2022/10/11 18:52', - '2022/10/11 18:52'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('515', 'delivery_point_status', '分切输送线点位状态', '有气涨轴', '03', '30', '2022/10/11 18:52', - '2022/10/11 18:52'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('516', 'delivery_point_status', '分切输送线点位状态', '有子卷', '04', '40', '2022/10/11 18:52', - '2022/10/11 18:52'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('517', 'ST_INV_IN_TYPE', '入库单类型', '生产入库', '0001', '1', '2022/10/25 10:04', '2022/10/25 10:04'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('518', 'ST_INV_IN_TYPE', '入库单类型', '退货入库', '0002', '2', '2022/10/25 10:05', '2022/10/25 10:05'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('519', 'ST_INV_IN_TYPE', '入库单类型', '报废入库', '0003', '3', '2022/10/25 10:05', '2022/10/25 10:05'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('520', 'ST_INV_IN_TYPE', '入库单类型', '手工入库', '0009', '999', '2022/10/25 10:06', '2022/10/25 10:06'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('521', 'io_bill_status', '出入单据状态', '生成', '10', '1', '2022/10/25 16:33', '2022/10/25 16:33'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('522', 'io_bill_status', '出入单据状态', '提交', '20', '2', '2022/10/25 16:33', '2022/10/25 16:33'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('523', 'io_bill_status', '出入单据状态', '分配中', '30', '3', '2022/10/25 16:33', '2022/10/25 16:33'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('524', 'io_bill_status', '出入单据状态', '分配完', '40', '4', '2022/10/25 16:34', '2022/10/25 16:34'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('525', 'io_bill_status', '出入单据状态', '确认', '50', '5', '2022/10/25 16:34', '2022/10/25 16:34'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('526', 'io_bill_status', '出入单据状态', '完成', '99', '999', '2022/10/25 16:34', '2022/10/25 16:34'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('527', 'ST_INV_OUT_TYPE', '出库单类型', '发货出库', '1001', '1', '2022/10/27 11:00', '2022/10/28 14:48'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('528', 'ST_INV_OUT_TYPE', '出库单类型', '报废出库', '1002', '2', '2022/10/27 11:01', '2022/10/28 14:48'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('529', 'ST_INV_OUT_TYPE', '出库单类型', '改切出库', '1003', '3', '2022/10/27 11:01', '2022/10/28 14:48'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('530', 'ST_INV_OUT_TYPE', '出库单类型', '手工出库', '1009', '999', '2022/10/27 11:01', '2022/10/28 14:48'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('531', 'sub_package_relation', '子卷包装关系状态', '生成', '0', '10', '2022/10/28 13:22', '2022/10/28 13:22'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('532', 'sub_package_relation', '子卷包装关系状态', '包装', '1', '20', '2022/10/28 13:22', '2022/10/28 13:22'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('533', 'sub_package_relation', '子卷包装关系状态', '入库', '2', '30', '2022/10/28 13:22', '2022/10/28 13:22'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('534', 'sub_package_relation', '子卷包装关系状态', '出库', '3', '40', '2022/10/28 13:22', '2022/10/28 13:22'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('535', 'placement_type', '仓位放置类型', '双通', '01', '1', '2022/10/31 15:26', '2022/10/31 15:26'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('536', 'placement_type', '仓位放置类型', '左通', '02', '2', '2022/10/31 15:26', '2022/10/31 15:26'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('537', 'placement_type', '仓位放置类型', '右通', '03', '3', '2022/10/31 15:27', '2022/10/31 15:27'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('538', 'product_status', '生箔工序工单状态', '空轴搬出', '02', '2', '2022/11/1 13:37', '2022/11/1 13:37'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('539', 'product_status', '生箔工序工单状态', '确认下卷', '03', '3', '2022/11/1 13:37', '2022/11/1 13:37'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('540', 'product_status', '生箔工序工单状态', '下卷完成', '04', '4', '2022/11/1 13:37', '2022/11/1 13:37'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('541', 'sch_hot_point_status', '烘烤区库存状态', '空位', '01', '1', '2022/11/1 15:58', '2022/11/1 15:58'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('542', 'sch_hot_point_status', '烘烤区库存状态', '有料', '02', '2', '2022/11/1 15:58', '2022/11/1 15:58'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('543', 'check_bill_status', '盘点单据状态', '生成', '1', '1', '2022/11/7 14:08', '2022/11/7 14:08'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('544', 'check_bill_status', '盘点单据状态', '审核', '2', '2', '2022/11/7 14:08', '2022/11/7 14:08'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('545', 'check_bill_status', '盘点单据状态', '盘点中', '3', '3', '2022/11/7 14:08', '2022/11/7 14:08'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('546', 'check_bill_status', '盘点单据状态', '确认完成', '99', '999', '2022/11/7 14:08', '2022/11/7 14:08'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('547', 'ST_INV_TYPE_CK', '盘点单业务类型', '计划盘点', '1', '1', '2022/11/7 14:10', '2022/11/7 14:10'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('548', 'ST_INV_TYPE_CK', '盘点单业务类型', '临时盘点', '2', '2', '2022/11/7 14:10', '2022/11/7 14:10'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('549', 'check_dtl_status', '盘点单明细状态', '生成', '1', '1', '2022/11/7 15:14', '2022/11/7 15:14'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('550', 'check_dtl_status', '盘点单明细状态', '盘点中', '2', '2', '2022/11/7 15:14', '2022/11/7 15:14'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('551', 'check_dtl_status', '盘点单明细状态', '已盘点', '3', '3', '2022/11/7 15:15', '2022/11/7 15:15'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('552', 'check_dtl_status', '盘点单明细状态', '异常处理中', '4', '4', '2022/11/7 15:15', '2022/11/7 15:15'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('553', 'check_dtl_status', '盘点单明细状态', '异常处理完成', '5', '5', '2022/11/7 15:15', '2022/11/7 15:15'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('554', 'check_dtl_status', '盘点单明细状态', '确认完成', '99', '999', '2022/11/7 15:15', '2022/11/7 15:15'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('555', 'check_result', '盘点结果', '正常', '1', '1', '2022/11/7 16:31', '2022/11/7 16:31'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('556', 'check_result', '盘点结果', '盘亏', '2', '2', '2022/11/7 16:31', '2022/11/7 16:31'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('557', 'check_result', '盘点结果', '盘盈', '3', '3', '2022/11/7 16:31', '2022/11/7 16:31'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('558', 'move_bill_status', '移库单据状态', '生成', '10', '1', '2022/11/8 9:15', '2022/11/8 9:15'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('559', 'move_bill_status', '移库单据状态', '提交', '20', '2', '2022/11/8 9:15', '2022/11/8 9:15'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('560', 'move_bill_status', '移库单据状态', '执行中', '30', '3', '2022/11/8 9:16', '2022/11/8 9:16'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('561', 'move_bill_status', '移库单据状态', '完成', '99', '999', '2022/11/8 9:16', '2022/11/8 9:16'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('562', 'ST_INV_TYPE_MV', '移库类型', '出库移库', '21', '1', '2022/11/8 9:19', '2022/11/8 9:20'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('563', 'ST_INV_TYPE_MV', '移库类型', '手工移库', '29', '999', '2022/11/8 9:20', '2022/11/8 9:20'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('564', 'cut_product_status', '分切工单状态', '开始', '01', '1', '2022/11/11 14:42', '2022/11/11 14:42'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('565', 'cut_product_status', '分切工单状态', '配送中', '02', '2', '2022/11/11 14:42', '2022/11/11 14:42'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('566', 'cut_product_status', '分切工单状态', '配送完成', '03', '3', '2022/11/11 14:42', '2022/11/11 14:43'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('567', 'cut_product_status', '分切工单状态', '入站中', '04', '4', '2022/11/11 14:42', '2022/11/11 14:42'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('568', 'cut_product_status', '分切工单状态', '入站完成', '05', '5', '2022/11/11 14:43', '2022/11/11 14:43'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('569', 'cut_product_status', '分切工单状态', '出站中', '06', '6', '2022/11/11 14:43', '2022/11/11 14:43'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('570', 'cut_product_status', '分切工单状态', '结束', '09', '999', '2022/11/11 14:43', '2022/11/11 14:43'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('571', 'ST_INV_TYPE_CG', '库存转单类型', '备货转单', '2001', '1', '2022/11/19 23:30', '2022/11/19 23:30'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('572', 'ST_INV_TYPE_CG', '库存转单类型', '手动转单', '2002', '2', '2022/11/19 23:30', '2022/11/19 23:30'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('573', 'is_upload', '是否回传', '否', '0', '1', '2022/11/22 14:48', '2022/11/22 14:48'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('574', 'is_upload', '是否回传', '是', '1', '2', '2022/11/22 14:48', '2022/11/22 14:48'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('575', 'ST_INV_IN_TYPE', '入库单类型', '调拨入库', '0004', '4', '2022/12/1 9:10', '2022/12/1 9:10'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('576', 'ST_INV_OUT_TYPE', '出库单类型', '调拨出库', '1004', '4', '2022/12/1 9:11', '2022/12/1 9:11'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('577', 'print_temple', '客户对应打印模板', '甘肃海亮模板', '1', '1', '2022/12/2 20:13', '2022/12/3 10:24'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('578', 'print_temple', '客户对应打印模板', '标准模板', '2', '2', '2022/12/2 20:13', '2022/12/3 10:25'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('579', 'print_temple', '客户对应打印模板', '冬月能源模板', '3', '3', '2022/12/2 20:13', '2022/12/3 10:25'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('580', 'print_temple', '客户对应打印模板', '鑫川能源模板', '4', '4', '2022/12/2 20:13', '2022/12/3 10:25'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('581', 'print_temple', '客户对应打印模板', '正信电子模板', '5', '5', '2022/12/2 20:13', '2022/12/3 10:26'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('582', 'INANDOUT_BILL_TYPE', '出入库单据类型', '生产入库', '0001', '1', '2022/12/5 14:17', '2022/12/5 14:17'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('583', 'INANDOUT_BILL_TYPE', '出入库单据类型', '退货入库', '0002', '2', '2022/12/5 14:17', '2022/12/5 14:17'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('584', 'INANDOUT_BILL_TYPE', '出入库单据类型', '报废入库', '0003', '3', '2022/12/5 14:17', '2022/12/5 14:17'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('585', 'INANDOUT_BILL_TYPE', '出入库单据类型', '调拨入库', '0004', '4', '2022/12/5 14:17', '2022/12/5 14:17'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('586', 'INANDOUT_BILL_TYPE', '出入库单据类型', '手工入库', '0009', '5', '2022/12/5 14:18', '2022/12/5 14:18'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('587', 'INANDOUT_BILL_TYPE', '出入库单据类型', '发货出库', '1001', '6', '2022/12/5 14:18', '2022/12/5 14:18'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('588', 'INANDOUT_BILL_TYPE', '出入库单据类型', '报废出库', '1002', '7', '2022/12/5 14:19', '2022/12/5 14:19'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('589', 'INANDOUT_BILL_TYPE', '出入库单据类型', '改切出库', '1003', '8', '2022/12/5 14:19', '2022/12/5 14:19'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('590', 'INANDOUT_BILL_TYPE', '出入库单据类型', '调拨出库', '1004', '9', '2022/12/5 14:19', '2022/12/5 14:19'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('591', 'INANDOUT_BILL_TYPE', '出入库单据类型', '手工出库', '1009', '10', '2022/12/5 14:19', '2022/12/5 14:25'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('592', 'sch_cool_ivt_status', '冷却库存状态', '未检测', '03', '30', '2022/12/8 15:44', '2022/12/8 15:44'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('593', 'ST_INV_IN_TYPE', '入库单类型', '拆箱入库', '0005', '5', '2022/12/9 14:55', '2022/12/10 10:37'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('594', 'ST_INV_OUT_TYPE', '出库单类型', '拆箱出库', '1005', '5', '2022/12/9 14:55', '2022/12/10 10:37'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('595', 'INANDOUT_BILL_TYPE', '出入库单据类型', '拆箱入库', '0005', '11', '2022/12/9 14:56', '2022/12/10 10:35'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('596', 'INANDOUT_BILL_TYPE', '出入库单据类型', '拆箱出库', '1005', '12', '2022/12/9 14:56', '2022/12/10 10:35'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('600', 'INTERFACEBACK_TYPE', '接口回传类型', 'CRM', '3', '3', '2022/12/9 15:19', '2022/12/9 15:19'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('601', 'INTERFACEBACK_TYPE', '接口回传类型', 'ERP', '2', '2', '2022/12/9 15:19', '2022/12/9 15:19'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('602', 'INTERFACEBACK_TYPE', '接口回传类型', 'MES', '1', '1', '2022/12/9 15:19', '2022/12/9 15:19'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('603', 'sch_point_type', '点位类型', '入箱', '4', '4', '2022/12/12 16:01', '2022/12/12 16:01'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('604', 'sch_point_type', '点位类型', '出箱', '5', '5', '2022/12/12 16:01', '2022/12/12 16:01'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('605', 'task_priority', '任务优先级', '10101', '1', '1', '2022/12/13 14:27', '2022/12/13 14:27'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('606', 'task_priority', '任务优先级', '10102', '1', '2', '2022/12/13 14:28', '2022/12/13 14:28'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('607', 'task_priority', '任务优先级', '10103', '1', '3', '2022/12/13 14:28', '2022/12/13 14:28'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('608', 'task_priority', '任务优先级', '10201', '1', '4', '2022/12/13 14:28', '2022/12/13 14:28'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('609', 'task_priority', '任务优先级', '10202', '1', '5', '2022/12/13 14:29', '2022/12/13 14:29'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('610', 'task_priority', '任务优先级', '10203', '1', '6', '2022/12/13 14:29', '2022/12/13 14:29'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('611', 'task_priority', '任务优先级', '10204', '1', '7', '2022/12/13 14:32', '2022/12/13 14:32'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('612', 'task_priority', '任务优先级', '10301', '1', '8', '2022/12/13 14:32', '2022/12/13 14:32'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('613', 'task_priority', '任务优先级', '10302', '1', '9', '2022/12/13 14:32', '2022/12/13 14:32'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('614', 'task_priority', '任务优先级', '10303', '1', '10', '2022/12/13 14:32', '2022/12/13 14:32'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('615', 'task_priority', '任务优先级', '10401', '1', '11', '2022/12/13 14:33', '2022/12/13 14:33'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('616', 'task_priority', '任务优先级', '10402', '1', '12', '2022/12/13 14:33', '2022/12/13 14:33'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('617', 'task_priority', '任务优先级', '10403', '1', '13', '2022/12/13 14:33', '2022/12/13 14:33'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('618', 'task_priority', '任务优先级', '10404', '1', '14', '2022/12/13 14:33', '2022/12/13 14:33'); -INSERT INTO `sys_dict` (`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `create_time`, `update_time`) -values ('619', 'task_priority', '任务优先级', '10405', '1', '15', '2022/12/13 14:34', '2022/12/13 14:34'); --- 插入系统数据 -INSERT INTO `sys_dict`(`dict_id`, `code`, `name`, `label`, `value`, `dict_sort`, `dict_type`, `para1`, `para2`, `para3`, - `create_id`, `create_name`, `create_time`, `update_id`, `update_name`, `update_time`) -VALUES ('205', 'system_type', '所属系统', 'LMS系统', '1', NULL, NULL, '1324783485328', NULL, NULL, NULL, NULL, NULL, - '1', '管理员', '2022-12-19 09:21:26'); - - -DROP TABLE IF EXISTS `sys_role`; -CREATE TABLE `sys_role` -( - `role_id` char(19) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'ID', - `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '名称', - `level` decimal(5, 0) NULL DEFAULT NULL COMMENT '角色级别', - `order_seq` decimal(5, 0) NOT NULL DEFAULT 1 COMMENT '排序', - `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '备注', - `is_used` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '1' COMMENT '是否启用', - `is_delete` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '0' COMMENT '是否删除', - `create_id` char(19) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '创建人标识', - `create_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '创建人', - `create_time` varchar(25) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '创建时间', - `update_id` char(19) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '修改人标识', - `update_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '修改人', - `update_time` varchar(25) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`role_id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '角色表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_role --- ---------------------------- -INSERT INTO `sys_role` -VALUES ('1', '超级管理员', 1, 1, '-', '1', '0', '1', '管理员', '2022-10-11 19:52:12', '1', '管理员', - '2022-10-11 19:52:12'); -INSERT INTO `sys_role` -VALUES ('2', '普通用户', 2, 1, '-', '1', '0', '1', '管理员', '2022-10-11 19:52:12', '1', '管理员', - '2022-10-11 19:52:12'); -INSERT INTO `sys_role` -VALUES ('3', '仓库管理员', 3, 1, NULL, '1', '0', '1', '管理员', '2022-10-11 19:52:12', '1', '管理员', - '2022-10-11 19:52:12'); -INSERT INTO `sys_role` -VALUES ('4', '系统管理员', 3, 1, NULL, '1', '0', '1', '管理员', '2022-10-11 19:52:12', '1', '管理员', - '2022-10-11 19:52:12'); -INSERT INTO `sys_role` -VALUES ('5', '生产管理员', 3, 1, NULL, '1', '0', '1', '管理员', '2022-10-11 19:52:12', '1', '管理员', - '2022-10-11 19:52:12'); - -DROP TABLE IF EXISTS `sys_code_rule`; -CREATE TABLE `sys_code_rule` -( - `id` char(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '标识', - `code` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '编码', - `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '名称', - `current_value` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '当前值', - `remark` varchar(1000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '备注', - `is_active` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '1' COMMENT '是否启用', - `is_delete` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '0' COMMENT '是否删除', - `create_id` bigint(0) NULL DEFAULT NULL COMMENT '创建id', - `create_name` char(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '创建者', - `create_time` varchar(25) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '创建时间', - `update_id` bigint(0) NULL DEFAULT NULL COMMENT '修改id', - `update_name` char(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '修改者', - `update_time` varchar(25) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '编码规则表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_code_rule --- ---------------------------- -INSERT INTO `sys_code_rule` -VALUES ('0de65519cd504b8295d00a08768ea3b1', 'MOVE_CODE', '移库编码', NULL, NULL, '1', '0', 1, '管理员', - '2022-11-19 16:22:48', 1, '管理员', '2022-11-19 16:22:48'); -INSERT INTO `sys_code_rule` -VALUES ('67e53322e8a14b519f2ed515777368a0', 'COOLREGION_BILL_CODE', '冷却区单据编码', NULL, NULL, '1', '0', 1, '管理员', - '2022-11-19 16:22:48', 1, '管理员', '2022-11-19 16:22:48'); -INSERT INTO `sys_code_rule` -VALUES ('7e8120b829b644f586c7ba2fcf8c7629', 'IO_CODE', '出入库编码', NULL, NULL, '1', '0', 1, '管理员', - '2022-11-19 16:22:48', 1, '管理员', '2022-11-19 16:22:48'); -INSERT INTO `sys_code_rule` -VALUES ('909bc8c2afd74560809858fd2c980a60', 't', '1', NULL, NULL, '1', '0', 1, '管理员', '2022-11-19 16:22:48', 1, - '管理员', '2022-11-19 16:22:48'); -INSERT INTO `sys_code_rule` -VALUES ('96f43a631cd54069b736a9af2eff49dc', 'PD_CODE', '盘点单编码', NULL, NULL, '1', '0', 1, '管理员', - '2022-11-19 16:22:48', 1, '管理员', '2022-11-19 16:22:48'); -INSERT INTO `sys_code_rule` -VALUES ('9cdd984464e14de38fe1305f24fcebd3', 'CHANGE_CODE', '库存变更编码', NULL, NULL, '1', '0', 1, '管理员', - '2022-11-19 16:22:48', 1, '管理员', '2022-11-19 16:22:48'); -INSERT INTO `sys_code_rule` -VALUES ('dc0be256af95427bb80a36e38f3cf3f7', 'TASK_CODE', '任务编码', NULL, NULL, '1', '0', 1, '管理员', - '2022-11-19 16:22:48', 1, '管理员', '2022-11-19 16:22:48'); -INSERT INTO `sys_code_rule` -VALUES ('f177939e23594c08bc996cd05b743d23', 'HOT_BILL_CODE', '烘箱出入编码', NULL, NULL, '1', '0', 1, '管理员', - '2022-11-19 16:22:48', 1, '管理员', '2022-11-19 16:22:48'); - - -DROP TABLE IF EXISTS `sys_code_rule_detail`; -CREATE TABLE `sys_code_rule_detail` -( - `id` char(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '明细标识', - `type` varchar(2) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '编码规则类型', - `init_value` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '初始值', - `current_value` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '当前值', - `max_value` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '允许最大值', - `step` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '步长', - `fillchar` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '填充值', - `format` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '格式', - `length` decimal(5, 0) NULL DEFAULT NULL COMMENT '长度', - `sort_num` decimal(5, 0) NOT NULL DEFAULT 0 COMMENT '排序号', - `remark` varchar(1000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '备注', - `code_rule_id` char(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '编码规则标识', - `is_active` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '1' COMMENT '是否启用', - `is_delete` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '0' COMMENT '是否删除', - `create_id` bigint(0) NULL DEFAULT NULL COMMENT '创建id', - `create_name` char(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '创建者', - `create_time` varchar(25) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '创建时间', - `update_id` bigint(0) NULL DEFAULT NULL COMMENT '修改id', - `update_name` char(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '修改者', - `update_time` varchar(25) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '编码规则明细表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_code_rule_detail --- ---------------------------- -INSERT INTO `sys_code_rule_detail` -VALUES ('0319348eaff74ea68eceedee56053d56', '01', 'YK', 'YK', '', '', '', '', NULL, 0, '', - '0de65519cd504b8295d00a08768ea3b1', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('12720fff019b46688cb1abd04cfd0fed', '03', '0', '0', '999', '1', '0', '', 3, 3, '', - '9cdd984464e14de38fe1305f24fcebd3', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('274b89ac44d54481bdd8db91ade6e3ca', '02', '20221117', '20221117', '', '', '', 'yyyyMMdd', NULL, 2, '', - '96f43a631cd54069b736a9af2eff49dc', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('525f840467954f049d530a05ac31f9c0', '03', '0', '1', '999', '1', '0', '', 3, 3, '', - '0de65519cd504b8295d00a08768ea3b1', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('5551098abc0e4b6a9e005c4121fe0f97', '03', '0', '0', '999', '1', '0', '', 3, 3, '', - '96f43a631cd54069b736a9af2eff49dc', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('5f1acddba7d24b3c9bc9bc499ada1ac3', '03', '10001', '10179', '99999', '1', '0', '', 5, 3, '', - 'dc0be256af95427bb80a36e38f3cf3f7', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('64ee5f0c684542aea0e093dcab43d51d', '01', 's', 's', '', '', '', '', NULL, 0, '', - '909bc8c2afd74560809858fd2c980a60', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('7b8414d9119044f59ab30ae402592bd7', '02', '20221116', '20221116', '', '', '', 'yyyyMMdd', NULL, 2, '', - 'f177939e23594c08bc996cd05b743d23', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('85629588d3ef4090813b279eff8f3a00', '01', 'LQQ', 'LQQ', '', '', '', '', NULL, 1, '', - '67e53322e8a14b519f2ed515777368a0', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('8c870fdd9fb54a47acc4995e23cff5ff', '01', 'IO', 'IO', '', '', '', '', NULL, 0, '', - '7e8120b829b644f586c7ba2fcf8c7629', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('92b5470d49d6426b9d126d2afc54f69c', '02', '20221229', '20221229', '', '', '', 'yyyyMMdd', NULL, 1, '', - '9cdd984464e14de38fe1305f24fcebd3', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('9355791858104dd08fa1a9d961e7a059', '03', '0', '0', '999', '1', '0', '', 3, 3, '', - 'f177939e23594c08bc996cd05b743d23', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('9846e3b2133a4944bdfeef960d08281b', '01', 'CG', 'CG', '', '', '', '', NULL, 0, '', - '9cdd984464e14de38fe1305f24fcebd3', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('a4029c65a5074b278d7e996ec574adbc', '03', '0', '6', '999', '1', '0', '', 3, 3, '', - '67e53322e8a14b519f2ed515777368a0', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('ac2f89013df94e54996aa94be2603928', '03', '0', '24', '999', '1', '0', '', 3, 2, '', - '7e8120b829b644f586c7ba2fcf8c7629', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('b28e97ec9625499a8db964cad56e76eb', '02', '20221129', '20221129', '', '', '', 'yyyyMMdd', NULL, 1, '', - '0de65519cd504b8295d00a08768ea3b1', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('c9fdd440c7234b3baa07a204bc9a61d4', '01', 'PD', 'PD', '', '', '', '', NULL, 1, '', - '96f43a631cd54069b736a9af2eff49dc', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('d61f54162ada49be87c8531097bf4e34', '02', '20221116', '20221116', '', '', '', 'yyyyMMdd', NULL, 2, '', - '67e53322e8a14b519f2ed515777368a0', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('e349a74daf9648f5bf8f6d49689fc5a7', '01', 'ss', 'ss', '', '', '', '', NULL, 0, '', - '909bc8c2afd74560809858fd2c980a60', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('ebc7677c649d43b7b3cfbd593bc1f4a9', '02', '20221229', '20221229', '', '', '', 'yyyyMMdd', NULL, 1, '', - '7e8120b829b644f586c7ba2fcf8c7629', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); -INSERT INTO `sys_code_rule_detail` -VALUES ('fd9cacd321f84a34b7ce270b64f21567', '01', 'HOT', 'HOT', '', '', '', '', NULL, 1, '', - 'f177939e23594c08bc996cd05b743d23', '1', '0', 1, '管理员', '2022-10-25 10:12:05', 1, '管理员', - '2022-10-25 10:12:05'); - - -DROP TABLE IF EXISTS `sys_param`; -CREATE TABLE `sys_param` -( - `id` char(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '标识', - `code` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '编码', - `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '名称', - `value` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '值', - `remark` varchar(1000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '备注', - `is_active` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '1' COMMENT '是否启用', - `is_delete` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '0' COMMENT '是否删除', - `create_id` char(19) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '创建者ID', - `create_name` char(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '创建者', - `create_time` varchar(25) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '创建时间', - `update_id` char(19) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '修改者ID', - `update_name` char(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '修改者', - `update_time` varchar(25) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '系统参数表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_param --- ---------------------------- -INSERT INTO `sys_param` -VALUES ('078390dd33b846cd92a80d7befff77b3', 'platform', '系统名字', '甘肃海亮铜箔LMS系统', '', '1', '0', '1', '管理员', - '2022-10-10 16:54:39', '1', '管理员', '2022-10-10 16:54:39'); -INSERT INTO `sys_param` -VALUES ('3cfa1aabe2444efc86bae99d0aff9de0', 'SAP_TOKEN', 'TOKEN参数', '877734686FA61EDD99E9D85A96D91E14', '', '1', '0', - '1', '管理员', '2022-10-10 16:54:39', '1', '管理员', '2022-10-10 16:54:39'); -INSERT INTO `sys_param` -VALUES ('59dab529ff744cad9bc01e0fea857618', 'is_connect_acs', '是否连接ACS', '0', '0否,1是', '1', '0', '1', '管理员', - '2022-10-10 16:54:39', '1', '管理员', '2022-10-10 16:54:39'); -INSERT INTO `sys_param` -VALUES ('5e03e0124f964c23aa2f57ef9db84f2b', 'temperature_lose', '温度误差下限值', '5', NULL, '1', '0', '1', '管理员', - '2022-10-10 16:54:39', '1', '管理员', '2022-10-10 16:54:39'); -INSERT INTO `sys_param` -VALUES ('664db7cfd4944ea6b3057cacd84db261', 'SAP_CLIENT', 'SAP客户端', '800', '', '1', '0', '1', '管理员', - '2022-10-10 16:54:39', '1', '管理员', '2022-10-10 16:54:39'); -INSERT INTO `sys_param` -VALUES ('7a049fce270d4cddbdf5cf4b7d826179', 'is_upload', '是否回传', '1', '0-否;1-是', '1', '0', '1', '管理员', - '2022-10-10 16:54:39', '1', '管理员', '2022-10-10 16:54:39'); -INSERT INTO `sys_param` -VALUES ('87fc9a6b0da64dd58b9e7e8b5afe8790', 'temperature_just', '温度误差上限值', '5', NULL, '1', '0', '1', '管理员', - '2022-10-10 16:54:39', '1', '管理员', '2022-10-10 16:54:39'); -INSERT INTO `sys_param` -VALUES ('93f7c59f398f4c1d99ef22cfe75d3b27', 'SAP_URL', 'SAP接口地址', '10.156.2.4:8000', '', '1', '0', '1', '管理员', - '2022-10-10 16:54:39', '1', '管理员', '2022-10-10 16:54:39'); -INSERT INTO `sys_param` -VALUES ('9c07d247c49e4403b441ebb70a6af6e1', 'MES_PASSWORD', 'MES系统密码', 'HaiLiang123456', '', '1', '0', '1', - '管理员', '2022-10-10 16:54:39', '1', '管理员', '2022-10-10 16:54:39'); -INSERT INTO `sys_param` -VALUES ('af8d511eee2f44938145edc00b5b0fb7', 'is_connect_mes', '是否连接MES', '0', '0-否;1-是', '1', '0', '1', '管理员', - '2022-10-10 16:54:39', '1', '管理员', '2022-10-10 16:54:39'); -INSERT INTO `sys_param` -VALUES ('b3e52618097d475abf4caa1e194c71bf', 'MES_USERNAME', 'MES系统账号', 'LMSINTERFACE', '', '1', '0', '1', '管理员', - '2022-10-10 16:54:39', '1', '管理员', '2022-10-10 16:54:39'); -INSERT INTO `sys_param` -VALUES ('c003db12e86847dcafff7fa27d7214f1', 'log_day', '日志保留天数', '8', NULL, '1', '0', '1', '管理员', - '2022-10-10 16:54:39', '1', '管理员', '2022-10-10 16:54:39'); -INSERT INTO `sys_param` -VALUES ('e765d49bada347729620db80fd3a37ff', 'is_mesTolms', '是否启用mes调用lms', '0', '0-否,1-是', '1', '0', '1', - '管理员', '2022-10-10 16:54:39', '1', '管理员', '2022-10-10 16:54:39'); -INSERT INTO `sys_param` -VALUES ('f3b2f2ee46a54f37a23023ad363127c6', 'MAX_TUBE_NUM', '空管最大库存数量', '20', NULL, '1', '0', '1', '管理员', - '2022-10-10 16:54:39', '1', '管理员', '2022-10-10 16:54:39'); -INSERT INTO `sys_param` -VALUES ('f7f54cdb67694687b6f4e7aa15c0fec6', 'MES_URL', 'MES系统地址', 'http://10.1.3.36:8081/', - 'MES的测试环境是:http://10.1.3.23:8081/CamstarApi/\nMES的正式环境是:http://10.1.3.36:8081/CamstarApi/', '1', - '0', '1', '管理员', '2022-10-10 16:54:39', '1', '管理员', '2022-10-10 16:54:39'); - - -DROP TABLE IF EXISTS `sys_data_permission`; -CREATE TABLE `sys_data_permission` -( - `permission_id` bigint(0) NOT NULL COMMENT 'permission_id', - `code` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '编码', - `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '名称', - `order_sort` decimal(5, 0) NULL DEFAULT NULL COMMENT '排序', - `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '备注', - `is_used` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '1' COMMENT '是否启用', - `is_delete` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '0' COMMENT '是否删除', - `create_id` bigint(0) NULL DEFAULT NULL COMMENT '创建人标识', - `create_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '创建人', - `create_time` varchar(25) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '创建时间', - `update_id` bigint(0) NULL DEFAULT NULL COMMENT '修改人标识', - `update_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '修改人', - `update_time` varchar(25) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`permission_id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '数据数据权限表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_data_permission --- ---------------------------- -INSERT INTO `sys_data_permission` -VALUES (1605128919449735168, 'self', '自身数据权限', 1, NULL, '1', '0', 1, '管理员', '2022-12-20 17:12:10', 1, '管理员', - '2022-12-20 17:20:32'); -INSERT INTO `sys_data_permission` -VALUES (1605129738328870912, 'user', '用户数据权限', 2, NULL, '1', '0', 1, '管理员', '2022-12-20 17:15:26', 1, '管理员', - '2022-12-20 17:15:26'); -INSERT INTO `sys_data_permission` -VALUES (1605129882164137984, 'dept', '部门数据权限', 3, NULL, '1', '0', 1, '管理员', '2022-12-20 17:16:00', 1, '管理员', - '2022-12-20 17:20:26'); - --- ---------------------------- --- Table structure for sys_data_scope --- ---------------------------- -DROP TABLE IF EXISTS `sys_data_scope`; -CREATE TABLE `sys_data_scope` -( - `self_user_id` char(19) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '当前用户', - `permission_scope_type` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '数据权限类型', - `dept_id` char(19) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '部门权限列表', - `user_id` char(19) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '用户权限列表' -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '数据权限规则表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_data_scope --- ---------------------------- - --- ---------------------------- --- Table structure for sys_user_data_permission --- ---------------------------- -DROP TABLE IF EXISTS `sys_user_data_permission`; -CREATE TABLE `sys_user_data_permission` -( - `user_id` char(19) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '用户标识', - `permission_scope_type` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '数据权限范围', - `permission_id` char(19) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '权限标识' -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '用户数据权限表' ROW_FORMAT = Dynamic; - -DROP TABLE IF EXISTS `sys_quartz_job`; -CREATE TABLE `sys_quartz_job` -( - `job_id` char(19) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '标识', - `bean_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'bean名', - `cron_expression` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'corn表达式', - `is_pause` bit(1) NULL DEFAULT NULL COMMENT '状态', - `job_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '任务名称', - `method_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '方法名称', - `params` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '参数', - `description` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '备注', - `person_in_charge` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '负责人', - `email` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '邮箱', - `sub_task` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '子任务ID', - `pause_after_failure` bit(1) NULL DEFAULT NULL COMMENT '失败状态', - `create_id` char(19) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '创建人标识', - `create_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '创建人', - `create_time` varchar(25) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '创建时间', - `update_id` char(19) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '修改人标识', - `update_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '修改人', - `update_time` varchar(25) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`job_id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '定时任务表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_quartz_job --- ---------------------------- -INSERT INTO `sys_quartz_job` -VALUES ('2', 'testTask', '0/5 * * * * ?', b'1', '测试1', 'run1', 'test', '带参测试,多参使用json', '测试', NULL, NULL, - NULL, '1', '管理员', '2022-12-05 17:23:03', '1', '管理员', '2022-12-05 17:23:03'); -INSERT INTO `sys_quartz_job` -VALUES ('3', 'testTask', '0/5 * * * * ?', b'1', '测试', 'run', '', '不带参测试', 'Zheng Jie', '', '5,6', b'1', '1', - '管理员', '2022-12-05 17:23:03', '1', '管理员', '2022-12-05 17:23:03'); -INSERT INTO `sys_quartz_job` -VALUES ('6', 'testTask', '0/5 * * * * ?', b'1', '测试3', 'run2', NULL, '测试3', 'Zheng Jie', '', NULL, b'0', '1', - '管理员', '2022-12-05 17:23:03', '1', '管理员', '2022-12-05 17:23:03'); -INSERT INTO `sys_quartz_job` -VALUES ('7', 'cleanLog', '0 0 2 * * ?', b'1', '清除日志', 'run', NULL, '操作日志和异常日志', 'admin', NULL, NULL, b'1', - '1', '管理员', '2022-12-05 17:23:03', '1', '管理员', '2022-12-05 17:23:03'); -INSERT INTO `sys_quartz_job` -VALUES ('88', 'autoCreateTask', '0/5 * * * * ?', b'1', '自动创建任务', 'run', NULL, '自动创建任务', 'ldjun', NULL, NULL, - b'0', '1', '管理员', '2022-12-05 17:23:03', '1', '管理员', '2022-12-05 17:23:03'); -INSERT INTO `sys_quartz_job` -VALUES ('89', 'autoQueryDeviceStatus', '0/5 * * * * ?', b'1', '查询设备状态', 'run', NULL, '查询设备状态', 'zhouz', - NULL, NULL, b'0', '1', '管理员', '2022-12-05 17:23:03', '1', '管理员', '2022-12-05 17:23:03'); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/SupplierbaseController.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/SupplierbaseController.java deleted file mode 100644 index 34dc0c7..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/SupplierbaseController.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.nl.wms.basedata.master.rest; - - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.logging.annotation.Log; -import org.nl.wms.basedata.master.service.SupplierbaseService; -import org.nl.wms.basedata.master.service.dto.SupplierbaseDto; -import org.springframework.data.domain.Pageable; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -/** - * @author zhouz - * @date 2021-12-06 - **/ -@RestController -@RequiredArgsConstructor - -@RequestMapping("/api/supplierbase") -@Slf4j -public class SupplierbaseController { - - private final SupplierbaseService supplierbaseService; - - @GetMapping - @Log("查询供应商") - - public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { - return new ResponseEntity<>(supplierbaseService.queryAll(whereJson, page), HttpStatus.OK); - } - - @PostMapping - @Log("新增供应商") - - public ResponseEntity create(@Validated @RequestBody SupplierbaseDto dto) { - supplierbaseService.create(dto); - return new ResponseEntity<>(HttpStatus.CREATED); - } - - @PutMapping - @Log("修改供应商") - - public ResponseEntity update(@Validated @RequestBody SupplierbaseDto dto) { - supplierbaseService.update(dto); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @Log("删除供应商") - - //@PreAuthorize("@el.check('mdCsSupplierbase:del')") - @DeleteMapping - public ResponseEntity delete(@RequestBody Long[] ids) { - supplierbaseService.deleteAll(ids); - return new ResponseEntity<>(HttpStatus.OK); - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/SupplierbaseService.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/SupplierbaseService.java deleted file mode 100644 index a48fffa..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/SupplierbaseService.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.nl.wms.basedata.master.service; - -import org.nl.wms.basedata.master.service.dto.SupplierbaseDto; -import org.springframework.data.domain.Pageable; - -import java.util.List; -import java.util.Map; - -/** - * @author zhouz - * @description 服务接口 - * @date 2021-12-06 - **/ -public interface SupplierbaseService { - - /** - * 查询数据分页 - * - * @param whereJson 条件 - * @param page 分页参数 - * @return Map - */ - Map queryAll(Map whereJson, Pageable page); - - /** - * 查询所有数据不分页 - * - * @param whereJson 条件参数 - * @return List - */ - List queryAll(Map whereJson); - - /** - * 根据ID查询 - * - * @param supp_id ID - * @return MdCsSupplierbase - */ - SupplierbaseDto findById(Long supp_id); - - /** - * 根据编码查询 - * - * @param code code - * @return MdCsSupplierbase - */ - SupplierbaseDto findByCode(String code); - - - /** - * 创建 - * - * @param dto / - */ - void create(SupplierbaseDto dto); - - /** - * 编辑 - * - * @param dto / - */ - void update(SupplierbaseDto dto); - - /** - * c - * 多选删除 - * - * @param ids / - */ - void deleteAll(Long[] ids); -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/SupplierbaseDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/SupplierbaseDto.java deleted file mode 100644 index 2404584..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/SupplierbaseDto.java +++ /dev/null @@ -1,158 +0,0 @@ -package org.nl.wms.basedata.master.service.dto; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** - * @author zhouz - * @description / - * @date 2021-12-06 - **/ -@Data -public class SupplierbaseDto implements Serializable { - /** 供应商标识 */ - /** - * 防止精度丢失 - */ - @JsonSerialize(using = ToStringSerializer.class) - private Long supp_id; - - /** - * 供应商编码 - */ - private String supp_code; - - /** - * 供应商名称 - */ - private String supp_name; - - /** - * 法人代表 - */ - private String jurid_name; - - /** - * 税务登记号 - */ - private String tax_no; - - /** - * 工商注册号 - */ - private String register_no; - - /** - * 经营许可证号 - */ - private String manage_lice_no; - - /** - * 营业执照 - */ - private String busi_char_name; - - /** - * 行政区划 - */ - private Long area_id; - - /** - * 邮政编码 - */ - private String zip_code; - - /** - * 公司电话 - */ - private String corp_tele_no; - - /** - * 公司地址 - */ - private String corp_address; - - /** - * 创建人 - */ - private String create_id; - - /** - * 创建人姓名 - */ - private String create_name; - - /** - * 创建时间 - */ - private String create_time; - - /** - * 修改人 - */ - private String update_optid; - - /** - * 修改人姓名 - */ - private String update_optname; - - /** - * 修改时间 - */ - private String update_time; - - /** - * 启用时间 - */ - private String is_used_time; - - /** - * 是否启用 - */ - private String is_used; - - /** - * 是否删除 - */ - private String is_delete; - - /** - * 外部标识 - */ - private String ext_id; - - /** - * 条码打印起始值 - */ - private String barcode_print; - - /** - * 备注 - */ - private String remark; - - /** - * 分类标识 - */ - private Long class_id; - - /** - * 分类编码 - */ - private String class_code; - - /** - * 分类名称 - */ - private String class_name; - - /** - * 资金计划履约天数 - */ - private BigDecimal honour_days; -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/SupplierbaseServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/SupplierbaseServiceImpl.java deleted file mode 100644 index 3367801..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/SupplierbaseServiceImpl.java +++ /dev/null @@ -1,165 +0,0 @@ -package org.nl.wms.basedata.master.service.impl; - - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.common.utils.SecurityUtils; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.wql.core.bean.ResultBean; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.modules.wql.util.WqlUtil; -import org.nl.wms.basedata.master.service.ClassstandardService; -import org.nl.wms.basedata.master.service.SupplierbaseService; -import org.nl.wms.basedata.master.service.dto.ClassstandardDto; -import org.nl.wms.basedata.master.service.dto.SupplierbaseDto; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Map; - -/** - * @author zhouz - * @description 服务实现 - * @date 2021-12-06 - **/ -@Service -@RequiredArgsConstructor -@Slf4j -public class SupplierbaseServiceImpl implements SupplierbaseService { - @Autowired - private ClassstandardService classstandardService; - - @Override - public Map queryAll(Map whereJson, Pageable page) { - String where = ""; - WQLObject wo = WQLObject.getWQLObject("md_cs_supplierbase"); - String search = (String) whereJson.get("search"); - if (!StrUtil.isEmpty(search)) { - where = "AND (supp_code like '%" + search + "%' OR supp_name like '%" + search + "%')"; - } - ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), "is_delete = '0'" + where, "update_time desc"); - final JSONObject json = rb.pageResult(); - return json; - } - - @Override - public List queryAll(Map whereJson) { - WQLObject wo = WQLObject.getWQLObject("md_cs_supplierbase"); - JSONArray arr = wo.query().getResultJSONArray(0); - List list = arr.toJavaList(SupplierbaseDto.class); - return list; - } - - @Override - public SupplierbaseDto findById(Long supp_id) { - WQLObject wo = WQLObject.getWQLObject("md_cs_supplierbase"); - JSONObject json = wo.query("supp_id =" + supp_id + "").uniqueResult(0); - if (ObjectUtil.isEmpty(json)) { - return null; - } - final SupplierbaseDto obj = json.toJavaObject(SupplierbaseDto.class); - return obj; - } - - @Override - public SupplierbaseDto findByCode(String code) { - WQLObject wo = WQLObject.getWQLObject("md_cs_supplierbase"); - JSONObject json = wo.query("supp_code ='" + code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(json)) { - return null; - } - final SupplierbaseDto obj = json.toJavaObject(SupplierbaseDto.class); - return obj; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void create(SupplierbaseDto dto) { - String supp_code = dto.getSupp_code(); - SupplierbaseDto supplierbaseDto = this.findByCode(supp_code); - if (supplierbaseDto != null && "0".equals(supplierbaseDto.getIs_delete())) { - throw new BadRequestException("存在相同的供应商编号"); - } - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - - ClassstandardDto classDto = classstandardService.findById(dto.getClass_id() + ""); - if (ObjectUtil.isNotEmpty(classDto)) { - dto.setClass_code(classDto.getClass_code()); - dto.setClass_name(classDto.getClass_name()); - } - - dto.setSupp_id(IdUtil.getSnowflake(1, 1).nextId()); - dto.setCreate_id(currentUserId); - dto.setCreate_name(nickName); - dto.setUpdate_optid(currentUserId); - dto.setUpdate_optname(nickName); - dto.setUpdate_time(now); - dto.setCreate_time(now); - - WQLObject wo = WQLObject.getWQLObject("md_cs_supplierbase"); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - wo.insert(json); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void update(SupplierbaseDto dto) { - SupplierbaseDto entity = this.findById(dto.getSupp_id()); - if (entity == null) { - throw new BadRequestException("被删除或无权限,操作失败!"); - } - ClassstandardDto classDto = classstandardService.findById(dto.getClass_id() + ""); - if (ObjectUtil.isNotEmpty(classDto)) { - dto.setClass_code(classDto.getClass_code()); - dto.setClass_name(classDto.getClass_name()); - } - String supp_code = dto.getSupp_code(); - SupplierbaseDto supplierbaseDto = this.findByCode(supp_code); - if (supplierbaseDto != null && !dto.getSupp_id().equals(supplierbaseDto.getSupp_id()) && "0".equals(supplierbaseDto.getIs_delete())) { - throw new BadRequestException("存在相同的供应商编号"); - } - - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - - String now = DateUtil.now(); - dto.setUpdate_time(now); - dto.setUpdate_optid(currentUserId); - dto.setUpdate_optname(nickName); - - WQLObject wo = WQLObject.getWQLObject("md_cs_supplierbase"); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - wo.update(json); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteAll(Long[] ids) { - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - - WQLObject wo = WQLObject.getWQLObject("md_cs_supplierbase"); - for (Long supp_id : ids) { - JSONObject param = new JSONObject(); - param.put("supp_id", String.valueOf(supp_id)); - param.put("is_delete", "1"); - param.put("update_optid", currentUserId); - param.put("update_optname", nickName); - param.put("update_time", now); - wo.update(param); - } - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_STORAGEVEHICLEEXT.wql b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_STORAGEVEHICLEEXT.wql deleted file mode 100644 index 40b5d14..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_STORAGEVEHICLEEXT.wql +++ /dev/null @@ -1,114 +0,0 @@ -[交易说明] - 交易名: 载具扩展属性设置分页查询 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.storagevehicle_code_begin TYPEAS s_string - 输入.storagevehicle_code_end TYPEAS s_string - 输入.storagevehicle_type TYPEAS s_string - - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - PAGEQUERY - SELECT - info.*, - ext.storagevehicleext_id, - ext.material_id, - ext.pcsn, - ext.qty_unit_id, - ext.qty_unit_name, - ext.storage_qty, - ext.workordercard_id, - ext.is_need_clean, - ext.remark, - d.label AS storagevehicle_type_name, - mdb.material_name, - mdb.material_spec, - mdb.gross_weight, - mdp.old_mark, - point.point_name, - device.device_id AS device_uuid, - device.device_code - FROM - md_pb_storagevehicleinfo info - LEFT JOIN md_pb_storagevehicleext ext ON info.storagevehicle_id = ext.storagevehicle_id - LEFT JOIN sys_dict d ON info.storagevehicle_type = d.value and d.code = 'storagevehicle_type' - LEFT JOIN MD_ME_MaterialBase mdb ON ext.material_id = mdb.material_id - LEFT JOIN MD_ME_ProducMaterialExt mdp ON mdb.material_id = mdp.material_id - LEFT JOIN sch_base_point point ON info.storagevehicle_code = point.vehicle_code - LEFT JOIN EM_BI_DeviceInfo device ON device.device_id = ext.device_uuid - WHERE - info.is_delete = '0' - AND info.storagevehicle_type in (30,31,32,33) - - ENDOPTION - OPTION 输入.storagevehicle_code_begin <> "" - info.storagevehicle_code >= 输入.storagevehicle_code_begin - ENDOPTION - ENDOPTION - OPTION 输入.storagevehicle_code_end <> "" - info.storagevehicle_code <= 输入.storagevehicle_code_end - ENDOPTION - - ENDOPTION - OPTION 输入.storagevehicle_type <> "" - info.storagevehicle_type = 输入.storagevehicle_type - ENDOPTION - - ENDOPTION - OPTION 输入.storagevehicle_type <> "" - info.storagevehicle_type = 输入.storagevehicle_type - ENDOPTION - ENDSELECT - ENDPAGEQUERY - ENDIF - - IF 输入.flag = "2" - PAGEQUERY - SELECT - dict.label, - dict.value - FROM - sys_dict dict - WHERE - dict.code = 'storagevehicle_type' - AND dict.value in (30,31,32,33) - ENDSELECT - ENDPAGEQUERY - ENDIF - - - diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/mdcs.xls b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/mdcs.xls index 24fd3ca1e9266ce746392f4137f4c543e904f588..3e4a97026ce81af1ea7a2458d78db99cb569fddd 100644 GIT binary patch delta 48544 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 PLzi&4REQaQmG*xCOjX!? delta 60028 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 Zz1YCuF~{^8^U=*3uO4ewE|@#_{tJ5Rb;kez diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java index fecf549..43e95de 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java @@ -43,13 +43,6 @@ public class AcsToWmsController { return new ResponseEntity<>(acsToWmsService.orderFinish(string), HttpStatus.OK); } - @PostMapping("/apply") - @Log(value = "申请任务", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS) - @SaIgnore - public ResponseEntity apply(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(acsToWmsService.apply(whereJson), HttpStatus.OK); - } - @PostMapping("/againApply") @Log(value = "二次申请任务", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS) @@ -66,14 +59,6 @@ public class AcsToWmsController { return new ResponseEntity<>(acsToWmsService.deviceApply(jo), HttpStatus.OK); } - @PostMapping("/process") - @Log(value = "RCS上报密集库任务异常处理", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS) - - @SaIgnore - public ResponseEntity process(@RequestBody JSONObject jo) { - return new ResponseEntity<>(acsToWmsService.process(jo), HttpStatus.OK); - } - @PostMapping("/shipDeviceUpdate") // @Log(value = "输送线光电无货上报", isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LMS) diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java index 79787c4..257096e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java @@ -43,14 +43,6 @@ public interface AcsToWmsService { */ Map orderFinish(String string); - /** - * ACS客户端--->LMS服务端 - * 任务申请 - * - * @param whereJson 条件 - * @return JSONObject - */ - JSONObject apply(JSONObject whereJson); /** * ACS客户端--->LMS服务端 @@ -61,15 +53,6 @@ public interface AcsToWmsService { */ JSONObject deviceApply(JSONObject whereJson); - /** - * ACS客户端--->LMS服务端 - * RCS上报密集库任务异常处理 - * - * @param whereJson 条件 - * @return JSONObject - */ - JSONObject process(JSONObject whereJson); - /** * ACS客户端--->LMS服务端 * 输送线光电无货上报 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index e132c5c..e889ebc 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -11,8 +11,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; -import com.google.common.collect.Interner; -import com.google.common.collect.Interners; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -59,7 +57,6 @@ import org.nl.system.service.param.ISysParamService; import org.nl.system.service.param.dao.Param; import org.nl.system.service.param.impl.SysParamServiceImpl; import org.nl.wms.ext.acs.service.AcsToWmsService; -import org.nl.wms.pda.mps.eum.RegionTypeEnum; import org.nl.wms.pda.mps.service.CasingService; import org.nl.wms.pda.mps.service.ShippingService; import org.nl.wms.pda.mps.service.impl.BakingServiceImpl; @@ -69,12 +66,8 @@ import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.manage.AutoSendFeiShu; import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.sch.tasks.CutConveyorTask; -import org.nl.wms.sch.tasks.EmptyVehicleTask; import org.nl.wms.sch.tasks.PaperTrussTask; -import org.nl.wms.sch.tasks.SendOutTask; -import org.nl.wms.st.inbill.service.RawAssistIStorService; import org.nl.wms.st.inbill.service.StorPublicService; -import org.nl.wms.st.instor.service.impl.HandMoveStorServiceImpl; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; @@ -84,8 +77,6 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.lang.reflect.Method; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -98,7 +89,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { private static Map Task_Status_Convers = MapOf.of("1",TaskStatusEnum.EXECUTING.getCode(),"2",TaskStatusEnum.FINISHED.getCode(),"3","0"); - private final RawAssistIStorService rawAssistIStorService; private final StorPublicService storPublicService; @@ -308,467 +298,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { return result; } - @Override - @Transactional(rollbackFor = Exception.class) - @SneakyThrows - public JSONObject apply(JSONObject whereJson) { - log.info("apply请求参数:---------------------------------------------" + whereJson.toString()); - String type = whereJson.getString("type"); - JSONObject result = new JSONObject(); - RLock lock = redissonClient.getLock("acs_to_wms:" + type); - boolean tryLock = lock.tryLock(5, 20, TimeUnit.SECONDS); - try { - if (tryLock) { - String device_code = whereJson.getString("device_code"); - String vehicle_code = whereJson.getString("vehicle_code"); - WQLObject point_table = WQLObject.getWQLObject("SCH_BASE_Point"); - WQLObject struct_table = WQLObject.getWQLObject("ST_IVT_StructAttr"); - - if (ObjectUtil.isEmpty(type)) { - throw new BadRequestException("ACS申请任务失败!任务类型不能为空"); - } - if (ObjectUtil.isEmpty(device_code)) { - throw new BadRequestException("ACS申请任务失败!点位不能为空"); - } - - /* - * 根据type判断是什么业务类型: - * 1.入库任务 - * 2.空盘入库任务 - * 3.空盘出库任务 - * 4.出库口申请入发货区任务 - */ - if ("1".equals(type)) { - boolean checked = true; - boolean auto_div = false; - if (ObjectUtil.isEmpty(vehicle_code)) { - throw new BadRequestException("ACS申请任务失败!载具不能为空"); - } - //通过该木箱码查询对应的分配明细 - JSONArray dis_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("box_no", vehicle_code).addParam("flag", "28").process().getResultJSONArray(0); - // 校验木箱高度 - String height = whereJson.getString("height"); // 高度类型 - JSONObject jsonSub = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + vehicle_code + "'").uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonSub)) { - throw new BadRequestException("请检查子卷包装关系是否存在!"); - } - double box_high = jsonSub.getDoubleValue("box_high"); - // 入库木箱下限 - String in_download_box_high = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("in_download_box_high").getValue(); - // 入库木箱上线 - String in_up_box_high = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("in_up_box_high").getValue(); - String box_type = ""; - if (Double.parseDouble(in_download_box_high) < box_high && box_high <= Double.parseDouble(in_up_box_high)) { - box_type = "2"; - } - - if (Double.parseDouble(in_download_box_high) >= box_high) { - box_type = "1"; - } - if (ObjectUtil.isEmpty(box_type)) { - throw new BadRequestException("木箱高度超出指定范围,比对失败!"); - } - if (!StrUtil.equals(box_type, height)) { - throw new BadRequestException("木箱高度类型错误:当前类型为" + height + ",实际类型应为" + box_type); - } - if (ObjectUtil.isEmpty(dis_rows)) { - throw new BadRequestException("未查询到木箱:" + vehicle_code + "相关入库分配明细记录!"); - } - ArrayList dis_list = new ArrayList<>(); - for (int i = 0; i < dis_rows.size(); i++) { - HashMap dis_map = new HashMap<>(); - JSONObject dis_row = dis_rows.getJSONObject(i); - dis_map.put("box_no", dis_row.getString("box_no")); - dis_map.put("point_code", device_code); - dis_map.put("sect_id", dis_row.getString("sect_id")); - dis_map.put("sect_code", dis_row.getString("sect_code")); - dis_map.put("sect_name", dis_row.getString("sect_name")); - dis_map.put("struct_id", dis_row.getString("struct_id")); - dis_map.put("struct_code", dis_row.getString("struct_code")); - if (StrUtil.isNotEmpty(dis_row.getString("struct_code"))) { - auto_div = true; - checked = false; - } - dis_map.put("struct_name", dis_row.getString("struct_name")); - dis_map.put("iostorinv_id", dis_row.getString("iostorinv_id")); - dis_list.add(dis_map); - } - Map map = new HashMap(); - //查询主存区的sect - JSONObject sect_jo = WQLObject.getWQLObject("st_ivt_sectattr").query("sect_type_attr = '00' AND is_used = '1'").uniqueResult(0); - map.put("tableMater", dis_list); - map.put("point_code", device_code); - map.put("sect_id", sect_jo.getString("sect_id")); - map.put("checked", checked); - map.put("auto_div", auto_div); - map.put("auto_issue", "1"); - //自动分配货位并下发任务 - rawAssistIStorService.divStruct(map); - } - if ("2".equals(type)) { - //查询一个可用的空载具点位并下发给ACS - /* - * 1、优先存放空托盘区、托盘号默认99999;空托盘区没有位置,再找空巷道,或者空巷道有空位置的货位。 - 2、分配货位规则: - a、查找片区内,有空位的巷道,并且两头能够通畅的巷道排;判断巷道的任务类型,只能为入库或者无任务类型; - b、没有,则优先找空的巷道;按空位置顺序分配; - 3、任务下发,判断巷道的任务类型,只能为空盘入库或者无任务类型; - * */ - // 判断是否需要扩容 - isExpansion(); - - vehicle_code = CodeUtil.getNewCode("VEHICCLE_CODE_KTP"); - JSONArray emptyArr = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("flag", "21").process().getResultJSONArray(0); - - JSONObject struct_jo = new JSONObject(); - for (int i = 0; i < emptyArr.size(); i++) { - JSONObject empty_row = emptyArr.getJSONObject(i); - - String block_num = empty_row.getString("block_num"); - String row_num = empty_row.getString("row_num"); - String placement_type = empty_row.getString("placement_type"); - - JSONArray isLock = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('4','5') AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1'").getResultJSONArray(0); - - if (ObjectUtil.isEmpty(isLock)) { - - if ("03".equals(placement_type)) { - // 右通 - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq desc").uniqueResult(0); - break; - } else if ("02".equals(placement_type)) { - // 左通 - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq").uniqueResult(0); - break; - } else { - // 双通 - - // 先倒序找到第一个托盘、判断上一个是否有货位 - JSONObject jsonDescStruct = new JSONObject(); - JSONObject jsonDescBox = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq DESC").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonDescBox)) { - String out_order_seq = jsonDescBox.getString("out_order_seq"); - // 上一个货位顺序号 - jsonDescStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } else { - // 倒序找到第一个空位 - jsonDescStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq DESC").uniqueResult(0); - } - - if (ObjectUtil.isNotEmpty(jsonDescStruct)) { - struct_jo = jsonDescStruct; - break; - } else { - // 没有就正序找到第一个托盘、判断上一个是否有货位 - JSONObject jsonAscStruct = new JSONObject(); - JSONObject jsonAscBox = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq ASC").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonAscBox)) { - String out_order_seq2 = jsonAscBox.getString("out_order_seq"); - // 上一个货位顺序号 - jsonAscStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } else { - jsonAscStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq ASC").uniqueResult(0); - } - - if (ObjectUtil.isNotEmpty(jsonAscStruct)) { - struct_jo = jsonAscStruct; - break; - } - } - } - } else { - continue; - } - } - - if (ObjectUtil.isEmpty(struct_jo)) { - throw new BadRequestException("未查询到可用的空载具存放点位!"); - } - - JSONObject task_jo = new JSONObject(); - task_jo.put("point_code1", device_code); - task_jo.put("point_code2", struct_jo.getString("struct_code")); - task_jo.put("task_type", "010502"); - task_jo.put("vehicle_code", vehicle_code); - EmptyVehicleTask task = new EmptyVehicleTask(); - task.createTask(task_jo); - - //锁定终点、货位点位 - HashMap map = new HashMap(); - map.put("lock_type", "5"); - point_table.update(map, "point_code = '" + struct_jo.getString("struct_code") + "'"); - struct_table.update(map, "struct_code = '" + struct_jo.getString("struct_code") + "'"); - } - if ("3".equals(type)) { - //查询一个可用的空载具点位并下发给ACS - /* - * 1、优先存放空托盘区、托盘号默认99999;空托盘区没有位置,再找空巷道,或者空巷道有空位置的货位。 - 2、分配货位规则: - a、查找片区内,有空位的巷道,并且两头能够通畅的巷道排;判断巷道的任务类型,只能为入库或者无任务类型; - b、没有,则优先找空的巷道;按空位置顺序分配; - 3、任务下发,判断巷道的任务类型,只能为空盘入库或者无任务类型; - * */ - - - // 查询此点位是否有正在进行的任务,如果有则不生成任务 - JSONObject jsonTask = WQLObject.getWQLObject("sch_base_task") - .query("point_code2 = '" + device_code + "' and is_delete = '0' and task_status <> '07'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonTask)) { - result.put("status", HttpStatus.OK.value()); - result.put("message", "此点位已生成任务,请等待任务结束!"); - log.info("apply返回参数:---------------------------------------------" + result.toString()); - return result; - } - - JSONArray empArr = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("flag", "22").process().getResultJSONArray(0); - - JSONObject struct_jo = new JSONObject(); - for (int i = 0; i < empArr.size(); i++) { - JSONObject empty_row = empArr.getJSONObject(i); - - String block_num = empty_row.getString("block_num"); - String row_num = empty_row.getString("row_num"); - String placement_type = empty_row.getString("placement_type"); - - JSONArray isLock = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('4','5') AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1'").getResultJSONArray(0); - - if (ObjectUtil.isEmpty(isLock)) { - if ("01".equals(placement_type) || "03".equals(placement_type)) { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq").uniqueResult(0); - } else { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq desc").uniqueResult(0); - } - if (!ObjectUtil.isEmpty(struct_jo)){ - break; - } - } else { - continue; - } - } - - if (ObjectUtil.isEmpty(struct_jo)) { - throw new BadRequestException("未查询到可用的空载具或当前载具存在任务!!"); - } - - JSONObject task_jo = new JSONObject(); - task_jo.put("point_code1", struct_jo.getString("struct_code")); - task_jo.put("point_code2", device_code); - task_jo.put("task_type", "010504"); - task_jo.put("vehicle_code", struct_jo.getString("storagevehicle_code")); - EmptyVehicleTask task = new EmptyVehicleTask(); - task.createTask(task_jo); - - //锁定终点、货位点位 - HashMap map = new HashMap(); - map.put("lock_type", "4"); - point_table.update(map, "point_code = '" + struct_jo.getString("struct_code") + "'"); - struct_table.update(map, "struct_code = '" + struct_jo.getString("struct_code") + "'"); - } - if ("4".equals(type)) { - CutConveyorTask cutConveyorTask = new CutConveyorTask(); - - //查询该木箱对应的包装关系 - JSONObject sub_jo = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + vehicle_code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(sub_jo)) { - throw new BadRequestException("未查询到该木箱对应的包装关系!"); - } - - //判断是否开启了系统参数生成AGV搬运任务 - String agv_transport = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("agv_transport").getValue(); - //如果未开启AGV搬运则不创建从1016到发货区的任务 - if (agv_transport.equals("0")) { - log.info("未开启AGV搬运系统参数,不生成AGV搬运[" + vehicle_code + "]任务!"); - JSONArray sub_rows2 = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + vehicle_code + "'").getResultJSONArray(0); - for (int i = 0; i < sub_rows2.size(); i++) { - JSONObject sub_row = sub_rows2.getJSONObject(i); - if (StrUtil.isNotEmpty(sub_row.getString("need_delete")) && "1".equals(sub_row.getString("need_delete"))) { - WQLObject.getWQLObject("pdm_bi_subpackagerelation").delete(sub_row); - } - } - result.put("status", HttpStatus.OK.value()); - result.put("message", "下发成功!"); - return result; - } - - // 校验木箱长度类型 - double box_length = sub_jo.getDoubleValue("box_length"); - String length_down_1 = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("box_length_down_1").getValue(); - String length_up_1 = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("box_length_up_1").getValue(); - String length_down_2 = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("box_length_down_2").getValue(); - String length_up_2 = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("box_length_up_2").getValue(); - - Double box_length_down_1 = Double.valueOf(length_down_1); - Double box_length_up_1 = Double.valueOf(length_up_1); - Double box_length_down_2 = Double.valueOf(length_down_2); - Double box_length_up_2 = Double.valueOf(length_up_2); - - - if (box_length_down_1 <= box_length && box_length <= box_length_up_1) { - device_code = device_code + "_1"; - } else if (box_length_down_2 <= box_length && box_length <= box_length_up_2) { - device_code = device_code + "_2"; - } else { - device_code = device_code + "_3"; - } - - String sale_order_name = sub_jo.getString("sale_order_name"); - String box_length_1 = sub_jo.getString("box_length"); - String box_width_1 = sub_jo.getString("box_width"); - String box_high_1 = sub_jo.getString("box_high"); - String product_name = sub_jo.getString("product_name"); - - JSONObject param = new JSONObject(); - param.put("flag", "1"); - param.put("sale_order_name", sale_order_name); - param.put("product_name", product_name); - param.put("box_length", box_length_1); - param.put("box_width", box_width_1); - param.put("box_high", box_high_1); - - //查询是否存在可用的空位 - String point_code = ""; - JSONArray joArr = new JSONArray(); - - // 查找此订单号、物料、木箱长宽高相同的一排 - JSONArray joRow = WQL.getWO("QST_ACSTOLMSTYPE4").addParamMap(param).process().getResultJSONArray(0); - for (int j = 0; j < joRow.size(); j++) { - JSONObject json = joRow.getJSONObject(j); - String row_num = json.getString("row_num"); - - // 查找此排下的所有空位 - JSONArray joEmpPoint = WQL.getWO("QST_ACSTOLMSTYPE4").addParam("flag", "2").addParam("row_num", row_num).process().getResultJSONArray(0); - - if (ObjectUtil.isNotEmpty(joEmpPoint)) { - for (int n = 0; n < joEmpPoint.size(); n++) { - joArr.add(joEmpPoint.getJSONObject(n)); - } - } - } - - if (ObjectUtil.isEmpty(joArr)) { - //查询新的一排 - JSONArray rowArr = WQL.getWO("QST_ACSTOLMSTYPE4").addParam("flag", "3").process().getResultJSONArray(0); - - if (ObjectUtil.isEmpty(rowArr)) { - throw new BadRequestException("未查询到相同销售订单的放货区点位或空的一排!"); - } else { - JSONArray resultJSONArray = point_table.query("point_type = '9' and layer_num = '2' and is_used = '1'").getResultJSONArray(0); - int flag = 8; - - if (ObjectUtil.isEmpty(resultJSONArray)) { - flag = 4; - } - - for (int i = 0; i < rowArr.size(); i++) { - JSONObject point_jo = rowArr.getJSONObject(i); - - JSONArray pointArr = WQLObject.getWQLObject("sch_base_point").query("row_num = '" + point_jo.getString("row_num") + "' AND point_type ='9' AND is_delete = '0' and lock_type = '1' and IFNULL(vehicle_code,'') = '' and is_used = '1' order by out_order_seq ASC").getResultJSONArray(0); - if (pointArr.size() == flag) { - JSONObject jsonNewRow = WQLObject.getWQLObject("sch_base_point").query("row_num = '" + point_jo.getString("row_num") + "' AND point_type ='9' AND is_delete = '0' and lock_type = '1' order by out_order_seq,layer_num").uniqueResult(0); - - if (cutConveyorTask.isSingleTask(jsonNewRow.getString("point_code"))) { - continue; - } - - point_code = jsonNewRow.getString("point_code"); - break; - } - } - } - } else { - // 校验此货位是否被堵住:1.如果被堵住则判断下一个是否被堵住 2.如果全部被堵住则新开一排 - for (int i = 0; i < joArr.size(); i++) { - JSONObject json = joArr.getJSONObject(i); - // 判断是否被挡住 - JSONArray jsonArray = WQL.getWO("QST_ACSTOLMSTYPE4") - .addParam("flag", "4") - .addParam("point_code", json.getString("point_code")) - .process().getResultJSONArray(0); - - if (ObjectUtil.isNotEmpty(jsonArray)) { - // 堵住则判断下一个 - continue; - } else { - if (cutConveyorTask.isSingleTask(json.getString("point_code"))) { - continue; - } - - // 未堵住: 跳出循环 - point_code = json.getString("point_code"); - break; - } - - } - } - - if (ObjectUtil.isEmpty(point_code)) { - // 为空则新开一排 - JSONArray rowArr = WQL.getWO("QST_ACSTOLMSTYPE4").addParam("flag", "3").process().getResultJSONArray(0); - - if (ObjectUtil.isEmpty(rowArr)) { - throw new BadRequestException("未查询到相同销售订单的放货区点位或空的一排!"); - } else { - JSONArray resultJSONArray = point_table.query("point_type = '9' and layer_num = '2' and is_used = '1'").getResultJSONArray(0); - int flag = 8; - - if (ObjectUtil.isEmpty(resultJSONArray)) { - flag = 4; - } - - for (int i = 0; i < rowArr.size(); i++) { - JSONObject point_jo = rowArr.getJSONObject(i); - - JSONArray pointArr = WQLObject.getWQLObject("sch_base_point").query("row_num = '" + point_jo.getString("row_num") + "' AND point_type ='9' AND is_delete = '0' and lock_type = '1' and IFNULL(vehicle_code,'') = '' and is_used = '1' order by out_order_seq ASC").getResultJSONArray(0); - if (pointArr.size() == flag) { - JSONObject jsonNewRow = WQLObject.getWQLObject("sch_base_point").query("row_num = '" + point_jo.getString("row_num") + "' AND point_type ='9' AND is_delete = '0' and lock_type = '1' order by out_order_seq,layer_num").uniqueResult(0); - - if (cutConveyorTask.isSingleTask(jsonNewRow.getString("point_code"))) { - continue; - } - - point_code = jsonNewRow.getString("point_code"); - break; - } - } - } - } - - //创建任务 - JSONObject task_jo = new JSONObject(); - task_jo.put("point_code1", device_code); - task_jo.put("point_code2", point_code); - task_jo.put("vehicle_code", vehicle_code); - task_jo.put("task_type", "010506"); - SendOutTask sendOutTask = new SendOutTask(); - sendOutTask.createTask(task_jo); - - // 锁住点位 - JSONObject jsonPoint = WQLObject.getWQLObject("sch_base_point").query("point_code = '" + point_code + "'").uniqueResult(0); - jsonPoint.put("lock_type", "99"); - jsonPoint.put("vehicle_code", vehicle_code); - WQLObject.getWQLObject("sch_base_point").update(jsonPoint); - } - result.put("status", HttpStatus.OK.value()); - result.put("message", "下发成功!"); - log.info("apply返回参数:---------------------------------------------" + result.toString()); - return result; - } - } finally { - if (lock.isLocked() && lock.isHeldByCurrentThread()) { - try { - lock.unlock(); - } catch (Exception ex) { - } - } - } - result.put("status", HttpStatus.BAD_REQUEST.value()); - result.put("message", "申请任务超时!" + type); - log.info("apply返回参数:---------------------------------------------" + result.toString()); - - return result; - } @Override @Transactional(rollbackFor = Exception.class) @@ -967,73 +496,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { return result; } - @Override - public JSONObject process(JSONObject whereJson) { - log.info("process请求参数:---------------------------------------------" + whereJson.toString()); - String vehicle_code = whereJson.getString("vehicle_code"); - String ext_task_id = whereJson.getString("ext_task_id"); - String srcLocation = whereJson.getString("srcLocation"); - String dtl_type = whereJson.getString("dtl_type"); - log.info("ACS提示原货位:" + srcLocation + "被占用,需要重新分配货位!"); - - //锁定原货位 - HashMap unlock_map = new HashMap(); - unlock_map.put("lock_type", "99"); - unlock_map.put("taskdtl_type", ""); - unlock_map.put("taskdtl_id", ""); - unlock_map.put("task_code", ""); - unlock_map.put("inv_type", ""); - unlock_map.put("inv_id", ""); - unlock_map.put("inv_code", ""); - WQLObject.getWQLObject("sch_base_point").update(unlock_map, "point_code = '" + srcLocation + "'"); - WQLObject.getWQLObject("ST_IVT_StructAttr").update(unlock_map, "struct_code = '" + srcLocation + "'"); - - JSONObject old_struct = WQLObject.getWQLObject("ST_IVT_StructAttr").query("struct_code = '" + srcLocation + "'").uniqueResult(0); - //根据木箱码和任务号查询对应的分配明细 - JSONArray dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("box_no = '" + vehicle_code + "' AND task_id = '" + ext_task_id + "'").getResultJSONArray(0); - - //查询一个新的货位 - JSONObject str_jo = new JSONObject(); - str_jo.put("box_no", vehicle_code); - str_jo.put("sect_id", "1582991348217286656"); - JSONObject new_str = rawAssistIStorService.autoDis(str_jo); - JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + dis_rows.getJSONObject(0).getString("iostorinv_id") + "'").uniqueResult(0); - - //更新分配数据 - HashMap dis_map = new HashMap(); - dis_map.put("struct_id", new_str.getString("struct_id")); - dis_map.put("struct_code", new_str.getString("struct_code")); - dis_map.put("struct_name", new_str.getString("struct_name")); - WQLObject.getWQLObject("ST_IVT_IOStorInvDis").update(dis_map, "box_no = '" + vehicle_code + "' AND task_id = '" + ext_task_id + "'"); - //取消分配之前的货位 - for (int i = 0; i < dis_rows.size(); i++) { - JSONObject i_form = new JSONObject(); - JSONObject dis_row = dis_rows.getJSONObject(i); - i_form.put("struct_id", old_struct.getString("struct_id")); - i_form.put("material_id", dis_row.getString("material_id")); - i_form.put("quality_scode", dis_row.getString("quality_scode")); - i_form.put("pcsn", dis_row.getString("pcsn")); - i_form.put("ivt_level", dis_row.getString("ivt_level")); - i_form.put("change_qty", dis_row.getString("plan_qty")); - i_form.put("bill_type_scode", mst_jo.getString("bill_type")); - i_form.put("inv_id", mst_jo.getString("iostorinv_id")); - i_form.put("bill_code", mst_jo.getString("bill_code")); - i_form.put("bill_table", "ST_IVT_IOStorInv"); - i_form.put("qty_unit_id", dis_row.getString("qty_unit_id")); - i_form.put("qty_unit_name", dis_row.getString("qty_unit_name")); - storPublicService.IOStor(i_form, "32"); - i_form.put("struct_id", new_str.getString("struct_id")); - storPublicService.IOStor(i_form, "31"); - } - JSONObject result = new JSONObject(); - result.put("status", HttpStatus.OK.value()); - result.put("message", "变更货位成功!"); - result.put("srcLocation", old_struct.getString("struct_code")); - result.put("destLocation", new_str.getString("struct_code")); - result.put("dtl_type", "1"); - return result; - } - @Override public JSONObject sendDeviceStatus(JSONObject whereJson) { log.info("sendDeviceStatus--------------输入为:" + whereJson.toString()); @@ -2590,123 +2052,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { return jsonObject; } - /** - * 判断是否需要扩容 - */ - @Transactional - public void isExpansion() { - WQLObject attr = WQLObject.getWQLObject("st_ivt_structattr"); - WQLObject point = WQLObject.getWQLObject("sch_base_point"); - - // 查询空托盘中的空排还剩下多少 - List empList = WQL.getWO("ST_UPDATESTRUCTSECTONE_01").addParam("flag", "1") - .process().getResultJSONArray(0).toJavaList(JSONObject.class); - - if (empList.size() >= 3) { - return; - } - - // 进行扩容:找未锁定、空的一排主存区 - String block_num = ""; - String row_num = ""; - // 是否需要移库 - boolean is_move = false; - - List zcList = WQL.getWO("ST_UPDATESTRUCTSECTONE_01").addParam("flag", "2") - .process().getResultJSONArray(0).toJavaList(JSONObject.class); - - if (ObjectUtil.isNotEmpty(zcList)) { - block_num = zcList.get(0).getString("block_num"); - row_num = zcList.get(0).getString("row_num"); - } else { - // 需要进行移库:找木箱数量较少的那一排移库 - List moveList = WQL.getWO("ST_UPDATESTRUCTSECTONE_01").addParam("flag", "3") - .process().getResultJSONArray(0).toJavaList(JSONObject.class); - - if (ObjectUtil.isNotEmpty(moveList)) { - // 判断是否有锁 - String block_num_in = moveList.stream() - .map(row -> row.getString("block_num")) - .collect(Collectors.joining("','")); - - String row_num_in = moveList.stream() - .map(row -> row.getString("row_num")) - .collect(Collectors.joining("','")); - - List rowList = attr.query("block_num in ('" + block_num_in + "') AND row_num in ('" + row_num_in + "') and layer_num = '1' and sect_code = 'ZC01'") - .getResultJSONArray(0).toJavaList(JSONObject.class); - - for (int i = 0; i < moveList.size(); i++) { - JSONObject json = moveList.get(i); - - List collect = rowList.stream() - .filter(row -> row.getString("block_num").equals(json.getString("block_num")) && - row.getString("row_num").equals(json.getString("row_num")) - ) - .collect(Collectors.toList()); - - // 判断是否全部都为未锁定 - boolean isLock = collect.stream() - .allMatch(row -> row.getString("lock_type").equals("1")); - - if (isLock) { - block_num = json.getString("block_num"); - row_num = json.getString("row_num"); - is_move = true; - break; - } - } - } - } - - // 判断块、排是否为空 - if (ObjectUtil.isEmpty(block_num) && ObjectUtil.isEmpty(row_num)) { - log.info("1层空托盘区扩容失败:没有匹配到有空位的主存区!"); - return; - } - - try { - // 判断是否需要移库 - if (is_move) { - // 查询出这排需要移库的木箱 -- 默认右通(双通) - List needMoveList = attr.query("sect_code = 'ZC01' and block_num = '" + block_num + "' and row_num = '" + row_num + "' and layer_num = '1' and IFNULL(storagevehicle_code,'') <> '' order by out_order_seq ASC") - .getResultJSONArray(0).toJavaList(JSONObject.class); - - // 判断左通、右通 - if (needMoveList.get(0).getString("placement_type").equals("02")) { - // 左通 -- 根据出库顺序进行排序 - needMoveList = attr.query("sect_code = 'ZC01' and block_num = '" + block_num + "' and row_num = '" + row_num + "' and layer_num = '1' and IFNULL(storagevehicle_code,'') <> '' order by out_order_seq DESC") - .getResultJSONArray(0).toJavaList(JSONObject.class); - } - - // 调用移库方法 - JSONObject moveParam = new JSONObject(); - moveParam.put("needMoveList", needMoveList); - moveParam.put("task_group_id", IdUtil.getSnowflake(1, 1).nextId()); - - HandMoveStorServiceImpl bean = SpringContextHolder.getBean(HandMoveStorServiceImpl.class); - bean.createMoveExpansion(moveParam); - } - - } catch (Exception e) { - log.info("1层空托盘区扩容失败:" + e.getMessage()); - return; - } - - // 更新仓位为空托盘区 - JSONObject jsonParam = new JSONObject(); - jsonParam.put("sect_id", RegionTypeEnum.KTP01.getId()); - jsonParam.put("sect_code", "KTP01"); - jsonParam.put("sect_name", RegionTypeEnum.KTP01.getName()); - attr.update(jsonParam, "sect_code = 'ZC01' AND block_num = '" + block_num + "' AND row_num = '" + row_num + "' AND layer_num = '1'"); - - // 更新点位为主存区域 - jsonParam.put("region_id", RegionTypeEnum.KTP01.getId()); - jsonParam.put("region_code", "KTP01"); - jsonParam.put("region_name", RegionTypeEnum.KTP01.getName()); - point.update(jsonParam, "region_code = 'ZC01' AND block_num = '" + block_num + "' AND row_num = '" + row_num + "' AND layer_num = '1'"); - - } @Override public JSONObject actionFinishRequest2(JSONObject param) { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java index c534117..9b79747 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java @@ -53,7 +53,6 @@ import org.nl.wms.pda.mps.service.impl.BakingServiceImpl; import org.nl.wms.pdm.bi.service.dto.SubpackagerelationDto; import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.tasks.CoolCutTask; -import org.nl.wms.st.inbill.service.CheckOutBillService; import org.nl.wms.st.instor.service.impl.ProductScrapServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -70,8 +69,6 @@ import java.util.stream.Collectors; @Slf4j public class MesToLmsServiceImpl implements MesToLmsService { - private final CheckOutBillService checkOutBillService; - private final OutService outService; private final InService inService; @@ -862,58 +859,6 @@ public class MesToLmsServiceImpl implements MesToLmsService { } else { //生成一个改切出库任务 - //查询该箱子所在仓位 - String package_box_sn = plan_jo.getString("package_box_sn"); - String restruct_container_name = plan_jo.getString("restruct_container_name"); - - //查询该包装关系 - JSONObject sub_jo = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("container_name = '" + restruct_container_name + "'").uniqueResult(0); - JSONObject struct = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + package_box_sn + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(struct)) { - throw new BadRequestException("该箱子已出库,不在库内!"); - } - if (!"1".equals(struct.getString("lock_type"))) { - throw new BadRequestException("该木箱正在出库中!"); - } - - //插入主表、明细、分配 - JSONObject mst_jo = new JSONObject(); - mst_jo.put("biz_date", DateUtil.now()); - mst_jo.put("bill_type", "1003"); - mst_jo.put("stor_id", struct.getString("stor_id")); - mst_jo.put("stor_code", struct.getString("stor_code")); - mst_jo.put("stor_name", struct.getString("stor_name")); - mst_jo.put("total_qty", "0"); - mst_jo.put("bill_status", "10"); - - JSONArray rows = new JSONArray(); - JSONObject dtl = new JSONObject(); - //查询该物料 - JSONObject mater_jo = WQLObject.getWQLObject("md_me_materialbase").query("material_code = '" + sub_jo.getString("product_name") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(mater_jo)) { - throw new BadRequestException("未查询到物料:" + sub_jo.getString("product_name") + ",信息!"); - } - dtl.put("material_id", mater_jo.getString("material_id")); - dtl.put("pcsn", plan_jo.getString("restruct_container_name")); - dtl.put("box_no", package_box_sn); - JSONObject unit = WQLObject.getWQLObject("md_pb_measureunit").query("measure_unit_id = '" + mater_jo.getString("base_unit_id") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(unit)) { - throw new BadRequestException("未查询到物料计量单位:" + mater_jo.getString("base_unit_id") + ",信息!"); - } - dtl.put("qty_unit_id", unit.getString("measure_unit_id")); - dtl.put("qty_unit_name", unit.getString("unit_name")); - dtl.put("plan_qty", sub_jo.getString("net_weight")); - dtl.put("source_billdtl_id", plan_jo.getString("workorder_id")); - rows.add(dtl); - mst_jo.put("tableData", rows); - mst_jo.put("user", "mes"); - String iostorinv_id = checkOutBillService.insertDtl(mst_jo); - - //调用自动分配 - JSONObject out_jo = new JSONObject(); - out_jo.put("iostorinv_id", iostorinv_id); - checkOutBillService.allDiv(out_jo); - } } result.put("RTYPE", "S"); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/SapToLmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/SapToLmsServiceImpl.java index 4d498fc..4a47b49 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/SapToLmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/SapToLmsServiceImpl.java @@ -11,8 +11,6 @@ import lombok.extern.slf4j.Slf4j; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.wms.ext.sap.service.SapToLmsService; -import org.nl.wms.st.inbill.service.CheckOutBillService; -import org.nl.wms.st.inbill.service.RawAssistIStorService; import org.nl.wms.st.instor.service.RecutPlanService; import org.springframework.stereotype.Service; @@ -27,106 +25,9 @@ import java.util.stream.Collectors; @Slf4j public class SapToLmsServiceImpl implements SapToLmsService { - private final CheckOutBillService checkOutBillService; - - private final RawAssistIStorService rawAssistIStorService; private final RecutPlanService recutPlanService; - - public JSONObject getReCutInfo2(JSONObject json) { - log.info("getReCutInfo的输入参数为:------------------------" + json.toString()); - - JSONObject jsonMst = new JSONObject(); - - JSONObject result = new JSONObject(); - - String msg = "改切出库单据推送成功!"; - try { - JSONArray dtl_ja = json.getJSONArray("ITEM"); - String LGORT = dtl_ja.getJSONObject(0).getString("LGORT"); - JSONObject stor_jo = WQLObject.getWQLObject("ST_IVT_BSRealStorAttr").query("ext_id = '" + LGORT + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(stor_jo)) { - result.put("RTYPE", "E"); - result.put("RTMSG", "操作失败!" + "未查询到外部标识为:" + LGORT + "对应的仓库!"); - result.put("RTOAL", 1); - result.put("RTDAT", null); - return result; - } - - jsonMst.put("stor_id", stor_jo.getString("stor_id")); - jsonMst.put("stor_code", stor_jo.getString("stor_code")); - jsonMst.put("stor_name", stor_jo.getString("stor_name")); - jsonMst.put("detail_count", dtl_ja.size()); - jsonMst.put("bill_status", "10"); - jsonMst.put("create_mode", "03"); - jsonMst.put("bill_type", "1003"); - jsonMst.put("biz_date", DateUtil.now()); - jsonMst.put("user", "sap"); - - JSONArray dtls = new JSONArray(); - for (int i = 0; i < dtl_ja.size(); i++) { - JSONObject jo = dtl_ja.getJSONObject(i); - String sap_pcsn = jo.getString("CHARG"); - if (StrUtil.isEmpty("sap_pcsn")) { - throw new BadRequestException("请求参数SAP批次不能为空!"); - } - JSONObject sub_jo = WQLObject.getWQLObject("PDM_BI_SubPackageRelation").query("sap_pcsn = '" + sap_pcsn + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(sub_jo)) { - throw new BadRequestException("LMS中不存在SAP批次为【" + sap_pcsn + "】的包装关系"); - } - String container_name = sub_jo.getString("container_name"); - JSONObject struct_ivt = WQLObject.getWQLObject("st_ivt_structivt").query("pcsn = '" + container_name + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(struct_ivt)) { - throw new BadRequestException("SAP批次为【" + sap_pcsn + "】的成品卷不存在或已经出库!"); - } else { - if (struct_ivt.getDoubleValue("frozen_qty") > 0) { - msg = "SAP批次为【" + sap_pcsn + "】的成品卷已经被分配或出库中"; - } else { - JSONObject dtl = new JSONObject(); - //查询该物料 - JSONObject mater_jo = WQLObject.getWQLObject("md_me_materialbase").query("material_code = '" + sub_jo.getString("product_name") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(mater_jo)) { - throw new BadRequestException("未查询到物料:" + sub_jo.getString("product_name") + ",信息!"); - } - dtl.put("material_id", mater_jo.getString("material_id")); - dtl.put("pcsn", container_name); - dtl.put("box_no", sub_jo.getString("package_box_sn")); - JSONObject unit = WQLObject.getWQLObject("md_pb_measureunit").query("measure_unit_id = '" + mater_jo.getString("base_unit_id") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(unit)) { - throw new BadRequestException("未查询到物料计量单位:" + mater_jo.getString("base_unit_id") + ",信息!"); - } - dtl.put("qty_unit_id", unit.getString("measure_unit_id")); - dtl.put("qty_unit_name", unit.getString("unit_name")); - dtl.put("plan_qty", sub_jo.getString("net_weight")); - dtls.add(dtl); - } - } - } - - if (!dtls.isEmpty()) { - jsonMst.put("tableData", dtls); - String iostorinv_id = checkOutBillService.insertDtl(jsonMst); - - //调用自动分配 - JSONObject out_jo = new JSONObject(); - out_jo.put("iostorinv_id", iostorinv_id); - checkOutBillService.allDiv(out_jo); - } else { - throw new BadRequestException("推送失败!SAP推送的子卷明细不符合出库状态!"); - } - } catch (Exception exception) { - result.put("TYPE", "E"); - result.put("MESSAGE", "推送失败!" + exception.getMessage()); - log.info("getMaterialInfo的输出参数为:------------------------" + result.toString()); - return result; - } - result.put("TYPE", "S"); - result.put("MESSAGE", msg); - log.info("getMaterialInfo的输出参数为:------------------------" + result.toString()); - return result; - } - @Override public JSONObject getReCutInfo(JSONObject json) { log.info("getReCutInfo的输入参数为:------------------------" + json.toString()); @@ -504,30 +405,9 @@ public class SapToLmsServiceImpl implements SapToLmsService { } // 发货出库 if (StrUtil.equals(lfart, "ZLF")) { - jsonMst.put("tableData", tableData); - // 调用出库新增并分配 - String iostorinv_id = checkOutBillService.insertDtl2(jsonMst); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("iostorinv_id", iostorinv_id); } // 分拣出库 if (StrUtil.equals(lfart, "ZJS")) { - jsonMst.put("buss_type", "1011"); - jsonMst.put("bill_type", "1011"); - jsonMst.put("tableData", tableData); - // 调用出库新增并分配 - String iostorinv_id = checkOutBillService.insertDtl2(jsonMst); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("iostorinv_id", iostorinv_id); - } - // 退货入库 - if (StrUtil.equals(lfart, "ZLR")) { - jsonMst.put("tableData", box_rows); - //创建退货入库单 - jsonMst.put("bill_type", "0002"); - jsonMst.put("biz_date", DateUtil.now()); - jsonMst.put("bill_status", "10"); - rawAssistIStorService.insertDtl(jsonMst); } } @@ -604,89 +484,6 @@ public class SapToLmsServiceImpl implements SapToLmsService { log.info("getCannibalize的输入参数为:------------------------" + jo.toString()); JSONObject result = new JSONObject(); - WQLObject storTab = WQLObject.getWQLObject("st_ivt_bsrealstorattr"); // 仓库表 - WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase"); // 物料表 - WQLObject unitTab = WQLObject.getWQLObject("md_pb_measureunit"); // 基础单位表 - - // 校验调入仓库和调出仓库是否存在 - String lgort_out = jo.getString("LGORT1"); // 调出仓库 - String lgort_in = jo.getString("LGORT2"); // 调入仓库 - - if (ObjectUtil.isEmpty(jo.getString("ZDBSQD"))) { - throw new BadRequestException("交货单不能为空!"); - } - - JSONObject jsonStorOut = storTab.query("stor_code = '" + lgort_out + "' and is_used = '1' and is_delete = '0'").uniqueResult(0); - JSONObject jsonStorIn = storTab.query("stor_code = '" + lgort_in + "' and is_used = '1' and is_delete = '0'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonStorOut) || ObjectUtil.isEmpty(jsonStorIn)) { - result.put("RTYPE", "E"); - result.put("RTMSG", "操作失败!,调入仓库或调出仓库有误,请检查!"); - result.put("RTOAL", 1); - result.put("RTDAT", null); - return result; - } - - try { - // 创建调拨出库单 - // 主表 - JSONObject jsonMst = new JSONObject(); - jsonMst.put("io_type", "1"); - jsonMst.put("buss_type", "1004"); - jsonMst.put("bill_type", "1004"); - jsonMst.put("source_id", jo.getLongValue("ZDBSQD")); - jsonMst.put("source_name", "调拨单"); - jsonMst.put("stor_id", jsonStorOut.getString("stor_id")); - jsonMst.put("stor_code", jsonStorOut.getString("stor_code")); - jsonMst.put("stor_name", jsonStorOut.getString("stor_name")); - jsonMst.put("out_stor_id", jsonStorIn.getString("stor_id")); - jsonMst.put("detail_count", 1); - jsonMst.put("bill_status", "10"); - jsonMst.put("create_mode", "03"); - jsonMst.put("biz_date", DateUtil.now()); - jsonMst.put("user", "sap"); - - // 明细 - JSONArray item = jo.getJSONArray("ITEM"); - - JSONArray tableData = new JSONArray(); - for (int i = 0; i < item.size(); i++) { - JSONObject jsonObject = item.getJSONObject(i); - JSONObject jsonDtl = new JSONObject(); - - JSONObject jsonMater = materTab.query("material_code = '" + jsonObject.getString("MATNR") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonMater)) { - throw new BadRequestException("此物料不存在" + jsonObject.getString("MATNR")); - } - JSONObject jsonUnit = unitTab.query("measure_unit_id = '" + jsonMater.getString("base_unit_id") + "'").uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonObject.getString("KALAB"))) { - throw new BadRequestException("调拨数量不能为空!"); - } - if (ObjectUtil.isEmpty(jsonObject.getString("ZVBELN"))) { - throw new BadRequestException("订单不能为空!"); - } - - jsonDtl.put("material_id", jsonMater.getString("material_id")); - jsonDtl.put("qty_unit_id", jsonMater.getLongValue("base_unit_id")); - jsonDtl.put("qty_unit_name", jsonUnit.getString("unit_name")); - jsonDtl.put("plan_qty", jsonObject.getDoubleValue("KALAB")); - jsonDtl.put("source_bill_code", jsonObject.getString("ZVBELN")); - jsonDtl.put("vbeln", jo.getString("ZDBSQD")); // 来源交货单 - jsonDtl.put("width", jsonObject.getString("ZHL02")); // 幅宽 - tableData.add(jsonDtl); - } - jsonMst.put("tableData", tableData); - - // 调用出库新增 - checkOutBillService.insertDtl2(jsonMst); - } catch (Exception e) { - result.put("RTYPE", "E"); - result.put("RTMSG", "操作失败!" + e.getMessage()); - result.put("RTOAL", 1); - result.put("RTDAT", null); - log.info("getDeliveryInfo的输出参数为:------------------------" + result.toString()); - return result; - } result.put("RTYPE", "S"); result.put("RTMSG", "操作成功!"); result.put("RTOAL", 1); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/FeedingServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/FeedingServiceImpl.java index 26e118d..aa71332 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/FeedingServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/FeedingServiceImpl.java @@ -17,14 +17,11 @@ import org.nl.modules.wql.core.content.HttpContext; import org.nl.modules.wql.util.SpringContextHolder; import org.nl.wms.basedata.st.service.impl.UserAreaServiceImpl; import org.nl.wms.ext.acs.service.WmsToAcsService; -import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl; -import org.nl.wms.ext.mes.service.LmsToMesService; import org.nl.wms.pda.mps.eum.RegionTypeEnum; import org.nl.wms.pda.mps.service.FeedingService; import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.tasks.CoolCutTask; import org.nl.wms.sch.tasks.OutHotTask; -import org.nl.wms.st.inbill.service.CheckOutBillService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -34,9 +31,7 @@ import java.util.HashMap; @RequiredArgsConstructor @Slf4j public class FeedingServiceImpl implements FeedingService { - private final LmsToMesService lmsToMesService; - private final CheckOutBillService checkOutBillService; @Override public JSONObject queryMaterialInfo(JSONObject whereJson, HttpContext ctx) { @@ -166,59 +161,7 @@ public class FeedingServiceImpl implements FeedingService { } else { - //生成一个改切出库任务 - //查询该箱子所在仓位 - String package_box_sn = plan_jo.getString("package_box_sn"); - String restruct_container_name = plan_jo.getString("restruct_container_name"); - - //查询该包装关系 - JSONObject sub_jo = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("container_name = '" + restruct_container_name + "'").uniqueResult(0); - JSONObject struct = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + package_box_sn + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(struct)) { - throw new BadRequestException("该箱子已出库,不在库内!"); - } - if (!"3".equals(struct.getString("lock_type"))) { - throw new BadRequestException("该木箱正在出库中!"); - } - - //插入主表、明细、分配 - JSONObject mst_jo = new JSONObject(); - mst_jo.put("biz_date", DateUtil.now()); - mst_jo.put("bill_type", "1003"); - mst_jo.put("stor_id", struct.getString("stor_id")); - mst_jo.put("stor_code", struct.getString("stor_code")); - mst_jo.put("stor_name", struct.getString("stor_name")); - mst_jo.put("total_qty", "0"); - mst_jo.put("bill_status", "10"); - - JSONArray rows = new JSONArray(); - JSONObject dtl = new JSONObject(); - //查询该物料 - JSONObject mater_jo = WQLObject.getWQLObject("md_me_materialbase").query("material_code = '" + sub_jo.getString("product_name") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(mater_jo)) { - throw new BadRequestException("未查询到物料:" + sub_jo.getString("product_name") + "基础信息!"); - } - dtl.put("material_id", mater_jo.getString("material_id")); - dtl.put("pcsn", plan_jo.getString("restruct_container_name")); - dtl.put("box_no", package_box_sn); - JSONObject unit = WQLObject.getWQLObject("md_pb_measureunit").query("measure_unit_id = '" + mater_jo.getString("base_unit_id") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(unit)) { - throw new BadRequestException("未查询到物料计量单位:" + mater_jo.getString("base_unit_id") + "基础信息!"); - } - dtl.put("qty_unit_id", unit.getString("measure_unit_id")); - dtl.put("qty_unit_name", unit.getString("unit_name")); - dtl.put("plan_qty", sub_jo.getString("net_weight")); - dtl.put("source_billdtl_id", plan_jo.getString("workorder_id")); - rows.add(dtl); - mst_jo.put("tableData", rows); - mst_jo.put("user", "mes"); - String iostorinv_id = checkOutBillService.insertDtl(mst_jo); - - //调用自动分配 - JSONObject out_jo = new JSONObject(); - out_jo.put("iostorinv_id", iostorinv_id); - checkOutBillService.allDiv(out_jo); } JSONObject jo = new JSONObject(); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductInstorServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductInstorServiceImpl.java index 2476e55..5e0fcfe 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductInstorServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductInstorServiceImpl.java @@ -8,13 +8,9 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.nl.b_lms.pdm.subpackagerelation.dao.PdmBiSubpackagerelation; -import org.nl.b_lms.pdm.subpackagerelation.service.IpdmBiSubpackagerelationService; import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; import org.nl.common.utils.SecurityUtils; import org.nl.modules.common.exception.BadRequestException; @@ -29,7 +25,6 @@ import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl; import org.nl.wms.ext.mes.service.LmsToMesService; import org.nl.wms.pda.st.service.ProductInstorService; import org.nl.wms.sch.tasks.CutConveyorTask; -import org.nl.wms.st.inbill.service.RawAssistIStorService; import org.nl.wms.st.inbill.service.StorPublicService; import org.nl.wms.st.inbill.service.impl.InbillServiceImpl; import org.redisson.api.RLock; @@ -54,9 +49,6 @@ import java.util.stream.Collectors; @Slf4j public class ProductInstorServiceImpl implements ProductInstorService { - private final InbillServiceImpl inbillService; - - private final RawAssistIStorService rawAssistIStorService; private final StorPublicService storPublicService; @@ -201,7 +193,6 @@ public class ProductInstorServiceImpl implements ProductInstorService { if (ObjectUtil.isNotEmpty(box_mst_jo)) { iostorinv_id = box_mst_jo.getString("iostorinv_id"); } else { - iostorinv_id = rawAssistIStorService.insertDtl(mst_jo); } //判断是否虚拟 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/VirtualOutServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/VirtualOutServiceImpl.java index 7c4858f..e99b8e4 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/VirtualOutServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/VirtualOutServiceImpl.java @@ -15,7 +15,6 @@ import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.wms.basedata.st.service.impl.UserStorServiceImpl; import org.nl.wms.pda.st.service.VirtualOutService; -import org.nl.wms.st.inbill.service.CheckOutBillService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -30,8 +29,6 @@ import org.springframework.transaction.annotation.Transactional; @Slf4j public class VirtualOutServiceImpl implements VirtualOutService { - private final CheckOutBillService checkOutBillService; - @Autowired private IStIvtIostorinvOutService iStIvtIostorinvOutService; @@ -153,8 +150,6 @@ public class VirtualOutServiceImpl implements VirtualOutService { // 调用强制完成接口(判断是一期还是二期) if (jsonMst.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { iStIvtIostorinvOutService.confirm(jsonMst); - } else { - checkOutBillService.confirmOrder(jsonMst); } } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/PDM_BI_DEVICE01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/PDM_BI_DEVICE01.wql deleted file mode 100644 index 7f4e565..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/PDM_BI_DEVICE01.wql +++ /dev/null @@ -1,58 +0,0 @@ -[交易说明] - 交易名: 设备查询 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.search TYPEAS s_string - - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - PAGEQUERY - SELECT - device.* - FROM - em_bi_deviceinfo device - WHERE - device.is_delete = '0' - - OPTION 输入.search <> "" - (device.device_code like 输入.search or - device.device_name like 输入.search) - ENDOPTION - - ENDSELECT - ENDPAGEQUERY - ENDIF \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/em.xls b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/em.xls index 24be88f248f8eff49cd7464993132ec6da89a86d..f17cbbb0eafb1b9e38314deaff39e0e397f1231b 100644 GIT binary patch literal 57344 zcmeHw2Vhl2x9&dafdmpdp`C;P0g@01y@nMFbJSN)zmYiXay9zHjF2diDv#|G)3v|Gm3UCVQ_nYt~w`W=)^7&+!jJ&u!cj zc3!buZ540jR$-vxXTUq~%pk51Me)J|;ai1;g%YVKc>Le%Kga@qL)X!+GR(x?7lCE& zj}U+mh)@EdBtj5EFhVJW(g<(?B^03yLRo}z2;~tfAXG%CgiskF4511_RfK8?)e&kS zI1$1TA`ogKL?YBesEtquAqt@`LOq1~2+;^J2(bta5aJLTA~ZsXM`(=D1feNHGlb>{ zEf88Fv_fc&&<3F`LOX;6g!Tv>5IQ1sLg19{`JKvV34O=}xTrgQjb%c; zd=VJ+Us?Yt&szV9i-g=-2(=N4TmPBfQ~hV$|6cYMNND7HdepJ^L!X?keBmh9dVu2P z6zyykcmvz}8dF13{}`5)_hbI0zTcEolt1V^UR9MFxY1wWKM99%e;~qJc^Pr}L;A95 zyyGh{AVhKaDW%tWoubQ$KIhNU{rx`c5Z3KodNc&Q>Z;ZMx9=hotRTE@cL#|uu4m_rth?F=&19zpVJb zOVGY7{(1&`U z5AlF6>j59=0dH43m|r_QYnipYs{7POYg1NnL@1XEBQU9nMyQF2N-ITThGGJvW2^f# zQT#AXvLPP=UrR@Wdyj{N%`if%?4B?dvOGzXan*g=BRkbSCoNjC%48H~WsMX^3Mz%n zSv@@IIU~LmCOO7fbKdPJB4C{ekxHgb5YN?p24EUkR|@kahImf`80U#~4vMIy=X}WQ z+UaT*=9x|kZigzPb5Zk^iD_*^yL?&Mx#!M~q9{=f&{mXJ97ECc7)z-xN@*x2+GhMv zSi8DU3wUOjeG=VAJSA=g@2p}?tSW6URmMu$ogvv-RPv%U&>5W*YZ8j`TcH!RRlQzy z67K-`TVaTzT)Q(oyJb6iPk3^*qyK*y??9pHm$Wn2ZiM}RS7TIsvqA2;l&nxv@d*=t!WAsLa^$L(9iA&)cKE6){v)w)gaN#? z16RZZy~JbjOyapp=E6Jihy^zb-jXlQ2n7Ag(9lOpJ_7w42>qE@#UHA1sD|QGLEys; zcu6nu5gI-tL((@B^fgudN6K(KBKuMw&e~mij=+dP%NJ+z0?&?;mrp&xhqHS#K1Sf{ zxZ&#yJXZnD^lb&6D}!cy4G;Ke4}7Y7z*qLbN9yS=SK8TK&uSj{SMB~glP|D>poB_|(*%3ZyerJS+BskIG`pNp`uj4}#oQUz0^~)baOhG?8 z)PxTZ^w_(Zq2dEYeUW(ddbW5W*Tu(3k6z3|FZBu3@h&?61APp5SG|+;*lSYxxag(+ zuv=@Fo-RBnVSjgh$Y-LDyFQZMJ-1l@# z2~}9{O!R`k1N9N(A0r=wJzaR(&83fvUXCjy9{Q;Ha@7~sBM0|aZSjz6!Am{{zjE<0 z$Yrjer$w%6A9s4$4!GlGyJX^Hw1e!I-Q~LBU3`pqVK+)QFZh`F z>*cHZgR#7fej@SQz?9{s`ib-(9k2R{6|ee<#A9F&K5P$FK9awVSNT}+Djy@>XlElH z?We7MuwQS%OTTjW6N&dk54`FpKEY1TuQfilcq6@RSKa9)UiyiloizEsfsY9<%Gbs} z4fH;8Jg?OYO;3q;*T;zW#0Oqvv8UvZ*42WS{N3@A-o3mey*q#1-^_li`;Uq@wr>Xe z_{e#XyB*}X8tw`Ibn4?1mz~i90}npxc*ccCO|->>5_sgxLSI(koo@Wg2|Q+<7J7;I zL=P#=sVsvWk7@jy11l~go_03l35op1nemcOxEsB+zmV%nppOrQeJuRTL|_+;A!vPy<8~~ zR|y-OzYQ+H2Iu3#6&4=V_{|B3vdCtEI&hLm$_8N(v}n%^wDac8D}t6QEDkJgm&4h$ z!gk!9R+w(Awe`T;=i-KE!%anCmd5C(fK7t8a5P zO!_uuIS|y#T~;kbdEpd=tOsvhIp!t{n~56EJv~>_^z?;qyQg2T_!W`9jye7J>or=n z?AE6nyXTdimnxq%Ouz0duMLsFQ(mohX;ci_ zcoVIz74u-_+qf9CO-!_A+gkbZeCVC#t(l1yfOfgtoE^Pxb7OaFZ*!~9v@oPk&#+5x z&X+ZPOGEmjJ&K>6XJl3V8^znD2Z46E=br-_HN8AJtPR|yu^6L+NPI6E8^wuxb2bPP8I1;4BC#xpzTx)+RnwG z?N$uhyNf~Fy%@ATib3167_^DSpzT!*+TO*W?Nbceq+-zaEe36JF=+c0gO&&5@3dYF zCJSsi$Qx&5wzAuonIDE8`YydjFXx>YZOz8kY#N^hZjL>Z4^fs z^unXzay5$91gRiVGh(2|qlW}(#Z55sb_uNcO-F(|E#J&y&}J1u+uqW-i~_BoS$qNk$``y>0E7%n7h6F$U?2t%TK@W5L9eHLU{2{S$#!CfWZECgcAdOeXvj zCe}in2qwiTL~8|`B+}azxQAiNWF+uZVAjH&QViOu#h{&51g*8ar-QcGUTU?{3^1{` zvIi^W2n{()w^mU1f#1wx(9SA?*6JFwJt}Qi-0mauIsan%xy4Lx^`3bmulBlHX>*G~ zd&DE{3NLh(xk}-~0b$C+hS9vkp%i*4&4<0Q5J?qMh2(k{@*bM&BkpB#eZ{?OuAjJ< z%k>xc^0@)xULiLS_duMd#CHe28T;;XHxXVXAc8ScL@-vceH2GV{@uwBrblN!98le? zkypt=A4QFoNdm?98yx;wYu31N_bv_YjFF_Jv4x2*XIxzP?(#arC4Z-df0IIAMUPjN z;x~MR1Sbv%xGCiw0;MR0v1*d4dXh#qNkX+GToIskgYkV&O-j5?k}_HnE)2*d)%7He zZIYDLl5l;1Ndob0Qk2DtrRja#tmRb>)?$oG>Xf8^*pQYNqqbdY5Mv|7tnc@J&(K5w*(Szv&hOA#RX})x`+GaI;sucz(Rw~IN z9EXsxBhm=x*=s3IoD6rm5k4G1Hzc{d96r?xOW|0$=MtNlu2ts$(HNd*4 z6e{cbWZkq_tes$8R0_$uJdUcn*^~yb+BDqFrfPi*hZ&2sDcM4m7HLzJb$OJNn@!nJS#4U&&8BLD6^;h7NSl(K)uy$Jw5iUzQPDQF zV_m06o9e9Ni?*p9>!>1as+;y8cC%>{8=JEzi)xgHdtxT0i8rO0wNSI-0;&8 zPITBrb~Gd71+tSF*;pVun~_a`tc*8Jlu&ubW2n$b3+(Q@Fuzg*bEHa01-j~N8;jJ` zy_>FkQz86rovNveDim)A(K1A&)V+rpDRu8@MpE}+e7#gNP;()qmrlh~AJRa*%}6Pv zj~OY2B$<&?NMBtDizO5k~BJHIp6{Ww=p@ZD{#vD5CRW{ z7%9bb&k@-pGSer;&KNf~_-M}(hn*n_=jUvkzU-4`X$PV@r|x}k=Yi`=$Ms?D-!Ay@ z@y||Qx_Do+V`s~qdbE4+py>7f!4IXsADj35)!ETcR@wGx*Q#$uk3Ii(`ODwVsC4An z#bwWSduMW=IWqy%;&VO@5aF-<-Tr_d@6I>(?&f)%pZfxT)Qc3ja8$*Z8VU${nitbG02WKKV({X(z{i)N|DrKQukQ zb@ATMo~ZuHzAq~`+wk){*K2=KW%SanUGwI@;GB3dH}~#m-qKzJX7TP0JbdK-{8BG@zZdM>GpY809t9nbe(Jay_UoqboNZoj>`sn5QEK$%iqYeT4SB1| z&4{gugTCMK{i7)dV^iYV4s6)EbK`nzKmK#^$ESXL_@E*sghcOqri^b+ezz0)@K!=FB0xBr2q)4$mj`_AXzO=zO9c z^>6*MW6y7BM1iLWf^(fqTg z7VPq#{mSaYUq|IV(CAp>{J>tTDo(v;{UV$+e2<<}<g%&#HokB4-P^lPOS`b} z#kVIsJ)u+56U#PS^k0yiHU06V4|X1CTyE$u3p?DX``z%tqaF^gmUE(U%CjBIUVU%J z-3eEp&wTWYS=$Z|TJ`Z~Umfq#q5tsy;eRcQ`(RPCtI6j#KlD{douf^DkJ)jdUbugJ z=u0nbNIv&%UfhzIX%XqC*0u7wHg)~nvhViT|Jn3UqJLiA;lzFQ);%Bhb?l@^YfMR7 zKeFE$N6)m1e{N`<8}eq>((UzrkG&D!>Ck;OCd_>Lz?D81Ui|Zi(GwoIYeUyxl@sxO z`<#ET%7R%xw_39&u=duE67Ie6?$iz^+im~ixpxjd^To}K=X{5x^!w$9_1n%oc|P&u zZ(}Q_{c)wi$zvrycGH=#h&`WPN^AA< z(+}ov>e}tCuI1OR82?&Uzp~96>^rr+MW5q8?uy$!X5+Ek z%j%bo97&q;QK`Z2ugb{nuzvr2f$KM%Z+PU@?~|Tiy{7Yo8s+PaIDG5q$fkqZ-pJVA z`)IHEEk9p0@IZs8A5PudqwD^~>0>({?r|yn)ui{2ynE(cu8GfC4neg0;@ zhIQw4d-{bDf3@q|`AVG$;d@$sTs`3Y^?}1T$8V`NVPk5keo^_O&Qv_!Va=zG6JDne z#Ra$boqp!>A?JgC9D2V+_rsf;tgnBn?c!wxyK6i(Fl4WP`jJj&E5GsG%`elt?OnfY zVN{o)YX|M=^3}548+YD2X6E?Py@NJpKizGZU(in@|GIf4$8T}O7hk<_^K!qvldkM< zadrCiwoTWzuY0J}qYrG|J+JN)dsd&ldFHo_oIN*Qdgz;lIgg%-+IyjKM%+(hLt~z- zTJDYdonAQCe@y+4=f73|{SM8qUU=fIxPeVORUTSD{BQs3?do;NXqW#@@YHv1YC;=AX2$(qrAqQ}wT8??3g>`+p>Ty6wf1cOR@Xw4he2 zrH2}1{jj&iub;vW^Wl%~8%r&C80Y@>!MdKkN0jUx@<&3pQW5@l=~zJM(Xz zU-`AO!n&vZ4qxcl?!Bz@)7l)GH~+}}o1d%|Fl5Gr2R6<6Y=6qjy-#dv{eHtLTe?0M zx2jC(yia<)oV2sU$P-6GKD@j0XN^-M=RLW6V#?_nYc^Cq*R;pU-zp@XZZ>@9(rrfy z_Z^Nqx}n!=^L9mF>gV?D1Wos{)hooStzkAnC0G8JD?wmUum`+=3hPrw5E5fAXb}<+Z=aJO0c^-V45J z65O<1WS<{?4Bi+wQ(=}up}X=LgKpZ1eKx!*VHiMNiPtNG~D zJ$&9B^3qFhoHdVsoI4^v{2h6%ier{#aUargeD;*|>?tY9ITO++-^0PrGt1vgJRBF& z`9{~j?zQAqw=3v4`JQsk-kO;jd2GhJ$EV)RjT!6T zf9b3iZP#_G`f&dnZ|9fY{$a@L=c0G7Sy!#e*{DxCyt8HU!4)$rez+{Z3|z4VP;-`6W_^ZlY7RgUrwkZBq z>72k;fopD#|Gro6?hdbV*n(0=xK>jk0xP&q{P%^=*%(eTu=hv(bYKV=e2RnRsz;iI zTB|9DT|#eZX@nQvxiGSju3c0bj`rn61tSrR)uE`AtZMRN%JZ0m7*pD3(^~bIUfMP^ z&@R1gMU+bE1!f)F>r8!7!;MObXED;Z@~}>8bRJxFcjIB0inlPe zz-tsnDbw&qrYQ!B9>8TPS->^KlKRqsXatvNaYN>zK~M1Ot4svXPT-gUNmKDWMOlVz zl4T}(W?Np?IO5eX+(EwggR^rosqs$8p{bADkFN%I;MT3;<9IMVE$do-sSM&$@0Yj< z>Dg(sX6FweE_toQT}*V$2p>&cDdqL`#Cbci@*?JxPa##+ZIbF>zW<;T)1FLQ2YuHW z^i_4`eG$s7KR&NH0ubp>;!^QyIu&MKd8zn+a%UQqpJ4Vc@*@vVdRY0Zu=TE{za8F6=LxDL-k^{UkO+uTns}q5aWBoJz zx_4dKr`)Yue->U$3!A;*frZEFzZnozzr^(P>(09$iVm1xA$10 zmUqwo<;+tfCiQ&HH=;_~_8*?_GQsceZ=O4uRPCi&>*l{cH7w+b!g2FsqC0mgy*KEt z)*2`eEWcDr3X#&d3)rjU1|OAKb%_e=hA(yp6V9c@Op(M&YQO`KG@`1O8%bxX=hI^ zPC5DNlzB52OuaRr$%2ua?^?UO*W`K47ftK5?ctdV8s;ZPk8hhY_wRF`{PFdb@%@J! z*;Mt>fq$L-`uBs|zkcX+MC+8#%TFvharFyb9$)j!gZs0$O=+|7;G#S@{i{`etbzBb?I&K`I%Cz; zGq2R1GCr_-ufsn~{Oy&Qg9kL|d3^hTqzBKxP-}AVp0MA(`)) zj*r>4xzvEuq0dj*S#xlDwM)O`th?DGZFO7k-*)z2vFpQG&-Fch_|H8Z-|O*N=*wwe zFRb&`Bdh;9dg=7Dn`0lJ{r$;Dx_r?8=_kviA3Aug%dLGsCGVbBx$D*V`&Pa9_Af*B zotfRW|G?k3URZshbKu<3Gj{*hr^;iKr?kHiy!M6P|L*W9GtP_yZz%G84z{z4YDXRo};d|Ly)0^XByWvE{>qw_d!l z_^}IH7xh>fc6?I&ktaisR{P+OY@c68jvR4hXRTSQ$ELlwr1piT)t>MC-aKXGrps+Q zDkZO0LOr_I(H=wQLyi!1p07F*@LY)QFhKcB@viQT7N!PjD=PK?i~>>>rx*=P!}C~- zDkcE#j?o0)jhz8_67KDRoq$-rqmplH9tC_hHy&0Fi<;;28seqqaUx(x>cMoUl9uIE zf|H%f)toTwK53}kBc00HJ|_-p+;sH-UjW+S@YAhH|7S>Hhu8sbE*Ep{EhkQNamQs!2wNJ zVF_@PAH2&hPUdjIv~@$eC0^-!De+ih^sLYN*Grs?L0LLJQ!u-DZ_s1C!pH1R-!L$! za6Ppu!vZp~);QN_i=9 zVDj;_Kl;Q^y^-$~r)v}sjXoHoB-Rt0)l&5BTR(Z}up50Hanv$6`D%`Qa>NZAT4%T; zj@mfl=B?T~%n{eV&kOl8XFB4}Y}lONy0@hJAnoc>M_h$@%a=Yk$uazsr48W$^%9vj zsBl`Jn8ct$HIAuTCeEB0P#ByzW?-Pf;*Fu%XvxF{(_|@{sTU=eNHp{KecH;^#LS%8BhTmuO(Bn#UNq#?m{Q5~ofjwk z*(W-4>KZ9;!L+JQ;|sH^IRn#nu1wD~;&cl%12?~<6~kgz>A20y)G-A~bCyO;jT*2m$uazTdT=7)n?qI(qy5B=V${^YWjSl` zNM0|dmrlX)tp*vjlYt=(eGQLY(XREy_9u>j4dMZ>-e~u5>xpR+P>FoLOQKkaOp906 zcLoNJBqFw?+EARGt7!F)b=0Z2H51$!cEqKjK^TEnHGcq$ZNW5FS}GMafDI|DF@5`EKy)VS8Jb|W&?C?;bDpT8{T0VZH0+Hugh-rY zNsMenO)a;KH3u#8WW1*7mbfeyt#ZQT$i2r7)jd8*oQ1m-A4 zX^`QI86eV-MH;#Wb|aI_OqziS-i={o!ozX0*5~({KZtKp?T8QG1}gbD(Me5#xt&NF=mpiJ<)iR6?Ya=aUwH|{n;ZhY4OyEqEFd$e zP-?^zb#XY=6NCRvz#|B6BMd^1s%bV-^oHr^SWWENqDcXeivzQPeii|j((Obv5`r2+ z-2jN-+Cd0HC_-5TzFEX&5O%- z(8WDVby=IuXqh3A)2OLS5<`bBNu*P}pR-^Zt6znAH~OM#NuzOaMDHJI&z}af<6J=$Kg&;VH1M5Jn8LA`jQjC0?rLrNUDcQ?7W`HF#se0dJJdJ?6 zPjI(h6i%Fwp{*<#g?InzvIY)mn|?k0+N$`}fWl-Pap{THye}5q+T*FW5?JWUTegsw zjz-Ur_Q&bLXz=C_dMPnDx!bJa@HL?&8)W`^41XRV(@w)Co;8$FXoY{AK43`gS&b51 zP3SoAVvdCd?gh-&g}H`$=13N<8tG;dJqi_P_1ZwR;w)13EVE`q2b!GK3Qpr?@hW4| zAXJ?ob_Z4>qwqlCTXaB+hSE8te+h|WwXE9E(mozDsz#PUAq`?~=B<(iVBaVmpyUlVH7k|rPB#Mi#x1Y>bKz9yWBW^�F9O|K28(^e;^1>YqmD)nzS}` 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≤ECi@V#j8hz2d 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 Dylkwr diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/pdm.xls b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/pdm.xls index d680263ad87c37d422a378be56e89e27b66d305b..6a9c445b375035fccc4222e4cb2840a38b750a9f 100644 GIT binary patch literal 247808 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

^A5DB$|sz3BW6!ZMY1{!|9N&vT&ugzc?ZxmpgO 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

W-M$K@#_?VS)89YwDwx_=zY3=B!(Ih5o-50_ z0sYkM>(_*7^Uhxrrp-Hl%`smC(_gDzbIjKqlkMy^VY2pKlk1etJAW;Do#K3izN?PE zK!?ve{|j{Zyz{?6hxTiKfezoV{RKL-U;9f?-+zIQuwS$173VwjU9+-Z7pBcTe_fb1 z^Za$kd_7>k?wGF!%-3@=IiI4R%6vnZHuwAuVcOjDHyrbgfcb`Fz7a6r$jRh6mYV>9fz@bj&v$lgIc?Ve%NiDSd~{K7TXXcf4hMR~>JOj#fCM z`Te&<#|h^Ae#_~23p#u|e#_~2E70+l)A5$*I1&3{U;0*52j``%k3sn)zb!gi8y#

!j`ygWb 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 z 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 Xv4|xuIDd}`Dd= qty) { - load_series = dictObj.getString("value"); - break; - } - } - return load_series; - } - @Override public void download(Map whereJson, HttpServletResponse response) throws IOException { HashMap map = new HashMap(); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/InTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/InTask.java deleted file mode 100644 index c2da495..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/InTask.java +++ /dev/null @@ -1,257 +0,0 @@ -package org.nl.wms.sch.tasks; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import org.nl.common.utils.SecurityUtils; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.modules.wql.util.SpringContextHolder; -import org.nl.wms.basedata.st.service.dto.StructattrDto; -import org.nl.wms.basedata.st.service.impl.StructattrServiceImpl; -import org.nl.wms.sch.AcsTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.st.inbill.service.impl.InbillServiceImpl; -import org.nl.wms.st.inbill.service.impl.RawAssistIStorServiceImpl; -import org.nl.wms.st.inbill.service.impl.StorPublicServiceImpl; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Created by ZZ on 2021/12/22. - */ -@Service -public class InTask extends AbstractAcsTask { - - private final String THIS_CLASS = InTask.class.getName(); - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList resultList = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - - //判断该任务所在的块、排存在其他任务 - String point_code2 = json.getString("point_code2"); - JSONObject struct_jo = WQLObject.getWQLObject("ST_IVT_StructAttr").query("struct_code = '" + point_code2 + "'").uniqueResult(0); - - char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1); - AcsTaskDto dto = AcsTaskDto.builder() - .ext_task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(json.getString("point_code1")) - .next_device_code(json.getString("point_code2")) - .vehicle_code(json.getString("vehicle_code")) - .priority(json.getString("priority")) - .class_type(json.getString("task_type")) - .dtl_type(String.valueOf(dtl_type)) - .remark(json.getString("remark")) - .build(); - resultList.add(dto); - } - return resultList; - } - - @Override - public void updateTaskStatus(JSONObject taskObj, String status) { - WQLObject disTab = WQLObject.getWQLObject("st_ivt_iostorinvdis"); // 出入库分配表 - WQLObject mstTab = WQLObject.getWQLObject("ST_IVT_IOStorInv"); // 出入库主表 - WQLObject dtlTab = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); // 出入库明细表 - - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - HashMap map = new HashMap(); - //1:执行中,2:完成 ,0:acs取消 - if (status.equals(TaskStatusEnum.EXECUTING.getCode())) { - map.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - //更新入库单分配任务状态 - HashMap dis_map = new HashMap(); - dis_map.put("work_status", "02"); - dis_map.put("is_issued", "1"); - WQLObject.getWQLObject("ST_IVT_IOStorInvDis").update(dis_map, "task_id = '" + taskObj.getString("task_id") + "'"); - } - if (status.equals(TaskStatusEnum.FINISHED.getCode())) { - map.put("task_status", TaskStatusEnum.FINISHED.getCode()); - //调用入库分配确认方法 - InbillServiceImpl inbillService = SpringContextHolder.getBean(InbillServiceImpl.class); - JSONObject dis_form = new JSONObject(); - dis_form.put("task_id", taskObj.getString("task_id")); - inbillService.confirmDis(dis_form); - } - if (StrUtil.equals(status, "0")) { - WQLObject point_table = WQLObject.getWQLObject("SCH_BASE_Point"); - WQLObject struct_table = WQLObject.getWQLObject("ST_IVT_StructAttr"); - - if (taskObj.getIntValue("task_status") > Integer.valueOf(TaskStatusEnum.ISSUE.getCode())) { - throw new BadRequestException("任务已执行不能取消"); - } - - // 更新任务表删除字段 - map.put("is_delete", "1"); - - JSONObject jsonDis = disTab.query("task_id ='" + taskObj.getString("task_id") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonDis)) { - throw new BadRequestException("分配明细不存在"); - } - String iostorinv_id = jsonDis.getString("iostorinv_id"); - - // 解锁货位 - HashMap unlock_map = new HashMap(); - unlock_map.put("lock_type", "1"); - unlock_map.put("taskdtl_type", ""); - unlock_map.put("taskdtl_id", ""); - unlock_map.put("task_code", ""); - unlock_map.put("inv_type", ""); - unlock_map.put("inv_id", ""); - unlock_map.put("inv_code", ""); - point_table.update(unlock_map, "point_code = '" + taskObj.get("point_code2") + "'"); - struct_table.update(unlock_map, "struct_code = '" + taskObj.get("point_code2") + "'"); - - //减去原货位的待入数 - JSONArray dis_rows = disTab.query("struct_code = '" + taskObj.get("point_code2") + "' AND work_status < '99'").getResultJSONArray(0); - if (dis_rows.size() <= 0) { - throw new BadRequestException("数据参数有误!"); - } - - StructattrDto old_struct = new StructattrServiceImpl().findByCode(taskObj.getString("point_code2")); - JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + dis_rows.getJSONObject(0).getString("iostorinv_id") + "'").uniqueResult(0); - for (int i = 0; i < dis_rows.size(); i++) { - JSONObject i_form = new JSONObject(); - JSONObject dis_row = dis_rows.getJSONObject(i); - i_form.put("struct_id", old_struct.getStruct_id()); - i_form.put("material_id", dis_row.getString("material_id")); - i_form.put("quality_scode", dis_row.getString("quality_scode")); - i_form.put("pcsn", dis_row.getString("pcsn")); - i_form.put("ivt_level", dis_row.getString("ivt_level")); - i_form.put("change_qty", dis_row.getString("plan_qty")); - i_form.put("bill_type_scode", mst_jo.getString("bill_type")); - i_form.put("inv_id", mst_jo.getString("iostorinv_id")); - i_form.put("bill_code", mst_jo.getString("bill_code")); - i_form.put("bill_table", "ST_IVT_IOStorInv"); - i_form.put("qty_unit_id", dis_row.getString("qty_unit_id")); - i_form.put("qty_unit_name", dis_row.getString("qty_unit_name")); - new StorPublicServiceImpl().IOStor(i_form, "32"); - } - - // 修改主表状态为分配中:30 - JSONObject mstMap = new JSONObject(); - mstMap.put("bill_status", "30"); - mstMap.put("update_optid", currentUserId); - mstMap.put("update_optname", nickName); - mstMap.put("update_time", now); - mstTab.update(mstMap, "iostorinv_id = '" + iostorinv_id + "'"); - - // 修改明细状态为生成:10 - JSONObject dtlMap = new JSONObject(); - dtlMap.put("bill_status", "10"); - dtlTab.update(dtlMap, "iostorinv_id = '" + iostorinv_id + "'"); - - // 更新分配明细为:未生成:00,清空对应字段 - JSONObject disMap = new JSONObject(); - disMap.put("work_status", "00"); - disMap.put("point_id", ""); - disMap.put("task_id", ""); - disMap.put("sect_id", ""); - disMap.put("sect_code", ""); - disMap.put("sect_name", ""); - disMap.put("struct_id", ""); - disMap.put("struct_code", ""); - disMap.put("struct_name", ""); - disTab.update(disMap, "task_id = '" + taskObj.getString("task_id") + "'"); - } - map.put("update_optid", currentUserId); - map.put("update_optname", nickName); - map.put("update_time", now); - WQLObject.getWQLObject("SCH_BASE_Task").update(map, "task_id = '" + taskObj.getString("task_id") + "'"); - } - - @Override - public void findStartPoint() { - - } - - @Override - public void findNextPoint() { - - } - - @Override - @Transactional(rollbackFor = Exception.class) - public String createTask(JSONObject form) { - - String task_type = form.getString("task_type"); - if (StrUtil.isBlank(task_type)) { - throw new BadRequestException("业务类型不能为空"); - } - String start_device_code = form.getString("start_device_code"); - if (StrUtil.isBlank(start_device_code)) { - throw new BadRequestException("起点不能为空"); - } - String next_device_code = form.getString("next_device_code"); - if (StrUtil.isBlank(next_device_code)) { - throw new BadRequestException("下一点不能为空"); - } - String vehicle_code = form.getString("vehicle_code"); - if (StrUtil.isBlank(vehicle_code)) { - throw new BadRequestException("载具号不能为空"); - } - - String currentUserId = SecurityUtils.getCurrentUserId(); - String currentUsername = SecurityUtils.getCurrentUsername(); - - JSONObject json = new JSONObject(); - json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); - json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); - json.put("task_type", form.getString("task_type")); - json.put("vehicle_code", form.getString("vehicle_code")); - json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - json.put("point_code1", start_device_code); - json.put("point_code2", next_device_code); - json.put("handle_class", this.getClass().getName()); - json.put("create_id", currentUserId); - json.put("create_name", currentUsername); - json.put("create_time", DateUtil.now()); - json.put("priority", "1"); - json.put("acs_task_type", "7"); - WQLObject.getWQLObject("SCH_BASE_Task").insert(json); - - return json.getString("task_id"); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void forceFinish(String task_id) { - //任务表 - WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject task = wo_Task.query("task_status<>'07' and task_id='" + task_id + "'").uniqueResult(0); - if (task == null) { - throw new BadRequestException("查询不到操作的任务记录!"); - } - Map whereJson = new HashMap(); - whereJson.put("task_code", task.getString("task_code")); - RawAssistIStorServiceImpl inbillService = SpringContextHolder.getBean(RawAssistIStorServiceImpl.class); - inbillService.confirmTask(whereJson); - } - - @Override - public void cancel(String task_id) { - JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); - this.updateTaskStatus(taskObj, "0"); - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/OutTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/OutTask.java deleted file mode 100644 index 0227e82..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/OutTask.java +++ /dev/null @@ -1,188 +0,0 @@ -package org.nl.wms.sch.tasks; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import org.nl.common.utils.SecurityUtils; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.modules.wql.util.SpringContextHolder; -import org.nl.wms.sch.AcsTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.st.inbill.service.CheckOutBillService; -import org.springframework.stereotype.Component; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by Lxy on 2021/12/22. - */ -@Service -@RequiredArgsConstructor -public class OutTask extends AbstractAcsTask { - private final String THIS_CLASS = OutTask.class.getName(); - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - //任务表 - WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); - - JSONObject map = new JSONObject(); - map.put("flag", "1"); - map.put("handle_class", THIS_CLASS); - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - ArrayList resultList = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - - char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1); - AcsTaskDto dto = AcsTaskDto.builder() - .ext_task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(json.getString("point_code1")) - .next_device_code(json.getString("point_code2")) - .vehicle_code(json.getString("vehicle_code")) - .priority(json.getString("priority")) - .class_type(json.getString("task_type")) - .dtl_type(String.valueOf(dtl_type)) - .remark(json.getString("remark")) - .build(); - resultList.add(dto); - - // 更新任务为下发 - JSONObject paramMap = new JSONObject(); - paramMap.put("task_status", TaskStatusEnum.ISSUE.getCode()); - wo_Task.update(paramMap, "task_id ='" + json.getString("task_id") + "'"); - } - return resultList; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject taskObj, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject disTab = WQLObject.getWQLObject("st_ivt_iostorinvdis"); // 出入库分配表 - - String task_id = taskObj.getString("task_id"); - JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "' and task_status < '07'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonTask)) { - if (StrUtil.equals(status, "0")) { - // 任务为执行之后就不允许取消 - if (jsonTask.getIntValue("task_status") > Integer.valueOf(TaskStatusEnum.ISSUE.getCode())) { - throw new BadRequestException("任务:" + jsonTask.getString("task_code") + "已执行,不可取消"); - } - - // 更新删除字段 - jsonTask.put("is_delete", "1"); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); - - // 更新分配明细为:未生成 - JSONObject map = new JSONObject(); - map.put("work_status", "00"); - map.put("point_id", ""); - - disTab.update(map, "task_id = '" + task_id + "'"); - - } - - if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { - // 更新任务状态为执行中 - jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); - - } - - if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { - String currentUserId = SecurityUtils.getCurrentUserId(); - String currentUsername = SecurityUtils.getCurrentUsername(); - - // 判断此任务是否有任务组 - String task_group_id = jsonTask.getString("task_group_id"); - if (ObjectUtil.isNotEmpty(task_group_id)) { - // 上一个任务组顺序号 - String sort_seq_last = NumberUtil.sub(jsonTask.getString("sort_seq"), "1").toString(); - } - - // 调用标识完成 - CheckOutBillService checkOutBillService = SpringContextHolder.getBean(CheckOutBillService.class); - checkOutBillService.finishTask(jsonTask); - - // 更改任务状态为完成 - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("update_optid", currentUserId); - jsonTask.put("update_optname", currentUsername); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); - } - } - - } - - @Override - public void findStartPoint() { - - } - - @Override - public void findNextPoint() { - - } - - @Override - public String createTask(JSONObject form) { - String currentUserId = SecurityUtils.getCurrentUserId(); - String currentUsername = SecurityUtils.getCurrentUsername(); - - JSONObject json = new JSONObject(); - json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); - json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); - - json.put("task_type", form.getString("task_type")); - json.put("vehicle_code", form.getString("vehicle_code")); - json.put("task_name", form.getString("task_name")); - json.put("point_code1", form.getString("point_code1")); - json.put("point_code2", form.getString("point_code2")); - json.put("material_id", form.getString("material_id")); - json.put("task_group_id", form.getString("task_group_id")); - json.put("sort_seq", form.getString("sort_seq")); - - json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - json.put("handle_class", THIS_CLASS); - json.put("create_id", currentUserId); - json.put("create_name", currentUsername); - json.put("create_time", DateUtil.now()); - json.put("acs_task_type", "7"); - WQLObject.getWQLObject("SCH_BASE_Task").insert(json); - - return json.getString("task_id"); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void forceFinish(String task_id) { - JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); - this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); - } - - @Override - public void cancel(String task_id) { - JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); - this.updateTaskStatus(taskObj, "0"); - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/rest/RawAssistIStorController.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/rest/RawAssistIStorController.java deleted file mode 100644 index 2c6da03..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/rest/RawAssistIStorController.java +++ /dev/null @@ -1,299 +0,0 @@ -package org.nl.wms.st.inbill.rest; - -import cn.dev33.satoken.annotation.SaIgnore; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; -import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvService; -import org.nl.common.utils.MapOf; -import org.nl.modules.logging.annotation.Log; -import org.nl.wms.st.inbill.service.RawAssistIStorService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Pageable; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.Map; - -@RestController -@RequiredArgsConstructor - -@RequestMapping("/api/in/rawAssist") -@Slf4j -public class RawAssistIStorController { - - /** - * 一期入库服务 - */ - @Autowired - private RawAssistIStorService rawAssistIStorService; - - /** - * 二期入库服务 - */ - @Autowired - private IStIvtIostorinvService iStIvtIostorinvService; - - @GetMapping - @Log("查询入库单据") - - //@PreAuthorize("@el.check('checkoutbill:list')") - public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { - return new ResponseEntity<>(rawAssistIStorService.pageQuery(whereJson, page), HttpStatus.OK); - } - - @Log("删除出入库单") - - //@PreAuthorize("@el.check('sectattr:del')") - @DeleteMapping - public ResponseEntity delete(@RequestBody Long[] ids) { -// rawAssistIStorService.deleteAll(ids); - iStIvtIostorinvService.deleteAll(ids); - return new ResponseEntity<>(HttpStatus.OK); - } - - @GetMapping("/getBillDtl") - @Log("查询入库单来源") - - //@PreAuthorize("@el.check('materialtype:list')") - public ResponseEntity getBillDtl(@RequestParam Map whereJson, Pageable page) { - return new ResponseEntity<>(rawAssistIStorService.getBillDtl(whereJson, page), HttpStatus.OK); - } - - @PostMapping() - @Log("新增入库单") - - //@PreAuthorize("@el.check('structrelamaterial:edit')") - public ResponseEntity insertDtl(@RequestBody Map whereJson) { - // 校验仓库 - if (whereJson.get("stor_id").toString().equals(IOSEnum.STOR_ID.code("二期"))) { - iStIvtIostorinvService.insertMst(whereJson); - } else { - rawAssistIStorService.insertDtl(whereJson); - } - return new ResponseEntity<>(HttpStatus.CREATED); - } - - @PutMapping - @Log("修改入库单") - - //@PreAuthorize("@el.check('sectattr:edit')") - public ResponseEntity update(@RequestBody Map whereJson) { - if (whereJson.get("stor_id").toString().equals(IOSEnum.STOR_ID.code("二期"))) { - iStIvtIostorinvService.update(whereJson); - }else { - rawAssistIStorService.update(whereJson); - } - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @GetMapping("/getIODtl") - @Log("查询出入库单明细") - - //@PreAuthorize("@el.check('materialtype:list')") - public ResponseEntity getIODtl(@RequestParam Map whereJson) { - return new ResponseEntity<>(rawAssistIStorService.getIODtl(whereJson), HttpStatus.OK); - } - - @PostMapping("/commit") - @Log("出入单提交") - - //@PreAuthorize("@el.check('materialtype:list')") - public ResponseEntity commit(@RequestBody Map whereJson) { - rawAssistIStorService.commit(whereJson); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/getDisDtl") - @Log("查询入库分配载具明细") - - //@PreAuthorize("@el.check('materialtype:list')") - public ResponseEntity getDisDtl(@RequestBody Map whereJson) { - return new ResponseEntity<>(rawAssistIStorService.getDisDtl(whereJson), HttpStatus.OK); - } - - @PostMapping("/divStruct") - @Log("分配货位") - - //@PreAuthorize("@el.check('materialtype:list')") - public ResponseEntity divStruct(@RequestBody Map whereJson) { - if (whereJson.get("stor_id").toString().equals(IOSEnum.STOR_ID.code("二期"))) { - iStIvtIostorinvService.divStruct(whereJson); - } else { - rawAssistIStorService.divStruct(whereJson); - } - - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/allDivStruct") - @Log("全部分配货位") - - //@PreAuthorize("@el.check('materialtype:list')") - public ResponseEntity allDivStruct(@RequestBody JSONObject whereJson) { - rawAssistIStorService.allDivStruct(whereJson); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/unDivStruct") - @Log("取消分配货位") - - //@PreAuthorize("@el.check('materialtype:list')") - public ResponseEntity unDivStruct(@RequestBody Map whereJson) { - if (whereJson.get("stor_id").toString().equals(IOSEnum.STOR_ID.code("二期"))) { - iStIvtIostorinvService.unDivStruct(whereJson); - }else { - rawAssistIStorService.unDivStruct(whereJson); - } - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/divPoint") - @Log("设置起点") - - //@PreAuthorize("@el.check('materialtype:list')") - public ResponseEntity divPoint(@RequestBody Map whereJson) { - if (whereJson.get("stor_id").toString().equals(IOSEnum.STOR_ID.code("二期"))) { - iStIvtIostorinvService.setPoint(whereJson); - } else { - rawAssistIStorService.divPoint(whereJson); - } - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/queryTask") - @Log("查询任务") - - //@PreAuthorize("@el.check('materialtype:list')") - public ResponseEntity queryTask(@RequestBody Map whereJson) { - return new ResponseEntity<>(rawAssistIStorService.queryTask(whereJson), HttpStatus.OK); - } - - @PostMapping("/delDis") - @Log("删除分配") - - //@PreAuthorize("@el.check('materialtype:list')") - public ResponseEntity delDis(@RequestBody JSONObject whereJson) { - rawAssistIStorService.delDis(whereJson); - return new ResponseEntity<>(HttpStatus.OK); - } - - @PostMapping("/queryBoxMater") - @Log("查询箱内子卷") - - //@PreAuthorize("@el.check('materialtype:list')") - public ResponseEntity queryBoxMater(@RequestBody JSONArray whereJson) { - - return new ResponseEntity<>(rawAssistIStorService.queryBoxMater(whereJson), HttpStatus.OK); - } - - @PostMapping("/updateTask") - @Log("变更任务") - - //@PreAuthorize("@el.check('materialtype:list')") - public ResponseEntity updateTask(@RequestBody Map whereJson) { - rawAssistIStorService.updateTask(whereJson); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/delTask") - @Log("删除任务") - - //@PreAuthorize("@el.check('materialtype:list')") - public ResponseEntity delTask(@RequestBody Map whereJson) { - if (whereJson.get("stor_id").toString().equals(IOSEnum.STOR_ID.code("二期"))) { - iStIvtIostorinvService.delTask(whereJson); - } else { - rawAssistIStorService.delTask(whereJson); - } - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/reIssueTask") - @Log("下发") - - //@PreAuthorize("@el.check('materialtype:list')") - public ResponseEntity reIssueTask(@RequestBody Map whereJson) { - if (whereJson.get("stor_id").toString().equals(IOSEnum.STOR_ID.code("二期"))) { - iStIvtIostorinvService.reIssueTask(whereJson); - } else { - rawAssistIStorService.reIssueTask(whereJson); - } - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/confirmTask") - @Log("完成任务") - - //@PreAuthorize("@el.check('materialtype:list')") - public ResponseEntity confirmTask(@RequestBody Map whereJson) { - if (whereJson.get("stor_id").toString().equals(IOSEnum.STOR_ID.code("二期"))) { - iStIvtIostorinvService.confirmTask(whereJson); - } else { - rawAssistIStorService.confirmTask(whereJson); - } - - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/cancelTask") - @Log("取消完成任务") - - //@PreAuthorize("@el.check('materialtype:list')") - public ResponseEntity cancelTask(@RequestBody Map whereJson) { - rawAssistIStorService.cancelTask(whereJson); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/confirm") - @Log("完成单据") - - //@PreAuthorize("@el.check('materialtype:list')") - public ResponseEntity confirm(@RequestBody Map whereJson) { - if (whereJson.get("stor_id").toString().equals(IOSEnum.STOR_ID.code("二期"))) { - iStIvtIostorinvService.confirm(whereJson); - } else { - rawAssistIStorService.confirm(whereJson); - - } - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/backConfirm") - @Log("完成入库负单") - - //@PreAuthorize("@el.check('materialtype:list')") - public ResponseEntity backConfirm(@RequestBody Map whereJson) { - rawAssistIStorService.backConfirm(whereJson); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/autoDis") - @Log("自动分配") - - //@PreAuthorize("@el.check('materialtype:list')") - public ResponseEntity autoDis(@RequestBody JSONObject whereJson) { - rawAssistIStorService.autoDis(whereJson); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @Log("导出数据") - @GetMapping(value = "/download") - public void download(@RequestParam Map map, HttpServletResponse response) throws IOException { - rawAssistIStorService.download(map, response); - } - - - @Log("一期扩容接口") - @GetMapping(value = "/updateStructSect") - @SaIgnore - public ResponseEntity updateStructSect(String layer_num) throws IOException { - rawAssistIStorService.updateStructSect(layer_num); - return new ResponseEntity<>(MapOf.of("status","200","message","sucess"),HttpStatus.OK); - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/CheckOutBillService.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/CheckOutBillService.java deleted file mode 100644 index 3978620..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/CheckOutBillService.java +++ /dev/null @@ -1,331 +0,0 @@ -package org.nl.wms.st.inbill.service; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import org.springframework.data.domain.Pageable; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.Map; - -public interface CheckOutBillService { - /** - * 查询数据分页 - * - * @param whereJson 条件 - * @param page 分页参数 - * @return Map - */ - Map pageQuery(Map whereJson, Pageable page, String[] stor_id, String[] bill_status, String[] bill_type); - - /** - * 查询数据分页 - * - * @param whereJson 条件 - * @param page 分页参数 - * @return Map - */ - Map queryAddDtl(Map whereJson, Pageable page); - - /** - * 查询数据分页 - * - * @param whereJson 条件 - * @param page 分页参数 - * @return Map - */ - Map queryDtl(Map whereJson, Pageable page); - - /** - * 多选删除 - * - * @param ids / - */ - void deleteAll(Long[] ids); - - /** - * 新增出库单 - * - * @param whereJson 参数举例: - * {bill_code=, stor_id=1473161852946092032, stor_code=01, stor_name=原材料库, bill_status=10, total_qty=2, detail_count=1, bill_type=010201, remark=, biz_date=2022-01-08, create_mode=, tableData=[{material_id=1309, material_code=090301010001, bill_status=10, material_name=碳化钨粉 02, pcsn=, quality_scode=02, ivt_level=01, is_active=1, plan_qty=2, qty_unit_name=千克\公斤, qty_unit_id=1, remark=, edit=true}]} - * / - */ - String insertDtl(JSONObject whereJson); - - /** - * 发货出库用 - * - * @param whereJson / - */ - String insertDtl2(JSONObject whereJson); - - /** - * 新增出库单 - * - * @param whereJson 参数举例: - * {bill_code=, stor_id=1473161852946092032, stor_code=01, stor_name=原材料库, bill_status=10, total_qty=2, detail_count=1, bill_type=010201, remark=, biz_date=2022-01-08, create_mode=, tableData=[{material_id=1309, material_code=090301010001, bill_status=10, material_name=碳化钨粉 02, pcsn=, quality_scode=02, ivt_level=01, is_active=1, plan_qty=2, qty_unit_name=千克\公斤, qty_unit_id=1, remark=, edit=true}]} - * / - */ - void insertDtlByJson(JSONObject whereJson); - - /** - * 查询出库单明细 - * - * @param whereJson / - * @return - */ - JSONArray getOutBillDtl(Map whereJson); - - /** - * 查询出库单分配明细 - * - * @param whereJson / - * @return - */ - JSONArray getOutBillDis(Map whereJson); - - JSONArray getOutBillDis2(Map whereJson); - - /** - * 查询出库单分配明细 - * - * @param whereJson / - * @return - */ - JSONArray getOutBillDisDtl(Map whereJson); - - /** - * 查询出库单分配任务 - * - * @param whereJson / - * @return - */ - JSONArray getOutBillTask(Map whereJson); - - /** - * 修改出库单 - * - * @param whereJson / - */ - void update(JSONObject whereJson); - - /** - * 全部分配,对同一出库单明细进行分配 - * - * @param whereJson / - */ - void allDiv(JSONObject whereJson); - - /** - * 全部分配,对同一出库单明细进行分配(多线程) - * - * @param whereJson / - */ - void allDiv2(JSONObject whereJson); - - /** - * 对一条明细自动分配 - * - * @param whereJson / - */ - void allDivOne(JSONObject whereJson); - - /** - * 全部取消 - * - * @param whereJson / - */ - void allCancel(JSONObject whereJson); - - /** - * 取消一个 - * - * @param whereJson / - */ - void oneCancel(JSONObject whereJson); - - /** - * 设置检验站点 - * - * @param whereJson / - */ - void setPoint(JSONObject whereJson); - - /** - * 设置一个站点 - * - * @param whereJson / - */ - void oneSetPoint2(JSONObject whereJson); - - /** - * 设置全部站点 - * - * @param whereJson / - */ - void allSetPoint(JSONObject whereJson); - - /** - * 查询可分配库存 - * - * @param whereJson / - * @return - */ - JSONArray getStructIvt(Map whereJson); - - /** - * 出库单手动分配 - * - * @param whereJson / - */ - void manualDiv(JSONObject whereJson); - - /** - * 出库单强制确认(更新仓位以及库存信息) - * - * @param whereJson / - */ - void confirm(JSONObject whereJson); - - /** - * 出库单强制确认(只确认单据用-虚拟区的更新库存) - * - * @param whereJson / - */ - void confirmOrder(JSONObject whereJson); - - /** - * 出库任务下发 - * - * @param whereJson / - */ - void issueTask(JSONObject whereJson); - - /** - * 出库任务手动完成 - * - * @param whereJson / - */ - void finishTask(JSONObject whereJson); - - /** - * 出库任务手动取消完成 - * - * @param whereJson / - */ - void cancleTaskfinish(JSONObject whereJson); - - /** - * 查询单据字段 - * - * @return - */ - JSONArray getInvTypes(); - - /** - * 查询出库单物料是否限制参数 - * - * @param form - * @return - */ - JSONObject getParamByCodeType(JSONObject form); - - /** - * 查询点位区域类型 - * - * @param form - * @return - */ - JSONArray schAreaType(JSONObject form); - - /** - * 出库单强制确认 - * - * @param whereJson / - */ - void backConfirm(JSONObject whereJson); - - /** - * 获取全部出入库业务类型 - */ - JSONArray getType(); - - /** - * 发货信息保存 - */ - void moneySubmit(JSONObject whereJson); - - /** - * 下载发货单Excel - * - * @param whereJson / - */ - void downloadExcel(HttpServletResponse response, Map whereJson) throws IOException; - - /** - * 获取分配明细条数 - * - * @param whereJson / - */ - JSONObject getDisNum(Map whereJson); - - /** - * 新增物料库存条件过滤 - * - * @param whereJson / - */ - JSONArray queryBox(JSONObject whereJson); - - JSONArray getOutBillTask2(Map whereJson); - - /** - * 删除任务 - * - * @param whereJson / - */ - void cancelTask(JSONObject whereJson); - - - /** - * 销售出库回传mes - * - * @param whereJson / - */ - void outReturn(JSONObject whereJson); - - - /** - * 导出数据 - * - * @param map 待导出的数据 - * @param response / - * @throws IOException / - */ - void download(Map map, HttpServletResponse response, String[] stor_id, String[] bill_status, String[] bill_type) throws IOException; - - /** - * 更新是否超期 - * @param whereJson { - * 主表数据 - * } - */ - JSONObject updataIsOverdue(JSONObject whereJson); - - /** - * 导入运费 - * @param file、 - * @param request、 - */ - void importExcel(MultipartFile file, HttpServletRequest request); - - /** - * 更新分拣出库重量 - * @param whereJson { - * dtl: 明细数据 - * tabledis: 分配明细集合 - * } - */ - void saveUpdate(JSONObject whereJson); -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/RawAssistIStorService.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/RawAssistIStorService.java deleted file mode 100644 index 0d1df8f..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/RawAssistIStorService.java +++ /dev/null @@ -1,82 +0,0 @@ -package org.nl.wms.st.inbill.service; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import org.springframework.data.domain.Pageable; - -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.Map; - -public interface RawAssistIStorService { - /** - * 查询数据分页 - * - * @param whereJson 条件 - * @param page 分页参数 - * @return Map - */ - Map pageQuery(Map whereJson, Pageable page); - - Map getBillDtl(Map whereJson, Pageable page); - - String insertDtl(Map whereJson); - - void deleteAll(Long[] ids); - - void delDis(JSONObject whereJson); - - JSONArray queryBoxMater(JSONArray rows); - - void update(Map whereJson); - - void commit(Map whereJson); - - JSONArray getIODtl(Map whereJson); - - void divStruct(Map whereJson); - - void allDivStruct(JSONObject form); - - void unDivStruct(Map whereJson); - - void divPoint(Map whereJson); - - void updateTask(Map whereJson); - - void delTask(Map whereJson); - - void reIssueTask(Map whereJson); - - void confirmTask(Map whereJson); - - void cancelTask(Map whereJson); - - void confirm(Map whereJson); - - void backConfirm(Map whereJson); - - JSONArray getDisDtl(Map whereJson); - - JSONArray queryTask(Map whereJson); - - JSONObject autoDis(JSONObject whereJson); - - JSONObject autoDisMove(JSONObject whereJson); - - - /** - * 导出数据 - * - * @param map 待导出的数据 - * @param response / - * @throws IOException / - */ - void download(Map map, HttpServletResponse response) throws IOException; - - /** - * 一期仓库扩容 - * @param layer_num - */ - void updateStructSect(String layer_num); -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/RawAssistIStorServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/RawAssistIStorServiceImpl.java deleted file mode 100644 index 2a3f289..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/RawAssistIStorServiceImpl.java +++ /dev/null @@ -1,2955 +0,0 @@ -package org.nl.wms.st.inbill.service.impl; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HttpUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; -import org.nl.common.utils.SecurityUtils; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.common.utils.CodeUtil; -import org.nl.modules.common.utils.FileUtil; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.modules.wql.util.SpringContextHolder; -import org.nl.modules.wql.util.WqlUtil; -import org.nl.system.service.param.impl.SysParamServiceImpl; -import org.nl.wms.basedata.st.service.StorattrService; -import org.nl.wms.basedata.st.service.StructattrService; -import org.nl.wms.basedata.st.service.dto.StorattrDto; -import org.nl.wms.basedata.st.service.dto.StructattrDto; -import org.nl.wms.basedata.st.service.impl.StructattrServiceImpl; -import org.nl.wms.basedata.st.service.impl.UserStorServiceImpl; -import org.nl.wms.pda.mps.eum.RegionTypeEnum; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.service.PointService; -import org.nl.wms.sch.service.TaskService; -import org.nl.wms.sch.service.dto.PointDto; -import org.nl.wms.sch.tasks.InTask; -import org.nl.wms.st.inbill.service.RawAssistIStorService; -import org.nl.wms.st.inbill.service.StorPublicService; -import org.redisson.api.RLock; -import org.redisson.api.RedissonClient; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -/** - * PC端出入库新增 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class RawAssistIStorServiceImpl implements RawAssistIStorService { - - private final StorattrService storattrService; - - private final InbillServiceImpl inbillService; - - private final StorPublicService storPublicService; - - private final StructattrService structattrService; - - private final PointService pointService; - - private final TaskService taskService; - - private final RedissonClient redissonClient; - - @Override - public Map pageQuery(Map whereJson, Pageable page) { - HashMap map = new HashMap<>(); - map.put("flag", "30"); - map.put("buss_type", (String) whereJson.get("buss_type")); - map.put("stor_id", (String) whereJson.get("stor_id")); - map.put("bill_type", (String) whereJson.get("bill_type")); - map.put("create_mode", (String) whereJson.get("create_mode")); - map.put("bill_status", (String) whereJson.get("bill_status")); - - String bill_code = MapUtil.getStr(whereJson, "bill_code"); - String sap_pcsn = MapUtil.getStr(whereJson, "sap_pcsn"); - String pcsn = MapUtil.getStr(whereJson, "pcsn"); - String box_no = MapUtil.getStr(whereJson, "box_no"); - String vbeln = MapUtil.getStr(whereJson, "vbeln"); - - - if (!ObjectUtil.isEmpty(bill_code)) { - map.put("bill_code", "%" + bill_code + "%"); - } - - // 空格查询 - if (StrUtil.isNotEmpty(pcsn)) { - // 判断是否有空格 - boolean matches = pcsn.matches(".*\\s.*"); - - if (matches) { - String[] s = pcsn.split(" "); - String pcsn_in = String.join("','", Arrays.asList(s)); - - map.put("pcsn_in", "('"+pcsn_in+"')"); - } else { - map.put("pcsn", "%" + pcsn + "%"); - } - map.put("flag", "29"); - } - - // 空格查询 - if (StrUtil.isNotEmpty(sap_pcsn)) { - // 判断是否有空格 - boolean matches = sap_pcsn.matches(".*\\s.*"); - - if (matches) { - String[] s = sap_pcsn.split(" "); - String sap_pcsn_in = String.join("','", Arrays.asList(s)); - - map.put("sap_pcsn_in", "('"+sap_pcsn_in+"')"); - } else { - map.put("sap_pcsn", "%" + sap_pcsn + "%"); - } - map.put("flag", "29"); - } - - // 空格查询 - if (StrUtil.isNotEmpty(box_no)) { - // 判断是否有空格 - boolean matches = box_no.matches(".*\\s.*"); - - if (matches) { - String[] s = box_no.split(" "); - String box_no_in = String.join("','", Arrays.asList(s)); - - map.put("box_no_in", "('"+box_no_in+"')"); - } else { - map.put("box_no", "%" + box_no + "%"); - - } - map.put("flag", "29"); - } - - // 空格查询 - if (StrUtil.isNotEmpty(vbeln)) { - // 判断是否有空格 - boolean matches = vbeln.matches(".*\\s.*"); - - if (matches) { - String[] s = vbeln.split(" "); - String vbeln_in = String.join("','", Arrays.asList(s)); - - map.put("vbeln_in", "('"+vbeln_in+"')"); - } else { - map.put("vbeln", "%" + vbeln + "%"); - } - } - - String begin_time = (String) whereJson.get("begin_time"); - - if (!StrUtil.isEmpty(begin_time)) { - map.put("begin_time", begin_time); - } - String end_time = (String) whereJson.get("end_time"); - if (!StrUtil.isEmpty(end_time)) { - map.put("end_time", end_time); - } - - //获取人员对应的仓库 - UserStorServiceImpl userStorService = new UserStorServiceImpl(); - String in_stor_id = userStorService.getInStor(); - - if (ObjectUtil.isNotEmpty(in_stor_id)) { - map.put("in_stor_id", in_stor_id); - } - - JSONObject jo = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "iostorinv_id desc"); - return jo; - } - - @Override - public Map getBillDtl(Map whereJson, Pageable page) { - HashMap map = new HashMap<>(); - String bill_code = (String) whereJson.get("bill_code"); - String material_search = (String) whereJson.get("material_search"); - String begin_time = (String) whereJson.get("begin_time"); - String end_time = (String) whereJson.get("end_time"); - String container_name = (String) whereJson.get("container_name"); - String package_box_sn = (String) whereJson.get("package_box_sn"); - String sap_pcsn = (String) whereJson.get("sap_pcsn"); - map.put("flag", "2"); - if (StrUtil.isNotEmpty(package_box_sn)) { - map.put("package_box_sn", package_box_sn); - } - if (StrUtil.isNotEmpty(container_name)) { - map.put("container_name", container_name); - } - if (StrUtil.isNotEmpty(bill_code)) { - map.put("bill_code", bill_code); - } - if (StrUtil.isNotEmpty(sap_pcsn)) { - map.put("sap_pcsn", sap_pcsn); - } - if (StrUtil.isNotEmpty(material_search)) { - map.put("material_search", "%" + material_search + "%"); - } - if (StrUtil.isNotEmpty(begin_time)) { - map.put("begin_time", begin_time.substring(0, 10)); - map.put("end_time", end_time.substring(0, 10)); - } - JSONObject jo = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "date_of_FG_inbound,package_box_sn desc"); - return jo; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public String insertDtl(Map whereJson) { - ArrayList rows = (ArrayList) whereJson.get("tableData"); - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - double total_qty = 0; - JSONObject io_mst = new JSONObject(); - String iostorinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - String bill_code = CodeUtil.getNewCode("IO_CODE"); - io_mst.put("iostorinv_id", iostorinv_id); - io_mst.put("bill_code", bill_code); - io_mst.put("buss_type", ((String) whereJson.get("bill_type")).substring(0, 4)); - io_mst.put("io_type", "0"); - io_mst.put("bill_type", whereJson.get("bill_type")); - io_mst.put("biz_date", whereJson.get("biz_date").toString().substring(0, 10)); - StorattrDto storattrDto = storattrService.findById(Long.parseLong((String) whereJson.get("stor_id"))); - String stor_code = storattrDto.getStor_code(); - String stor_name = storattrDto.getStor_name(); - io_mst.put("stor_id", whereJson.get("stor_id")); - io_mst.put("stor_code", stor_code); - io_mst.put("stor_name", stor_name); - io_mst.put("detail_count", rows.size()); - io_mst.put("remark", whereJson.get("remark")); - io_mst.put("bill_status", whereJson.get("bill_status")); - io_mst.put("create_mode", "01"); - io_mst.put("input_optid", currentUserId + ""); - io_mst.put("input_optname", nickName); - io_mst.put("input_time", now); - io_mst.put("update_optid", currentUserId + ""); - io_mst.put("update_optname", nickName); - io_mst.put("update_time", now); - io_mst.put("is_delete", "0"); - io_mst.put("is_upload", "0"); - Long deptId = SecurityUtils.getDeptId(); - io_mst.put("sysdeptid", deptId + ""); - io_mst.put("syscompanyid", deptId + ""); - - for (int i = 0; i < rows.size(); i++) { - HashMap row = rows.get(i); - row.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + ""); - row.put("iostorinv_id", iostorinv_id); - row.put("seq_no", (i + 1) + ""); - JSONObject material = WQLObject.getWQLObject("md_me_materialbase").query("material_code = '" + row.get("product_name") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(material)) { - throw new BadRequestException("LMS系统不存在物料:【" + row.get("product_name") + "】,请确认物料是否正确,或SAP系统是否推送到LMS系统"); - } - row.put("material_id", material.getString("material_id")); - row.put("pcsn", row.get("container_name")); - row.put("bill_status", "10"); - row.put("quality_scode", "01"); - row.put("qty_unit_id", material.getString("base_unit_id")); - JSONObject unit = WQLObject.getWQLObject("md_pb_measureunit").query("measure_unit_id = '" + material.getString("base_unit_id") + "'").uniqueResult(0); - row.put("qty_unit_name", unit.getString("unit_name")); - row.put("assign_qty", row.get("net_weight")); - row.put("plan_qty", row.get("net_weight")); - String net_weight = row.get("net_weight"); - total_qty += Double.parseDouble(net_weight); - row.put("box_no", row.get("package_box_sn")); - - //判断该木箱是否已经生成入库单 - //判断该载具是否已经分配货位或者起点 - JSONArray now_dis_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("flag", "18").addParam("box_no", row.get("package_box_sn")).process().getResultJSONArray(0); - if (now_dis_rows.size() > 0) { - throw new BadRequestException("该木箱已经分配过货位,无法继续分配!"); - } - //判断该木箱是否已经存在库内 - JSONObject str_jo = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + row.get("package_box_sn") + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(str_jo)) { - throw new BadRequestException("木箱:" + row.get("package_box_sn") + "已存在库内,请对数据进行核实!"); - } - - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(row); - - JSONObject dis = new JSONObject(); - dis.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId() + ""); - dis.put("iostorinv_id", iostorinv_id); - dis.put("iostorinvdtl_id", row.get("iostorinvdtl_id")); - dis.put("seq_no", 1); - dis.put("material_id", row.get("material_id")); - dis.put("pcsn", row.get("pcsn")); - dis.put("box_no", row.get("box_no")); - dis.put("storagevehicle_code", row.get("box_no")); - dis.put("quality_scode", row.get("quality_scode")); - dis.put("work_status", "00"); - dis.put("qty_unit_id", material.getString("base_unit_id")); - dis.put("qty_unit_name", unit.getString("unit_name")); - dis.put("plan_qty", row.get("plan_qty")); - WQLObject.getWQLObject("ST_IVT_IOStorInvDis").insert(dis); - - //将包装关系中对应的记录状态改为包装 - HashMap map = new HashMap<>(); - map.put("status", "1"); - if ("0003".equals(whereJson.get("bill_type"))) { - WQLObject.getWQLObject("PDM_BI_SubPackageRelation").update(map, "package_box_SN = '" + dis.getString("box_no") + "' AND status = '3'"); - } else { - WQLObject.getWQLObject("PDM_BI_SubPackageRelation").update(map, "package_box_SN = '" + dis.getString("box_no") + "' AND status = '0'"); - } - } - io_mst.put("total_qty", total_qty); - WQLObject.getWQLObject("ST_IVT_IOStorInv").insert(io_mst); - - return iostorinv_id; - } - - @Override - public void deleteAll(Long[] ids) { - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - - WQLObject wo = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - for (Long id : ids) { - JSONObject param = new JSONObject(); - param.put("iostorinv_id", String.valueOf(id)); - param.put("is_delete", "1"); - param.put("update_optid", currentUserId); - param.put("update_optname", nickName); - param.put("update_time", now); - wo.update(param); - - JSONArray rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinv_id = '" + String.valueOf(id) + "'").getResultJSONArray(0); - for (int i = 0; i < rows.size(); i++) { - JSONObject row = rows.getJSONObject(i); - String box_no = row.getString("box_no"); - //将状态为包装的改为生成 - HashMap map = new HashMap<>(); - map.put("status", "0"); - WQLObject.getWQLObject("PDM_BI_SubPackageRelation").update(map, "package_box_SN = '" + box_no + "' AND status = '1'"); - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").delete(row); - } - } - } - - @Override - public void delDis(JSONObject whereJson) { - String box_no = whereJson.getString("package_box_sn"); - //将状态为包装的改为生成 - HashMap map = new HashMap<>(); - map.put("status", "0"); - WQLObject.getWQLObject("PDM_BI_SubPackageRelation").update(map, "package_box_SN = '" + box_no + "' AND status = '1'"); - } - - @Override - public JSONArray queryBoxMater(JSONArray rows) { - JSONArray total_rows = new JSONArray(); - HashSet set = new HashSet<>(); - for (int i = 0; i < rows.size(); i++) { - JSONObject row = rows.getJSONObject(i); - String package_box_sn = row.getString("package_box_sn"); - set.add(package_box_sn); - } - for (String s : set) { - JSONArray maters = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("flag", "16").addParam("package_box_sn", s).process().getResultJSONArray(0); - for (int i = 0; i < maters.size(); i++) { - JSONObject mater = maters.getJSONObject(i); - total_rows.add(mater); - } - } - return total_rows; - } - - @Override - public void update(Map whereJson) { - JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "'").uniqueResult(0); - if (!"10".equals(mst_jo.getString("bill_status"))) { - throw new BadRequestException("主表状态必须为生成!"); - } - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - - String now = DateUtil.now(); - whereJson.put("update_optid", currentUserId + ""); - whereJson.put("update_optname", nickName); - whereJson.put("update_time", now); - - WQLObject wo = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); - WQLObject wo_dis = WQLObject.getWQLObject("st_ivt_iostorinvdis"); - wo.update(whereJson); - //先删除该单据下的所有明细 - String iostorinv_id = (String) whereJson.get("iostorinv_id"); - wo_dtl.delete("iostorinv_id = '" + iostorinv_id + "'"); - JSONArray dis_rows = wo_dis.query("iostorinv_id = '" + iostorinv_id + "'").getResultJSONArray(0); - for (int i = 0; i < dis_rows.size(); i++) { - JSONObject dis_row = dis_rows.getJSONObject(i); - String box_no = dis_row.getString("box_no"); - //将状态为包装的改为生成 - HashMap map = new HashMap<>(); - if ("0003".equals(whereJson.get("bill_type"))) { - map.put("status", "3"); - } else { - map.put("status", "0"); - } - - WQLObject.getWQLObject("PDM_BI_SubPackageRelation").update(map, "package_box_SN = '" + box_no + "' AND status = '1'"); - } - wo_dis.delete("iostorinv_id = '" + iostorinv_id + "'"); - ArrayList rows = (ArrayList) whereJson.get("tableData"); - for (int i = 0; i < rows.size(); i++) { - HashMap row = rows.get(i); - row.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + ""); - row.put("iostorinv_id", iostorinv_id); - row.put("seq_no", (i + 1) + ""); - JSONObject material = WQLObject.getWQLObject("md_me_materialbase").query("material_code = '" + row.get("product_name") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(material)) { - throw new BadRequestException("LMS系统不存在物料:【" + row.get("product_name") + "】,请确认物料是否正确,或SAP系统是否推送到LMS系统"); - } - row.put("material_id", material.getString("material_id")); - row.put("pcsn", row.get("container_name")); - row.put("bill_status", "10"); - row.put("quality_scode", "01"); - row.put("qty_unit_id", material.getString("base_unit_id")); - JSONObject unit = WQLObject.getWQLObject("md_pb_measureunit").query("measure_unit_id = '" + material.getString("base_unit_id") + "'").uniqueResult(0); - row.put("qty_unit_name", unit.getString("unit_name")); - row.put("assign_qty", row.get("net_weight")); - row.put("plan_qty", row.get("net_weight")); - String net_weight = row.get("net_weight"); - row.put("box_no", row.get("package_box_sn")); - - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(row); - - JSONObject dis = new JSONObject(); - dis.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId() + ""); - dis.put("iostorinv_id", iostorinv_id); - dis.put("iostorinvdtl_id", row.get("iostorinvdtl_id")); - dis.put("seq_no", 1); - dis.put("material_id", row.get("material_id")); - dis.put("pcsn", row.get("pcsn")); - dis.put("box_no", row.get("box_no")); - dis.put("quality_scode", row.get("quality_scode")); - dis.put("work_status", "00"); - dis.put("qty_unit_id", material.getString("base_unit_id")); - dis.put("qty_unit_name", unit.getString("unit_name")); - dis.put("plan_qty", row.get("plan_qty")); - WQLObject.getWQLObject("ST_IVT_IOStorInvDis").insert(dis); - - //将包装关系中对应的记录状态改为包装 - HashMap map = new HashMap<>(); - map.put("status", "1"); - if ("0003".equals(whereJson.get("bill_type"))) { - WQLObject.getWQLObject("PDM_BI_SubPackageRelation").update(map, "package_box_SN = '" + dis.getString("box_no") + "' AND status = '3'"); - } else { - WQLObject.getWQLObject("PDM_BI_SubPackageRelation").update(map, "package_box_SN = '" + dis.getString("box_no") + "' AND status = '0'"); - } - } - } - - @Override - public void commit(Map whereJson) { - String iostorinv_id = (String) whereJson.get("iostorinv_id"); - JSONObject mst = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - if (!"10".equals(mst.getString("bill_status"))) { - throw new BadRequestException("请选择单据状态为生成的进行提交!"); - } - HashMap map = new HashMap<>(); - map.put("bill_status", "20"); - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - - String now = DateUtil.now(); - map.put("update_optid", currentUserId + ""); - map.put("update_optname", nickName); - map.put("update_time", now); - WQLObject.getWQLObject("ST_IVT_IOStorInv").update(map, "iostorinv_id = '" + iostorinv_id + "'"); - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").update(map, "iostorinv_id = '" + iostorinv_id + "'"); - } - - @Override - public JSONArray getIODtl(Map whereJson) { - String id = (String) whereJson.get("bill_code"); - String open_flag = (String) whereJson.get("open_flag"); - JSONArray ja = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("flag", "3").addParam("bill_code", id) - .addParam("open_flag", open_flag).process().getResultJSONArray(0); - return ja; - } - - @Override - public JSONArray getDisDtl(Map whereJson) { - //查询该明细下的所有入库分配载具明细 - String iostorinv_id = (String) whereJson.get("iostorinv_id"); - JSONArray dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinvdtl_id = '" + whereJson.get("iostorinvdtl_id") + "' AND (task_id is null OR task_id = '')").getResultJSONArray(0); - JSONArray dis_dtl_rows = new JSONArray(); - HashSet vehicle_set = new HashSet<>(); - for (int j = 0; j < dis_rows.size(); j++) { - JSONObject dtl_row = dis_rows.getJSONObject(j); - vehicle_set.add(dtl_row.getString("box_no")); - } - for (String vehicle_code : vehicle_set) { - HashMap map = new HashMap<>(); - map.put("flag", "4"); - map.put("iostorinv_id", iostorinv_id); - map.put("package_box_sn", vehicle_code); - JSONArray dtl_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(map).process().getResultJSONArray(0); - dis_dtl_rows.addAll(dtl_rows); - } - return dis_dtl_rows; - } - - @Transactional(rollbackFor = Exception.class) - @Override - public void divStruct(Map whereJson) { - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - String sect_id = ""; - String sect_code = ""; - String sect_name = ""; - String struct_id = ""; - String struct_code = ""; - String struct_name = ""; - ArrayList rows = (ArrayList) whereJson.get("tableMater"); - JSONObject whereJson2 = JSONObject.parseObject(JSON.toJSONString(whereJson)); - HashMap map = rows.get(0); - - Boolean auto_div = false; - if (whereJson2.containsKey("auto_div")) { - auto_div = whereJson2.getBoolean("auto_div"); - } - //判断该载具是否已经分配货位或者起点 - JSONArray now_dis_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("flag", "17").addParam("box_no", map.get("box_no")).process().getResultJSONArray(0); - if (now_dis_rows.size() > 0 && !auto_div) { - throw new BadRequestException("该木箱已经分配过货位,无法继续分配!"); - } - - String point_code = map.get("point_code"); - if (StrUtil.isNotEmpty(point_code)) { - HashMap point_map = new HashMap<>(); - PointDto pointDto = pointService.findByCode(point_code); - point_map.put("point_code", pointDto.getPoint_code()); - point_map.put("point_id", pointDto.getPoint_id() + ""); - point_map.put("point_name", pointDto.getPoint_name()); - WQLObject.getWQLObject("ST_IVT_IOStorInvDis").update(point_map, "iostorinv_id = '" + map.get("iostorinv_id") + "' AND box_no = '" + map.get("box_no") + "'"); - } - - Boolean checked = whereJson2.getBoolean("checked"); - //是否分配货位 - if (ObjectUtil.isNotEmpty(checked) && checked) { - JSONObject jo_form = new JSONObject(); - jo_form.put("box_no", map.get("box_no")); - JSONObject struct_jo = new JSONObject(); - if (whereJson.containsKey("sect_id")) { - String need_sect = (String) whereJson.get("sect_id"); - JSONObject need_sect_jo = WQLObject.getWQLObject("st_ivt_sectattr").query("sect_id = '" + need_sect + "'").uniqueResult(0); - //判断是否为主存区,主存区调用自动分配,虚拟区调用普通查询 - if (StrUtil.isNotEmpty(need_sect) && !"00".equals(need_sect_jo.getString("sect_type_attr"))) { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("sect_id = '" + need_sect + "' AND lock_type = '1' AND is_delete = '0' AND IFNULL( storagevehicle_code, '' ) = ''").uniqueResult(0); - // 如果为空则扩容 - if (ObjectUtil.isEmpty(struct_jo)) { - JSONObject jsonParam = new JSONObject(); - jsonParam.put("sect_id", whereJson.get("sect_id")); - jsonParam.put("stor_id", whereJson.get("stor_id")); - jsonParam.put("num", 50); - - StructattrServiceImpl bean = SpringContextHolder.getBean(StructattrServiceImpl.class); - bean.oneCreate(jsonParam); - - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("sect_id = '" + need_sect + "' AND lock_type = '1' AND is_delete = '0' AND IFNULL( storagevehicle_code, '' ) = ''").uniqueResult(0); - } - } else { - jo_form.put("sect_id", whereJson.get("sect_id")); - struct_jo = this.autoDis(jo_form); - } - } else { - throw new BadRequestException("请选择需要分配的库区!"); - } - - - if (ObjectUtil.isEmpty(struct_jo)) { - throw new BadRequestException("未查询到适用仓位!"); - } - sect_id = struct_jo.getString("sect_id"); - sect_code = struct_jo.getString("sect_code"); - sect_name = struct_jo.getString("sect_name"); - struct_id = struct_jo.getString("struct_id"); - struct_code = struct_jo.getString("struct_code"); - struct_name = struct_jo.getString("struct_name"); - } else { - //更新入库分配表仓位相关字段 - - // 校验仓位是否满足此木箱高度 - JSONObject jsonSub = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + map.get("box_no") + "'").uniqueResult(0); - double box_high = jsonSub.getDoubleValue("box_high"); - - JSONObject jsonAttr = WQLObject.getWQLObject("st_ivt_structattr").query("struct_code = '" + map.get("struct_code") + "'").uniqueResult(0); - - // 入库木箱下限 - String in_download_box_high = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("in_download_box_high").getValue(); - // 入库木箱上线 - String in_up_box_high = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("in_up_box_high").getValue(); - - if (Double.parseDouble(in_download_box_high) < box_high && box_high <= Double.parseDouble(in_up_box_high)) { - if (StrUtil.equals(jsonAttr.getString("layer_num"), "3")) { - if (box_high > jsonAttr.getDoubleValue("height")) { - throw new BadRequestException("木箱高度不符,请检查!"); - } - } else if (StrUtil.equals(jsonAttr.getString("layer_num"), "1")) { - if (box_high > Double.parseDouble(in_download_box_high)) { - throw new BadRequestException("木箱高度不符,请检查!"); - } - } - } - - if (box_high > Double.parseDouble(in_up_box_high)) { - throw new BadRequestException("木箱高度不符,请检查!"); - } - - sect_id = map.get("sect_id"); - sect_code = map.get("sect_code"); - sect_name = map.get("sect_name"); - struct_id = map.get("struct_id"); - struct_code = map.get("struct_code"); - struct_name = map.get("struct_name"); - } - HashMap dis_map = new HashMap(); - dis_map.put("sect_id", sect_id); - dis_map.put("sect_code", sect_code); - dis_map.put("sect_name", sect_name); - dis_map.put("struct_id", struct_id); - dis_map.put("struct_code", struct_code); - dis_map.put("struct_name", struct_name); - - //锁定货位 - JSONObject lock_map = new JSONObject(); - lock_map.put("end_point", struct_code); - //查询主表信息 - JSONObject mst = WQLObject.getWQLObject("st_ivt_iostorinv").query("iostorinv_id = '" + map.get("iostorinv_id") + "'").uniqueResult(0); - lock_map.put("inv_type", mst.get("bill_type")); - lock_map.put("inv_id", mst.get("iostorinv_id")); - lock_map.put("inv_code", mst.get("bill_code")); - inbillService.operatePoint("0", lock_map); - - //判断起点是否不为空 - JSONObject ios_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + map.get("iostorinv_id") + "' AND box_no = '" + map.get("box_no") + "'").uniqueResult(0); - - JSONObject sect_jo = WQLObject.getWQLObject("st_ivt_sectattr").query("sect_id ='" + sect_id + "'").uniqueResult(0); - boolean is_virtual = false; - if ("09".equals(sect_jo.getString("sect_type_attr"))) { - is_virtual = true; - String task_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - dis_map.put("task_id", task_id); - dis_map.put("work_status", "01"); - } - if (StrUtil.isNotEmpty(ios_dis.getString("point_id")) && !is_virtual) { - //创建任务并下发 - InTask task = new InTask(); - JSONObject task_form = new JSONObject(); - task_form.put("task_type", "010501"); - task_form.put("start_device_code", map.get("point_code")); - task_form.put("next_device_code", struct_code); - task_form.put("vehicle_code", map.get("box_no")); - task_form.put("storagevehicle_type", map.get("storagevehicle_type")); - String task_id = task.createTask(task_form); - // 下发 - task.immediateNotifyAcs(task_id); - /* if (whereJson.containsKey("auto_issue")) { - }*/ - dis_map.put("task_id", task_id); - dis_map.put("work_status", "01"); - } - - WQLObject.getWQLObject("ST_IVT_IOStorInvDis").update(dis_map, "iostorinv_id = '" + map.get("iostorinv_id") + "' AND box_no = '" + map.get("box_no") + "'"); - - //修改库存 - //直接取出入库分配表的库存 - JSONArray dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + map.get("iostorinv_id") + "' AND box_no = '" + map.get("box_no") + "'").getResultJSONArray(0); - JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + map.get("iostorinv_id") + "'").uniqueResult(0); - for (int i = 0; i < dis_rows.size(); i++) { - JSONObject dis_jo = dis_rows.getJSONObject(i); - JSONObject i_form = new JSONObject(); - i_form.put("struct_id", dis_jo.getString("struct_id")); - i_form.put("material_id", dis_jo.getString("material_id")); - i_form.put("pcsn", dis_jo.getString("pcsn")); - i_form.put("change_qty", dis_jo.getString("plan_qty")); - i_form.put("bill_type_scode", mst_jo.getString("bill_type")); - i_form.put("quality_scode", "01"); - i_form.put("inv_id", mst_jo.getString("iostorinv_id")); - i_form.put("bill_code", mst_jo.getString("bill_code")); - i_form.put("bill_table", "ST_IVT_IOStorInv"); - i_form.put("qty_unit_id", dis_jo.getString("qty_unit_id")); - i_form.put("qty_unit_name", dis_jo.getString("qty_unit_name")); - storPublicService.IOStor(i_form, "31"); - - JSONObject dtl_jo = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinvdtl_id = '" + dis_jo.getString("iostorinvdtl_id") + "'").uniqueResult(0); - if (StrUtil.isNotEmpty(ios_dis.getString("point_id")) || is_virtual) { - if (dtl_jo.getDoubleValue("unassign_qty") == 0) { - //判断该明细下是否还存在未分配货位的分配明细 - JSONArray disdiv_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinvdtl_id = '" + dis_jo.getString("iostorinvdtl_id") + "' AND (struct_id = '' OR struct_id is null) AND (point_id = '' OR point_id is null)").getResultJSONArray(0); - if (disdiv_rows.size() == 0) { - dtl_jo.put("bill_status", "40"); - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").update(dtl_jo); - //判断主表下的明细是否都为40 - JSONArray dtl_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinv_id = '" + dis_jo.getString("iostorinv_id") + "' AND bill_status < '40'").getResultJSONArray(0); - if (dtl_rows.size() == 0) { - mst_jo.put("bill_status", "40"); - mst_jo.put("dis_optid", currentUserId); - mst_jo.put("dis_optname", nickName); - mst_jo.put("dis_time", now); - WQLObject.getWQLObject("ST_IVT_IOStorInv").update(mst_jo); - } else { - mst_jo.put("bill_status", "30"); - mst_jo.put("dis_optid", currentUserId); - mst_jo.put("dis_optname", nickName); - mst_jo.put("dis_time", now); - WQLObject.getWQLObject("ST_IVT_IOStorInv").update(mst_jo); - } - } - } - } else { - dtl_jo.put("bill_status", "30"); - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").update(dtl_jo); - mst_jo.put("bill_status", "30"); - mst_jo.put("dis_optid", currentUserId); - mst_jo.put("dis_optname", nickName); - mst_jo.put("dis_time", now); - WQLObject.getWQLObject("ST_IVT_IOStorInv").update(mst_jo); - } - } - //如果是虚拟区,直接更新完成分配任务 - if (is_virtual) { - JSONObject dis_form = new JSONObject(); - dis_form.put("task_id", dis_map.get("task_id")); - inbillService.confirmDis(dis_form); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - @SneakyThrows - public void allDivStruct(JSONObject form) { - String iostorinv_id = form.getString("iostorinv_id"); - String sect_id = form.getString("sect_id"); - - JSONObject sect_jo = WQLObject.getWQLObject("st_ivt_sectattr").query("sect_id = '" + sect_id + "'").uniqueResult(0); - if (!"09".equals(sect_jo.getString("sect_type_attr"))) { - throw new BadRequestException("只能对虚拟区的库区进行全部分配!"); - } - //查询当前入库单状态为生成的入库单明细 - JSONArray dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + iostorinv_id + "' AND work_status = '00'").getResultJSONArray(0); - HashSet vehicle_set = new HashSet<>(); - for (int j = 0; j < dis_rows.size(); j++) { - JSONObject dtl_row = dis_rows.getJSONObject(j); - vehicle_set.add(dtl_row.getString("box_no")); - } - - RLock lock = redissonClient.getLock("all_div"); - boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); - - try { - if (tryLock) { - for (String vehicle_code : vehicle_set) { - HashMap map = new HashMap<>(); - map.put("flag", "4"); - map.put("iostorinv_id", iostorinv_id); - map.put("package_box_sn", vehicle_code); - JSONArray dtl_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(map).process().getResultJSONArray(0); - List list = new ArrayList<>(); - for (int i = 0; i < dtl_rows.size(); i++) { - JSONObject jo = dtl_rows.getJSONObject(i); - list.add(JSON.parseObject(jo.toString(), Map.class)); - } - Map dis_map = new HashMap<>(); - dis_map.put("tableMater", list); - dis_map.put("sect_id", sect_id); - dis_map.put("checked", true); - this.divStruct(dis_map); - } - } else { - throw new BadRequestException("其他入库单当前正在分配货位,请等待几秒再进行操作!"); - } - } finally { - if (lock.isLocked() && lock.isHeldByCurrentThread()) { - lock.unlock(); - } - } - - } - - @Transactional(rollbackFor = Exception.class) - @Override - public void unDivStruct(Map jo) { - WQLObject dis_wql = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - WQLObject point_table = WQLObject.getWQLObject("SCH_BASE_Point"); - WQLObject struct_table = WQLObject.getWQLObject("ST_IVT_StructAttr"); - - ArrayList rows = (ArrayList) jo.get("tableMater"); - HashMap whereJson = rows.get(0); - - //解锁原货位点位 - HashMap unlock_map = new HashMap(); - unlock_map.put("lock_type", "1"); - unlock_map.put("taskdtl_type", ""); - unlock_map.put("taskdtl_id", ""); - unlock_map.put("task_code", ""); - unlock_map.put("inv_type", ""); - unlock_map.put("inv_id", ""); - unlock_map.put("inv_code", ""); - point_table.update(unlock_map, "point_code = '" + whereJson.get("struct_code") + "'"); - struct_table.update(unlock_map, "struct_code = '" + whereJson.get("struct_code") + "'"); - - //减去原货位的待入数 - JSONArray dis_rows = dis_wql.query("struct_code = '" + whereJson.get("struct_code") + "' AND work_status < '99'").getResultJSONArray(0); - if (dis_rows.size() <= 0) { - throw new BadRequestException("数据参数有误!"); - } - StructattrDto old_struct = structattrService.findByCode((String) whereJson.get("struct_code")); - JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + dis_rows.getJSONObject(0).getString("iostorinv_id") + "'").uniqueResult(0); - for (int i = 0; i < dis_rows.size(); i++) { - JSONObject i_form = new JSONObject(); - JSONObject dis_row = dis_rows.getJSONObject(i); - i_form.put("struct_id", old_struct.getStruct_id()); - i_form.put("material_id", dis_row.getString("material_id")); - i_form.put("quality_scode", dis_row.getString("quality_scode")); - i_form.put("pcsn", dis_row.getString("pcsn")); - i_form.put("ivt_level", dis_row.getString("ivt_level")); - i_form.put("change_qty", dis_row.getString("plan_qty")); - i_form.put("bill_type_scode", mst_jo.getString("bill_type")); - i_form.put("inv_id", mst_jo.getString("iostorinv_id")); - i_form.put("bill_code", mst_jo.getString("bill_code")); - i_form.put("bill_table", "ST_IVT_IOStorInv"); - i_form.put("qty_unit_id", dis_row.getString("qty_unit_id")); - i_form.put("qty_unit_name", dis_row.getString("qty_unit_name")); - storPublicService.IOStor(i_form, "32"); - - } - - //更新分配状态 - HashMap map = new HashMap<>(); - map.put("point_id", ""); - map.put("sect_id", ""); - map.put("sect_code", ""); - map.put("sect_name", ""); - map.put("struct_id", ""); - map.put("struct_code", ""); - map.put("struct_name", ""); - map.put("work_status", "00"); - WQLObject.getWQLObject("ST_IVT_IOStorInvDis").update(map, "iostorinv_id = '" + mst_jo.get("iostorinv_id") + "' AND box_no = '" + whereJson.get("box_no") + "'"); - - //修改明细状态 - JSONObject dtl_jo = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinvdtl_id = '" + dis_rows.getJSONObject(0).getString("iostorinvdtl_id") + "'").uniqueResult(0); - - HashMap dtl_map = new HashMap<>(); - dtl_map.put("bill_status", "10"); - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").update(dtl_map, "iostorinv_id = '" + mst_jo.get("iostorinv_id") + "' AND box_no = '" + whereJson.get("box_no") + "'"); - - //更新主表状态 - JSONArray dtl_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinv_id = '" + mst_jo.get("iostorinv_id") + "' AND bill_status IN ('20','30')").getResultJSONArray(0); - if (dtl_rows.size() > 0) { - mst_jo.put("bill_status", "30"); - } else { - mst_jo.put("bill_status", "10"); - } - WQLObject.getWQLObject("ST_IVT_IOStorInv").update(mst_jo); - } - - @Transactional(rollbackFor = Exception.class) - @Override - public void divPoint(Map whereJson) { - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - - ArrayList rows = (ArrayList) whereJson.get("tableMater"); - String point_code = (String) whereJson.get("point_code"); - HashMap map = rows.get(0); - - HashMap point_map = new HashMap<>(); - PointDto pointDto = pointService.findByCode(point_code); - point_map.put("point_code", pointDto.getPoint_code()); - point_map.put("point_id", pointDto.getPoint_id() + ""); - point_map.put("point_name", pointDto.getPoint_name()); - - //判断起点终点是否不为空 - JSONObject ios_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + map.get("iostorinv_id") + "' AND box_no = '" + map.get("box_no") + "'").uniqueResult(0); - if (StrUtil.isNotEmpty(ios_dis.getString("struct_code"))) { - //创建任务 - AbstractAcsTask task = new InTask(); - JSONObject task_form = new JSONObject(); - task_form.put("task_type", "010501"); - task_form.put("start_device_code", point_code); - task_form.put("next_device_code", ios_dis.getString("struct_code")); - task_form.put("vehicle_code", map.get("box_no")); - //查询主表信息 - JSONObject mst = WQLObject.getWQLObject("st_ivt_iostorinv").query("iostorinv_id = '" + map.get("iostorinv_id") + "'").uniqueResult(0); - task_form.put("inv_type", mst.get("bill_type")); - task_form.put("inv_id", mst.get("iostorinv_id")); - task_form.put("inv_code", mst.get("bill_code")); - String task_id = task.createTask(task_form); - point_map.put("task_id", task_id); - point_map.put("work_status", "01"); - } - WQLObject.getWQLObject("ST_IVT_IOStorInvDis").update(point_map, "iostorinv_id = '" + map.get("iostorinv_id") + "' AND box_no = '" + map.get("box_no") + "'"); - - if (StrUtil.isNotEmpty(ios_dis.getString("struct_code"))) { - //修改库存 - //直接取出入库分配表的库存 - JSONArray dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + map.get("iostorinv_id") + "' AND box_no = '" + map.get("box_no") + "'").getResultJSONArray(0); - JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + map.get("iostorinv_id") + "'").uniqueResult(0); - for (int i = 0; i < dis_rows.size(); i++) { - JSONObject dis_jo = dis_rows.getJSONObject(i); - //更新明细表状态 - JSONObject dtl_jo = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinvdtl_id = '" + dis_jo.getString("iostorinvdtl_id") + "'").uniqueResult(0); - if (dtl_jo.getDoubleValue("unassign_qty") == 0) { - //判断该明细下是否还存在未分配货位的分配明细 - JSONArray disdiv_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinvdtl_id = '" + dis_jo.getString("iostorinvdtl_id") + "' AND (struct_id = '' OR struct_id is null) AND (point_id = '' OR point_id is null)").getResultJSONArray(0); - if (disdiv_rows.size() == 0) { - dtl_jo.put("bill_status", "40"); - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").update(dtl_jo); - //判断主表下的明细是否都为40 - JSONArray dtl_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinv_id = '" + dis_jo.getString("iostorinv_id") + "' AND bill_status < '40'").getResultJSONArray(0); - if (dtl_rows.size() == 0) { - mst_jo.put("bill_status", "40"); - mst_jo.put("dis_optid", currentUserId); - mst_jo.put("dis_optname", nickName); - mst_jo.put("dis_time", now); - WQLObject.getWQLObject("ST_IVT_IOStorInv").update(mst_jo); - } - } - } - } - } - } - - @Override - public JSONArray queryTask(Map whereJson) { - HashMap map = new HashMap<>(); - map.put("flag", "5"); - map.put("iostorinvdtl_id", (String) whereJson.get("iostorinvdtl_id")); - map.put("is_finish", (String) whereJson.get("checked")); - JSONArray rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(map).process().getResultJSONArray(0); - return rows; - } - - @Override - public JSONObject autoDis(JSONObject whereJson) { - /* - * 分配逻辑: - * 1、先查找该木箱内属于什么物料、订单,定位到具体的块、排,查看是否存在空位 - * a、存在的话,优先放在这一块这一排中(遍历) - * b、不存在则根据该订单物料大概数量、选择数量相近的一个空巷道 - * 1)存在空巷道 - * 2)不存在,则找一个双通有空位置、数量相近的巷道 - * */ - - JSONObject struct_jo = new JSONObject(); - - String box_no = whereJson.getString("box_no"); - - String sect_id = whereJson.getString("sect_id"); - - JSONObject sub_jo = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + box_no + "' AND status < 3").uniqueResult(0); - - String material_code = sub_jo.getString("product_name"); - - String sale_order_name = sub_jo.getString("sale_order_name"); - - HashMap row_map = new HashMap<>(); - row_map.put("material_code", material_code); - row_map.put("sale_order_name", sale_order_name); - row_map.put("sect_id", sect_id); - row_map.put("flag", "111"); - - // 获取系统参数入库到第几层 0-3层都可 1-1层 2-2层 3-3层 - String in_layer_num; - - /* - * 判断木箱高度能入第几层: - * 1.低于650mm 优先入1层 没位置在入 2/3层 - * 2.650mm > 木箱 <= 800mm, 只能入二、三层 - * 3.第三层要根据实际高度分配货位 - */ - // 入库木箱下限 - String in_download_box_high = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("in_download_box_high").getValue(); - // 入库木箱上限 - String in_up_box_high = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("in_up_box_high").getValue(); - - double box_high = sub_jo.getDoubleValue("box_high"); - - if (Double.parseDouble(in_download_box_high) < box_high && box_high <= Double.parseDouble(in_up_box_high)) { - // 只能入到 2/3层 - in_layer_num = "('2','3')"; - } else { - in_layer_num = ""; - } - - // 木箱高度大于入库上限 报错 - if (box_high > Double.parseDouble(in_up_box_high)) { - throw new BadRequestException("木箱:" + sub_jo.getString("package_box_sn") + "高度不符合要求,请检查!"); - } - - //查询到当前可用的巷道 - JSONArray rowArr2 = new JSONArray(); - - // 仓位下限阈值 - String download_attr_num = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("download_attr_num").getValue(); - - List attrListAll = WQL.getWO("PDA_ST_01").addParam("flag", "10") - .addParam("layer_num", "('1','2','3')").process() - .getResultJSONArray(0).toJavaList(JSONObject.class); - - if (box_high <= Double.parseDouble(in_download_box_high)) { - // 判断1层主存区是否超过阈值 - JSONObject jsonOne = attrListAll.stream() - .filter(row -> row.getString("layer_num").equals("1")) - .findFirst().orElse(null); - - if (jsonOne.getDoubleValue("num") <= Double.parseDouble(download_attr_num)) { - in_layer_num = "('2','3')"; - // 判断2层3层的仓位是否够 - List layerList = attrListAll.stream() - .filter(row -> "2,3".contains(row.getString("layer_num"))) - .collect(Collectors.toList()); - - JSONObject jsonAttr = layerList.stream() - .filter(row -> row.getDoubleValue("num") <= Double.parseDouble(download_attr_num)) - .findFirst().orElse(null); - - if (ObjectUtil.isNotEmpty(jsonAttr)) { - if (jsonAttr.getString("layer_num").equals("2")) { - in_layer_num = "('3')"; - } else { - in_layer_num = "('2')"; - } - } - } else { - // 优先入1层 - row_map.put("in_layer_num", "('1')"); - - rowArr2 = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - - if (ObjectUtil.isEmpty(rowArr2)) { - // 如果1层没有相同物料订单号的则找有空位的一排 - row_map.put("flag", "1111"); - rowArr2 = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - - // 如果为空则进行扩容 - if (ObjectUtil.isEmpty(rowArr2)) { - boolean is_expansion = updateStructSectOne(); - - if (is_expansion) { - // 如果为true则在进行查询一次 - rowArr2 = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - } - } - } - } - } else { - // 判断2层3层的仓位是否够 - List layerList = attrListAll.stream() - .filter(row -> "2,3".contains(row.getString("layer_num"))) - .collect(Collectors.toList()); - - JSONObject jsonAttr = layerList.stream() - .filter(row -> row.getDoubleValue("num") <= Double.parseDouble(download_attr_num)) - .findFirst().orElse(null); - - if (ObjectUtil.isNotEmpty(jsonAttr)) { - if (jsonAttr.getString("layer_num").equals("2")) { - in_layer_num = "('3')"; - } else { - in_layer_num = "('2')"; - } - } - } - row_map.put("in_layer_num", in_layer_num); - - if (ObjectUtil.isEmpty(rowArr2)) { - row_map.put("flag", "111"); - rowArr2 = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - } - - JSONArray rowArr = new JSONArray(); - for (int i = 0; i < rowArr2.size(); i++) { - JSONObject jo = rowArr2.getJSONObject(i); - String block_num = jo.getString("block_num"); - String row_num = jo.getString("row_num"); - String placement_type = jo.getString("placement_type"); - row_map.put("block_num", block_num); - row_map.put("row_num", row_num); - row_map.put("placement_type", placement_type); - row_map.put("flag", "112"); - JSONObject row_jo = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().uniqueResult(0); - int num = row_jo.getIntValue("num"); - if (num > 0) { - rowArr.add(jo); - } - } - - for (int i = 0; i < rowArr.size(); i++) { - JSONObject row_jo = rowArr.getJSONObject(i); - - String block_num = row_jo.getString("block_num"); - String row_num = row_jo.getString("row_num"); - String placement_type = row_jo.getString("placement_type"); - - // 判断此排是否有除:入库锁、移入锁以外的锁 - JSONArray isLock = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type not in ('1','2','7') AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1'").getResultJSONArray(0); - if (ObjectUtil.isEmpty(isLock)) { - if ("02".equals(placement_type)) { - // 左通 - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq ASC").uniqueResult(0); - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else if ("03".equals(placement_type)) { - // 右通 - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq DESC").uniqueResult(0); - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else { - // 双通 - // 判断这一排全部是否是空位 - List attrList = WQLObject.getWQLObject("st_ivt_structattr") - .query("block_num = '" + block_num + "' and placement_type = '" + placement_type + "' and row_num = '" + row_num + "' and is_used = '1' and is_delete = '0' order by out_order_seq DESC") - .getResultJSONArray(0).toJavaList(JSONObject.class); - - // 如果这排全部是空位 并且没有被锁定则返回一个货位 - boolean is_all = attrList.stream() - .allMatch(row -> ObjectUtil.isEmpty(row.getString("storagevehicle_code")) - && row.getString("lock_type").equals("1") - ); - - if (is_all) { - struct_jo = attrList.get(0); - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } - - // 先倒序找到第一个木箱、判断上一个是否有货位 - JSONObject jsonDescBox = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq DESC").uniqueResult(0); - - JSONObject jsonDescStruct = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonDescBox)) { - String out_order_seq = jsonDescBox.getString("out_order_seq"); - jsonDescStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } else { - // 先倒序找到第一个入库锁或者移库锁、判断上一个是否有货位 - JSONObject jsonDescEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq DESC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonDescEmpStruct)) { - String out_order_seq = jsonDescEmpStruct.getString("out_order_seq"); - jsonDescStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } - } - - if (ObjectUtil.isNotEmpty(jsonDescStruct)) { - struct_jo = jsonDescStruct; - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else { - // 没有就正序找到第一个物料、判断上一个是否有货位 - JSONObject jsonAscBox = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq ASC").uniqueResult(0); - - JSONObject jsonAscStruct = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonAscBox)) { - String out_order_seq2 = jsonAscBox.getString("out_order_seq"); - // 上一个货位顺序号 - jsonAscStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } else { - JSONObject jsonAscEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq ASC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonAscEmpStruct)) { - String out_order_seq2 = jsonAscEmpStruct.getString("out_order_seq"); - jsonAscStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } - - } - if (ObjectUtil.isNotEmpty(jsonAscStruct)) { - struct_jo = jsonAscStruct; - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else { - // 说明这排有任务在执行,新开一排 - //根据分切计划查询该订单物料大概还有多少未入 - row_map.put("flag", "12"); - JSONArray plan_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - if (ObjectUtil.isEmpty(plan_rows)) { - plan_rows = new JSONArray(); - } - //查询该销售订单及行号有多少个生成状态的箱子 - row_map.put("flag", "27"); - JSONArray box_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - if (ObjectUtil.isEmpty(box_rows)) { - box_rows = new JSONArray(); - } - int box_num = (int) Math.ceil(plan_rows.size() / 2) + box_rows.size(); - - //查询数量与订单物料箱子数量相近的一排 - JSONObject empty_row = WQL.getWO("QST_IVT_RAWASSISTISTOR") - .addParam("sect_id", sect_id) - .addParam("in_layer_num",in_layer_num) - .addParam("flag", "13") - .addParam("sql_str", " ORDER BY abs(" + box_num + "-a.struct_num),block_num,row_num") - .process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(empty_row)) { - String block_num2 = empty_row.getString("block_num"); - String row_num2 = empty_row.getString("row_num"); - String placement_type2 = empty_row.getString("placement_type"); - - if ("02".equals(placement_type)) { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num2 + "' AND row_num = '" + row_num2 + "' AND placement_type = '" + placement_type2 + "' AND is_delete = '0' AND is_used = '1' AND lock_type = '1' order by out_order_seq ASC").uniqueResult(0); - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num2 + "' AND row_num = '" + row_num2 + "' AND placement_type = '" + placement_type2 + "'AND is_delete = '0' AND is_used = '1' AND lock_type = '1' order by out_order_seq DESC").uniqueResult(0); - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } - } else { - //如果查询不到空的一排,则查询有空位双通的一排 - JSONArray haveArr = WQL.getWO("QST_IVT_RAWASSISTISTOR") - .addParam("sect_id", sect_id) - .addParam("flag", "14") - .addParam("in_layer_num",in_layer_num) - .addParam("sql_str", " ORDER BY abs(" + box_num + "-a.struct_num)") - .process().getResultJSONArray(0); - - for (int j = 0; j < haveArr.size(); j++) { - JSONObject have_row = haveArr.getJSONObject(j); - - String block_num3 = have_row.getString("block_num"); - String row_num3 = have_row.getString("row_num"); - - JSONArray isLock2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type not in ('1','2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1'").getResultJSONArray(0); - - if (ObjectUtil.isEmpty(isLock2)) { - // 先倒序找到第一个木箱、判断上一个是否有货位 - JSONObject jsonDescBox2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq DESC").uniqueResult(0); - - JSONObject jsonDescStruct2 = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonDescBox2)) { - String out_order_seq = jsonDescBox2.getString("out_order_seq"); - jsonDescStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } else { - // 先倒序找到第一个入库锁或者移库锁、判断上一个是否有货位 - JSONObject jsonDescEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq DESC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonDescEmpStruct)) { - String out_order_seq = jsonDescEmpStruct.getString("out_order_seq"); - jsonDescStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } - } - - if (ObjectUtil.isNotEmpty(jsonDescStruct2)) { - struct_jo = jsonDescStruct2; - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else { - // 没有就正序找到第一个物料、判断上一个是否有货位 - JSONObject jsonAscBox2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq ASC").uniqueResult(0); - - JSONObject jsonAscStruct2 = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonAscBox2)) { - String out_order_seq2 = jsonAscBox2.getString("out_order_seq"); - // 上一个货位顺序号 - jsonAscStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } else { - JSONObject jsonAscEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq ASC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonAscEmpStruct)) { - String out_order_seq2 = jsonAscEmpStruct.getString("out_order_seq"); - jsonAscStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } - - } - if (ObjectUtil.isNotEmpty(jsonAscStruct2)) { - struct_jo = jsonAscStruct2; - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } - } - } else { - continue; - } - } - } - } - } - } - } else { - continue; - } - } - - if (ObjectUtil.isEmpty(rowArr) || ObjectUtil.isEmpty(struct_jo)) { - //如果不存在相同订单物料的巷道 或者未找到相同物料订单号巷道中的货位 则 - - //根据分切计划查询该订单物料大概还有多少未入 - row_map.put("flag", "12"); - JSONArray plan_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - if (ObjectUtil.isEmpty(plan_rows)) { - plan_rows = new JSONArray(); - } - //查询该销售订单及行号有多少个生成状态的箱子 - row_map.put("flag", "27"); - JSONArray box_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - if (ObjectUtil.isEmpty(box_rows)) { - box_rows = new JSONArray(); - } - int box_num = (int) Math.ceil(plan_rows.size() / 2) + box_rows.size(); - - //查询数量与订单物料箱子数量相近的一排 - JSONObject empty_row = WQL.getWO("QST_IVT_RAWASSISTISTOR") - .addParam("in_layer_num", in_layer_num) - .addParam("sect_id", sect_id) - .addParam("box_height", String.valueOf(box_high)) - .addParam("flag", "13") - .addParam("sql_str", " ORDER BY abs(" + box_num + "-a.struct_num),block_num,row_num") - .process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(empty_row)) { - String block_num = empty_row.getString("block_num"); - String row_num = empty_row.getString("row_num"); - String placement_type = empty_row.getString("placement_type"); - - if ("02".equals(placement_type)) { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "' AND row_num = '" + row_num + "' AND placement_type = '" + placement_type + "' AND is_delete = '0' AND is_used = '1' AND lock_type = '1' order by out_order_seq ASC").uniqueResult(0); - - } else { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "' AND row_num = '" + row_num + "' AND placement_type = '" + placement_type + "'AND is_delete = '0' AND is_used = '1' AND lock_type = '1' order by out_order_seq DESC").uniqueResult(0); - } - } else { - //如果查询不到空的一排,则查询有空位双通的一排 - JSONArray haveArr = WQL.getWO("QST_IVT_RAWASSISTISTOR") - .addParam("in_layer_num", in_layer_num) - .addParam("sect_id", sect_id).addParam("flag", "14") - .addParam("sql_str", " ORDER BY abs(" + box_num + "-a.struct_num)") - .process().getResultJSONArray(0); - for (int j = 0; j < haveArr.size(); j++) { - JSONObject have_row = haveArr.getJSONObject(j); - - String block_num3 = have_row.getString("block_num"); - String row_num3 = have_row.getString("row_num"); - - JSONArray isLock2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type not in ('1','2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1'").getResultJSONArray(0); - - if (ObjectUtil.isEmpty(isLock2)) { - // 先倒序找到第一个木箱、判断上一个是否有货位 - JSONObject jsonDescBox2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq DESC").uniqueResult(0); - - JSONObject jsonDescStruct2 = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonDescBox2)) { - String out_order_seq = jsonDescBox2.getString("out_order_seq"); - jsonDescStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } else { - // 先倒序找到第一个入库锁或者移库锁、判断上一个是否有货位 - JSONObject jsonDescEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq DESC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonDescEmpStruct)) { - String out_order_seq = jsonDescEmpStruct.getString("out_order_seq"); - jsonDescStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } - } - - if (ObjectUtil.isNotEmpty(jsonDescStruct2)) { - struct_jo = jsonDescStruct2; - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else { - // 没有就正序找到第一个物料、判断上一个是否有货位 - JSONObject jsonAscBox2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq ASC").uniqueResult(0); - - JSONObject jsonAscStruct2 = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonAscBox2)) { - String out_order_seq2 = jsonAscBox2.getString("out_order_seq"); - // 上一个货位顺序号 - jsonAscStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } else { - JSONObject jsonAscEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq ASC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonAscEmpStruct)) { - String out_order_seq2 = jsonAscEmpStruct.getString("out_order_seq"); - jsonAscStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } - - } - if (ObjectUtil.isNotEmpty(jsonAscStruct2)) { - struct_jo = jsonAscStruct2; - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } - } - } else { - continue; - } - } - } - } - - if (ObjectUtil.isEmpty(struct_jo)) { - throw new BadRequestException("未查询到可用的仓位!"); - } - return struct_jo; - } - - @Override - public JSONObject autoDisMove(JSONObject whereJson) { - /* - * 分配逻辑: - * 1、先查找该木箱内属于什么物料、订单,定位到具体的块、排,查看是否存在空位 - * a、存在的话,优先放在这一块这一排中(遍历) - * b、不存在则根据该订单物料大概数量、选择数量相近的一个空巷道 - * 1)存在空巷道 - * 2)不存在,则找一个双通有空位置、数量相近的巷道 - * */ - - - String box_no = whereJson.getString("box_no"); - - String sect_id = whereJson.getString("sect_id"); - - String col_num = whereJson.getString("layer_num"); // 转库时用 - - JSONObject struct_jo = new JSONObject(); - - JSONObject sub_jo = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + box_no + "' AND status < 3").uniqueResult(0); - if (ObjectUtil.isEmpty(sub_jo)) { - throw new BadRequestException("子卷包装关系不存在或已出库,请检查!"); - } - - String material_code = sub_jo.getString("product_name"); - - String sale_order_name = sub_jo.getString("sale_order_name"); - - double box_high = sub_jo.getDoubleValue("box_high"); - - HashMap row_map = new HashMap<>(); - row_map.put("material_code", material_code); - row_map.put("sale_order_name", sale_order_name); - row_map.put("col_num", col_num); - row_map.put("sect_id", sect_id); - row_map.put("flag", "11"); - - //查询到当前可用的巷道 - JSONArray rowArr = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - - for (int i = 0; i < rowArr.size(); i++) { - JSONObject row_jo = rowArr.getJSONObject(i); - - String block_num = row_jo.getString("block_num"); - String row_num = row_jo.getString("row_num"); - String placement_type = row_jo.getString("placement_type"); - - // 判断此排是否有除:入库锁、移入锁以外的锁 - JSONArray isLock = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type not in ('1','2','7') AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1'").getResultJSONArray(0); - if (ObjectUtil.isEmpty(isLock)) { - if ("02".equals(placement_type)) { - // 左通 - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq ASC").uniqueResult(0); - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else if ("03".equals(placement_type)) { - // 右通 - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq DESC").uniqueResult(0); - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else { - // 双通 - - // 先倒序找到第一个木箱、判断上一个是否有货位 - JSONObject jsonDescBox = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq DESC").uniqueResult(0); - - JSONObject jsonDescStruct = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonDescBox)) { - String out_order_seq = jsonDescBox.getString("out_order_seq"); - jsonDescStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } else { - // 先倒序找到第一个入库锁或者移库锁、判断上一个是否有货位 - JSONObject jsonDescEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq DESC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonDescEmpStruct)) { - String out_order_seq = jsonDescEmpStruct.getString("out_order_seq"); - jsonDescStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } - } - - if (ObjectUtil.isNotEmpty(jsonDescStruct)) { - struct_jo = jsonDescStruct; - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else { - // 没有就正序找到第一个物料、判断上一个是否有货位 - JSONObject jsonAscBox = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq ASC").uniqueResult(0); - - JSONObject jsonAscStruct = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonAscBox)) { - String out_order_seq2 = jsonAscBox.getString("out_order_seq"); - // 上一个货位顺序号 - jsonAscStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } else { - JSONObject jsonAscEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq ASC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonAscEmpStruct)) { - String out_order_seq2 = jsonAscEmpStruct.getString("out_order_seq"); - jsonAscStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } - - } - if (ObjectUtil.isNotEmpty(jsonAscStruct)) { - struct_jo = jsonAscStruct; - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else { - // 说明这排有任务在执行,新开一排 - //根据分切计划查询该订单物料大概还有多少未入 - row_map.put("flag", "12"); - JSONArray plan_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - if (ObjectUtil.isEmpty(plan_rows)) { - plan_rows = new JSONArray(); - } - //查询该销售订单及行号有多少个生成状态的箱子 - row_map.put("flag", "27"); - JSONArray box_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - if (ObjectUtil.isEmpty(box_rows)) { - box_rows = new JSONArray(); - } - int box_num = (int) Math.ceil(plan_rows.size() / 2) + box_rows.size(); - - //查询数量与订单物料箱子数量相近的一排 - JSONObject empty_row = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("col_num", col_num).addParam("sect_id", sect_id).addParam("flag", "13").addParam("sql_str", " ORDER BY abs(" + box_num + "-a.struct_num),block_num,row_num").process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(empty_row)) { - String block_num2 = empty_row.getString("block_num"); - String row_num2 = empty_row.getString("row_num"); - String placement_type2 = empty_row.getString("placement_type"); - - if ("02".equals(placement_type)) { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num2 + "' AND row_num = '" + row_num2 + "' AND placement_type = '" + placement_type2 + "' AND is_delete = '0' AND is_used = '1' AND lock_type = '1' order by out_order_seq ASC").uniqueResult(0); - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num2 + "' AND row_num = '" + row_num2 + "' AND placement_type = '" + placement_type2 + "'AND is_delete = '0' AND is_used = '1' AND lock_type = '1' order by out_order_seq DESC").uniqueResult(0); - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } - } else { - //如果查询不到空的一排,则查询有空位双通的一排 - JSONArray haveArr = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("col_num", col_num).addParam("sect_id", sect_id).addParam("flag", "14").addParam("sql_str", " ORDER BY abs(" + box_num + "-a.struct_num)").process().getResultJSONArray(0); - - for (int j = 0; j < haveArr.size(); j++) { - JSONObject have_row = haveArr.getJSONObject(j); - - String block_num3 = have_row.getString("block_num"); - String row_num3 = have_row.getString("row_num"); - - JSONArray isLock2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type not in ('1','2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1'").getResultJSONArray(0); - - if (ObjectUtil.isEmpty(isLock2)) { - // 先倒序找到第一个木箱、判断上一个是否有货位 - JSONObject jsonDescBox2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq DESC").uniqueResult(0); - - JSONObject jsonDescStruct2 = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonDescBox2)) { - String out_order_seq = jsonDescBox2.getString("out_order_seq"); - jsonDescStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } else { - // 先倒序找到第一个入库锁或者移库锁、判断上一个是否有货位 - JSONObject jsonDescEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq DESC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonDescEmpStruct)) { - String out_order_seq = jsonDescEmpStruct.getString("out_order_seq"); - jsonDescStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } - } - - if (ObjectUtil.isNotEmpty(jsonDescStruct2)) { - struct_jo = jsonDescStruct2; - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else { - // 没有就正序找到第一个物料、判断上一个是否有货位 - JSONObject jsonAscBox2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq ASC").uniqueResult(0); - - JSONObject jsonAscStruct2 = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonAscBox2)) { - String out_order_seq2 = jsonAscBox2.getString("out_order_seq"); - // 上一个货位顺序号 - jsonAscStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } else { - JSONObject jsonAscEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq ASC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonAscEmpStruct)) { - String out_order_seq2 = jsonAscEmpStruct.getString("out_order_seq"); - jsonAscStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } - - } - if (ObjectUtil.isNotEmpty(jsonAscStruct2)) { - struct_jo = jsonAscStruct2; - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } - } - } else { - continue; - } - } - } - } - } - } - } else { - continue; - } - } - - if (ObjectUtil.isEmpty(rowArr) || ObjectUtil.isEmpty(struct_jo)) { - //如果不存在相同订单物料的巷道 或者未找到相同物料订单号巷道中的货位 则 - - //根据分切计划查询该订单物料大概还有多少未入 - row_map.put("flag", "12"); - JSONArray plan_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - if (ObjectUtil.isEmpty(plan_rows)) { - plan_rows = new JSONArray(); - } - //查询该销售订单及行号有多少个生成状态的箱子 - row_map.put("flag", "27"); - JSONArray box_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - if (ObjectUtil.isEmpty(box_rows)) { - box_rows = new JSONArray(); - } - int box_num = (int) Math.ceil(plan_rows.size() / 2) + box_rows.size(); - - //查询数量与订单物料箱子数量相近的一排 - JSONObject empty_row = WQL.getWO("QST_IVT_RAWASSISTISTOR") - .addParam("col_num", col_num) - .addParam("sect_id", sect_id) - .addParam("box_height", String.valueOf(box_high)) - .addParam("flag", "13") - .addParam("sql_str", " ORDER BY abs(" + box_num + "-a.struct_num),block_num,row_num") - .process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(empty_row)) { - String block_num = empty_row.getString("block_num"); - String row_num = empty_row.getString("row_num"); - String placement_type = empty_row.getString("placement_type"); - - if ("02".equals(placement_type)) { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "' AND row_num = '" + row_num + "' AND placement_type = '" + placement_type + "' AND is_delete = '0' AND is_used = '1' AND lock_type = '1' order by out_order_seq ASC").uniqueResult(0); - } else { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "' AND row_num = '" + row_num + "' AND placement_type = '" + placement_type + "'AND is_delete = '0' AND is_used = '1' AND lock_type = '1' order by out_order_seq DESC").uniqueResult(0); - } - } else { - - //如果查询不到空的一排,则查询有空位双通的一排 - JSONArray haveArr = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("col_num", col_num).addParam("sect_id", sect_id).addParam("flag", "14").addParam("sql_str", " ORDER BY abs(" + box_num + "-a.struct_num)").process().getResultJSONArray(0); - for (int j = 0; j < haveArr.size(); j++) { - JSONObject have_row = haveArr.getJSONObject(j); - - String block_num3 = have_row.getString("block_num"); - String row_num3 = have_row.getString("row_num"); - - JSONArray isLock2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type not in ('1','2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1'").getResultJSONArray(0); - - if (ObjectUtil.isEmpty(isLock2)) { - // 先倒序找到第一个木箱、判断上一个是否有货位 - JSONObject jsonDescBox2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq DESC").uniqueResult(0); - - JSONObject jsonDescStruct2 = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonDescBox2)) { - String out_order_seq = jsonDescBox2.getString("out_order_seq"); - jsonDescStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } else { - // 先倒序找到第一个入库锁或者移库锁、判断上一个是否有货位 - JSONObject jsonDescEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq DESC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonDescEmpStruct)) { - String out_order_seq = jsonDescEmpStruct.getString("out_order_seq"); - jsonDescStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } - } - - if (ObjectUtil.isNotEmpty(jsonDescStruct2)) { - struct_jo = jsonDescStruct2; - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else { - // 没有就正序找到第一个物料、判断上一个是否有货位 - JSONObject jsonAscBox2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq ASC").uniqueResult(0); - - JSONObject jsonAscStruct2 = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonAscBox2)) { - String out_order_seq2 = jsonAscBox2.getString("out_order_seq"); - // 上一个货位顺序号 - jsonAscStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } else { - JSONObject jsonAscEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq ASC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonAscEmpStruct)) { - String out_order_seq2 = jsonAscEmpStruct.getString("out_order_seq"); - jsonAscStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } - - } - if (ObjectUtil.isNotEmpty(jsonAscStruct2)) { - struct_jo = jsonAscStruct2; - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } - } - } else { - continue; - } - } - } - } - - if (ObjectUtil.isEmpty(struct_jo)) { - // 主存区类型更改成中转区类型:找一排主存区的更改中转区、把一排中转区的更改成主存区(只允许调用一次) - String result = HttpUtil.get("http://127.0.0.1:8013/api/in/rawAssist/updateStructSect?layer_num=" + col_num); - if (StringUtils.isEmpty(result)){ - throw new BadRequestException("扩容异常"); - } - JSONObject toJSON = JSONObject.parseObject(result); - if (!toJSON.getString("status").equals("200")){ - throw new BadRequestException(toJSON.getString("message")); - } -// SpringContextHolder.getBean(RawAssistIStorServiceImpl.class).updateStructSect(col_num); - struct_jo = autoDisMove2(whereJson); - } - return struct_jo; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void download(Map whereJson, HttpServletResponse response) throws IOException { - HashMap map = new HashMap<>(); - map.put("flag", "199"); - map.put("buss_type", (String) whereJson.get("buss_type")); - map.put("stor_id", (String) whereJson.get("stor_id")); - map.put("bill_type", (String) whereJson.get("bill_type")); - map.put("create_mode", (String) whereJson.get("create_mode")); - map.put("bill_status", (String) whereJson.get("bill_status")); - - String bill_code = MapUtil.getStr(whereJson, "bill_code"); - String sap_pcsn = MapUtil.getStr(whereJson, "sap_pcsn"); - String pcsn = MapUtil.getStr(whereJson, "pcsn"); - String box_no = MapUtil.getStr(whereJson, "box_no"); - String vbeln = MapUtil.getStr(whereJson, "vbeln"); - - - if (!ObjectUtil.isEmpty(bill_code)) { - map.put("bill_code", "%" + bill_code + "%"); - } - - // 空格查询 - if (StrUtil.isNotEmpty(pcsn)) { - // 判断是否有空格 - boolean matches = pcsn.matches(".*\\s.*"); - - if (matches) { - String[] s = pcsn.split(" "); - String pcsn_in = String.join("','", Arrays.asList(s)); - - map.put("pcsn_in", "('"+pcsn_in+"')"); - } else { - map.put("pcsn", "%" + pcsn + "%"); - } - } - - // 空格查询 - if (StrUtil.isNotEmpty(sap_pcsn)) { - // 判断是否有空格 - boolean matches = sap_pcsn.matches(".*\\s.*"); - - if (matches) { - String[] s = sap_pcsn.split(" "); - String sap_pcsn_in = String.join("','", Arrays.asList(s)); - - map.put("sap_pcsn_in", "('"+sap_pcsn_in+"')"); - } else { - map.put("sap_pcsn", "%" + sap_pcsn + "%"); - } - } - - // 空格查询 - if (StrUtil.isNotEmpty(box_no)) { - // 判断是否有空格 - boolean matches = box_no.matches(".*\\s.*"); - - if (matches) { - String[] s = box_no.split(" "); - String box_no_in = String.join("','", Arrays.asList(s)); - - map.put("box_no_in", "('"+box_no_in+"')"); - } else { - map.put("box_no", "%" + box_no + "%"); - - } - } - - // 空格查询 - if (StrUtil.isNotEmpty(vbeln)) { - // 判断是否有空格 - boolean matches = vbeln.matches(".*\\s.*"); - - if (matches) { - String[] s = vbeln.split(" "); - String vbeln_in = String.join("','", Arrays.asList(s)); - - map.put("vbeln_in", "('"+vbeln_in+"')"); - } else { - map.put("vbeln", "%" + vbeln + "%"); - } - } - - String begin_time = (String) whereJson.get("begin_time"); - - if (!StrUtil.isEmpty(begin_time)) { - map.put("begin_time", begin_time); - } - String end_time = (String) whereJson.get("end_time"); - if (!StrUtil.isEmpty(end_time)) { - map.put("end_time", end_time); - } - - //获取人员对应的仓库 - UserStorServiceImpl userStorService = new UserStorServiceImpl(); - String in_stor_id = userStorService.getInStor(); - - if (ObjectUtil.isNotEmpty(in_stor_id)) { - map.put("in_stor_id", in_stor_id); - } - JSONArray resultJSONArray = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(map).process().getResultJSONArray(0); - List> list = new ArrayList<>(); - for (int i = 0; i < resultJSONArray.size(); i++) { - JSONObject json = resultJSONArray.getJSONObject(i); - - Map mp = new LinkedHashMap<>(); - mp.put("单据号", json.getString("bill_code")); - - if (json.getString("bill_status").equals(IOSEnum.BILL_STATUS.code("生成"))) { - mp.put("单据状态", "生成"); - } else if (json.getString("bill_status").equals(IOSEnum.BILL_STATUS.code("分配中"))) { - mp.put("单据状态", "分配中"); - } else if (json.getString("bill_status").equals(IOSEnum.BILL_STATUS.code("分配完"))) { - mp.put("单据状态", "分配完"); - } else if (json.getString("bill_status").equals(IOSEnum.BILL_STATUS.code("完成"))) { - mp.put("单据状态", "完成"); - } - mp.put("仓库", json.getString("stor_name")); - - if (json.getString("bill_type").equals(IOSEnum.IN_TYPE.code("生产入库"))) { - mp.put("业务类型", "生产入库"); - } else if (json.getString("bill_type").equals(IOSEnum.IN_TYPE.code("退货入库"))) { - mp.put("业务类型", "退货入库"); - } else if (json.getString("bill_type").equals(IOSEnum.IN_TYPE.code("报废入库"))) { - mp.put("业务类型", "报废入库"); - } else if (json.getString("bill_type").equals(IOSEnum.IN_TYPE.code("调拨入库"))) { - mp.put("业务类型", "调拨入库"); - } else if (json.getString("bill_type").equals(IOSEnum.IN_TYPE.code("拆箱入库"))) { - mp.put("业务类型", "拆箱入库"); - } else if (json.getString("bill_type").equals(IOSEnum.IN_TYPE.code("返检入库"))) { - mp.put("业务类型", "返检入库"); - } else if (json.getString("bill_type").equals(IOSEnum.IN_TYPE.code("改切入库"))) { - mp.put("业务类型", "改切入库"); - } else if (json.getString("bill_type").equals(IOSEnum.IN_TYPE.code("手工入库"))) { - mp.put("业务类型", "手工入库"); - } - mp.put("业务日期", json.getString("biz_date")); - mp.put("明细数", json.getString("detail_count")); - mp.put("总重量", NumberUtil.round(json.getDoubleValue("total_qty"), 3)); - mp.put("交货单", json.getString("vbeln")); - mp.put("备注", json.getString("remark")); - mp.put("制单人", json.getString("input_optname")); - mp.put("制单时间", json.getString("input_time")); - mp.put("修改人", json.getString("update_optname")); - mp.put("修改时间", json.getString("update_time")); - mp.put("分配人", json.getString("dis_optname")); - mp.put("分配时间", json.getString("dis_time")); - mp.put("确认人", json.getString("confirm_optname")); - mp.put("确认时间", json.getString("confirm_time")); - list.add(mp); - } - FileUtil.downloadExcel(list, response); - } - - public JSONObject autoDisMove2(JSONObject whereJson) { - /* - * 分配逻辑: - * 1、先查找该木箱内属于什么物料、订单,定位到具体的块、排,查看是否存在空位 - * a、存在的话,优先放在这一块这一排中(遍历) - * b、不存在则根据该订单物料大概数量、选择数量相近的一个空巷道 - * 1)存在空巷道 - * 2)不存在,则找一个双通有空位置、数量相近的巷道 - * */ - - - String box_no = whereJson.getString("box_no"); - - String sect_id = whereJson.getString("sect_id"); - - String col_num = whereJson.getString("layer_num"); // 转库时用 - - JSONObject struct_jo = new JSONObject(); - - JSONObject sub_jo = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + box_no + "' AND status < 3").uniqueResult(0); - if (ObjectUtil.isEmpty(sub_jo)) { - throw new BadRequestException("子卷包装关系不存在或已出库,请检查!"); - } - - String material_code = sub_jo.getString("product_name"); - - String sale_order_name = sub_jo.getString("sale_order_name"); - - double box_high = sub_jo.getDoubleValue("box_high"); - - HashMap row_map = new HashMap<>(); - row_map.put("material_code", material_code); - row_map.put("sale_order_name", sale_order_name); - row_map.put("col_num", col_num); - row_map.put("sect_id", sect_id); - row_map.put("flag", "11"); - - //查询到当前可用的巷道 - JSONArray rowArr = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - - for (int i = 0; i < rowArr.size(); i++) { - JSONObject row_jo = rowArr.getJSONObject(i); - - String block_num = row_jo.getString("block_num"); - String row_num = row_jo.getString("row_num"); - String placement_type = row_jo.getString("placement_type"); - - // 判断此排是否有除:入库锁、移入锁以外的锁 - JSONArray isLock = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type not in ('1','2','7') AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1'").getResultJSONArray(0); - if (ObjectUtil.isEmpty(isLock)) { - if ("02".equals(placement_type)) { - // 左通 - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq ASC").uniqueResult(0); - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else if ("03".equals(placement_type)) { - // 右通 - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq DESC").uniqueResult(0); - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else { - // 双通 - - // 先倒序找到第一个木箱、判断上一个是否有货位 - JSONObject jsonDescBox = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq DESC").uniqueResult(0); - - JSONObject jsonDescStruct = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonDescBox)) { - String out_order_seq = jsonDescBox.getString("out_order_seq"); - jsonDescStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } else { - // 先倒序找到第一个入库锁或者移库锁、判断上一个是否有货位 - JSONObject jsonDescEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq DESC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonDescEmpStruct)) { - String out_order_seq = jsonDescEmpStruct.getString("out_order_seq"); - jsonDescStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } - } - - if (ObjectUtil.isNotEmpty(jsonDescStruct)) { - struct_jo = jsonDescStruct; - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else { - // 没有就正序找到第一个物料、判断上一个是否有货位 - JSONObject jsonAscBox = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq ASC").uniqueResult(0); - - JSONObject jsonAscStruct = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonAscBox)) { - String out_order_seq2 = jsonAscBox.getString("out_order_seq"); - // 上一个货位顺序号 - jsonAscStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } else { - JSONObject jsonAscEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq ASC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonAscEmpStruct)) { - String out_order_seq2 = jsonAscEmpStruct.getString("out_order_seq"); - jsonAscStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } - - } - if (ObjectUtil.isNotEmpty(jsonAscStruct)) { - struct_jo = jsonAscStruct; - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else { - // 说明这排有任务在执行,新开一排 - //根据分切计划查询该订单物料大概还有多少未入 - row_map.put("flag", "12"); - JSONArray plan_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - if (ObjectUtil.isEmpty(plan_rows)) { - plan_rows = new JSONArray(); - } - //查询该销售订单及行号有多少个生成状态的箱子 - row_map.put("flag", "27"); - JSONArray box_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - if (ObjectUtil.isEmpty(box_rows)) { - box_rows = new JSONArray(); - } - int box_num = (int) Math.ceil(plan_rows.size() / 2) + box_rows.size(); - - //查询数量与订单物料箱子数量相近的一排 - JSONObject empty_row = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("col_num", col_num).addParam("sect_id", sect_id).addParam("flag", "13").addParam("sql_str", " ORDER BY abs(" + box_num + "-a.struct_num),block_num,row_num").process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(empty_row)) { - String block_num2 = empty_row.getString("block_num"); - String row_num2 = empty_row.getString("row_num"); - String placement_type2 = empty_row.getString("placement_type"); - - if ("02".equals(placement_type)) { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num2 + "' AND row_num = '" + row_num2 + "' AND placement_type = '" + placement_type2 + "' AND is_delete = '0' AND is_used = '1' AND lock_type = '1' order by out_order_seq ASC").uniqueResult(0); - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num2 + "' AND row_num = '" + row_num2 + "' AND placement_type = '" + placement_type2 + "'AND is_delete = '0' AND is_used = '1' AND lock_type = '1' order by out_order_seq DESC").uniqueResult(0); - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } - } else { - //如果查询不到空的一排,则查询有空位双通的一排 - JSONArray haveArr = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("col_num", col_num).addParam("sect_id", sect_id).addParam("flag", "14").addParam("sql_str", " ORDER BY abs(" + box_num + "-a.struct_num)").process().getResultJSONArray(0); - - for (int j = 0; j < haveArr.size(); j++) { - JSONObject have_row = haveArr.getJSONObject(j); - - String block_num3 = have_row.getString("block_num"); - String row_num3 = have_row.getString("row_num"); - - JSONArray isLock2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type not in ('1','2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1'").getResultJSONArray(0); - - if (ObjectUtil.isEmpty(isLock2)) { - // 先倒序找到第一个木箱、判断上一个是否有货位 - JSONObject jsonDescBox2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq DESC").uniqueResult(0); - - JSONObject jsonDescStruct2 = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonDescBox2)) { - String out_order_seq = jsonDescBox2.getString("out_order_seq"); - jsonDescStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } else { - // 先倒序找到第一个入库锁或者移库锁、判断上一个是否有货位 - JSONObject jsonDescEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq DESC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonDescEmpStruct)) { - String out_order_seq = jsonDescEmpStruct.getString("out_order_seq"); - jsonDescStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } - } - - if (ObjectUtil.isNotEmpty(jsonDescStruct2)) { - struct_jo = jsonDescStruct2; - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else { - // 没有就正序找到第一个物料、判断上一个是否有货位 - JSONObject jsonAscBox2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq ASC").uniqueResult(0); - - JSONObject jsonAscStruct2 = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonAscBox2)) { - String out_order_seq2 = jsonAscBox2.getString("out_order_seq"); - // 上一个货位顺序号 - jsonAscStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } else { - JSONObject jsonAscEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq ASC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonAscEmpStruct)) { - String out_order_seq2 = jsonAscEmpStruct.getString("out_order_seq"); - jsonAscStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } - - } - if (ObjectUtil.isNotEmpty(jsonAscStruct2)) { - struct_jo = jsonAscStruct2; - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } - } - } else { - continue; - } - } - } - } - } - } - } else { - continue; - } - } - - if (ObjectUtil.isEmpty(rowArr) || ObjectUtil.isEmpty(struct_jo)) { - //如果不存在相同订单物料的巷道 或者未找到相同物料订单号巷道中的货位 则 - - //根据分切计划查询该订单物料大概还有多少未入 - row_map.put("flag", "12"); - JSONArray plan_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - if (ObjectUtil.isEmpty(plan_rows)) { - plan_rows = new JSONArray(); - } - //查询该销售订单及行号有多少个生成状态的箱子 - row_map.put("flag", "27"); - JSONArray box_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - if (ObjectUtil.isEmpty(box_rows)) { - box_rows = new JSONArray(); - } - int box_num = (int) Math.ceil(plan_rows.size() / 2) + box_rows.size(); - - //查询数量与订单物料箱子数量相近的一排 - JSONObject empty_row = WQL.getWO("QST_IVT_RAWASSISTISTOR") - .addParam("col_num", col_num) - .addParam("sect_id", sect_id) - .addParam("box_height", String.valueOf(box_high)) - .addParam("flag", "13") - .addParam("sql_str", " ORDER BY abs(" + box_num + "-a.struct_num),block_num,row_num") - .process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(empty_row)) { - String block_num = empty_row.getString("block_num"); - String row_num = empty_row.getString("row_num"); - String placement_type = empty_row.getString("placement_type"); - - if ("02".equals(placement_type)) { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "' AND row_num = '" + row_num + "' AND placement_type = '" + placement_type + "' AND is_delete = '0' AND is_used = '1' AND lock_type = '1' order by out_order_seq ASC").uniqueResult(0); - } else { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "' AND row_num = '" + row_num + "' AND placement_type = '" + placement_type + "'AND is_delete = '0' AND is_used = '1' AND lock_type = '1' order by out_order_seq DESC").uniqueResult(0); - } - } else { - - //如果查询不到空的一排,则查询有空位双通的一排 - JSONArray haveArr = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("col_num", col_num).addParam("sect_id", sect_id).addParam("flag", "14").addParam("sql_str", " ORDER BY abs(" + box_num + "-a.struct_num)").process().getResultJSONArray(0); - for (int j = 0; j < haveArr.size(); j++) { - JSONObject have_row = haveArr.getJSONObject(j); - - String block_num3 = have_row.getString("block_num"); - String row_num3 = have_row.getString("row_num"); - - JSONArray isLock2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type not in ('1','2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1'").getResultJSONArray(0); - - if (ObjectUtil.isEmpty(isLock2)) { - // 先倒序找到第一个木箱、判断上一个是否有货位 - JSONObject jsonDescBox2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq DESC").uniqueResult(0); - - JSONObject jsonDescStruct2 = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonDescBox2)) { - String out_order_seq = jsonDescBox2.getString("out_order_seq"); - jsonDescStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } else { - // 先倒序找到第一个入库锁或者移库锁、判断上一个是否有货位 - JSONObject jsonDescEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq DESC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonDescEmpStruct)) { - String out_order_seq = jsonDescEmpStruct.getString("out_order_seq"); - jsonDescStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } - } - - if (ObjectUtil.isNotEmpty(jsonDescStruct2)) { - struct_jo = jsonDescStruct2; - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } else { - // 没有就正序找到第一个物料、判断上一个是否有货位 - JSONObject jsonAscBox2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq ASC").uniqueResult(0); - - JSONObject jsonAscStruct2 = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonAscBox2)) { - String out_order_seq2 = jsonAscBox2.getString("out_order_seq"); - // 上一个货位顺序号 - jsonAscStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } else { - JSONObject jsonAscEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq ASC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonAscEmpStruct)) { - String out_order_seq2 = jsonAscEmpStruct.getString("out_order_seq"); - jsonAscStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } - - } - if (ObjectUtil.isNotEmpty(jsonAscStruct2)) { - struct_jo = jsonAscStruct2; - - // 判断是否是第三层 且高度是否超过仓位高度 - if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) { - if (box_high > struct_jo.getDoubleValue("height")) { - struct_jo = null; - continue; - } - } - break; - } - } - } else { - continue; - } - } - } - } - return struct_jo; - } - - public JSONObject queryEmpStruct(JSONObject whereJson) { - JSONObject struct_jo = new JSONObject(); - String sect_id = whereJson.getString("sect_id"); - String placement_type = whereJson.getString("placement_type"); - String material_code = whereJson.getString("material_code"); - String sale_order_name = whereJson.getString("sale_order_name"); - - //根据分切计划查询该订单物料大概还有多少未入 - JSONObject row_map = new JSONObject(); - row_map.put("material_code", material_code); - row_map.put("sale_order_name", sale_order_name); - row_map.put("sect_id", sect_id); - row_map.put("flag", "12"); - JSONArray plan_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - if (ObjectUtil.isEmpty(plan_rows)) { - plan_rows = new JSONArray(); - } - //查询该销售订单及行号有多少个生成状态的箱子 - row_map.put("flag", "27"); - JSONArray box_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - if (ObjectUtil.isEmpty(box_rows)) { - box_rows = new JSONArray(); - } - int box_num = (int) Math.ceil(plan_rows.size() / 2) + box_rows.size(); - - //查询数量与订单物料箱子数量相近的一排 - JSONObject empty_row = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("sect_id", sect_id).addParam("flag", "13").addParam("sql_str", " ORDER BY abs(" + box_num + "-a.struct_num),block_num,row_num").process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(empty_row)) { - String block_num2 = empty_row.getString("block_num"); - String row_num2 = empty_row.getString("row_num"); - String placement_type2 = empty_row.getString("placement_type"); - - if ("02".equals(placement_type)) { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num2 + "' AND row_num = '" + row_num2 + "' AND placement_type = '" + placement_type2 + "' AND is_delete = '0' AND is_used = '1' AND lock_type = '1' order by out_order_seq ASC").uniqueResult(0); - } else { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num2 + "' AND row_num = '" + row_num2 + "' AND placement_type = '" + placement_type2 + "'AND is_delete = '0' AND is_used = '1' AND lock_type = '1' order by out_order_seq DESC").uniqueResult(0); - } - } else { - - //如果查询不到空的一排,则查询有空位双通的一排 - JSONObject have_row = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("sect_id", sect_id).addParam("flag", "14").addParam("sql_str", " ORDER BY abs(" + box_num + "-a.struct_num)").process().uniqueResult(0); - - if (ObjectUtil.isNotEmpty(have_row)) { - String block_num3 = have_row.getString("block_num"); - String row_num3 = have_row.getString("row_num"); - - //判断该排是左边为空,还是右边为空 - JSONObject right_str = WQLObject.getWQLObject("st_ivt_structattr").query("block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' order by out_order_seq").uniqueResult(0); - JSONObject left_str = WQLObject.getWQLObject("st_ivt_structattr").query("block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' order by out_order_seq desc").uniqueResult(0); - if (StrUtil.isNotEmpty(right_str.getString("storagevehicle_code")) || !"1".equals(right_str.getString("lock_type"))) { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq").uniqueResult(0); - } - if (StrUtil.isNotEmpty(left_str.getString("storagevehicle_code")) || !"1".equals(left_str.getString("lock_type"))) { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq desc").uniqueResult(0); - } - } - - } - return struct_jo; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTask(Map whereJson) { - WQLObject dis_wql = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - WQLObject task_wql = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject point_table = WQLObject.getWQLObject("SCH_BASE_Point"); - WQLObject struct_table = WQLObject.getWQLObject("ST_IVT_StructAttr"); - -// 判断入库点是否修改 - if (!whereJson.get("point_code").equals(whereJson.get("new_point_code"))) { - HashMap dis_map = new HashMap<>(); - HashMap task_map = new HashMap<>(); - PointDto pointDto = pointService.findByCode((String) whereJson.get("new_point_code")); - dis_map.put("point_code", pointDto.getPoint_code()); - dis_map.put("point_id", pointDto.getPoint_id() + ""); - dis_map.put("point_name", pointDto.getPoint_name()); - task_map.put("start_point_code", (String) whereJson.get("new_point_code")); - //修改分配表起点,任务表起点 - dis_wql.update(dis_map, "task_id = '" + whereJson.get("task_id") + "'"); - task_wql.update(task_map, "taskdtl_id = '" + whereJson.get("task_id") + "'"); - } - - - //判断目标货位是否修改 - if (!whereJson.get("struct_code").equals(whereJson.get("new_struct_code"))) { - //修改任务表终点 - HashMap task_map = new HashMap<>(); - task_map.put("next_point_code", (String) whereJson.get("new_struct_code")); - task_wql.update(task_map, "taskdtl_id = '" + whereJson.get("task_id") + "'"); - - //更新分配表的目的仓位 - StructattrDto structattrDto = structattrService.findByCode((String) whereJson.get("new_struct_code")); - HashMap str_map = new HashMap<>(); - str_map.put("sect_id", structattrDto.getSect_id()); - str_map.put("sect_code", structattrDto.getSect_code()); - str_map.put("sect_name", structattrDto.getSect_name()); - str_map.put("struct_id", structattrDto.getStruct_id()); - str_map.put("struct_code", structattrDto.getStruct_code()); - str_map.put("struct_name", structattrDto.getStruct_name()); - dis_wql.update(str_map, "task_id = '" + whereJson.get("task_id") + "'"); - -// 原货位解锁,新货位加锁 - HashMap unlock_map = new HashMap(); - unlock_map.put("lock_type", "1"); - point_table.update(unlock_map, "point_code = '" + whereJson.get("struct_code") + "'"); - struct_table.update(unlock_map, "struct_code = '" + whereJson.get("struct_code") + "'"); - - HashMap lock_map = new HashMap(); - lock_map.put("lock_type", "2"); - point_table.update(lock_map, "point_code = '" + whereJson.get("new_struct_code") + "'"); - struct_table.update(lock_map, "struct_code = '" + whereJson.get("new_struct_code") + "'"); - - //减去原库位待入数,加上新货位待入数 - //查询为该任务id的入库分配表,进行循环物料修改库存 - JSONArray dis_rows = dis_wql.query("task_id = '" + whereJson.get("task_id") + "'").getResultJSONArray(0); - if (dis_rows.size() <= 0) { - throw new BadRequestException("数据参数有误!"); - } - StructattrDto old_struct = structattrService.findByCode((String) whereJson.get("struct_code")); - JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + dis_rows.getJSONObject(0).getString("iostorinv_id") + "'").uniqueResult(0); - for (int i = 0; i < dis_rows.size(); i++) { - JSONObject i_form = new JSONObject(); - JSONObject dis_row = dis_rows.getJSONObject(i); - i_form.put("struct_id", old_struct.getStruct_id()); - i_form.put("material_id", dis_row.getString("material_id")); - i_form.put("quality_scode", dis_row.getString("quality_scode")); - i_form.put("pcsn", dis_row.getString("pcsn")); - i_form.put("ivt_level", dis_row.getString("ivt_level")); - i_form.put("change_qty", dis_row.getString("plan_qty")); - i_form.put("bill_type_scode", mst_jo.getString("bill_type")); - i_form.put("inv_id", mst_jo.getString("iostorinv_id")); - i_form.put("bill_code", mst_jo.getString("bill_code")); - i_form.put("bill_table", "ST_IVT_IOStorInv"); - i_form.put("qty_unit_id", dis_row.getString("qty_unit_id")); - i_form.put("qty_unit_name", dis_row.getString("qty_unit_name")); - storPublicService.IOStor(i_form, "32"); - - i_form.put("struct_id", structattrDto.getStruct_id()); - storPublicService.IOStor(i_form, "31"); - } - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void delTask(Map whereJson) { - WQLObject dis_wql = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - WQLObject task_wql = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject point_table = WQLObject.getWQLObject("SCH_BASE_Point"); - WQLObject struct_table = WQLObject.getWQLObject("ST_IVT_StructAttr"); - - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - - //更新任务表状态为删除 - HashMap task_map = new HashMap<>(); - task_map.put("is_delete", "1"); - task_map.put("update_optid", currentUserId); - task_map.put("update_optname", nickName); - task_map.put("update_time", now); - //修改分配表起点,任务表起点 - task_wql.update(task_map, "task_id = '" + whereJson.get("task_id") + "'"); - - //解锁原货位点位 - HashMap unlock_map = new HashMap(); - unlock_map.put("lock_type", "1"); - unlock_map.put("taskdtl_type", ""); - unlock_map.put("taskdtl_id", ""); - unlock_map.put("task_code", ""); - unlock_map.put("inv_type", ""); - unlock_map.put("inv_id", ""); - unlock_map.put("inv_code", ""); - point_table.update(unlock_map, "point_code = '" + whereJson.get("struct_code") + "'"); - struct_table.update(unlock_map, "struct_code = '" + whereJson.get("struct_code") + "'"); - - //减去原货位的待入数 - JSONArray dis_rows = dis_wql.query("task_id = '" + whereJson.get("task_id") + "'").getResultJSONArray(0); - if (dis_rows.size() <= 0) { - throw new BadRequestException("数据参数有误!"); - } - StructattrDto old_struct = structattrService.findByCode((String) whereJson.get("struct_code")); - JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + dis_rows.getJSONObject(0).getString("iostorinv_id") + "'").uniqueResult(0); - for (int i = 0; i < dis_rows.size(); i++) { - JSONObject i_form = new JSONObject(); - JSONObject dis_row = dis_rows.getJSONObject(i); - i_form.put("struct_id", old_struct.getStruct_id()); - i_form.put("material_id", dis_row.getString("material_id")); - i_form.put("quality_scode", dis_row.getString("quality_scode")); - i_form.put("pcsn", dis_row.getString("pcsn")); - i_form.put("change_qty", dis_row.getString("plan_qty")); - i_form.put("bill_type_scode", mst_jo.getString("bill_type")); - i_form.put("inv_id", mst_jo.getString("iostorinv_id")); - i_form.put("bill_code", mst_jo.getString("bill_code")); - i_form.put("bill_table", "ST_IVT_IOStorInv"); - i_form.put("qty_unit_id", dis_row.getString("qty_unit_id")); - i_form.put("qty_unit_name", dis_row.getString("qty_unit_name")); - storPublicService.IOStor(i_form, "32"); - - } - //更新分配状态 - HashMap map = new HashMap<>(); - map.put("point_id", ""); - map.put("sect_id", ""); - map.put("sect_code", ""); - map.put("sect_name", ""); - map.put("struct_id", ""); - map.put("struct_code", ""); - map.put("struct_name", ""); - map.put("task_id", ""); - WQLObject.getWQLObject("ST_IVT_IOStorInvDis").update(map, "iostorinv_id = '" + mst_jo.get("iostorinv_id") + "' AND box_no = '" + whereJson.get("box_no") + "'"); - - //修改明细状态 - HashMap dtl_map = new HashMap<>(); - map.put("bill_status", "10"); - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").update(map, "iostorinv_id = '" + mst_jo.get("iostorinv_id") + "' AND box_no = '" + whereJson.get("box_no") + "'"); - - //更新主表状态 - JSONArray dtl_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinv_id = '" + mst_jo.get("iostorinv_id") + "' AND bill_status IN ('20','30')").getResultJSONArray(0); - if (dtl_rows.size() > 0) { - mst_jo.put("bill_status", "30"); - } else { - mst_jo.put("bill_status", "10"); - } - WQLObject.getWQLObject("ST_IVT_IOStorInv").update(mst_jo); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void reIssueTask(Map whereJson) { - String task_id = (String) whereJson.get("task_id"); - //判断指令状态,只能下发生成、执行中状态的任务 - JSONObject task_jo = WQLObject.getWQLObject("sch_base_task").query("task_id = '" + task_id + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(task_jo)) { - throw new BadRequestException("请输入正确的任务号!"); - } - if (!"04".equals(task_jo.getString("task_status"))) { - throw new BadRequestException("只能修改任务状态为未下发的任务!"); - } - AbstractAcsTask task = new InTask(); - //调用ACS接受任务接口 - JSONObject result = task.immediateNotifyAcs(task_id); - if (ObjectUtil.isNotEmpty(result)) { - String status = result.getString("status"); - if ("200".equals(status)) { - HashMap map = new HashMap<>(); - //更新任务指令为下发 - JSONObject task_map = new JSONObject(); - task_map.put("task_id", task_id); - task.updateTaskStatus(task_map, "1"); - } else { - throw new BadRequestException("任务下发失败:" + result.getString("message")); - } - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void confirmTask(Map whereJson) { - //判断指令状态,只能下发生成、执行中状态的任务 - String task_code = (String) whereJson.get("task_code"); - JSONObject task_jo = WQLObject.getWQLObject("sch_base_task").query("task_code = '" + task_code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(task_jo)) { - throw new BadRequestException("请输入正确的任务号!"); - } - - AbstractAcsTask task = new InTask(); - task.updateTaskStatus(task_jo, TaskStatusEnum.FINISHED.getCode()); - } - - @Override - public void cancelTask(Map whereJson) { - WQLObject dis_wql = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - WQLObject task_wql = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject dtl_wql = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); - - JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "'").uniqueResult(0); - if ("99".equals(mst_jo.getString("bill_status"))) { - throw new BadRequestException("单据已完成,无法进行取消任务操作!"); - } - - //变更任务状态 - HashMap task_map = new HashMap(); - task_map.put("task_status", "01"); - task_wql.update(task_map, "taskdtl_id = '" + whereJson.get("task_id") + "'"); - - //更新实际数量 - JSONArray dis_rows = dis_wql.query("task_id = '" + whereJson.get("task_id") + "'").getResultJSONArray(0); - for (int i = 0; i < dis_rows.size(); i++) { - JSONObject dis_row = dis_rows.getJSONObject(i); - double real_qty = dis_row.getDoubleValue("real_qty"); - dis_row.put("real_qty", "0"); - dis_row.put("work_status", "01"); - dis_wql.update(dis_row); - - //更新明细实际数量 - JSONObject dtl_jo = dtl_wql.query("iostorinvdtl_id = '" + dis_row.getString("iostorinvdtl_id") + "'").uniqueResult(0); - double old_real_qty = dtl_jo.getDoubleValue("real_qty"); - dtl_jo.put("real_qty", NumberUtil.sub(old_real_qty, real_qty)); - dtl_wql.update(dtl_jo); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void confirm(Map whereJson) { - WQLObject dis_wql = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - WQLObject dtl_wql = WQLObject.getWQLObject("st_ivt_iostorinvdtl"); - - //校验主表状态为分配中、分配完 - JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "'").uniqueResult(0); - if (!"30".equals(mst_jo.getString("bill_status")) && !"40".equals(mst_jo.getString("bill_status"))) { - throw new BadRequestException("主表状态必须为分配中、分配完!"); - } - - //分配中任务状态必须全部为完成 - JSONArray dis_rows = dis_wql.query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "' AND work_status < '99'").getResultJSONArray(0); - if (dis_rows.size() > 0) { - throw new BadRequestException("存在未完成的作业,或存在组盘记录!"); - } - - //将明细全部变为99 - HashMap map = new HashMap(); - map.put("bill_status", "99"); - dtl_wql.update(map, "iostorinv_id = '" + whereJson.get("iostorinv_id") + "' AND bill_status < '99'").getResultJSONArray(0); - - //完成单据 - inbillService.confirmMst(JSONObject.parseObject(JSON.toJSONString(whereJson))); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void backConfirm(Map whereJson) { - WQLObject dtl_wql = WQLObject.getWQLObject("st_ivt_iostorinvdtl"); - WQLObject mst_wql = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - - //校验主表状态为生成 - JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "'").uniqueResult(0); - if (!"10".equals(mst_jo.getString("bill_status"))) { - throw new BadRequestException("主表状态必须为生成!"); - } - - JSONObject mst_row = mst_wql.query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "'").uniqueResult(0); - JSONArray dtl_rows = dtl_wql.query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "'").getResultJSONArray(0); - - //生成手工出库单 - String iostorinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - String bill_code = CodeUtil.getNewCode("IO_CODE"); - whereJson.put("iostorinv_id", iostorinv_id); - whereJson.put("bill_code", bill_code); - whereJson.put("io_type", "1"); - whereJson.put("bill_type", "010601"); - whereJson.put("buss_type", ((String) whereJson.get("bill_type")).substring(0, 4)); - mst_wql.insert(whereJson); - for (int i = 0; i < dtl_rows.size(); i++) { - JSONObject dtl_row = dtl_rows.getJSONObject(i); - dtl_row.put("source_billdtl_id", dtl_row.getString("iostorinvdtl_id")); - dtl_row.put("source_bill_type", mst_row.getString("bill_type")); - dtl_row.put("source_bill_code", mst_row.getString("bill_code")); - dtl_row.put("source_bill_table", "ST_IVT_IOStorInvDtl"); - dtl_row.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId()); - dtl_row.put("iostorinv_id", iostorinv_id); - dtl_row.put("bill_status", "10"); - dtl_wql.insert(dtl_row); - } - - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - - mst_row.put("bill_status", "99"); - mst_row.put("confirm_optid", currentUserId); - mst_row.put("confirm_optname", nickName); - mst_row.put("confirm_time", now); - //更新主表状态为99 - mst_wql.update(mst_row); - - HashMap map = new HashMap<>(); - map.put("bill_status", "99"); - dtl_wql.update(map, "iostorinv_id = '" + mst_row.get("iostorinv_id") + "'"); - } - - /** - * 新开事务,把当前事务挂起,(新开事务不回滚) - */ - @Transactional() - public void updateStructSect(String layer_num) { - WQLObject attr = WQLObject.getWQLObject("st_ivt_structattr"); - WQLObject point = WQLObject.getWQLObject("sch_base_point"); - /* - * 1.将主存区的一排更改为中转区 - * 2.将中转区的一排更改为主存区 - */ - String block_num = ""; - String row_num = ""; - // 1.找主存区数量小的一排转为中转区 - // 根据块、排进行分组,优先空排 -> 有货数量少的 - List attrListAllEmp = WQL.getWO("ST_UPDATESTRUCTSECT_01").addParam("flag", "1") - .addParam("layer_num", layer_num).process().getResultJSONArray(0) - .toJavaList(JSONObject.class); - - if (ObjectUtil.isEmpty(attrListAllEmp)) { - // 如果为空则查找有空位的排 - List attrListEmp = WQL.getWO("ST_UPDATESTRUCTSECT_01").addParam("flag", "2") - .addParam("layer_num", layer_num).process().getResultJSONArray(0) - .toJavaList(JSONObject.class); - - if (ObjectUtil.isEmpty(attrListEmp)) { - throw new BadRequestException("自动扩容失败,主存区没有空位可扩容!"); - } - - // 判断是这排是否被锁住 - String block_num_in = attrListEmp.stream() - .map(row -> row.getString("block_num")) - .collect(Collectors.joining("','")); - - String row_num_in = attrListEmp.stream() - .map(row -> row.getString("row_num")) - .collect(Collectors.joining("','")); - - List rowList = attr.query("block_num in ('" + block_num_in + "') AND row_num in ('" + row_num_in + "') and layer_num = '" + layer_num + "' and sect_code = 'ZC01'") - .getResultJSONArray(0).toJavaList(JSONObject.class); - - for (int i = 0; i < attrListEmp.size(); i++) { - JSONObject json = attrListEmp.get(i); - - List collect = rowList.stream() - .filter(row -> row.getString("block_num").equals(json.getString("block_num")) && - row.getString("row_num").equals(json.getString("row_num")) - ) - .collect(Collectors.toList()); - - // 判断是否全部都为未锁定 - boolean isLock = collect.stream() - .allMatch(row -> row.getString("lock_type").equals("1")); - - if (!isLock) { - continue; - } - - block_num = json.getString("block_num"); - row_num = json.getString("row_num"); - break; - } - } else { - JSONObject json = attrListAllEmp.get(0); - block_num = json.getString("block_num"); - row_num = json.getString("row_num"); - } - - if (ObjectUtil.isEmpty(block_num) && ObjectUtil.isEmpty(row_num)) { - throw new BadRequestException(layer_num + "层没有仓位可分配为中转区!"); - } - - // 2.将中转区的一排更改为主存区 - // 查询中转区满的一排 - List attrListAllNoEmp = WQL.getWO("ST_UPDATESTRUCTSECT_01").addParam("flag", "3") - .addParam("layer_num", layer_num).process().getResultJSONArray(0) - .toJavaList(JSONObject.class); - - if (ObjectUtil.isNotEmpty(attrListAllNoEmp)) { - // 更新仓位为主存区 - JSONObject jsonParam2 = new JSONObject(); - jsonParam2.put("sect_id", RegionTypeEnum.ZC01.getId()); - jsonParam2.put("sect_code", "ZC01"); - jsonParam2.put("sect_name", RegionTypeEnum.ZC01.getName()); - - JSONObject json = attrListAllNoEmp.get(0); - // 更新仓位 - attr.update(jsonParam2,"sect_code = 'ZZ01' AND block_num = '"+json.getString("block_num")+"' AND row_num = '"+json.getString("row_num")+"' AND layer_num = '"+layer_num+"'"); - - // 更新点位 - jsonParam2.put("region_id", RegionTypeEnum.ZC01.getId()); - jsonParam2.put("region_code", "ZC01"); - jsonParam2.put("region_name", RegionTypeEnum.ZC01.getName()); - point.update(jsonParam2,"region_code = 'ZZ01' AND block_num = '"+json.getString("block_num")+"' AND row_num = '"+json.getString("row_num")+"' AND layer_num = '"+layer_num+"'"); - - } - - // 更新仓位为中转区 - JSONObject jsonParam = new JSONObject(); - jsonParam.put("sect_id", RegionTypeEnum.ZZ01.getId()); - jsonParam.put("sect_code", "ZZ01"); - jsonParam.put("sect_name", RegionTypeEnum.ZZ01.getName()); - attr.update(jsonParam,"sect_code = 'ZC01' AND block_num = '"+block_num+"' AND row_num = '"+row_num+"' AND layer_num = '"+layer_num+"'"); - - // 更新点位 - jsonParam.put("region_id", RegionTypeEnum.ZZ01.getId()); - jsonParam.put("region_code", "ZZ01"); - jsonParam.put("region_name", RegionTypeEnum.ZZ01.getName()); - point.update(jsonParam,"region_code = 'ZC01' AND block_num = '"+block_num+"' AND row_num = '"+row_num+"' AND layer_num = '"+layer_num+"'"); - } - - /** - * 1层主存区扩容:空托盘区 ==> 主存区 - */ - public boolean updateStructSectOne() { - WQLObject attr = WQLObject.getWQLObject("st_ivt_structattr"); - WQLObject point = WQLObject.getWQLObject("sch_base_point"); - /* - * 1.找空托盘区空的一排进行扩容 - * - */ - // 找空托盘区空的一排 - List rowList = WQL.getWO("ST_UPDATESTRUCTSECTONE_01").addParam("flag", "1") - .process().getResultJSONArray(0).toJavaList(JSONObject.class); - - // 如果没有空排或者空排低于2排则不允许扩容 - if (ObjectUtil.isEmpty(rowList) || rowList.size() <= 2) { - log.info("空托盘区需预留2排空位,不容许扩容!"); - return false; - } - - try { - JSONObject json = rowList.get(0); - - // 更新仓位为主存区 - JSONObject jsonParam = new JSONObject(); - jsonParam.put("sect_id", RegionTypeEnum.ZC01.getId()); - jsonParam.put("sect_code", "ZC01"); - jsonParam.put("sect_name", RegionTypeEnum.ZC01.getName()); - attr.update(jsonParam,"sect_code = 'KTP01' AND block_num = '"+json.getString("block_num")+"' AND row_num = '"+json.getString("row_num")+"' AND layer_num = '1'"); - - // 更新点位为主存区域 - jsonParam.put("region_id", RegionTypeEnum.ZC01.getId()); - jsonParam.put("region_code", "ZC01"); - jsonParam.put("region_name", RegionTypeEnum.ZC01.getName()); - point.update(jsonParam,"region_code = 'KTP01' AND block_num = '"+json.getString("block_num")+"' AND row_num = '"+json.getString("row_num")+"' AND layer_num = '1'"); - } catch (Exception e) { - System.out.println("1层主存区扩容失败:"+e.getMessage()); - return false; - } - return true; - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/rest/HandMoveStorController.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/rest/HandMoveStorController.java index d429d4b..2c91e1e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/rest/HandMoveStorController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/rest/HandMoveStorController.java @@ -96,11 +96,4 @@ public class HandMoveStorController { return new ResponseEntity<>(HttpStatus.NO_CONTENT); } - @PostMapping("/checkReturn") - @Log("盘点回库") - - public ResponseEntity checkReturn() { - handMoveStorService.checkReturn(); - return new ResponseEntity<>(HttpStatus.OK); - } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/HandMoveStorService.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/HandMoveStorService.java index aaa2b25..41e81a7 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/HandMoveStorService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/HandMoveStorService.java @@ -110,9 +110,4 @@ public interface HandMoveStorService { * @param whereJson / */ void handdown(JSONObject whereJson); - - /** - * 盘点回库 - */ - void checkReturn(); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/HandMoveStorServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/HandMoveStorServiceImpl.java index 1f82542..ee235a5 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/HandMoveStorServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/HandMoveStorServiceImpl.java @@ -16,25 +16,18 @@ import org.nl.modules.common.exception.BadRequestException; import org.nl.common.utils.CodeUtil; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.modules.wql.util.SpringContextHolder; import org.nl.modules.wql.util.WqlUtil; import org.nl.wms.basedata.st.service.impl.UserStorServiceImpl; -import org.nl.wms.pda.mps.eum.RegionTypeEnum; import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.OutTask; -import org.nl.wms.st.inbill.service.RawAssistIStorService; import org.nl.wms.st.inbill.service.StorPublicService; import org.nl.wms.st.instor.service.HandMoveStorService; import org.nl.wms.st.instor.task.EmpMoveTask; import org.nl.wms.st.instor.task.HandMoveStorAcsTask; -import org.nl.wms.st.outbill.service.impl.CheckOutBillServiceImpl; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; -import java.util.function.Consumer; -import java.util.stream.Collectors; /** * PC端出入库新增 @@ -44,10 +37,6 @@ import java.util.stream.Collectors; @Slf4j public class HandMoveStorServiceImpl implements HandMoveStorService { private final StorPublicService storPublicService; - private final HandMoveStorAcsTask handMoveStorAcsTask; - private final EmpMoveTask empMoveTask; - private final OutTask outTask; - private final RawAssistIStorService rawAssistIStorService; @Override public Map pageQuery(Map whereJson, Pageable page) { @@ -85,88 +74,10 @@ public class HandMoveStorServiceImpl implements HandMoveStorService { if (jo_mst.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { this.deleteByIdTwo(moveinv_id + ""); - } else { - this.deleteById(moveinv_id + ""); } } } - /** - * 通过moveinv_id删除明细,还原库存等操作 - * - * @param moveinv_id - */ - public void deleteById(String moveinv_id) { - //明细表 - WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_MoveInvDtl"); - //主表 - WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_MoveInv"); - //任务表 - WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); - //点位表 - WQLObject wo_Point = WQLObject.getWQLObject("sch_base_point"); - //仓位表 - WQLObject wo_Attr = WQLObject.getWQLObject("st_ivt_structattr"); - - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - HashMap map = new HashMap<>(); - map.put("is_delete", "1"); - map.put("update_optid", currentUserId + ""); - map.put("update_optname", nickName); - map.put("update_time", now); - JSONObject jo_mst = wo_mst.query("moveinv_id='" + moveinv_id + "'").uniqueResult(0); - JSONArray ja = wo_dtl.query("moveinv_id='" + moveinv_id + "'").getResultJSONArray(0); - String point_code2 = ""; - for (int i = 0; i < ja.size(); i++) { - JSONObject jo = ja.getJSONObject(i); - //删除任务 - HashMap task_map = new HashMap<>(); - task_map.put("is_delete", "1"); - point_code2 = wo_Task.query("task_id = '" + jo.getString("task_id") + "'").uniqueResult(0).getString("point_code2"); - wo_Task.update(task_map, "task_id='" + jo.getString("task_id") + "'"); - //解锁起点点位、仓位 - JSONObject from_start = new JSONObject(); - from_start.put("lock_type", "1"); - from_start.put("is_free", "0"); - from_start.put("struct_id", jo.getString("turnout_struct_id")); - from_start.put("storagevehicle_code", jo.getString("storagevehicle_code")); - storPublicService.updateStructAndPoint(from_start); - //解锁终点点位、仓位 - from_start.put("struct_id", jo.getString("turnin_struct_id")); - storPublicService.updateStructAndPoint(from_start); - - //更新移出库存 - jo.put("struct_id", jo.getString("turnout_struct_id")); - jo.put("change_qty", jo.getDoubleValue("qty")); - jo.put("bill_type_scode", jo_mst.getString("bill_type")); - jo.put("inv_id", jo.getString("moveinvdtl_id")); - jo.put("bill_code", jo_mst.getString("bill_code")); - jo.put("bill_table", "ST_IVT_MoveInv"); - storPublicService.IOStor(jo, "12"); - //更新移入库存 - jo.put("struct_id", jo.getString("turnin_struct_id")); - jo.put("bill_type_scode", jo_mst.getString("bill_type")); - jo.put("inv_id", jo.getString("moveinvdtl_id")); - jo.put("bill_code", jo_mst.getString("bill_code")); - jo.put("bill_table", "ST_IVT_MoveInv"); - storPublicService.IOStor(jo, "32"); - //删除明细 - wo_dtl.delete("moveinvdtl_id='" + jo.getString("moveinvdtl_id") + "'"); - } - //更新主表 - wo_mst.update(map, "moveinv_id='" + moveinv_id + "'"); - // 更新移入点位 - JSONObject jsonPoint = wo_Point.query("point_code = '" + point_code2 + "'").uniqueResult(0); - jsonPoint.put("vehicle_code", ""); - wo_Point.update(jsonPoint); - - JSONObject jsonAttr = wo_Attr.query("struct_code = '" + point_code2 + "'").uniqueResult(0); - jsonAttr.put("storagevehicle_code", ""); - wo_Attr.update(jsonAttr); - - } /** * 通过moveinv_id删除明细,还原库存等操作(二期) * @@ -244,10 +155,6 @@ public class HandMoveStorServiceImpl implements HandMoveStorService { public void insertDtl(Map map) { String bill_type = MapUtil.getStr(map, "bill_type"); - if (StrUtil.equals(bill_type, "30")) { - // 辅道移库: 调用辅道出库方法 - map = roadInsertDtl(map); - } if (ObjectUtil.isNotEmpty(map.get("tableData"))) { //主表 @@ -284,8 +191,6 @@ public class HandMoveStorServiceImpl implements HandMoveStorService { JSONObject ret = new JSONObject(); if (jo_mst.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { ret = this.insertDtlByRows2(jo_mst, arrayTwo); - } else { - ret = this.insertDtlByRows(jo_mst, rows); } map.put("detail_count", ret.getString("detail_count")); @@ -294,93 +199,7 @@ public class HandMoveStorServiceImpl implements HandMoveStorService { } } - @Transactional(rollbackFor = Exception.class) - public Map roadInsertDtl(Map map) { - WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); - /* - 1.货位上是空托盘:直接生成点对点任务 - 2.货位上是木箱:走正常流程 - */ - RawAssistIStorService rawAssistIStorService = SpringContextHolder.getBean(RawAssistIStorService.class); - // 1.找出此区域 第 7 排所有有货货位 - String block_num = MapUtil.getStr(map, "block_num"); - // 判断此区有没有被锁住的货位 - JSONArray resultJSONArray = attrTab.query("block_num = '" + block_num + "' and is_used = '1' and is_delete = '0' and row_num = '7' and lock_type <> '1'").getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(resultJSONArray)) { - throw new BadRequestException("有正在运行的任务或已锁定未生成任务"); - } - - // 找出所有货位 - JSONArray boxArr = attrTab.query("block_num = '" + block_num + "' and is_used = '1' and is_delete = '0' and IFNULL(storagevehicle_code,'') <> '' and lock_type = '1' and row_num = '7' order by out_order_seq DESC").getResultJSONArray(0); - - // 判断是否是空托盘区 - boolean is_ktp = boxArr.stream() - .map(row -> (JSONObject) row) - .anyMatch(row -> StrUtil.equals(row.getString("sect_code"), "KTP01")); - - ArrayList dtlArr = new ArrayList<>(); - - if (is_ktp) { - // 空托盘 - for (int i = 0; i < boxArr.size(); i++) { - JSONObject json = boxArr.getJSONObject(i); - // 调用空托盘入库 - JSONObject param = new JSONObject(); - param.put("block_num", json.getString("block_num")); - param.put("row_num", json.getString("row_num")); - JSONObject jsonEmp = queryEmp(param); - - // 生成空托盘移库任务 - JSONObject param2 = new JSONObject(); - param2.put("task_type", "010505"); - param2.put("task_name", "空托盘转库任务"); - param2.put("vehicle_code", json.getString("storagevehicle_code")); - param2.put("point_code1", json.getString("struct_code")); - param2.put("point_code2", jsonEmp.getString("struct_code")); - String task_id = empMoveTask.createTask(param2); - - // 下发任务 - empMoveTask.immediateNotifyAcs(task_id); - } - } else { - // 货位 - for (int i = 0; i < boxArr.size(); i++) { - JSONObject json = boxArr.getJSONObject(i); - - // 找到一个移入货位 - JSONObject moveParam = new JSONObject(); - moveParam.put("box_no", json.getString("storagevehicle_code")); - moveParam.put("sect_id", RegionTypeEnum.ZZ01.getId()); - moveParam.put("layer_num", json.getString("layer_num")); - - JSONObject jsonMove = rawAssistIStorService.autoDisMove(moveParam); - - if (ObjectUtil.isEmpty(jsonMove)) { - throw new BadRequestException("没有可用暂存位"); - } - - // 组织明细 - - JSONArray jsonIvt = WQL.getWO("QST_IVT_HANDMOVESTOR").addParam("flag", "35").addParam("package_box_sn", json.getString("storagevehicle_code")).process().getResultJSONArray(0); - List collect = jsonIvt.stream().map(row -> (Map) row).collect(Collectors.toList()); - collect.forEach(row -> { - row.put("wrok_status", "10"); - row.put("turnin_sect_id", jsonMove.getString("sect_id")); - row.put("turnin_sect_code", jsonMove.getString("sect_code")); - row.put("turnin_sect_name", jsonMove.getString("sect_name")); - row.put("turnin_struct_id", jsonMove.getString("struct_id")); - row.put("turnin_struct_code", jsonMove.getString("struct_code")); - row.put("turnin_struct_name", jsonMove.getString("struct_name")); - dtlArr.add(row); - }); - jsonMove.put("lock_type", "7"); - attrTab.update(jsonMove); - } - } - map.put("tableData", dtlArr); - return map; - } @Transactional(rollbackFor = Exception.class) public JSONObject queryEmp(JSONObject whereJson) { @@ -455,147 +274,6 @@ public class HandMoveStorServiceImpl implements HandMoveStorService { return struct_jo; } - /** - * 根据传进来的载具物料明细,查询载具所有库存记录,并生成移库明细 - * - * @param rows - */ - @Transactional(rollbackFor = Exception.class) - JSONObject insertDtlByRows(JSONObject jo_mst, ArrayList rows) { - //明细表 - WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_MoveInvDtl"); - //主表 - WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_MoveInv"); - //任务表 - WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); - //点位表 - WQLObject wo_Point = WQLObject.getWQLObject("SCH_BASE_Point"); - //定义返回数据 - JSONObject ret = new JSONObject(); - - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - //定义需要需要插入的库存集合 - HashMap Struct_map = new HashMap(); - StringBuffer ids = new StringBuffer(); - for (int i = 0; i < rows.size(); i++) { - Map row = rows.get(i); - JSONObject jo_row = (JSONObject) JSONObject.toJSON(row); - String storagevehicle_code = (String) row.get("storagevehicle_code"); - if (i == 0) { - ids.append("'"); - } - if (!Struct_map.containsKey(storagevehicle_code)) { - Struct_map.put(storagevehicle_code, jo_row); - } - if (i != 0) { - ids.append("','"); - } - ids.append(storagevehicle_code); - } - ids.append("'"); - //查询所有载具的库存 - JSONArray ja = WQL.getWO("QST_IVT_HANDMOVESTOR") - .addParam("flag", "33") - .addParam("ids", ids.toString()) - .process().getResultJSONArray(0); - if (ja.size() == 0) { - throw new BadRequestException("当前所有载具无可移库库存!"); - } - double total_qty = 0; - for (int i = 0; i < ja.size(); i++) { - JSONObject jo = ja.getJSONObject(i); - String moveinvdtl_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - total_qty = total_qty + jo.getDoubleValue("qty"); - jo.put("moveinvdtl_id", moveinvdtl_id); - jo.put("moveinv_id", jo_mst.getString("moveinv_id")); - jo.put("seq_no", (i + 1) + ""); - jo.put("work_status", "01"); - jo.put("is_issued", "0"); - JSONObject row = Struct_map.get(jo.getString("storagevehicle_code")); - String turnin_struct_id = row.getString("turnin_struct_id"); - jo.put("turnin_sect_id", row.getString("turnin_sect_id")); - jo.put("turnin_sect_code", row.getString("turnin_sect_code")); - jo.put("turnin_sect_name", row.getString("turnin_sect_name")); - jo.put("turnin_struct_id", turnin_struct_id); - jo.put("turnin_struct_code", row.getString("turnin_struct_code")); - jo.put("turnin_struct_name", row.getString("turnin_struct_name")); - //查询移入点位 - JSONObject point = wo_Point.query("source_id='" + turnin_struct_id + "'").uniqueResult(0); - if (point == null) { - throw new BadRequestException(row.getString("turnin_struct_code") + "仓位数据异常,找不到对应点位!"); - } - //判断是否已生成过了任务,无未生成则插入任务 - JSONObject task = wo_Task.query("is_delete = '0' and task_status<'05' and point_code1='" + jo.getString("start_point_code") + "'").uniqueResult(0); - if (task != null) { - jo.put("task_id", task.getString("task_id")); - } else { - task = new JSONObject(); - String task_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - String task_code = IdUtil.getSnowflake(1, 1).nextId() + ""; - - task.put("taskdtl_id", task_id); - task.put("task_id", task_id); - task.put("task_code", task_code); - task.put("task_type", "010505"); - task.put("acs_task_type", "7"); - task.put("task_status", TaskStatusEnum.SURE_START.getCode()); - task.put("point_code1", jo.getString("start_point_code")); - task.put("point_code2", point.getString("point_code")); - task.put("vehicle_code", jo.getString("storagevehicle_code")); - task.put("handle_class", HandMoveStorAcsTask.class.getName()); - task.put("finished_type", ""); - task.put("is_delete", "0"); - task.put("create_id", currentUserId); - task.put("create_name", nickName); - task.put("create_time", now); - task.put("update_optid", currentUserId); - task.put("update_optname", nickName); - task.put("update_time", now); - task.put("priority", "1"); - wo_Task.insert(task); - jo.put("task_id", task_id); - } - //插入明细表 - wo_dtl.insert(jo); - - //更新移出库存 - jo.put("struct_id", jo.getString("turnout_struct_id")); - jo.put("change_qty", jo.getDoubleValue("qty")); - jo.put("bill_type_scode", jo_mst.getString("bill_type")); - jo.put("inv_id", moveinvdtl_id); - jo.put("bill_code", jo_mst.getString("bill_code")); - jo.put("bill_table", "ST_IVT_MoveInv"); - storPublicService.IOStor(jo, "11"); - //更新移入库存 - jo.put("struct_id", turnin_struct_id); - jo.put("bill_type_scode", jo_mst.getString("bill_type")); - jo.put("inv_id", moveinvdtl_id); - jo.put("bill_code", jo_mst.getString("bill_code")); - jo.put("bill_table", "ST_IVT_MoveInv"); - storPublicService.IOStor(jo, "31"); - //锁定起点点位、仓位 - JSONObject from_start = new JSONObject(); - from_start.put("lock_type", "6"); - from_start.put("struct_id", jo.getString("turnout_struct_id")); - from_start.put("inv_type", jo_mst.getString("bill_type")); - from_start.put("inv_id", jo_mst.getString("moveinv_id")); - from_start.put("inv_code", jo_mst.getString("bill_code")); - from_start.put("taskdtl_type", task.getString("taskdtl_type")); - from_start.put("taskdtl_id", task.getString("taskdtl_id")); - from_start.put("task_code", task.getString("task_code")); - storPublicService.updateStructAndPoint(from_start); - //锁定终点点位、仓位 - from_start.put("struct_id", turnin_struct_id); - from_start.put("lock_type", "7"); - storPublicService.updateStructAndPoint(from_start); - } - ret.put("total_qty", total_qty); - ret.put("detail_count", ja.size()); - return ret; - } - @Override @Transactional(rollbackFor = Exception.class) public String insertDtl2(JSONObject json) { @@ -696,13 +374,6 @@ public class HandMoveStorServiceImpl implements HandMoveStorService { jo.put("turnin_struct_code", row.getString("turnin_struct_code")); jo.put("turnin_struct_name", row.getString("turnin_struct_name")); //查询移入点位 - 如果是二期的就不用查询 - JSONObject point = new JSONObject(); - if(!jo_mst.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { - point = wo_Point.query("source_id='" + turnin_struct_id + "'").uniqueResult(0); - if (point == null) { - throw new BadRequestException(row.getString("turnin_struct_code") + "仓位数据异常,找不到对应点位!"); - } - } //判断是否已生成过了任务,无未生成则插入任务 JSONObject task = wo_Task.query("is_delete = '0' and task_status='04' and point_code1 ='" + jo.getString("turnout_struct_code") + "'").uniqueResult(0); @@ -715,17 +386,13 @@ public class HandMoveStorServiceImpl implements HandMoveStorService { task.put("task_id", task_id); task.put("task_code", task_code); - if(!jo_mst.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { - task.put("task_type", "010505"); - } else { + if(jo_mst.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { task.put("task_type", "010709"); } task.put("acs_task_type", "7"); task.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); task.put("point_code1", jo.getString("turnout_struct_code")); - if(!jo_mst.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { - task.put("point_code2", point.getString("point_code")); - } else { + if(jo_mst.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { task.put("point_code2", row.getString("turnin_struct_code")); } task.put("vehicle_code", jo.getString("storagevehicle_code")); @@ -777,18 +444,14 @@ public class HandMoveStorServiceImpl implements HandMoveStorService { from_start.put("taskdtl_id", task.getString("taskdtl_id")); from_start.put("task_code", task.getString("task_code")); - if(!jo_mst.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { - storPublicService.updateStructAndPoint(from_start); - } else { + if(jo_mst.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { storPublicService.updateStructAndPointTwo(from_start); } //锁定终点点位、仓位 from_start.put("struct_id", turnin_struct_id); from_start.put("lock_type", "7"); - if(!jo_mst.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { - storPublicService.updateStructAndPoint(from_start); - } else { + if(jo_mst.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { storPublicService.updateStructAndPointTwo(from_start); } } @@ -823,8 +486,6 @@ public class HandMoveStorServiceImpl implements HandMoveStorService { //调用删除明细,还原库存方法 if (jo_mst.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { this.deleteByIdTwo(moveinv_id + ""); - } else { - this.deleteById(moveinv_id + ""); } //获取明细 @@ -835,18 +496,16 @@ public class HandMoveStorServiceImpl implements HandMoveStorService { JSONObject ret ; if (jo_mst.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { ret = this.insertDtlByRows2(jo_mst, arrayTwo); - } else { - ret = this.insertDtlByRows(jo_mst, rows); + jo_mst.put("remark", whereJson.get("remark")); + jo_mst.put("biz_date", whereJson.get("biz_date")); + jo_mst.put("detail_count", ret.getString("detail_count")); + jo_mst.put("total_qty", ret.getString("total_qty")); + jo_mst.put("update_optid", currentUserId + ""); + jo_mst.put("update_optname", nickName); + jo_mst.put("update_time", now); + //更新主表 + wo_mst.update(jo_mst); } - jo_mst.put("remark", whereJson.get("remark")); - jo_mst.put("biz_date", whereJson.get("biz_date")); - jo_mst.put("detail_count", ret.getString("detail_count")); - jo_mst.put("total_qty", ret.getString("total_qty")); - jo_mst.put("update_optid", currentUserId + ""); - jo_mst.put("update_optname", nickName); - jo_mst.put("update_time", now); - //更新主表 - wo_mst.update(jo_mst); } @Override @@ -1367,14 +1026,6 @@ public class HandMoveStorServiceImpl implements HandMoveStorService { JSONObject jo = ja.getJSONObject(i); String task_id = jo.getString("task_id"); - if (!StrUtil.equals(bill_type, "30")) { - // 判断起点是否被挡 - JSONObject jsonTask = wo_Task.query("task_id = '" + task_id + "'").uniqueResult(0); - JSONObject jsonAttr = wo_attr.query("struct_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0); - // 调用共用判断是否阻挡并生成任务、移库单 - this.isBlock(jsonAttr); - } - JSONObject task = wo_Task.query("task_id='" + task_id + "'").uniqueResult(0); task.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); wo_Task.update(task); @@ -1406,284 +1057,6 @@ public class HandMoveStorServiceImpl implements HandMoveStorService { wo_mst.update(map, "moveinv_id='" + moveinv_id + "'"); } - @Override - @Transactional(rollbackFor = Exception.class) - public void checkReturn() { - /* - * 将所有盘点位上的木箱生成移库单并下发任务 - */ - WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); // 仓位表 - - // 1.找出所有需要盘点的移库的木箱 - JSONArray boxArr = attrTab.query("sect_id = '" + RegionTypeEnum.PD01.getId() + "' and IFNULL(storagevehicle_code,'') <> '' and is_used = '1' and is_delete = '0' order by block_num ASC,out_order_seq DESC").getResultJSONArray(0); - if (ObjectUtil.isEmpty(boxArr)) { - throw new BadRequestException("没有需要盘点回库的木箱!"); - } - - // 2.判断是否有被锁定的木箱 - boolean is_lock = boxArr.stream().map(row -> (JSONObject) row) - .anyMatch(row -> !StrUtil.equals(row.getString("lock_type"), "1")); - - if (is_lock) { - throw new BadRequestException("木箱存在被锁定,请检查!"); - } - - /* for (int i = 0; i < boxArr.size(); i++) { - JSONObject json = boxArr.getJSONObject(i); - - // 3.判断木箱是否存在未完成的盘点单 - WQL.getWO("QST_IVT_HANDMOVESTOR").addParam("flag", "8").addParam("storagevehicle_code",json.getString("storagevehicle_code")); - - }*/ - - // 3.判断木箱是否存在未完成的盘点单 - boxArr.forEach(row -> { - JSONObject json = WQL.getWO("QST_IVT_HANDMOVESTOR").addParam("flag", "8").addParam("storagevehicle_code", ((JSONObject) row).getString("storagevehicle_code")).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(json)) { - throw new BadRequestException("此木箱的盘点单据未完成:" + json.getString("storagevehicle_code")); - } - }); - - // 4.生成移库单 - for (int i = 0; i < boxArr.size(); i++) { - JSONObject json = boxArr.getJSONObject(i); - - // 找一个移入仓位 - RawAssistIStorService rawAssistIStorService = SpringContextHolder.getBean(RawAssistIStorService.class); - - JSONObject moveParamIn = new JSONObject(); - moveParamIn.put("box_no", json.getString("storagevehicle_code")); - moveParamIn.put("sect_id", RegionTypeEnum.ZC01.getId()); - moveParamIn.put("layer_num", json.getString("layer_num")); - JSONObject jsonMoveIn = rawAssistIStorService.autoDisMove(moveParamIn); - - if (ObjectUtil.isEmpty(jsonMoveIn)) { - throw new BadRequestException("没有可用暂存位"); - } - - JSONObject jsonMst = new JSONObject(); // 主表 - jsonMst.put("bill_type", "31"); - jsonMst.put("buss_type", "31"); - jsonMst.put("bill_status", "10"); - jsonMst.put("biz_date", DateUtil.today()); - jsonMst.put("stor_code", "CP01"); - jsonMst.put("stor_id", "1582991156504039424"); - jsonMst.put("stor_name", "成品仓库"); - jsonMst.put("is_task", "1"); - - JSONArray dtlArr = new JSONArray(); // 明细 - - // 组织明细 - JSONArray jsonIvt = WQL.getWO("QST_IVT_HANDMOVESTOR").addParam("flag", "35").addParam("package_box_sn", json.getString("storagevehicle_code")).process().getResultJSONArray(0); - jsonIvt.forEach(row -> { - ((JSONObject) row).put("wrok_status", "10"); - ((JSONObject) row).put("turnin_sect_id", jsonMoveIn.getString("sect_id")); - ((JSONObject) row).put("turnin_sect_code", jsonMoveIn.getString("sect_code")); - ((JSONObject) row).put("turnin_sect_name", jsonMoveIn.getString("sect_name")); - ((JSONObject) row).put("turnin_struct_id", jsonMoveIn.getString("struct_id")); - ((JSONObject) row).put("turnin_struct_code", jsonMoveIn.getString("struct_code")); - ((JSONObject) row).put("turnin_struct_name", jsonMoveIn.getString("struct_name")); - dtlArr.add(row); - }); - - jsonMst.put("tableData", dtlArr); - String moveinv_id = insertDtl2(jsonMst); - - // 下发任务 - JSONObject taskParam = new JSONObject(); - taskParam.put("moveinv_id", moveinv_id); - taskParam.put("bill_type", jsonMst.getString("jsonMst")); - - handdown(taskParam); - } - } - - @Transactional(rollbackFor = Exception.class) - public Integer isBlock(JSONObject whereJson) { - String placement_type = whereJson.getString("placement_type"); - CheckOutBillServiceImpl bean = SpringContextHolder.getBean(CheckOutBillServiceImpl.class); - - JSONArray jsonLockArr = new JSONArray(); - - if (StrUtil.equals(placement_type, "01")) { - /* - * 双通 - */ - - // 判断右边边被阻挡个数 - JSONObject isNumMap = new JSONObject(); - isNumMap.put("flag", "3"); - isNumMap.put("block_num", whereJson.getString("block_num")); - isNumMap.put("row_num", whereJson.getString("row_num")); - isNumMap.put("out_order_seq", whereJson.getString("out_order_seq")); - JSONArray numArrFirst = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - // 调用共用方法计算被挡个数 - JSONArray rightNumArr = bean.isNum(numArrFirst); - - // 判断左边被挡个数 - isNumMap.put("flag", "4"); - JSONArray numArrLast = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - // 调用共用方法计算被挡个数 - JSONArray leftNumArr = bean.isNum(numArrLast); - - if (rightNumArr.size() > leftNumArr.size()) { - /* - * 左边开始 - */ - // 查询仓位被锁住的货位 - isNumMap.put("flag", "5"); - JSONArray isLockArr = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - JSONArray numArr = bean.isNum(isLockArr); - // 不为空则返回报错 - if (ObjectUtil.isNotEmpty(numArr)) { - String error = ""; - - for (int k = 0; k < numArr.size(); k++) { - JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); - - } - - throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!"); - } - - // 查询被阻挡需要移库的货位 - isNumMap.put("flag", "6"); - jsonLockArr = WQL.getWO("QST_IVT_HANDMOVESTOR").addParamMap(isNumMap).process().getResultJSONArray(0); - - } else if (rightNumArr.size() < leftNumArr.size()) { - /* - * 右边开始 - */ - // 查询仓位被锁住的货位 - isNumMap.put("flag", "6"); - JSONArray isLockArr = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - JSONArray numArr = bean.isNum(isLockArr); - - // 不为空则返回报错 - if (ObjectUtil.isNotEmpty(numArr)) { - String error = ""; - - for (int k = 0; k < numArr.size(); k++) { - JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); - } - - throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!"); - } - - // 查询被阻挡需要移库的货位 - isNumMap.put("flag", "7"); - jsonLockArr = WQL.getWO("QST_IVT_HANDMOVESTOR").addParamMap(isNumMap).process().getResultJSONArray(0); - - } else { - /* - * 默认从右边开始 - */ - // 查询仓位被锁住的货位 - isNumMap.put("flag", "6"); - JSONArray isLockArr = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - JSONArray numArr = bean.isNum(isLockArr); - - // 不为空则返回报错 - if (ObjectUtil.isNotEmpty(numArr)) { - String error = ""; - - for (int k = 0; k < numArr.size(); k++) { - JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); - } - - throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!"); - } - - // 查询被阻挡需要移库的货位 - isNumMap.put("flag", "7"); - jsonLockArr = WQL.getWO("QST_IVT_HANDMOVESTOR").addParamMap(isNumMap).process().getResultJSONArray(0); - } - - } else if (StrUtil.equals(placement_type, "02")) { - /* - * 左通 - */ - // 查询仓位被锁住的货位 - JSONObject isNumMap = new JSONObject(); - isNumMap.put("flag", "5"); - isNumMap.put("block_num", whereJson.getString("block_num")); - isNumMap.put("row_num", whereJson.getString("row_num")); - isNumMap.put("out_order_seq", whereJson.getString("out_order_seq")); - JSONArray isLockArr = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - JSONArray numArr = bean.isNum(isLockArr); - // 不为空则返回报错 - if (ObjectUtil.isNotEmpty(numArr)) { - String error = ""; - - for (int k = 0; k < numArr.size(); k++) { - JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); - } - - throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!"); - } - - // 查询被阻挡需要移库的货位 - isNumMap.put("flag", "6"); - jsonLockArr = WQL.getWO("QST_IVT_HANDMOVESTOR").addParamMap(isNumMap).process().getResultJSONArray(0); - - } else if (StrUtil.equals(placement_type, "03")) { - /* - * 右通 - */ - - // 查询仓位被锁住的货位 - JSONObject isNumMap = new JSONObject(); - isNumMap.put("flag", "6"); - isNumMap.put("block_num", whereJson.getString("block_num")); - isNumMap.put("row_num", whereJson.getString("row_num")); - isNumMap.put("out_order_seq", whereJson.getString("out_order_seq")); - JSONArray isLockArr = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - JSONArray numArr = bean.isNum(isLockArr); - - // 不为空则返回报错 - if (ObjectUtil.isNotEmpty(numArr)) { - String error = ""; - - for (int k = 0; k < numArr.size(); k++) { - JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); - } - - throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!"); - } - - // 查询被阻挡需要移库的货位 - isNumMap.put("flag", "7"); - jsonLockArr = WQL.getWO("QST_IVT_HANDMOVESTOR").addParamMap(isNumMap).process().getResultJSONArray(0); - } - - /* - * 生成移库任务 - */ - - // 判断是否需要生成移库 - if (ObjectUtil.isNotEmpty(jsonLockArr)) { - JSONObject moveParam = new JSONObject(); - moveParam.put("jsonAllBlockPoint", jsonLockArr); - moveParam.put("is_move", "1"); - moveParam.put("task_group_id", IdUtil.getSnowflake(1, 1).nextId()); - bean.createMove(moveParam, null); - } - - return jsonLockArr.size(); - } - @Override public JSONArray getInvTypes() { //查询单据字段类型 @@ -1736,98 +1109,4 @@ public class HandMoveStorServiceImpl implements HandMoveStorService { } wo_mst.update(jo_mst); } - - /** - * 扩容移库 - * @param whereJson / - */ - public void createMoveExpansion(JSONObject whereJson) { - //任务表 - WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); - - JSONArray needMoveList = whereJson.getJSONArray("needMoveList"); - - for (int i = 0; i < needMoveList.size(); i++) { - JSONObject json = needMoveList.getJSONObject(i); - - JSONObject jsonAttr = attrTab.query("struct_code = '" + json.getString("struct_code") + "'").uniqueResult(0); - - JSONObject mapParam = new JSONObject();// 生成移库单传入参数 - JSONArray table = new JSONArray(); // 明细参数 - - mapParam.put("bill_type", "22"); - mapParam.put("buss_type", "22"); - mapParam.put("bill_status", "10"); - - mapParam.put("biz_date", DateUtil.today()); - mapParam.put("stor_code", "CP01"); - mapParam.put("stor_id", "1582991156504039424"); - mapParam.put("stor_name", "成品仓库"); - mapParam.put("is_task", "1"); - - // 查询移入货位 - JSONObject moveParam = new JSONObject(); - moveParam.put("box_no", json.getString("storagevehicle_code")); - moveParam.put("sect_id", RegionTypeEnum.ZZ01.getId()); - moveParam.put("layer_num", jsonAttr.getString("layer_num")); - JSONObject jsonMove = rawAssistIStorService.autoDisMove(moveParam); - // 查询移出货位的库存物料 - JSONObject jsonMoveIvt = WQL.getWO("ST_OUTIVT03") - .addParam("flag", "6") - .addParam("struct_id", json.getString("struct_id")) - .process().uniqueResult(0); - - // 移库单明细 - JSONObject jsonMoveDtl = new JSONObject(); - jsonMoveDtl.put("is_task", "2"); - jsonMoveDtl.put("turnout_sect_id", json.getLongValue("sect_id")); - jsonMoveDtl.put("turnout_sect_code", json.getString("sect_code")); - jsonMoveDtl.put("turnout_sect_name", json.getString("sect_name")); - jsonMoveDtl.put("turnout_struct_id", json.getLongValue("struct_id")); - jsonMoveDtl.put("turnout_struct_code", json.getString("struct_code")); - jsonMoveDtl.put("turnout_struct_name", json.getString("struct_name")); - jsonMoveDtl.put("material_id", jsonMoveIvt.getLongValue("material_id")); - jsonMoveDtl.put("pcsn", jsonMoveIvt.getString("pcsn")); - jsonMoveDtl.put("quality_scode", "01"); - jsonMoveDtl.put("qty_unit_id", jsonMoveIvt.getLongValue("qty_unit_id")); - jsonMoveDtl.put("qty_unit_name", jsonMoveIvt.getString("unit_name")); - jsonMoveDtl.put("qty", jsonMoveIvt.getDoubleValue("canuse_qty")); - jsonMoveDtl.put("storagevehicle_code", json.getString("storagevehicle_code")); - jsonMoveDtl.put("turnin_sect_id", jsonMove.getLongValue("sect_id")); - jsonMoveDtl.put("turnin_sect_code", jsonMove.getString("sect_code")); - jsonMoveDtl.put("turnin_sect_name", jsonMove.getString("sect_name")); - jsonMoveDtl.put("turnin_struct_id", jsonMove.getLongValue("struct_id")); - jsonMoveDtl.put("turnin_struct_code", jsonMove.getString("struct_code")); - jsonMoveDtl.put("turnin_struct_name", jsonMove.getString("struct_name")); - - // 生成任务 - JSONObject param2 = new JSONObject(); - param2.put("task_type", "010503"); - param2.put("vehicle_code", json.getString("storagevehicle_code")); - param2.put("point_code1", json.getString("struct_code")); - param2.put("point_code2", jsonMove.getString("struct_code")); - param2.put("task_group_id", whereJson.getLongValue("task_group_id")); // 任务组 - param2.put("sort_seq", i + 1); // 任务组顺序号 - String move_task_id = outTask.createTask(param2); - - // 回显移库明细任务id - jsonMoveDtl.put("task_id", move_task_id); - table.add(jsonMoveDtl); - // 更新任务处理类 - JSONObject jsonTaskMove = wo_Task.query("task_id = '" + move_task_id + "'").uniqueResult(0); - jsonTaskMove.put("task_type", "010505"); - jsonTaskMove.put("handle_class", HandMoveStorAcsTask.class.getName()); - jsonTaskMove.put("remark", "1层空托盘扩容移库"); - wo_Task.update(jsonTaskMove); - - mapParam.put("tableData", table); - // 调用移库单新增方法 - if (ObjectUtil.isNotEmpty(needMoveList)) { - insertDtl2(mapParam); - } - - handMoveStorAcsTask.immediateNotifyAcs(null); - } - } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/ProductScrapServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/ProductScrapServiceImpl.java index 861a1b9..b110553 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/ProductScrapServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/ProductScrapServiceImpl.java @@ -26,7 +26,6 @@ import org.nl.system.service.user.ISysUserService; import org.nl.system.service.user.dao.SysUser; import org.nl.wms.basedata.st.service.impl.UserStorServiceImpl; import org.nl.wms.ext.mes.service.impl.LmsToMesServiceImpl; -import org.nl.wms.st.inbill.service.CheckOutBillService; import org.nl.wms.st.instor.service.ProductScrapService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; @@ -47,7 +46,6 @@ import java.util.stream.Collectors; @RequiredArgsConstructor @Slf4j public class ProductScrapServiceImpl implements ProductScrapService { - private final CheckOutBillService checkOutBillService; @Autowired private ISysUserService iSysUserService; @@ -268,12 +266,6 @@ public class ProductScrapServiceImpl implements ProductScrapService { } // 调用出库新增并分配 - jsonOutMst.put("tableData", tableData); - String iostorinv_id = checkOutBillService.insertDtl(jsonOutMst); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("iostorinv_id", iostorinv_id); - // 变更为手动分配 - // checkOutBillService.allDiv(jsonObject); // 更新主表为完成 JSONObject param = new JSONObject(); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/RecutPlanServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/RecutPlanServiceImpl.java index 58e9df6..88d9341 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/RecutPlanServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/RecutPlanServiceImpl.java @@ -20,7 +20,6 @@ import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.WqlUtil; import org.nl.system.service.user.ISysUserService; import org.nl.wms.basedata.st.service.impl.UserStorServiceImpl; -import org.nl.wms.st.inbill.service.CheckOutBillService; import org.nl.wms.st.instor.service.RecutPlanService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; @@ -38,7 +37,6 @@ import java.util.Map; @Slf4j public class RecutPlanServiceImpl implements RecutPlanService { - private final CheckOutBillService checkOutBillService; @Autowired private IStIvtIostorinvOutService iStIvtIostorinvOutService; @@ -289,15 +287,6 @@ public class RecutPlanServiceImpl implements RecutPlanService { out_jo.put("div_type", "1"); // 改为手动分配 // iStIvtIostorinvOutService.allDiv(out_jo); - } else { - jsonMst.put("tableData", dtls); - String iostorinv_id = checkOutBillService.insertDtl(jsonMst); - - //调用自动分配 - JSONObject out_jo = new JSONObject(); - out_jo.put("iostorinv_id", iostorinv_id); - // 改为手动分配 - // checkOutBillService.allDiv(out_jo); } } else { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java deleted file mode 100644 index 06b1fe9..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java +++ /dev/null @@ -1,465 +0,0 @@ -package org.nl.wms.st.outbill.rest; - -import cn.dev33.satoken.annotation.SaIgnore; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.b_lms.sch.tasks.TwoSendOutTask; -import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; -import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvOutService; -import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvService; -import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl.*; -import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.InBussManageService; -import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.LashManageService; -import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.OutBoxManageService; -import org.nl.modules.logging.annotation.Log; -import org.nl.modules.wql.util.SpringContextHolder; -import org.nl.wms.st.inbill.service.CheckOutBillService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Pageable; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.Map; - -@RestController -@RequiredArgsConstructor - -@RequestMapping("/api/checkoutbill") -@Slf4j -public class CheckOutBillController { - /** - * 一期出库服务 - */ - private final CheckOutBillService checkOutBillService; - - /** - * 二期出出库服务 - */ - @Autowired - private IStIvtIostorinvOutService iStIvtIostorinvOutService; - - private final LashManageService lashManageService; - - private final InBussManageService inBussManageService; - - private final SendOutManageServiceImpl sendOutManageService; - - private final OutBoxManageService outBoxManageService; - - private final TwoSendOutTask twoSendOutTask; - - - @GetMapping - @Log("查询出库单") - - //@PreAuthorize("@el.check('checkoutbill:list')") - public ResponseEntity query(@RequestParam Map whereJson, Pageable page, String[] stor_id, String[] bill_status, String[] bill_type) { - return new ResponseEntity<>(checkOutBillService.pageQuery(whereJson, page, stor_id, bill_status, bill_type), HttpStatus.OK); - } - - @GetMapping("/addDtl") - @Log("查询库存") - - //@PreAuthorize("@el.check('checkoutbill:list')") - public ResponseEntity queryAddDtl(@RequestParam Map whereJson, Pageable page) { - return new ResponseEntity<>(checkOutBillService.queryAddDtl(whereJson, page), HttpStatus.OK); - } - - @GetMapping("/queryDtl") - @Log("查询库存") - - //@PreAuthorize("@el.check('checkoutbill:list')") - public ResponseEntity queryDtl(@RequestParam Map whereJson, Pageable page) { - return new ResponseEntity<>(checkOutBillService.queryDtl(whereJson, page), HttpStatus.OK); - } - - @GetMapping("/getOutBillDtl") - @Log("查询明细") - - public ResponseEntity getOutBillDtl(@RequestParam Map whereJson) { - return new ResponseEntity<>(checkOutBillService.getOutBillDtl(whereJson), HttpStatus.OK); - } - - @Log("删除出库单") - - //@PreAuthorize("@el.check('checkoutbill:del')") - @DeleteMapping - public ResponseEntity delete(@RequestBody Long[] ids) { - iStIvtIostorinvOutService.deleteAll(ids); -// checkOutBillService.deleteAll(ids); - return new ResponseEntity<>(HttpStatus.OK); - } - - @PutMapping - @Log("修改出库单") - - public ResponseEntity update(@RequestBody JSONObject whereJson) { - iStIvtIostorinvOutService.update(whereJson); -// checkOutBillService.update(whereJson); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping() - @Log("新增出库单") - - public ResponseEntity insertDtl(@RequestBody JSONObject whereJson) { - iStIvtIostorinvOutService.insertMst(whereJson); -// checkOutBillService.insertDtl(whereJson); - return new ResponseEntity<>(HttpStatus.CREATED); - } - - @PostMapping("/allDiv") - @Log("出库单全部分配") - - public ResponseEntity allDiv(@RequestBody JSONObject whereJson) { - if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { - iStIvtIostorinvOutService.allDiv(whereJson); - } else { - checkOutBillService.allDiv(whereJson); - } - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/allDivOne") - @Log("出库单自动分配") - - public ResponseEntity allDivOne(@RequestBody JSONObject whereJson) { - if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { - iStIvtIostorinvOutService.allDiv(whereJson); - } else { - checkOutBillService.allDivOne(whereJson); - } - - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/allCancel") - @Log("出库单全部取消") - - public ResponseEntity allCancel(@RequestBody JSONObject whereJson) { - if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { - iStIvtIostorinvOutService.cancelDiv(whereJson); - } else { - checkOutBillService.allCancel(whereJson); - } - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/cancelTask") - @Log("删除任务") - - public ResponseEntity cancelTask(@RequestBody JSONObject whereJson) { - checkOutBillService.cancelTask(whereJson); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/oneCancel") - @Log("出库单全部取消") - - public ResponseEntity oneCancel(@RequestBody JSONObject whereJson) { - if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { - iStIvtIostorinvOutService.cancelDiv(whereJson); - } else { - checkOutBillService.oneCancel(whereJson); - } - - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @GetMapping("/getOutBillDis") - @Log("查询已出库单分配") - - public ResponseEntity getOutBillDis(@RequestParam Map whereJson) { - return new ResponseEntity<>(checkOutBillService.getOutBillDis(whereJson), HttpStatus.OK); - } - - @GetMapping("/getOutBillDis2") - @Log("查询未出库单分配") - - public ResponseEntity getOutBillDis2(@RequestParam Map whereJson) { - return new ResponseEntity<>(checkOutBillService.getOutBillDis2(whereJson), HttpStatus.OK); - } - - @GetMapping("/getOutBillDisDtl") - @Log("查询出库单分配") - - public ResponseEntity getOutBillDisDtl(@RequestParam Map whereJson) { - return new ResponseEntity<>(checkOutBillService.getOutBillDisDtl(whereJson), HttpStatus.OK); - } - - @PostMapping("/setPoint") - @Log("设置检验站点") - - public ResponseEntity setPoint(@RequestBody JSONObject whereJson) { - checkOutBillService.setPoint(whereJson); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/oneSetPoint2") - @Log("设置一个站点") - - public ResponseEntity oneSetPoint2(@RequestBody JSONObject whereJson) { - checkOutBillService.oneSetPoint2(whereJson); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/allSetPoint") - @Log("一键设置") - - public ResponseEntity allSetPoint(@RequestBody JSONObject whereJson) { - if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { - iStIvtIostorinvOutService.allSetPoint(whereJson); - } else { - checkOutBillService.allSetPoint(whereJson); - } - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @GetMapping("/getOutBillTask") - @Log("查询出库单分配任务") - - public ResponseEntity getOutBillTask(@RequestParam Map whereJson) { - return new ResponseEntity<>(checkOutBillService.getOutBillTask(whereJson), HttpStatus.OK); - } - - @PostMapping("/getOutBillTask2") - @Log("详情查询出库单分配任务2") - - public ResponseEntity getOutBillTask2(@RequestBody Map whereJson) { - return new ResponseEntity<>(checkOutBillService.getOutBillTask2(whereJson), HttpStatus.OK); - } - - @GetMapping("/getStructIvt") - @Log("查询可分配库存") - - public ResponseEntity getStructIvt(@RequestParam Map whereJson) { - return new ResponseEntity<>(checkOutBillService.getStructIvt(whereJson), HttpStatus.OK); - } - - @PostMapping("/manualDiv") - @Log("出库单手动分配") - - public ResponseEntity manualDiv(@RequestBody JSONObject whereJson) { - if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { - iStIvtIostorinvOutService.manualDiv(whereJson); - } else { - checkOutBillService.manualDiv(whereJson); - } - - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/confirm") - @Log("出库单强制确认") - - public ResponseEntity confirm(@RequestBody JSONObject whereJson) { - if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { - iStIvtIostorinvOutService.confirm(whereJson); - } else { - checkOutBillService.confirmOrder(whereJson); - } - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/issueTask") - @Log("出库任务下发") - - public ResponseEntity issueTask(@RequestBody JSONObject whereJson) { - checkOutBillService.issueTask(whereJson); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/finishTask") - @Log("出库任务手动完成") - - public ResponseEntity finishTask(@RequestBody JSONObject whereJson) { - checkOutBillService.finishTask(whereJson); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @PostMapping("/cancleTaskfinish") - @Log("出库任务手动取消完成") - - public ResponseEntity cancleTaskfinish(@RequestBody JSONObject whereJson) { - checkOutBillService.cancleTaskfinish(whereJson); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @GetMapping("/getInvTypes") - @Log("查询单据字段") - - public ResponseEntity getInvTypes() { - return new ResponseEntity<>(checkOutBillService.getInvTypes(), HttpStatus.OK); - } - - @PostMapping("/paramByCodeType") - @Log("查询出库单物料是否限制参数") - - public ResponseEntity paramByCodeType(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(checkOutBillService.getParamByCodeType(whereJson), HttpStatus.OK); - } - - @PostMapping("/schAreaType") - @Log("查询点位区域类型") - - public ResponseEntity schAreaType(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(checkOutBillService.schAreaType(whereJson), HttpStatus.OK); - } - - @PostMapping("/backConfirm") - @Log("出库单强制确认") - - public ResponseEntity backConfirm(@RequestBody JSONObject whereJson) { - checkOutBillService.backConfirm(whereJson); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @GetMapping("/getType") - @Log("获取全部出入库业务类型") - - public ResponseEntity getType() { - return new ResponseEntity<>(checkOutBillService.getType(), HttpStatus.OK); - } - - @PostMapping("/moneySubmit") - @Log("发货信息保存") - - public ResponseEntity moneySubmit(@RequestBody JSONObject whereJson) { - checkOutBillService.moneySubmit(whereJson); - return new ResponseEntity<>(HttpStatus.OK); - } - - @Log("下载发货单Excel") - - @GetMapping(value = "/downloadExcel") - public ResponseEntity downloadExcel(HttpServletResponse response, @RequestParam Map whereJson) throws IOException { - checkOutBillService.downloadExcel(response, whereJson); - return new ResponseEntity<>(HttpStatus.OK); - } - - @PostMapping("/getDisNum") - @Log("获取分配明细条数") - - public ResponseEntity getDisNum(@RequestBody Map whereJson) { - return new ResponseEntity<>(checkOutBillService.getDisNum(whereJson), HttpStatus.OK); - } - - @PostMapping("/queryBox") - @Log("新增物料库存条件过滤") - - public ResponseEntity queryBox(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(checkOutBillService.queryBox(whereJson), HttpStatus.OK); - } - - @PostMapping("/outReturn") - @Log("销售出库回传mes") - - public ResponseEntity outReturn(@RequestBody JSONObject whereJson) { - checkOutBillService.outReturn(whereJson); - return new ResponseEntity<>(HttpStatus.OK); - } - - @Log("导出数据") - - @GetMapping(value = "/download") - public void download(@RequestParam Map map, HttpServletResponse response, String[] stor_id, String[] bill_status, String[] bill_type) throws IOException { - checkOutBillService.download(map, response, stor_id, bill_status, bill_type); - } - - @PostMapping("/updataIsOverdue") - @Log("更新是否超期") - public ResponseEntity updataIsOverdue(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(checkOutBillService.updataIsOverdue(whereJson),HttpStatus.OK); - } - - @PostMapping("/importExcel") - @SaIgnore - public ResponseEntity importExcel(@RequestParam("file") MultipartFile file, HttpServletRequest request) { - checkOutBillService.importExcel(file, request); - return new ResponseEntity<>(HttpStatus.OK); - } - - @PostMapping("/saveUpdate") - @Log("更新分拣出库重量") - public ResponseEntity saveUpdate(@RequestBody JSONObject whereJson) { - checkOutBillService.saveUpdate(whereJson); - return new ResponseEntity<>(HttpStatus.OK); - } - - - @PostMapping("/testInEmp") - @Log("空载具入库测试") - @SaIgnore - public ResponseEntity testInEmp(@RequestBody JSONObject whereJson) { - new InVehicleManageServiceImpl().inVehicle(whereJson); - return new ResponseEntity<>(HttpStatus.OK); - } - - @PostMapping("/testOutEmp") - @Log("空载具出库测试") - @SaIgnore - public ResponseEntity testOutEmp(@RequestBody JSONObject whereJson) { - new OutVehicleManageServiceImpl().outVehicle(whereJson); - return new ResponseEntity<>(HttpStatus.OK); - } - - @PostMapping("/testInBox") - @Log("木箱入库测试") - @SaIgnore - public ResponseEntity testInBox(@RequestBody JSONObject whereJson) { - InBoxManageServiceImpl bean = SpringContextHolder.getBean(InBoxManageServiceImpl.class); - bean.inBox(whereJson); - return new ResponseEntity<>(HttpStatus.OK); - } - - @PostMapping("/testOutBox") - @Log("木箱出库测试") - @SaIgnore - public ResponseEntity testOutBox(@RequestBody JSONObject whereJson) { - outBoxManageService.outBox(whereJson); - return new ResponseEntity<>(HttpStatus.OK); - } - - @PostMapping("/testBoxLash") - @Log("木箱捆扎测试") - @SaIgnore - public ResponseEntity testBoxLash(@RequestBody JSONObject whereJson) { - lashManageService.createLashTask(whereJson); - return new ResponseEntity<>(HttpStatus.OK); - } - - @PostMapping("/testSendOut") - @Log("发货区测试") - public ResponseEntity testSendOut(@RequestBody JSONObject whereJson) { - sendOutManageService.createSendOutTask(whereJson); - return new ResponseEntity<>(HttpStatus.OK); - } - - @PostMapping("/testSendOut2") - @Log("发货区测试2") - @SaIgnore - public ResponseEntity testSendOut2(@RequestBody JSONObject whereJson) { - //创建任务 - JSONObject task_jo = new JSONObject(); - task_jo.put("point_code1", whereJson.getString("point1")); - task_jo.put("point_code2", whereJson.getString("point2")); - task_jo.put("vehicle_code", whereJson.getString("vehicle_code")); - task_jo.put("task_type", "010708"); - twoSendOutTask.createTask(task_jo); - return new ResponseEntity<>(HttpStatus.OK); - } - - @PostMapping("/testIn") - @Log("申请入库") - public ResponseEntity testIn(@RequestBody JSONObject whereJson) { - inBussManageService.inTask(whereJson); - return new ResponseEntity<>(HttpStatus.OK); - } - -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java deleted file mode 100644 index d1a5fcf..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java +++ /dev/null @@ -1,6391 +0,0 @@ -package org.nl.wms.st.outbill.service.impl; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.poi.excel.ExcelReader; -import cn.hutool.poi.excel.ExcelUtil; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.ExcelWriter; -import com.alibaba.excel.write.metadata.WriteSheet; -import com.alibaba.excel.write.metadata.fill.FillWrapper; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.nl.common.utils.CodeUtil; -import org.nl.common.utils.SecurityUtils; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.common.utils.FileUtil; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.modules.wql.util.SpringContextHolder; -import org.nl.modules.wql.util.WqlUtil; -import org.nl.system.service.param.impl.SysParamServiceImpl; -import org.nl.wms.basedata.st.service.impl.UserStorServiceImpl; -import org.nl.wms.pda.mps.eum.RegionTypeEnum; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.OutTask; -import org.nl.wms.st.inbill.service.CheckOutBillService; -import org.nl.wms.st.inbill.service.RawAssistIStorService; -import org.nl.wms.st.inbill.service.StorPublicService; -import org.nl.wms.st.instor.service.HandMoveStorService; -import org.nl.wms.st.instor.service.impl.HandMoveStorServiceImpl; -import org.nl.wms.st.instor.task.HandMoveStorAcsTask; -import org.nl.wms.st.outbill.util.ThreadManage; -import org.nl.wms.st.returns.service.InAndOutReturnService; -import org.nl.wms.st.returns.service.impl.InAndOutRetrunServiceImpl; -import org.nl.wms.util.TranUtil; -import org.redisson.api.RLock; -import org.redisson.api.RedissonClient; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.InputStream; -import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; -import java.util.stream.Collectors; - -/** - * PC端出入库新增 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class CheckOutBillServiceImpl implements CheckOutBillService { - - private final StorPublicService storPublicService; - private final RawAssistIStorService rawAssistIStorService; - private final HandMoveStorService handMoveStorService; - private final OutTask outTask; - private final HandMoveStorAcsTask moveStorAcsTask; - private final InAndOutReturnService inAndOutReturnService; - private final RedissonClient redissonClient; - - @Override - public Map pageQuery(Map whereJson, Pageable page, String[] stor_id, String[] bill_status, String[] bill_type) { - HashMap map = new HashMap<>(whereJson); - map.put("flag", "1"); - - if (StrUtil.isNotEmpty(map.get("bill_code"))) { - map.put("bill_code", "%" + map.get("bill_code") + "%"); - } - if (StrUtil.isNotEmpty(map.get("buss_type"))) { - map.put("buss_type", whereJson.get("buss_type") + "%"); - } - if (StrUtil.isNotEmpty(map.get("io_type"))) { - map.put("io_type", map.get("io_type")); - } - if (StrUtil.isNotEmpty(map.get("is_upload"))) { - map.put("is_upload", map.get("is_upload")); - } - if (StrUtil.isNotEmpty(map.get("material_code"))) { - map.put("material_code", "%" + map.get("material_code") + "%"); - } - - // 空格查询 - if (StrUtil.isNotEmpty(map.get("vbeln"))) { - // 判断是否有空格 - String vbeln = MapUtil.getStr(map, "vbeln"); - - boolean matches = vbeln.matches(".*\\s.*"); - - if (matches) { - String[] s = vbeln.split(" "); - String vbeln_in = String.join("','", Arrays.asList(s)); - - map.put("vbeln_in", "('"+vbeln_in+"')"); - map.put("vbeln", ""); - } else { - map.put("vbeln", "%" + map.get("vbeln") + "%"); - } - } - - // 空格查询 - if (StrUtil.isNotEmpty(map.get("box_no"))) { - // 判断是否有空格 - String box_no = MapUtil.getStr(map, "box_no"); - - boolean matches = box_no.matches(".*\\s.*"); - - if (matches) { - String[] s = box_no.split(" "); - String box_no_in = String.join("','", Arrays.asList(s)); - - map.put("box_no_in", "('"+box_no_in+"')"); - map.put("box_no", ""); - } else { - map.put("box_no", "%" + map.get("box_no") + "%"); - - } - map.put("flag", "11"); - } - - if (StrUtil.isNotEmpty(map.get("width"))) { - map.put("width", "%" + map.get("width") + "%"); - } - - // 空格查询 - if (StrUtil.isNotEmpty(map.get("pcsn"))) { - // 判断是否有空格 - String pcsn = MapUtil.getStr(map, "pcsn"); - - boolean matches = pcsn.matches(".*\\s.*"); - - if (matches) { - String[] s = pcsn.split(" "); - String pcsn_in = String.join("','", Arrays.asList(s)); - - map.put("pcsn_in", "('"+pcsn_in+"')"); - map.put("pcsn", ""); - } else { - map.put("pcsn", "%" + map.get("pcsn") + "%"); - } - map.put("flag", "11"); - } - - // 空格查询 - if (StrUtil.isNotEmpty(map.get("sap_pcsn"))) { - // 判断是否有空格 - String sap_pcsn = MapUtil.getStr(map, "sap_pcsn"); - - boolean matches = sap_pcsn.matches(".*\\s.*"); - - if (matches) { - String[] s = sap_pcsn.split(" "); - String sap_pcsn_in = String.join("','", Arrays.asList(s)); - - map.put("sap_pcsn_in", "('"+sap_pcsn_in+"')"); - map.put("sap_pcsn", ""); - } else { - map.put("sap_pcsn", "%" + map.get("sap_pcsn") + "%"); - } - map.put("flag", "11"); - } - - if (StrUtil.isNotEmpty(map.get("cust_code"))) { - map.put("cust_code", "%" + map.get("cust_code") + "%"); - } - - //获取人员对应的仓库 - UserStorServiceImpl userStorService = new UserStorServiceImpl(); - String in_stor_id = userStorService.getInStor(); - - if (ObjectUtil.isNotEmpty(in_stor_id)) { - map.put("in_stor_id", in_stor_id); - } - if (ObjectUtil.isNotEmpty(stor_id)) { - String storIds = "("; - for (int i = 0; i < stor_id.length; i++) { - if (i != stor_id.length - 1) { - storIds += "'" + stor_id[i] + "',"; - } else { - storIds += "'" + stor_id[i] + "')"; - } - } - map.put("storIds", storIds); - } - - if (ObjectUtil.isNotEmpty(bill_status)) { - String billStatuses = "("; - for (int i = 0; i < bill_status.length; i++) { - if (i != bill_status.length - 1) { - billStatuses += "'" + bill_status[i] + "',"; - } else { - billStatuses += "'" + bill_status[i] + "')"; - } - } - map.put("billStatuses", billStatuses); - } - - if (ObjectUtil.isNotEmpty(bill_type)) { - String billTypes = "("; - for (int i = 0; i < bill_type.length; i++) { - if (i != bill_type.length - 1) { - billTypes += "'" + bill_type[i] + "',"; - } else { - billTypes += "'" + bill_type[i] + "')"; - } - } - map.put("billTypes", billTypes); - } - - JSONObject jo = WQL.getWO("QST_IVT_CHECKOUTBILL").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "iostorinv_id desc"); - return jo; - } - - @Override - public Map queryAddDtl(Map whereJson, Pageable page) { - HashMap map = new HashMap<>(whereJson); - map.put("flag", "7"); - map.put("begin_time", MapUtil.getStr(whereJson, "begin_time")); - map.put("end_time", MapUtil.getStr(whereJson, "end_time")); - map.put("stor_id", MapUtil.getStr(whereJson, "stor_id")); - map.put("canuse_qty", "0"); - - if (StrUtil.isNotEmpty(map.get("material_code"))) { - map.put("material_code", "%" + map.get("material_code") + "%"); - } - - // 空格查询 - String pcsn = MapUtil.getStr(whereJson, "pcsn"); - if (StrUtil.isNotEmpty(pcsn)) { - // 判断是否有空格 - boolean matches = pcsn.matches(".*\\s.*"); - - if (matches) { - String[] s = pcsn.split(" "); - String pcsn_in = String.join("','", Arrays.asList(s)); - - map.put("pcsn_in", "('"+pcsn_in+"')"); - map.put("pcsn", ""); - } else { - map.put("pcsn", "%" + pcsn + "%"); - } - } - - // 空格查询 - String sap_pcsn = MapUtil.getStr(whereJson, "sap_pcsn"); - if (StrUtil.isNotEmpty(sap_pcsn)) { - // 判断是否有空格 - boolean matches = sap_pcsn.matches(".*\\s.*"); - - if (matches) { - String[] s = sap_pcsn.split(" "); - String sap_pcsn_in = String.join("','", Arrays.asList(s)); - - map.put("sap_pcsn_in", "('"+sap_pcsn_in+"')"); - map.put("sap_pcsn", ""); - } else { - map.put("sap_pcsn", "%" + sap_pcsn + "%"); - } - } - - // 空格查询 - String package_box_sn = MapUtil.getStr(whereJson, "package_box_sn"); - if (StrUtil.isNotEmpty(package_box_sn)) { - // 判断是否有空格 - boolean matches = package_box_sn.matches(".*\\s.*"); - - if (matches) { - String[] s = package_box_sn.split(" "); - String package_box_sn_in = String.join("','", Arrays.asList(s)); - - map.put("box_no_in", "('"+package_box_sn_in+"')"); - map.put("box_no", ""); - } else { - map.put("box_no", "%" + map.get("package_box_sn") + "%"); - - } - } - - if (StrUtil.isNotEmpty(map.get("width_standard"))) { - map.put("width_standard", map.get("width_standard")); - } - if (StrUtil.isNotEmpty(map.get("thickness_request"))) { - map.put("thickness_request", map.get("thickness_request")); - } - if (StrUtil.isNotEmpty(map.get("customer_name"))) { - map.put("customer_name", map.get("customer_name")); - } - if (StrUtil.isNotEmpty(map.get("struct_code"))) { - map.put("struct_code", "%" + map.get("struct_code") + "%"); - } - JSONObject jo = WQL.getWO("QST_IVT_CHECKOUTBILL").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "ivt.struct_code ASC"); - return jo; - } - - @Override - public Map queryDtl(Map whereJson, Pageable page) { - HashMap map = new HashMap<>(whereJson); - map.put("flag", "12"); - - if (StrUtil.isNotEmpty(map.get("material_code"))) { - map.put("material_code", "%" + map.get("material_code") + "%"); - } - if (StrUtil.isNotEmpty(map.get("username"))) { - map.put("username", "%" + map.get("username") + "%"); - } - if (StrUtil.isNotEmpty(map.get("pcsn"))) { - map.put("pcsn", "%" + map.get("pcsn") + "%"); - } - String begin_time = map.get("begin_time"); - if (StrUtil.isNotEmpty(begin_time)) { - map.put("begin_time", begin_time.substring(0, 10)); - } - String end_time = map.get("end_time"); - if (StrUtil.isNotEmpty(end_time)) { - map.put("end_time", end_time.substring(0, 10)); - } - String source_bill_code = map.get("source_bill_code"); - if (StrUtil.isNotEmpty(source_bill_code)) { - StringBuilder sb = new StringBuilder(); - String[] strs = source_bill_code.split(","); - for (int i = 0; i < strs.length; i++) { - sb.append(",'" + strs[i] + "'"); - } - String str = sb.toString(); - str = "(" + str.substring(1) + ")"; - map.put("source_bill_code", str); - } - JSONObject jo = WQL.getWO("QST_IVT_CHECKOUTBILL").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "iosdtl2.material_id"); - return jo; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteAll(Long[] ids) { - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - - WQLObject wo = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - for (Long iostorinv_id : ids) { - HashMap map = new HashMap<>(); - map.put("is_delete", "1"); - map.put("update_optid", currentUserId + ""); - map.put("update_optname", nickName); - map.put("update_time", now); - wo.update(map, "iostorinv_id='" + iostorinv_id + "'"); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void insertDtlByJson(JSONObject map) { - //明细另一种写法 - JSONArray rows = map.getJSONArray("tableData"); - map.remove("tableData"); - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - String iostorinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - String bill_code = CodeUtil.getNewCode("IO_CODE"); - map.put("iostorinv_id", iostorinv_id); - map.put("bill_code", bill_code); - String bill_type = map.getString("bill_type"); - map.put("buss_type", bill_type.substring(0, 4)); - map.put("io_type", "1"); - map.put("detail_count", rows.size() + ""); - map.put("create_mode", "01"); - map.put("input_optid", currentUserId + ""); - map.put("input_optname", nickName); - map.put("input_time", now); - map.put("update_optid", currentUserId + ""); - map.put("update_optname", nickName); - map.put("update_time", now); - map.put("is_delete", "0"); - map.put("is_upload", "0"); - Long deptId = SecurityUtils.getDeptId(); - map.put("sysdeptid", deptId); - map.put("syscompanyid", deptId); - - for (int i = 0; i < rows.size(); i++) { - JSONObject row = rows.getJSONObject(i); - row.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + ""); - row.put("iostorinv_id", iostorinv_id); - row.put("seq_no", (i + 1) + ""); - row.put("assign_qty", "0"); - row.put("unassign_qty", row.get("plan_qty")); - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(row); - } - WQLObject.getWQLObject("ST_IVT_IOStorInv").insert(map); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public String insertDtl(JSONObject map) { - if(MapUtil.getStr(map,"bill_type").equals("1011")) { - String iostorinv_id = inserdtlPic(map); - return iostorinv_id ; - } - - WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); - //明细另一种写法 - JSONArray array = map.getJSONArray("tableData"); - JSONArray rows = new JSONArray(); - // 过滤相同箱号的明细 - HashSet boxSet = new HashSet<>(); - for (int i = 0; i < array.size(); i++) { - JSONObject json = array.getJSONObject(i); - if (ObjectUtil.isNotEmpty(json.getString("box_no"))) { - boxSet.add(json.getString("box_no")); - } else { - rows.add(json); - } - } - if (ObjectUtil.isNotEmpty(boxSet)) { - // 遍历 - for (String box_no : boxSet) { - JSONObject jsonObject = WQL.getWO("QST_IVT_CHECKOUTBILL").addParam("flag", "77").addParam("box_no", box_no).process().uniqueResult(0); - rows.add(jsonObject); - } - } - - - map.remove("tableData"); - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String user = map.getString("user"); - if (ObjectUtil.isNotEmpty(user)) { - if ("mes".equals(user)) { - currentUserId = "2"; - nickName = "mes用户"; - } - if ("sap".equals(user)) { - currentUserId = "3"; - nickName = "sap用户"; - } - } - String now = DateUtil.now(); - String iostorinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - String bill_code = CodeUtil.getNewCode("IO_CODE"); - - JSONObject jsonStor = WQLObject.getWQLObject("st_ivt_bsrealstorattr").query("stor_id ='" + MapUtil.getStr(map, "stor_id") + "'").uniqueResult(0); - map.put("iostorinv_id", iostorinv_id); - map.put("bill_code", bill_code); - map.put("biz_date", map.getString("biz_date").substring(0, 10)); - String bill_type = (String) map.get("bill_type"); - map.put("buss_type", bill_type.substring(0, 4)); - map.put("io_type", "1"); - map.put("detail_count", rows.size() + ""); - map.put("create_mode", "01"); - map.put("stor_code", jsonStor.getString("stor_code")); - map.put("stor_name", jsonStor.getString("stor_name")); - map.put("input_optid", currentUserId + ""); - map.put("input_optname", nickName); - map.put("input_time", now); - map.put("update_optid", currentUserId + ""); - map.put("update_optname", nickName); - map.put("update_time", now); - map.put("is_delete", "0"); - map.put("is_upload", "0"); - map.put("out_stor_id", map.getString("out_stor_id")); - if (ObjectUtil.isNotEmpty(user)) { - if (!"mes".equals(user) || "sap".equals(user)) { - Long deptId = SecurityUtils.getDeptId(); - map.put("sysdeptid", deptId); - map.put("syscompanyid", deptId); - } - } - double qty = 0.0; // 主表重量 - int num = rows.size(); // 明细数 - for (int i = 0; i < rows.size(); i++) { - JSONObject row = rows.getJSONObject(i); - // 校验计划数量不能为零 - double plan_qty = row.getDoubleValue("plan_qty"); - if (Double.compare(plan_qty, 0.0) == 0) { - throw new BadRequestException("数量不能为0"); - } - JSONObject jsonDtl = new JSONObject(); - jsonDtl.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + ""); - jsonDtl.put("iostorinv_id", iostorinv_id); - jsonDtl.put("seq_no", (i + 1) + ""); - jsonDtl.put("material_id", row.getString("material_id")); - jsonDtl.put("pcsn", row.getString("pcsn")); - jsonDtl.put("box_no", row.getString("box_no")); - jsonDtl.put("quality_scode", "01"); - jsonDtl.put("bill_status", "10"); - jsonDtl.put("qty_unit_id", row.get("qty_unit_id")); - jsonDtl.put("qty_unit_name", row.getString("qty_unit_name")); - jsonDtl.put("plan_qty", row.get("plan_qty")); - jsonDtl.put("remark", row.getString("remark")); - jsonDtl.put("source_bill_code", row.getString("source_bill_code")); - jsonDtl.put("assign_qty", "0"); - jsonDtl.put("unassign_qty", row.get("plan_qty")); - jsonDtl.put("vbeln", row.getString("vbeln")); - jsonDtl.put("posnr", row.getString("posnr")); - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(jsonDtl); - qty += jsonDtl.getDoubleValue("plan_qty"); - - // 判断此明细子卷是否存在,存在则将此木箱下的子卷全部生成明细 - String pcsn = row.getString("pcsn"); - String box_no = row.getString("box_no"); - //查询该箱子所在货位 - JSONObject struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + box_no + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(pcsn)) { - if (ObjectUtil.isEmpty(struct_jo)) { - throw new BadRequestException("未查询到该批次所在货位!"); - } - String struct_code = struct_jo.getString("struct_code"); - JSONObject json = ivtTab.query("pcsn = '" + pcsn + "' AND struct_code = '" + struct_code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(json)) { - continue; - } - - JSONObject jsonMap = new JSONObject(); - jsonMap.put("flag", "1"); - jsonMap.put("pcsn", pcsn); - jsonMap.put("struct_id", json.getString("struct_id")); - - JSONArray ivtArr = WQL.getWO("ST_OUTIVT02").addParamMap(jsonMap).process().getResultJSONArray(0); - for (int j = 0; j < ivtArr.size(); j++) { - JSONObject jsonIvt = ivtArr.getJSONObject(j); - JSONObject jsonDtl2 = new JSONObject(); - jsonDtl2.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + ""); - jsonDtl2.put("iostorinv_id", iostorinv_id); - jsonDtl2.put("seq_no", i + 2 + j); - jsonDtl2.put("material_id", jsonIvt.getString("material_id")); - jsonDtl2.put("pcsn", jsonIvt.getString("pcsn")); - jsonDtl2.put("box_no", jsonIvt.getString("box_no")); - jsonDtl2.put("quality_scode", "01"); - jsonDtl2.put("bill_status", "10"); - jsonDtl2.put("qty_unit_id", jsonIvt.get("qty_unit_id")); - jsonDtl2.put("qty_unit_name", jsonIvt.getString("qty_unit_name")); - jsonDtl2.put("plan_qty", jsonIvt.get("canuse_qty")); - jsonDtl2.put("remark", ""); - jsonDtl2.put("assign_qty", "0"); - jsonDtl2.put("unassign_qty", jsonIvt.get("canuse_qty")); - jsonDtl2.put("source_billdtl_id", jsonDtl.getString("iostorinvdtl_id")); - // 校验计划数量不能为零 - double plan_qty2 = jsonDtl2.getDoubleValue("plan_qty"); - if (Double.compare(plan_qty2, 0.0) == 0) { - throw new BadRequestException("数量不能为0"); - } - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(jsonDtl2); - - qty += jsonDtl2.getDoubleValue("plan_qty"); - } - num += ivtArr.size(); - } - - } - map.put("total_qty", qty); - map.put("detail_count", num); - WQLObject.getWQLObject("ST_IVT_IOStorInv").insert(map); - - return iostorinv_id; - } - - /** - * 拣选出库新增 - * @param map 、 - * @return 单据标识 - */ - private String inserdtlPic(JSONObject map) { - - WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); - //明细另一种写法 - JSONArray rows = map.getJSONArray("tableData"); - - map.remove("tableData"); - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String user = map.getString("user"); - if (ObjectUtil.isNotEmpty(user)) { - if ("mes".equals(user)) { - currentUserId = "2"; - nickName = "mes用户"; - } - if ("sap".equals(user)) { - currentUserId = "3"; - nickName = "sap用户"; - } - } - String now = DateUtil.now(); - String iostorinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - String bill_code = CodeUtil.getNewCode("IO_CODE"); - - JSONObject jsonStor = WQLObject.getWQLObject("st_ivt_bsrealstorattr").query("stor_id ='" + MapUtil.getStr(map, "stor_id") + "'").uniqueResult(0); - map.put("iostorinv_id", iostorinv_id); - map.put("bill_code", bill_code); - map.put("biz_date", map.getString("biz_date").substring(0, 10)); - String bill_type = (String) map.get("bill_type"); - map.put("buss_type", bill_type.substring(0, 4)); - map.put("io_type", "1"); - map.put("detail_count", rows.size() + ""); - map.put("create_mode", "01"); - map.put("stor_code", jsonStor.getString("stor_code")); - map.put("stor_name", jsonStor.getString("stor_name")); - map.put("input_optid", currentUserId + ""); - map.put("input_optname", nickName); - map.put("input_time", now); - map.put("update_optid", currentUserId + ""); - map.put("update_optname", nickName); - map.put("update_time", now); - map.put("is_delete", "0"); - map.put("is_upload", "0"); - map.put("out_stor_id", map.getString("out_stor_id")); - if (ObjectUtil.isNotEmpty(user)) { - if (!"mes".equals(user) || "sap".equals(user)) { - Long deptId = SecurityUtils.getDeptId(); - map.put("sysdeptid", deptId); - map.put("syscompanyid", deptId); - } - } - double qty = 0.0; // 主表重量 - int num = rows.size(); // 明细数 - for (int i = 0; i < rows.size(); i++) { - JSONObject row = rows.getJSONObject(i); - // 校验计划数量不能为零 - double plan_qty = row.getDoubleValue("plan_qty"); - if (Double.compare(plan_qty, 0.0) == 0) { - throw new BadRequestException("数量不能为0"); - } - JSONObject jsonDtl = new JSONObject(); - jsonDtl.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + ""); - jsonDtl.put("iostorinv_id", iostorinv_id); - jsonDtl.put("seq_no", (i + 1) + ""); - jsonDtl.put("material_id", row.getString("material_id")); - jsonDtl.put("pcsn", row.getString("pcsn")); - jsonDtl.put("box_no", row.getString("box_no")); - jsonDtl.put("quality_scode", "01"); - jsonDtl.put("bill_status", "10"); - jsonDtl.put("qty_unit_id", row.get("qty_unit_id")); - jsonDtl.put("qty_unit_name", row.getString("qty_unit_name")); - jsonDtl.put("plan_qty", row.get("plan_qty")); - jsonDtl.put("remark", row.getString("remark")); - jsonDtl.put("source_bill_code", row.getString("source_bill_code")); - jsonDtl.put("assign_qty", "0"); - jsonDtl.put("unassign_qty", row.get("plan_qty")); - jsonDtl.put("vbeln", row.getString("vbeln")); - jsonDtl.put("posnr", row.getString("posnr")); - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(jsonDtl); - qty += jsonDtl.getDoubleValue("plan_qty"); - - // 判断此明细子卷是否存在,存在则将此木箱下的子卷全部生成明细 - String pcsn = row.getString("pcsn"); - String box_no = row.getString("box_no"); - //查询该箱子所在货位 - JSONObject struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + box_no + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(pcsn)) { - if (ObjectUtil.isEmpty(struct_jo)) { - throw new BadRequestException("未查询到该批次所在货位!"); - } - String struct_code = struct_jo.getString("struct_code"); - JSONObject json = ivtTab.query("pcsn = '" + pcsn + "' AND struct_code = '" + struct_code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(json)) { - continue; - } - } - - } - map.put("total_qty", qty); - map.put("detail_count", num); - WQLObject.getWQLObject("ST_IVT_IOStorInv").insert(map); - - return iostorinv_id; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public String insertDtl2(JSONObject map) { - WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); - //明细另一种写法 - JSONArray rows = map.getJSONArray("tableData"); - - map.remove("tableData"); - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String user = map.getString("user"); - if (ObjectUtil.isNotEmpty(user)) { - if ("mes".equals(user)) { - currentUserId = "2"; - nickName = "mes用户"; - } - if ("sap".equals(user)) { - currentUserId = "3"; - nickName = "sap用户"; - } - } - String now = DateUtil.now(); - String iostorinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - String bill_code = CodeUtil.getNewCode("IO_CODE"); - - JSONObject jsonStor = WQLObject.getWQLObject("st_ivt_bsrealstorattr").query("stor_id ='" + MapUtil.getStr(map, "stor_id") + "'").uniqueResult(0); - map.put("iostorinv_id", iostorinv_id); - map.put("bill_code", bill_code); - map.put("biz_date", map.getString("biz_date").substring(0, 10)); - String bill_type = (String) map.get("bill_type"); - map.put("buss_type", bill_type.substring(0, 4)); - map.put("io_type", "1"); - map.put("detail_count", rows.size() + ""); - map.put("create_mode", "01"); - map.put("stor_code", jsonStor.getString("stor_code")); - map.put("stor_name", jsonStor.getString("stor_name")); - map.put("input_optid", currentUserId + ""); - map.put("input_optname", nickName); - map.put("input_time", now); - map.put("update_optid", currentUserId + ""); - map.put("update_optname", nickName); - map.put("update_time", now); - map.put("is_delete", "0"); - map.put("is_upload", "0"); - if (ObjectUtil.isNotEmpty(user)) { - if (!"mes".equals(user) || "sap".equals(user)) { - Long deptId = SecurityUtils.getDeptId(); - map.put("sysdeptid", deptId); - map.put("syscompanyid", deptId); - } - } - double qty = 0.0; // 主表重量 - int num = rows.size(); // 明细数 - for (int i = 0; i < rows.size(); i++) { - JSONObject row = rows.getJSONObject(i); - // 校验计划数量不能为零 - double plan_qty = row.getDoubleValue("plan_qty"); - if (Double.compare(plan_qty, 0) == 0) { - throw new BadRequestException("数量不能为0"); - } - - JSONObject jsonDtl = new JSONObject(); - jsonDtl.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + ""); - jsonDtl.put("iostorinv_id", iostorinv_id); - jsonDtl.put("seq_no", (i + 1) + ""); - jsonDtl.put("material_id", row.getString("material_id")); - jsonDtl.put("pcsn", row.getString("pcsn")); - jsonDtl.put("box_no", row.getString("box_no")); - jsonDtl.put("quality_scode", "01"); - jsonDtl.put("bill_status", "10"); - jsonDtl.put("qty_unit_id", row.get("qty_unit_id")); - jsonDtl.put("qty_unit_name", row.getString("qty_unit_name")); - jsonDtl.put("plan_qty", row.get("plan_qty")); - jsonDtl.put("remark", row.getString("remark")); - jsonDtl.put("source_bill_code", row.getString("source_bill_code")); - jsonDtl.put("assign_qty", "0"); - jsonDtl.put("unassign_qty", row.get("plan_qty")); - jsonDtl.put("vbeln", row.getString("vbeln")); - jsonDtl.put("posnr", row.getString("posnr")); - jsonDtl.put("width", row.getString("width")); - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(jsonDtl); - qty += jsonDtl.getDoubleValue("plan_qty"); - - // 判断此明细子卷是否存在,存在则将此木箱下的子卷全部生成明细 - String pcsn = row.getString("pcsn"); - String box_no = row.getString("box_no"); - //查询该箱子所在货位 - JSONObject struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + box_no + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(pcsn)) { - if (ObjectUtil.isEmpty(struct_jo)) { - throw new BadRequestException("未查询到该批次所在货位!"); - } - String struct_code = struct_jo.getString("struct_code"); - JSONObject json = ivtTab.query("pcsn = '" + pcsn + "' AND struct_code = '" + struct_code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(json)) { - continue; - } - - JSONObject jsonMap = new JSONObject(); - jsonMap.put("flag", "1"); - jsonMap.put("pcsn", pcsn); - jsonMap.put("struct_id", json.getString("struct_id")); - - JSONArray ivtArr = WQL.getWO("ST_OUTIVT02").addParamMap(jsonMap).process().getResultJSONArray(0); - for (int j = 0; j < ivtArr.size(); j++) { - JSONObject jsonIvt = ivtArr.getJSONObject(j); - JSONObject jsonDtl2 = new JSONObject(); - - jsonDtl2.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + ""); - jsonDtl2.put("iostorinv_id", iostorinv_id); - jsonDtl2.put("seq_no", i + 2 + j); - jsonDtl2.put("material_id", jsonIvt.getString("material_id")); - jsonDtl2.put("pcsn", jsonIvt.getString("pcsn")); - jsonDtl2.put("box_no", jsonIvt.getString("box_no")); - jsonDtl2.put("quality_scode", "01"); - jsonDtl2.put("bill_status", "10"); - jsonDtl2.put("qty_unit_id", jsonIvt.get("qty_unit_id")); - jsonDtl2.put("qty_unit_name", jsonIvt.getString("qty_unit_name")); - jsonDtl2.put("plan_qty", jsonIvt.get("canuse_qty")); - jsonDtl2.put("remark", ""); - jsonDtl2.put("assign_qty", "0"); - jsonDtl2.put("unassign_qty", jsonIvt.get("canuse_qty")); - jsonDtl2.put("source_billdtl_id", jsonDtl.getString("iostorinvdtl_id")); - // 校验计划数量不能为零 - double plan_qty2 = jsonDtl2.getDoubleValue("plan_qty"); - if (Double.compare(plan_qty2, 0) == 0) { - throw new BadRequestException("数量不能为0"); - } - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(jsonDtl2); - - qty += jsonDtl2.getDoubleValue("plan_qty"); - } - num += ivtArr.size(); - } - - } - map.put("total_qty", qty); - map.put("detail_count", num); - WQLObject.getWQLObject("ST_IVT_IOStorInv").insert(map); - - return iostorinv_id; - } - - @Override - public JSONArray getOutBillDtl(Map whereJson) { - whereJson.put("flag", "2"); - JSONArray jo = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParamMap((HashMap) whereJson) - .process() - .getResultJSONArray(0); - return jo; - } - - @Override - public JSONArray getOutBillDis(Map whereJson) { - whereJson.put("flag", "5"); - JSONArray jo = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParamMap((HashMap) whereJson) - .process() - .getResultJSONArray(0); - return jo; - } - - @Override - public JSONArray getOutBillDis2(Map whereJson) { - whereJson.put("flag", "52"); - JSONArray jo = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParamMap((HashMap) whereJson) - .process() - .getResultJSONArray(0); - return jo; - } - - @Override - public JSONArray getOutBillDisDtl(Map whereJson) { - whereJson.put("flag", "9"); - JSONArray jo = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParamMap((HashMap) whereJson) - .process() - .getResultJSONArray(0); - return jo; - } - - @Override - public JSONArray getOutBillTask(Map whereJson) { - HashMap map = new HashMap<>(whereJson); - map.put("flag", "10"); - if ("true".equals(map.get("checked"))) { - map.put("task_status", "99"); - } - JSONArray jo = new JSONArray(); - if (map.containsKey("iostorinvdtl_id")) { - jo = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParamMap(map) - .process() - .getResultJSONArray(0); - } - return jo; - } - - @Override - public JSONArray getOutBillTask2(Map whereJson) { - HashMap map = new HashMap<>(whereJson); - map.put("flag", "101"); - JSONArray jo = new JSONArray(); - if (map.containsKey("iostorinvdtl_id")) { - jo = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParamMap(map) - .process() - .getResultJSONArray(0); - } - for (int i = 0; i < jo.size(); i++) { - JSONObject json = jo.getJSONObject(i); - String task_status = json.getString("task_status"); - if (ObjectUtil.isEmpty(task_status)) { - String work_status = json.getString("work_status"); - if (StrUtil.equals(work_status, "01")) { - json.put("task_status", "01"); - } - if (StrUtil.equals(work_status, "99")) { - json.put("task_status", "07"); - } - } - } - return jo; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void cancelTask(JSONObject whereJson) { - WQLObject disTab = WQLObject.getWQLObject("st_ivt_iostorinvdis"); // 分配表 - WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); // 任务表 - - String task_id = whereJson.getString("task_id"); - JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - // 任务为下发之后就不允许取消 - if (jsonTask.getIntValue("task_status") > Integer.valueOf(TaskStatusEnum.START_AND_POINT.getCode())) { - throw new BadRequestException("任务:" + jsonTask.getString("task_code") + "已下发,不可取消"); - } - - // 更新分配明细 任务状态、清空任务id - JSONObject paramMap = new JSONObject(); - paramMap.put("task_id", ""); - paramMap.put("work_status", "00"); - paramMap.put("point_id", ""); - disTab.update(paramMap, "task_id = '" + task_id + "'"); - - // 删除此任务 - JSONObject paramMap2 = new JSONObject(); - paramMap2.put("is_delete", "1"); - taskTab.update(paramMap2, "task_id = '" + task_id + "'"); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void outReturn(JSONObject whereJson) { - WQLObject mstTab = WQLObject.getWQLObject("st_ivt_iostorinv"); - - JSONObject jsonMst = mstTab.query("iostorinv_id = '" + whereJson.getString("iostorinv_id") + "'").uniqueResult(0); - - if (!StrUtil.equals(jsonMst.getString("bill_type"), "1001")) { - throw new BadRequestException("请选择发货出库单据!"); - } - - // 调用mes接口回传 - JSONObject param = new JSONObject(); - JSONArray array = new JSONArray(); - array.add(jsonMst); - param.put("rows", array); - - InAndOutRetrunServiceImpl bean = SpringContextHolder.getBean(InAndOutRetrunServiceImpl.class); - bean.uploadMES(param); - } - - @Override - public void download(Map whereJson, HttpServletResponse response, String[] stor_id, String[] bill_status, String[] bill_type) throws IOException { - HashMap map = new HashMap<>(whereJson); - map.put("flag", "111"); - - if (StrUtil.isNotEmpty(map.get("bill_code"))) { - map.put("bill_code", "%" + map.get("bill_code") + "%"); - } - if (StrUtil.isNotEmpty(map.get("buss_type"))) { - map.put("buss_type", whereJson.get("buss_type") + "%"); - } - if (StrUtil.isNotEmpty(map.get("io_type"))) { - map.put("io_type", map.get("io_type")); - } - if (StrUtil.isNotEmpty(map.get("is_upload"))) { - map.put("is_upload", map.get("is_upload")); - } - if (StrUtil.isNotEmpty(map.get("material_code"))) { - map.put("material_code", "%" + map.get("material_code") + "%"); - } - - // 空格查询 - if (StrUtil.isNotEmpty(map.get("vbeln"))) { - // 判断是否有空格 - String vbeln = MapUtil.getStr(map, "vbeln"); - - boolean matches = vbeln.matches(".*\\s.*"); - - if (matches) { - String[] s = vbeln.split(" "); - String vbeln_in = String.join("','", Arrays.asList(s)); - - map.put("vbeln_in", "('"+vbeln_in+"')"); - map.put("vbeln", ""); - } else { - map.put("vbeln", "%" + map.get("vbeln") + "%"); - } - } - - // 空格查询 - if (StrUtil.isNotEmpty(map.get("box_no"))) { - // 判断是否有空格 - String box_no = MapUtil.getStr(map, "box_no"); - - boolean matches = box_no.matches(".*\\s.*"); - - if (matches) { - String[] s = box_no.split(" "); - String box_no_in = String.join("','", Arrays.asList(s)); - - map.put("box_no_in", "('"+box_no_in+"')"); - map.put("box_no", ""); - } else { - map.put("box_no", "%" + map.get("box_no") + "%"); - - } - } - - if (StrUtil.isNotEmpty(map.get("width"))) { - map.put("width", "%" + map.get("width") + "%"); - } - - // 空格查询 - if (StrUtil.isNotEmpty(map.get("pcsn"))) { - // 判断是否有空格 - String pcsn = MapUtil.getStr(map, "pcsn"); - - boolean matches = pcsn.matches(".*\\s.*"); - - if (matches) { - String[] s = pcsn.split(" "); - String pcsn_in = String.join("','", Arrays.asList(s)); - - map.put("pcsn_in", "('"+pcsn_in+"')"); - map.put("pcsn", ""); - } else { - map.put("pcsn", "%" + map.get("pcsn") + "%"); - } - } - - // 空格查询 - if (StrUtil.isNotEmpty(map.get("sap_pcsn"))) { - // 判断是否有空格 - String sap_pcsn = MapUtil.getStr(map, "sap_pcsn"); - - boolean matches = sap_pcsn.matches(".*\\s.*"); - - if (matches) { - String[] s = sap_pcsn.split(" "); - String sap_pcsn_in = String.join("','", Arrays.asList(s)); - - map.put("sap_pcsn_in", "('"+sap_pcsn_in+"')"); - map.put("sap_pcsn", ""); - } else { - map.put("sap_pcsn", "%" + map.get("sap_pcsn") + "%"); - } - } - - if (StrUtil.isNotEmpty(map.get("cust_code"))) { - map.put("cust_code", "%" + map.get("cust_code") + "%"); - } - if (ObjectUtil.isNotEmpty(stor_id)) { - String storIds = "("; - for (int i = 0; i < stor_id.length; i++) { - if (i != stor_id.length - 1) { - storIds += "'" + stor_id[i] + "',"; - } else { - storIds += "'" + stor_id[i] + "')"; - } - } - map.put("storIds", storIds); - } - - if (ObjectUtil.isNotEmpty(bill_status)) { - String billStatuses = "("; - for (int i = 0; i < bill_status.length; i++) { - if (i != bill_status.length - 1) { - billStatuses += "'" + bill_status[i] + "',"; - } else { - billStatuses += "'" + bill_status[i] + "')"; - } - } - map.put("billStatuses", billStatuses); - } - - if (ObjectUtil.isNotEmpty(bill_type)) { - String billTypes = "("; - for (int i = 0; i < bill_type.length; i++) { - if (i != bill_type.length - 1) { - billTypes += "'" + bill_type[i] + "',"; - } else { - billTypes += "'" + bill_type[i] + "')"; - } - } - map.put("billTypes", billTypes); - } - - JSONArray resultJSONArray = WQL.getWO("QST_IVT_CHECKOUTBILL").addParamMap(map).process().getResultJSONArray(0); - - List ivtList = WQL.getWO("QST_IVT_CHECKOUTBILL").addParam("flag", "21").process().getResultJSONArray(0).toJavaList(JSONObject.class); - - List> list = new ArrayList<>(); - - for (int i = 0; i < resultJSONArray.size(); i++) { - JSONObject jsonObject = resultJSONArray.getJSONObject(i); - Map mp = new LinkedHashMap<>(); - - mp.put("单据号", jsonObject.getString("bill_code")); - mp.put("仓库", jsonObject.getString("stor_name")); - if (StrUtil.equals(jsonObject.getString("bill_type"), "1001")) { - mp.put("业务类型", "发货出库"); - } - if (StrUtil.equals(jsonObject.getString("bill_type"), "1002")) { - mp.put("业务类型", "报废出库"); - } - if (StrUtil.equals(jsonObject.getString("bill_type"), "1003")) { - mp.put("业务类型", "改切出库"); - } - if (StrUtil.equals(jsonObject.getString("bill_type"), "1004")) { - mp.put("业务类型", "调拨出库"); - } - if (StrUtil.equals(jsonObject.getString("bill_type"), "1005")) { - mp.put("业务类型", "拆箱出库"); - } - if (StrUtil.equals(jsonObject.getString("bill_type"), "1009")) { - mp.put("业务类型", "手工出库"); - } - - String box_weight = ivtList.stream() - .filter(row -> row.getString("iostorinvdtl_id").equals(jsonObject.getString("iostorinvdtl_id"))) - .map(row -> row.getDoubleValue("box_weight")) - .reduce(Double::sum).orElse(0.00).toString(); - - //计划重量、实际重量、实际毛重、车号、箱数、收货地址(调拨显示到货仓库)、单据状态 - mp.put("业务日期", jsonObject.getString("biz_date")); - mp.put("计划重量", jsonObject.getString("qty")); - mp.put("实际重量", jsonObject.getString("plan_qty")); - mp.put("实际毛重", box_weight); - mp.put("车号", jsonObject.getString("order_number")); - mp.put("箱数", jsonObject.getString("box_count")); - if (StrUtil.equals(jsonObject.getString("bill_type"), "1004")) { - mp.put("收货地址", jsonObject.getString("out_stor_name")); - } else { - mp.put("收货地址", jsonObject.getString("receiptaddress")); - } - mp.put("单据状态", jsonObject.getString("bill_status")); - mp.put("客户编码", jsonObject.getString("cust_code")); - mp.put("客户名称", jsonObject.getString("cust_name")); - mp.put("交货单号", jsonObject.getString("vbeln")); - mp.put("订单及行号", jsonObject.getString("sale_order_name")); - mp.put("规格", jsonObject.getString("spec")); - mp.put("物流公司", jsonObject.getString("wl_cust_name")); - mp.put("运费", jsonObject.getString("estimated_freight")); - list.add(mp); - } - FileUtil.downloadExcel(list, response); - } - - @Override - public JSONObject updataIsOverdue(JSONObject whereJson) { - // 出入库主表 - WQLObject mstTab = WQLObject.getWQLObject("st_ivt_iostorinv"); - // 出入库分配明细表 - WQLObject disTab = WQLObject.getWQLObject("st_ivt_iostorinvdis"); - - // 更新主表 - JSONObject jsonMst = mstTab.query("iostorinv_id = '" + whereJson.getString("iostorinv_id") + "'").uniqueResult(0); - jsonMst.put("is_overdue", whereJson.getString("is_overdue")); - mstTab.update(jsonMst); - - // 计算超期数量 - List disList = disTab.query("iostorinvdtl_id = '" + whereJson.getString("iostorinvdtl_id") + "' AND is_overdue = '1'") - .getResultJSONArray(0).toJavaList(JSONObject.class); - - double overdue_qyt = disList.stream() - .map(row -> row.getDoubleValue("plan_qty")) - .reduce(Double::sum).orElse(0.00); - - JSONObject result = new JSONObject(); - result.put("overdue_qyt",overdue_qyt); - result.put("mst", jsonMst); - return result; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void importExcel(MultipartFile file, HttpServletRequest request) { - // 明细 - WQLObject dtl = WQLObject.getWQLObject("st_ivt_iostorinvdtl"); - // 主表 - WQLObject mst = WQLObject.getWQLObject("st_ivt_iostorinv"); - // 物流公司 - WQLObject tran = WQLObject.getWQLObject("MD_CS_TransportationBase"); - - // 1.获取上传文件输入流 - InputStream inputStream = null; - - try { - inputStream = file.getInputStream(); - } catch (Exception e) { - e.printStackTrace(); - } - - // 查询所有物流公司 - List tranList = tran.query("is_used = '1' and is_delete = '0'") - .getResultJSONArray(0).toJavaList(JSONObject.class); - - ExcelReader excelReader = ExcelUtil.getReader(inputStream); - List> read = excelReader.read(1, excelReader.getRowCount()); - - for (int i = 0; i < read.size(); i++) { - List list = read.get(i); - - // 交货单 - String vbeln = list.get(0).toString(); - - if (ObjectUtil.isEmpty(vbeln)) { - continue; - } - - // 根据交货单找到主单据 - JSONObject jsonDtl = dtl.query("vbeln = '" + vbeln + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonDtl)) { - continue; - } - JSONObject jsonMst = mst.query("iostorinv_id = '" + jsonDtl.getString("iostorinv_id") + "'").uniqueResult(0); - - // 物流公司名称 - String cust_name = list.get(1).toString(); - // 匹配对应的物流公司 - JSONObject jsonTran = tranList.stream() - .filter(row -> row.getString("cust_name").equals(cust_name)) - .findFirst().orElse(null); - - // 运单号 - String order_number = list.get(2).toString(); - - // 车型 - String car_type = list.get(3).toString(); - - // 其他费用 - String other_freight = list.get(4).toString(); - - // 其他费用 - String estimated_freight = list.get(5).toString(); - - // 更新主表 - jsonMst.put("trans_code", ObjectUtil.isNotEmpty(jsonTran) ? jsonTran.getString("cust_code") : "" ); - jsonMst.put("order_number", order_number); - jsonMst.put("car_type", car_type); - jsonMst.put("other_freight", other_freight); - jsonMst.put("estimated_freight", estimated_freight); - mst.update(jsonMst); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void saveUpdate(JSONObject whereJson) { - // 分配明细表 - WQLObject disTab = WQLObject.getWQLObject("st_ivt_iostorinvdis"); - // 明细表 - WQLObject dtlTab = WQLObject.getWQLObject("st_ivt_iostorinvdtl"); - // 库存表 - WQLObject ivtTab = WQLObject.getWQLObject("st_ivt_structivt"); - - JSONObject jsonDtl = whereJson.getJSONObject("dtl"); - List disArr = whereJson.getJSONArray("tabledis").toJavaList(JSONObject.class); - - for (int i = 0; i < disArr.size(); i++) { - JSONObject json = disArr.get(i); - - // 输入数量不能为零 - if (json.getDoubleValue("plan_qty") == 0) { - throw new BadRequestException("输入数量不能为0!"); - } - - // 更新冻结库存 - JSONObject jsonIvt = ivtTab.query("pcsn = '" + json.getString("pcsn") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonIvt)) { - throw new BadRequestException("库存不存在!"+json.getString("pcsn")); - } - - jsonIvt.put("frozen_qty", json.getDoubleValue("plan_qty")); - // 冻结库存不能超过库存数量 - if (jsonIvt.getDoubleValue("frozen_qty") > jsonIvt.getDoubleValue("ivt_qty")) { - throw new BadRequestException("输入数量不能大于库存数量! 当前库存数为:"+jsonIvt.getString("ivt_qty")); - } - - // 更新库存数 - double canuse_qty = NumberUtil.sub(jsonIvt.getDoubleValue("ivt_qty"), jsonIvt.getDoubleValue("frozen_qty")); - jsonIvt.put("canuse_qty",canuse_qty); - - ivtTab.update(jsonIvt); - - // 更新分配明细 - json.put("real_qty", json.getDoubleValue("plan_qty")); - disTab.update(json); - } - - // 更新明细 - double assign_qty = disArr.stream() - .map(row -> row.getDoubleValue("plan_qty")) - .reduce(Double::sum).orElse(0.00); - // 已分配重量 - jsonDtl.put("assign_qty", assign_qty); - - // 未分配重量/明细状态 - double unassign_qty = NumberUtil.sub(jsonDtl.getDoubleValue("plan_qty"), assign_qty); - if (unassign_qty <= 0) { - jsonDtl.put("unassign_qty", 0); - jsonDtl.put("bill_status", "40"); - } else { - jsonDtl.put("unassign_qty", unassign_qty); - jsonDtl.put("bill_status", "30"); - } - dtlTab.update(jsonDtl); - - // 更新主表状态 - updateMststatus(jsonDtl.getString("iostorinv_id")); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void update(JSONObject whereJson) { - - if (whereJson.getString("bill_type").equals("1011")) { - updatePic(whereJson); - return; - } - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - - String now = DateUtil.now(); - whereJson.put("update_optid", currentUserId + ""); - whereJson.put("update_optname", nickName); - whereJson.put("update_time", now); - - WQLObject wo = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); - WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); - - wo.update(whereJson); - //先删除该单据下的所有明细 - String iostorinv_id = (String) whereJson.get("iostorinv_id"); - wo_dtl.delete("iostorinv_id = '" + iostorinv_id + "'"); - - JSONArray array = whereJson.getJSONArray("tableData"); - JSONArray rows = new JSONArray(); - - // 过滤相同箱号的明细 - HashSet boxSet = new HashSet<>(); - for (int i = 0; i < array.size(); i++) { - JSONObject json = array.getJSONObject(i); - if (ObjectUtil.isNotEmpty(json.getString("box_no"))) { - boxSet.add(json.getString("box_no")); - } else { - rows.add(json); - } - } - if (ObjectUtil.isNotEmpty(boxSet)) { - // 遍历 - for (String box_no : boxSet) { - JSONObject jsonObject = WQL.getWO("QST_IVT_CHECKOUTBILL").addParam("flag", "77").addParam("box_no", box_no).process().uniqueResult(0); - rows.add(jsonObject); - } - } - - double qty = 0.0; // 主表重量 - int num = rows.size(); // 明细数 - for (int i = 0; i < rows.size(); i++) { - JSONObject row = rows.getJSONObject(i); - // 校验计划数量不能为零 - double plan_qty = row.getDoubleValue("plan_qty"); - if (Double.compare(plan_qty, 0) == 0) { - throw new BadRequestException("数量不能为0"); - } - - JSONObject jsonDtl = new JSONObject(); - jsonDtl.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + ""); - jsonDtl.put("iostorinv_id", iostorinv_id); - jsonDtl.put("seq_no", (i + 1) + ""); - jsonDtl.put("material_id", row.getString("material_id")); - jsonDtl.put("pcsn", row.getString("pcsn")); - jsonDtl.put("box_no", row.getString("box_no")); - jsonDtl.put("quality_scode", "01"); - jsonDtl.put("bill_status", "10"); - jsonDtl.put("qty_unit_id", row.get("qty_unit_id")); - jsonDtl.put("qty_unit_name", row.getString("qty_unit_name")); - jsonDtl.put("plan_qty", row.get("plan_qty")); - jsonDtl.put("remark", row.getString("remark")); - jsonDtl.put("source_bill_code", row.getString("source_bill_code")); - jsonDtl.put("assign_qty", "0"); - jsonDtl.put("unassign_qty", row.get("plan_qty")); - jsonDtl.put("vbeln", row.getString("vbeln")); - jsonDtl.put("posnr", row.getString("posnr")); - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(jsonDtl); - qty += jsonDtl.getDoubleValue("plan_qty"); - - // 判断此明细子卷是否存在,存在则将此木箱下的子卷全部生成明细 - String pcsn = row.getString("pcsn"); - String box_no = row.getString("box_no"); - //查询该箱子所在货位 - JSONObject struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + box_no + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(pcsn)) { - if (ObjectUtil.isEmpty(struct_jo)) { - throw new BadRequestException("未查询到该批次所在货位!"); - } - String struct_code = struct_jo.getString("struct_code"); - JSONObject json = ivtTab.query("pcsn = '" + pcsn + "' AND struct_code = '" + struct_code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(json)) { - continue; - } - - JSONObject jsonMap = new JSONObject(); - jsonMap.put("flag", "1"); - jsonMap.put("pcsn", pcsn); - jsonMap.put("struct_id", json.getString("struct_id")); - - JSONArray ivtArr = WQL.getWO("ST_OUTIVT02").addParamMap(jsonMap).process().getResultJSONArray(0); - for (int j = 0; j < ivtArr.size(); j++) { - JSONObject jsonIvt = ivtArr.getJSONObject(j); - JSONObject jsonDtl2 = new JSONObject(); - jsonDtl2.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + ""); - jsonDtl2.put("iostorinv_id", iostorinv_id); - jsonDtl2.put("seq_no", i + 2 + j); - jsonDtl2.put("material_id", jsonIvt.getString("material_id")); - jsonDtl2.put("pcsn", jsonIvt.getString("pcsn")); - jsonDtl2.put("box_no", jsonIvt.getString("box_no")); - jsonDtl2.put("quality_scode", "01"); - jsonDtl2.put("bill_status", "10"); - jsonDtl2.put("qty_unit_id", jsonIvt.get("qty_unit_id")); - jsonDtl2.put("qty_unit_name", jsonIvt.getString("qty_unit_name")); - jsonDtl2.put("plan_qty", jsonIvt.get("canuse_qty")); - jsonDtl2.put("remark", ""); - jsonDtl2.put("assign_qty", "0"); - jsonDtl2.put("unassign_qty", jsonIvt.get("canuse_qty")); - jsonDtl2.put("source_billdtl_id", jsonDtl.getString("iostorinvdtl_id")); - // 校验计划数量不能为零 - double plan_qty2 = jsonDtl2.getDoubleValue("plan_qty"); - if (Double.compare(plan_qty2, 0) == 0) { - throw new BadRequestException("数量不能为0"); - } - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(jsonDtl2); - - qty += jsonDtl2.getDoubleValue("plan_qty"); - } - num += ivtArr.size(); - } - whereJson.put("total_qty", qty); - whereJson.put("detail_count", num); - wo.update(whereJson); - } - } - - /** - * 分拣出库修改 - * @param whereJson、 - */ - private void updatePic(JSONObject whereJson) { - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - - String now = DateUtil.now(); - whereJson.put("update_optid", currentUserId + ""); - whereJson.put("update_optname", nickName); - whereJson.put("update_time", now); - - WQLObject wo = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); - WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); - - wo.update(whereJson); - //先删除该单据下的所有明细 - String iostorinv_id = (String) whereJson.get("iostorinv_id"); - wo_dtl.delete("iostorinv_id = '" + iostorinv_id + "'"); - - JSONArray rows = whereJson.getJSONArray("tableData"); - - double qty = 0.0; // 主表重量 - int num = rows.size(); // 明细数 - for (int i = 0; i < rows.size(); i++) { - JSONObject row = rows.getJSONObject(i); - // 校验计划数量不能为零 - double plan_qty = row.getDoubleValue("plan_qty"); - if (Double.compare(plan_qty, 0) == 0) { - throw new BadRequestException("数量不能为0"); - } - - JSONObject jsonDtl = new JSONObject(); - jsonDtl.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + ""); - jsonDtl.put("iostorinv_id", iostorinv_id); - jsonDtl.put("seq_no", (i + 1) + ""); - jsonDtl.put("material_id", row.getString("material_id")); - jsonDtl.put("pcsn", row.getString("pcsn")); - jsonDtl.put("box_no", row.getString("box_no")); - jsonDtl.put("quality_scode", "01"); - jsonDtl.put("bill_status", "10"); - jsonDtl.put("qty_unit_id", row.get("qty_unit_id")); - jsonDtl.put("qty_unit_name", row.getString("qty_unit_name")); - jsonDtl.put("plan_qty", row.get("plan_qty")); - jsonDtl.put("remark", row.getString("remark")); - jsonDtl.put("source_bill_code", row.getString("source_bill_code")); - jsonDtl.put("assign_qty", "0"); - jsonDtl.put("unassign_qty", row.get("plan_qty")); - jsonDtl.put("vbeln", row.getString("vbeln")); - jsonDtl.put("posnr", row.getString("posnr")); - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(jsonDtl); - qty += jsonDtl.getDoubleValue("plan_qty"); - - // 判断此明细子卷是否存在,存在则将此木箱下的子卷全部生成明细 - String pcsn = row.getString("pcsn"); - String box_no = row.getString("box_no"); - //查询该箱子所在货位 - JSONObject struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + box_no + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(pcsn)) { - if (ObjectUtil.isEmpty(struct_jo)) { - throw new BadRequestException("未查询到该批次所在货位!"); - } - String struct_code = struct_jo.getString("struct_code"); - JSONObject json = ivtTab.query("pcsn = '" + pcsn + "' AND struct_code = '" + struct_code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(json)) { - continue; - } - } - whereJson.put("total_qty", qty); - whereJson.put("detail_count", num); - wo.update(whereJson); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - @SneakyThrows - public void allDiv(JSONObject whereJson) { - //出库分配表 - WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - //出库明细表 - WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); - //出库主表 - WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - //库区表 - WQLObject wo_sect = WQLObject.getWQLObject("st_ivt_sectattr"); - - String iostorinv_id = whereJson.getString("iostorinv_id"); - //查询主表信息 - JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jo_mst)) { - throw new BadRequestException("查不到出库单信息"); - } - - // 如果是发货出库则判断运费和物流公司不能为空 - String bill_type = jo_mst.getString("bill_type"); - if (StrUtil.equals(bill_type, "1001")) { - String trans_code = jo_mst.getString("trans_code"); - String estimated_freight = jo_mst.getString("estimated_freight"); - - if (ObjectUtil.isEmpty(trans_code)) { - throw new BadRequestException("物流公司不能为空"); - } - if (ObjectUtil.isEmpty(estimated_freight)) { - throw new BadRequestException("预估运费不能为空"); - } - - } - - //查询生成和未分配完的明细 - JSONArray dtls = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParam("flag", "2") - .addParam("bill_status", "30") - .addParam("unassign_flag", "1") - .addParam("iostorinv_id", iostorinv_id) - .addParam("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id")) - .process() - .getResultJSONArray(0); - if (ObjectUtil.isEmpty(dtls)) { - throw new BadRequestException("当前订单无可分配出库明细"); - } - - RLock lock = redissonClient.getLock("all_divOne"); - boolean tryLock = lock.tryLock(0, 60,TimeUnit.SECONDS); - - try { - if (tryLock) { - //定义需要更新的仓位集合 - HashMap Struct_map = new HashMap(); - for (int i = 0; i < dtls.size(); i++) { - JSONObject dtl = dtls.getJSONObject(i); - double unassign_qty = dtl.getDoubleValue("unassign_qty"); - double plan_qty = dtl.getDoubleValue("plan_qty"); - /* - * 分配规则: - * top1.有销售订单号:用销售订单号、物料去找这批物料最早入库的所在的巷道 - * top2.没有销售订单号,有子卷号:固定出某个木箱 - * top3.没有销售订单号,没有子卷号:找此物料最早入库的所在巷道 - */ - boolean is_top3 = false; - if (ObjectUtil.isEmpty(dtl.getString("source_bill_code")) && ObjectUtil.isEmpty(dtl.getString("pcsn"))) { - is_top3 = true; - } - JSONObject jsonMap = new JSONObject(); - // 已分配重量 - double assign_qty = dtl.getDoubleValue("assign_qty"); - - if (ObjectUtil.isNotEmpty(dtl.getString("source_bill_code")) || is_top3) { - while (unassign_qty > 0) { - // 1.有销售订单号 - jsonMap.put("flag", "1"); - jsonMap.put("material_id", dtl.getString("material_id")); - jsonMap.put("sale_order_name", dtl.getString("source_bill_code")); - jsonMap.put("sect_id", whereJson.getString("sect_id")); - jsonMap.put("stor_id", whereJson.getString("stor_id")); - - JSONObject jsonOneIvt = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().uniqueResult(0); - if (ObjectUtil.isEmpty(jsonOneIvt)) { - throw new BadRequestException("库存不足"); - } - - // 查询这一巷道所有此物料此库存此销售订单的库存 - jsonMap.put("flag", "2"); - jsonMap.put("row_num", jsonOneIvt.getString("row_num")); - jsonMap.put("block_num", jsonOneIvt.getString("block_num")); - JSONArray ivtAllArr = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().getResultJSONArray(0); - - for (int j = 0; j < ivtAllArr.size(); j++) { - JSONObject ivt = ivtAllArr.getJSONObject(j); - double canuse_qty = ivt.getDoubleValue("canuse_qty"); - assign_qty = NumberUtil.add(assign_qty, canuse_qty); - - if (unassign_qty >= canuse_qty) { - unassign_qty = NumberUtil.sub(unassign_qty, canuse_qty); - } else { - unassign_qty = 0; - } - - // 查询此木箱下的所有子卷 - jsonMap.put("flag", "3"); - jsonMap.put("storagevehicle_code", ivt.getString("storagevehicle_code")); - JSONArray ivtAllArr2 = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().getResultJSONArray(0); - - for (int k = 0; k < ivtAllArr2.size(); k++) { - // 更新库存 - JSONObject ivt2 = ivtAllArr2.getJSONObject(k); - ivt2.put("change_qty", ivt2.getDoubleValue("canuse_qty")); - ivt2.put("bill_type_scode", jo_mst.getString("bill_type")); - ivt2.put("inv_id", dtl.getString("iostorinv_id")); - ivt2.put("bill_code", jo_mst.getString("bill_code")); - ivt2.put("bill_table", "ST_IVT_IOStorInv"); - storPublicService.IOStor(ivt2, "11"); - - //生成分配明细 - dtl.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId()); - dtl.put("sect_id", ivt2.getString("sect_id")); - dtl.put("sect_code", ivt2.getString("sect_code")); - dtl.put("sect_name", ivt2.getString("sect_name")); - dtl.put("struct_id", ivt2.getString("struct_id")); - dtl.put("struct_code", ivt2.getString("struct_code")); - dtl.put("struct_name", ivt2.getString("struct_name")); - dtl.put("pcsn", ivt2.getString("pcsn")); - dtl.put("box_no", ivt2.getString("storagevehicle_code")); - dtl.put("storagevehicle_id", ivt2.getString("storagevehicle_id")); - dtl.put("storagevehicle_code", ivt2.getString("storagevehicle_code")); - dtl.put("storagevehicle_type", ivt2.getString("storagevehicle_type")); - dtl.put("is_issued", "0"); - dtl.put("plan_qty", ivt2.getDoubleValue("change_qty")); - dtl.put("real_qty", ivt2.getDoubleValue("change_qty")); - dtl.put("is_overdue", ivt2.getString("is_overdue")); - dtl.put("instorage_time", ivt2.getString("instorage_time")); - - // 如果所属仓位是虚拟区 则将分配明细状态变为生成 - JSONObject jsonSect = wo_sect.query("sect_id = '" + ivt2.getString("sect_id") + "'").uniqueResult(0); - if (StrUtil.equals(jsonSect.getString("sect_type_attr"), "09")) { - dtl.put("work_status", "01"); - } else { - dtl.put("work_status", "00"); - } - - if (jo_mst.getString("is_overdue").equals("1")) { - // 判断是否超期 - if (ivt2.getString("is_overdue").equals("1")) { - dtl.put("work_status", "01"); - } - } - wo_dis.insert(dtl); - } - //记录需锁定的仓位 - Struct_map.put(ivt.getString("struct_id"), ivt); - // 为零结束 - if (unassign_qty == 0) { - break; - } - } - } - - } else { - // 确定子卷: 根据子卷找到库存出掉 - jsonMap.put("flag", "1"); - jsonMap.put("material_id", dtl.getString("material_id")); - jsonMap.put("pcsn", dtl.getString("pcsn")); - jsonMap.put("box_no", dtl.getString("box_no")); - jsonMap.put("sect_id", whereJson.getString("sect_id")); - jsonMap.put("stor_id", whereJson.getString("stor_id")); - - JSONObject jsonIvt = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().uniqueResult(0); - if (ObjectUtil.isEmpty(jsonIvt)) { - throw new BadRequestException("库存不足"); - } - - double canuse_qty ; - if (StrUtil.equals(bill_type, "1011")) { - canuse_qty = dtl.getDoubleValue("plan_qty"); - } else { - canuse_qty = jsonIvt.getDoubleValue("canuse_qty"); - } - - jsonIvt.put("change_qty", canuse_qty + ""); - unassign_qty = 0; - assign_qty = NumberUtil.add(assign_qty, canuse_qty); - - //更新库存 - jsonIvt.put("bill_type_scode", jo_mst.getString("bill_type")); - jsonIvt.put("inv_id", dtl.getString("iostorinv_id")); - jsonIvt.put("bill_code", jo_mst.getString("bill_code")); - jsonIvt.put("bill_table", "ST_IVT_IOStorInv"); - storPublicService.IOStor(jsonIvt, "11"); - //生成分配明细 - dtl.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId()); - dtl.put("sect_id", jsonIvt.getString("sect_id")); - dtl.put("sect_code", jsonIvt.getString("sect_code")); - dtl.put("sect_name", jsonIvt.getString("sect_name")); - dtl.put("struct_id", jsonIvt.getString("struct_id")); - dtl.put("struct_code", jsonIvt.getString("struct_code")); - dtl.put("struct_name", jsonIvt.getString("struct_name")); - dtl.put("pcsn", jsonIvt.getString("pcsn")); - dtl.put("box_no", jsonIvt.getString("storagevehicle_code")); - dtl.put("storagevehicle_id", jsonIvt.getString("storagevehicle_id")); - dtl.put("storagevehicle_code", jsonIvt.getString("storagevehicle_code")); - dtl.put("storagevehicle_type", jsonIvt.getString("storagevehicle_type")); - dtl.put("is_issued", "0"); - dtl.put("plan_qty", jsonIvt.getDoubleValue("change_qty")); - dtl.put("real_qty", jsonIvt.getDoubleValue("change_qty")); - dtl.put("is_overdue", jsonIvt.getString("is_overdue")); - dtl.put("instorage_time", jsonIvt.getString("instorage_time")); - // 如果所属仓位是虚拟区 则将分配明细状态变为生成 - JSONObject jsonSect = wo_sect.query("sect_id = '" + jsonIvt.getString("sect_id") + "'").uniqueResult(0); - if (StrUtil.equals(jsonSect.getString("sect_type_attr"), "09")) { - dtl.put("work_status", "01"); - } else { - dtl.put("work_status", "00"); - } - - // 判断是否超期 - if (jo_mst.getString("is_overdue").equals("1")) { - if (jsonIvt.getString("is_overdue").equals("1")) { - dtl.put("work_status", "01"); - } - } - - wo_dis.insert(dtl); - - //记录需锁定的仓位 (如果此明细有相同物料的且子卷号不能为空的则在最后一个明细分配完成后锁定仓位) - JSONObject map = new JSONObject(); - map.put("flag", "5"); - map.put("material_id", dtl.getString("material_id")); - map.put("box_no", dtl.getString("box_no")); - map.put("iostorinv_id", iostorinv_id); - map.put("iostorinvdtl_id", dtl.getString("iostorinvdtl_id")); - JSONArray dtlArr = WQL.getWO("ST_OUTIVT01").addParamMap(map).process().getResultJSONArray(0); - if (dtlArr.size() == 0) { - Struct_map.put(jsonIvt.getString("struct_id"), jsonIvt); - } - - } - HashMap map_dtl = new HashMap(); - //更新明细 - map_dtl.put("unassign_qty", unassign_qty + ""); - map_dtl.put("assign_qty", assign_qty + ""); - if (unassign_qty == 0) { - map_dtl.put("bill_status", "40"); - } else { - map_dtl.put("bill_status", "30"); - } - wo_dtl.update(map_dtl, "iostorinvdtl_id='" + dtl.getString("iostorinvdtl_id") + "'"); - - //更新主表状态 - this.updateMststatus(iostorinv_id); - - //锁定起点点位、仓位 - Collection c = Struct_map.values(); - Iterator it = c.iterator(); - JSONObject from_start = new JSONObject(); - from_start.put("lock_type", "3"); - for (; it.hasNext(); ) { - JSONObject Struct = it.next(); - from_start.put("struct_id", Struct.getString("struct_id")); - from_start.put("inv_type", jo_mst.getString("bill_type")); - from_start.put("inv_id", jo_mst.getString("iostorinv_id")); - from_start.put("inv_code", jo_mst.getString("bill_code")); - storPublicService.updateStructAndPoint(from_start); - } - } - } else { - throw new BadRequestException("其他出库单当前正在分配货位,请等待几秒再进行操作!"); - } - } finally { - if (lock.isLocked() && lock.isHeldByCurrentThread()) { - lock.unlock(); - } - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void allDiv2(JSONObject whereJson) { - //出库分配表 - WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - //出库明细表 - WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); - //出库主表 - WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - //库区表 - WQLObject wo_sect = WQLObject.getWQLObject("st_ivt_sectattr"); - - //定义需要更新的仓位集合 - HashMap Struct_map = new HashMap(); - String iostorinv_id = whereJson.getString("iostorinv_id"); - //查询主表信息 - JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jo_mst)) { - throw new BadRequestException("查不到出库单信息"); - } - - // 如果是发货出库则判断运费和物流公司不能为空 - String bill_type = jo_mst.getString("bill_type"); - if (StrUtil.equals(bill_type, "1001")) { - String trans_code = jo_mst.getString("trans_code"); - String estimated_freight = jo_mst.getString("estimated_freight"); - - if (ObjectUtil.isEmpty(trans_code)) { - throw new BadRequestException("物流公司不能为空"); - } - if (ObjectUtil.isEmpty(estimated_freight)) { - throw new BadRequestException("预估运费不能为空"); - } - - } - - //查询生成和未分配完的明细 - JSONArray dtls = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParam("flag", "2") - .addParam("bill_status", "30") - .addParam("unassign_flag", "1") - .addParam("iostorinv_id", iostorinv_id) - .addParam("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id")) - .process() - .getResultJSONArray(0); - if (ObjectUtil.isEmpty(dtls)) { - throw new BadRequestException("当前订单无可分配出库明细"); - } - - for (int i = 0; i < dtls.size(); i++) { - JSONObject dtl = dtls.getJSONObject(i); - double unassign_qty = dtl.getDoubleValue("unassign_qty"); - /* - * 分配规则: - * top1.有销售订单号:用销售订单号、物料去找这批物料最早入库的所在的巷道 - * top2.没有销售订单号,有子卷号:固定出某个木箱 - * top3.没有销售订单号,没有子卷号:找此物料最早入库的所在巷道 - */ - boolean is_top3 = false; - if (ObjectUtil.isEmpty(dtl.getString("source_bill_code")) && ObjectUtil.isEmpty(dtl.getString("pcsn"))) { - is_top3 = true; - } - JSONObject jsonMap = new JSONObject(); - // 已分配重量 - double assign_qty = dtl.getDoubleValue("assign_qty"); - - // 需要更新库存的集合 - List updateIvtList = new ArrayList<>(); - // 需要插入分配明细的集合 - List instDisList = new ArrayList<>(); - - if (ObjectUtil.isNotEmpty(dtl.getString("source_bill_code")) || is_top3) { - while (unassign_qty > 0) { - // 1.有销售订单号 - jsonMap.put("flag", "1"); - jsonMap.put("material_id", dtl.getString("material_id")); - jsonMap.put("sale_order_name", dtl.getString("source_bill_code")); - jsonMap.put("sect_id", whereJson.getString("sect_id")); - jsonMap.put("stor_id", whereJson.getString("stor_id")); - - JSONObject jsonOneIvt = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().uniqueResult(0); - if (ObjectUtil.isEmpty(jsonOneIvt)) { - throw new BadRequestException("库存不足"); - } - - // 查询这一巷道所有此物料此库存此销售订单的库存 - jsonMap.put("flag", "2"); - jsonMap.put("row_num", jsonOneIvt.getString("row_num")); - jsonMap.put("block_num", jsonOneIvt.getString("block_num")); - JSONArray ivtAllArr = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().getResultJSONArray(0); - - for (int j = 0; j < ivtAllArr.size(); j++) { - JSONObject ivt = ivtAllArr.getJSONObject(j); - double canuse_qty = ivt.getDoubleValue("canuse_qty"); - assign_qty = NumberUtil.add(assign_qty, canuse_qty); - - if (unassign_qty >= canuse_qty) { - unassign_qty = NumberUtil.sub(unassign_qty, canuse_qty); - } else { - unassign_qty = 0; - } - - // 查询此木箱下的所有子卷 - jsonMap.put("flag", "3"); - jsonMap.put("storagevehicle_code", ivt.getString("storagevehicle_code")); - JSONArray ivtAllArr2 = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().getResultJSONArray(0); - - for (int k = 0; k < ivtAllArr2.size(); k++) { - // 更新库存 - JSONObject ivt2 = ivtAllArr2.getJSONObject(k); - ivt2.put("change_qty", ivt2.getDoubleValue("canuse_qty")); - ivt2.put("bill_type_scode", jo_mst.getString("bill_type")); - ivt2.put("inv_id", dtl.getString("iostorinv_id")); - ivt2.put("bill_code", jo_mst.getString("bill_code")); - ivt2.put("bill_table", "ST_IVT_IOStorInv"); - // 放在更新库存的集合当中 - updateIvtList.add(ivt2); - // storPublicService.IOStor(ivt2, "11"); - - - //生成分配明细 - dtl.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId()); - dtl.put("sect_id", ivt2.getString("sect_id")); - dtl.put("sect_code", ivt2.getString("sect_code")); - dtl.put("sect_name", ivt2.getString("sect_name")); - dtl.put("struct_id", ivt2.getString("struct_id")); - dtl.put("struct_code", ivt2.getString("struct_code")); - dtl.put("struct_name", ivt2.getString("struct_name")); - dtl.put("pcsn", ivt2.getString("pcsn")); - dtl.put("box_no", ivt2.getString("storagevehicle_code")); - dtl.put("storagevehicle_id", ivt2.getString("storagevehicle_id")); - dtl.put("storagevehicle_code", ivt2.getString("storagevehicle_code")); - dtl.put("storagevehicle_type", ivt2.getString("storagevehicle_type")); - dtl.put("is_issued", "0"); - dtl.put("plan_qty", ivt2.getDoubleValue("change_qty")); - dtl.put("real_qty", ivt2.getDoubleValue("change_qty")); - dtl.put("is_overdue", ivt2.getString("is_overdue")); - dtl.put("instorage_time", ivt2.getString("instorage_time")); - - // 如果所属仓位是虚拟区 则将分配明细状态变为生成 - JSONObject jsonSect = wo_sect.query("sect_id = '" + ivt2.getString("sect_id") + "'").uniqueResult(0); - if (StrUtil.equals(jsonSect.getString("sect_type_attr"), "09")) { - dtl.put("work_status", "01"); - } else { - dtl.put("work_status", "00"); - } - - if (jo_mst.getString("is_overdue").equals("1")) { - // 判断是否超期 - if (ivt2.getString("is_overdue").equals("1")) { - dtl.put("work_status", "01"); - } - } - // 放在插入分配明细的集合当中 - instDisList.add(dtl); - // wo_dis.insert(dtl); - } - //记录需锁定的仓位 - Struct_map.put(ivt.getString("struct_id"), ivt); - // 为零结束 - if (unassign_qty == 0) { - break; - } - } - } - - } else { - // 确定子卷: 根据子卷找到库存出掉 - jsonMap.put("flag", "1"); - jsonMap.put("material_id", dtl.getString("material_id")); - jsonMap.put("pcsn", dtl.getString("pcsn")); - jsonMap.put("box_no", dtl.getString("box_no")); - jsonMap.put("sect_id", whereJson.getString("sect_id")); - jsonMap.put("stor_id", whereJson.getString("stor_id")); - - JSONObject jsonIvt = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().uniqueResult(0); - if (ObjectUtil.isEmpty(jsonIvt)) { - throw new BadRequestException("库存不足"); - } - - double canuse_qty = jsonIvt.getDoubleValue("canuse_qty"); - jsonIvt.put("change_qty", canuse_qty + ""); - unassign_qty = 0; - assign_qty = NumberUtil.add(assign_qty, canuse_qty); - - //更新库存 - jsonIvt.put("bill_type_scode", jo_mst.getString("bill_type")); - jsonIvt.put("inv_id", dtl.getString("iostorinv_id")); - jsonIvt.put("bill_code", jo_mst.getString("bill_code")); - jsonIvt.put("bill_table", "ST_IVT_IOStorInv"); - // 放入需要更新库存的集合当中 - updateIvtList.add(jsonIvt); - // storPublicService.IOStor(jsonIvt, "11"); - - //生成分配明细 - dtl.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId()); - dtl.put("sect_id", jsonIvt.getString("sect_id")); - dtl.put("sect_code", jsonIvt.getString("sect_code")); - dtl.put("sect_name", jsonIvt.getString("sect_name")); - dtl.put("struct_id", jsonIvt.getString("struct_id")); - dtl.put("struct_code", jsonIvt.getString("struct_code")); - dtl.put("struct_name", jsonIvt.getString("struct_name")); - dtl.put("pcsn", jsonIvt.getString("pcsn")); - dtl.put("box_no", jsonIvt.getString("storagevehicle_code")); - dtl.put("storagevehicle_id", jsonIvt.getString("storagevehicle_id")); - dtl.put("storagevehicle_code", jsonIvt.getString("storagevehicle_code")); - dtl.put("storagevehicle_type", jsonIvt.getString("storagevehicle_type")); - dtl.put("is_issued", "0"); - dtl.put("plan_qty", jsonIvt.getDoubleValue("change_qty")); - dtl.put("real_qty", jsonIvt.getDoubleValue("change_qty")); - dtl.put("is_overdue", jsonIvt.getString("is_overdue")); - dtl.put("instorage_time", jsonIvt.getString("instorage_time")); - // 如果所属仓位是虚拟区 则将分配明细状态变为生成 - JSONObject jsonSect = wo_sect.query("sect_id = '" + jsonIvt.getString("sect_id") + "'").uniqueResult(0); - if (StrUtil.equals(jsonSect.getString("sect_type_attr"), "09")) { - dtl.put("work_status", "01"); - } else { - dtl.put("work_status", "00"); - } - - // 判断是否超期 - if (jo_mst.getString("is_overdue").equals("1")) { - if (jsonIvt.getString("is_overdue").equals("1")) { - dtl.put("work_status", "01"); - } - } - - // 放入需要插入分配明细的集合当中 - instDisList.add(dtl); - // wo_dis.insert(dtl); - - //记录需锁定的仓位 (如果此明细有相同物料的且子卷号不能为空的则在最后一个明细分配完成后锁定仓位) - JSONObject map = new JSONObject(); - map.put("flag", "5"); - map.put("material_id", dtl.getString("material_id")); - map.put("box_no", dtl.getString("box_no")); - map.put("iostorinv_id", iostorinv_id); - map.put("iostorinvdtl_id", dtl.getString("iostorinvdtl_id")); - JSONArray dtlArr = WQL.getWO("ST_OUTIVT01").addParamMap(map).process().getResultJSONArray(0); - if (dtlArr.size() == 0) { - Struct_map.put(jsonIvt.getString("struct_id"), jsonIvt); - } - - } - HashMap map_dtl = new HashMap(); - //更新明细 - map_dtl.put("unassign_qty", unassign_qty + ""); - map_dtl.put("assign_qty", assign_qty + ""); - if (unassign_qty == 0) { - map_dtl.put("bill_status", "40"); - } else { - map_dtl.put("bill_status", "30"); - } - wo_dtl.update(map_dtl, "iostorinvdtl_id='" + dtl.getString("iostorinvdtl_id") + "'"); - - //更新主表状态 - this.updateMststatus(iostorinv_id); - - // 开启线程池 - JSONObject param = new JSONObject(); - param.put("updateIvtList", updateIvtList); - param.put("instDisList", instDisList); - param.put("struct_map", Struct_map); - - ThreadManage bean = SpringContextHolder.getBean(ThreadManage.class); - bean.startThread(param); - - /* //锁定起点点位、仓位 - Collection c = Struct_map.values(); - Iterator it = c.iterator(); - JSONObject from_start = new JSONObject(); - from_start.put("lock_type", "3"); - for (; it.hasNext(); ) { - JSONObject Struct = it.next(); - from_start.put("struct_id", Struct.getString("struct_id")); - from_start.put("inv_type", jo_mst.getString("bill_type")); - from_start.put("inv_id", jo_mst.getString("iostorinv_id")); - from_start.put("inv_code", jo_mst.getString("bill_code")); - storPublicService.updateStructAndPoint(from_start); - }*/ - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void allDivOne(JSONObject whereJson) { - //出库分配表 - WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - //出库明细表 - WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); - //出库主表 - WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - //库区表 - WQLObject wo_sect = WQLObject.getWQLObject("st_ivt_sectattr"); - - //定义需要更新的仓位集合 - HashMap Struct_map = new HashMap(); - String iostorinv_id = whereJson.getString("iostorinv_id"); - //查询主表信息 - JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jo_mst)) { - throw new BadRequestException("查不到出库单信息"); - } - - // 如果是发货出库则判断运费和物流公司不能为空 - String bill_type = jo_mst.getString("bill_type"); - if (StrUtil.equals(bill_type, "1001")) { - String trans_code = jo_mst.getString("trans_code"); - String estimated_freight = jo_mst.getString("estimated_freight"); - - if (ObjectUtil.isEmpty(trans_code)) { - throw new BadRequestException("物流公司不能为空"); - } - if (ObjectUtil.isEmpty(estimated_freight)) { - throw new BadRequestException("预估运费不能为空"); - } - - } - - //查询生成和未分配完的明细 - JSONArray dtls = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParam("flag", "2") - .addParam("bill_status", "30") - .addParam("unassign_flag", "1") - .addParam("iostorinv_id", iostorinv_id) - .addParam("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id")) - .process() - .getResultJSONArray(0); - if (ObjectUtil.isEmpty(dtls)) { - throw new BadRequestException("当前订单无可分配出库明细"); - } - - for (int i = 0; i < dtls.size(); i++) { - JSONObject dtl = dtls.getJSONObject(i); - double unassign_qty = dtl.getDoubleValue("unassign_qty"); - double plan_qty = dtl.getDoubleValue("plan_qty"); - /* - * 分配规则: - * top1.有销售订单号:用销售订单号、物料去找这批物料最早入库的所在的巷道 - * top2.没有销售订单号,有子卷号:固定出某个木箱 - * top3.没有销售订单号,没有子卷号:找此物料最早入库的所在巷道 - */ - boolean is_top3 = false; - if (ObjectUtil.isEmpty(dtl.getString("source_bill_code")) && ObjectUtil.isEmpty(dtl.getString("pcsn"))) { - is_top3 = true; - } - JSONObject jsonMap = new JSONObject(); - // 已分配数量 - double assign_qty = dtl.getDoubleValue("assign_qty"); - if (ObjectUtil.isNotEmpty(dtl.getString("source_bill_code")) || is_top3) { - while (unassign_qty > 0) { - // 1.有销售订单号 - jsonMap.put("flag", "1"); - jsonMap.put("material_id", dtl.getString("material_id")); - jsonMap.put("sale_order_name", dtl.getString("source_bill_code")); - jsonMap.put("sect_id", whereJson.getString("sect_id")); - jsonMap.put("stor_id", whereJson.getString("stor_id")); - - JSONObject jsonOneIvt = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().uniqueResult(0); - if (ObjectUtil.isEmpty(jsonOneIvt)) { - throw new BadRequestException("库存不足"); - } - - // 查询这一巷道所有此物料此库存此销售订单的库存 - jsonMap.put("flag", "2"); - jsonMap.put("row_num", jsonOneIvt.getString("row_num")); - jsonMap.put("block_num", jsonOneIvt.getString("block_num")); - JSONArray ivtAllArr = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().getResultJSONArray(0); - - for (int j = 0; j < ivtAllArr.size(); j++) { - JSONObject ivt = ivtAllArr.getJSONObject(j); - double canuse_qty = ivt.getDoubleValue("canuse_qty"); - assign_qty = NumberUtil.add(assign_qty, canuse_qty); - - if (unassign_qty >= canuse_qty) { - unassign_qty = unassign_qty - canuse_qty; - } else { - unassign_qty = 0; - } - - // 查询此木箱下的所有子卷 - jsonMap.put("flag", "3"); - jsonMap.put("storagevehicle_code", ivt.getString("storagevehicle_code")); - JSONArray ivtAllArr2 = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().getResultJSONArray(0); - - for (int k = 0; k < ivtAllArr2.size(); k++) { - // 更新库存 - JSONObject ivt2 = ivtAllArr2.getJSONObject(k); - ivt2.put("change_qty", ivt2.getDoubleValue("canuse_qty")); - ivt2.put("bill_type_scode", jo_mst.getString("bill_type")); - ivt2.put("inv_id", dtl.getString("iostorinv_id")); - ivt2.put("bill_code", jo_mst.getString("bill_code")); - ivt2.put("bill_table", "ST_IVT_IOStorInv"); - storPublicService.IOStor(ivt2, "11"); - - //生成分配明细 - dtl.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId()); - dtl.put("sect_id", ivt2.getString("sect_id")); - dtl.put("sect_code", ivt2.getString("sect_code")); - dtl.put("sect_name", ivt2.getString("sect_name")); - dtl.put("struct_id", ivt2.getString("struct_id")); - dtl.put("struct_code", ivt2.getString("struct_code")); - dtl.put("struct_name", ivt2.getString("struct_name")); - dtl.put("pcsn", ivt2.getString("pcsn")); - dtl.put("box_no", ivt2.getString("storagevehicle_code")); - dtl.put("storagevehicle_id", ivt2.getString("storagevehicle_id")); - dtl.put("storagevehicle_code", ivt2.getString("storagevehicle_code")); - dtl.put("storagevehicle_type", ivt2.getString("storagevehicle_type")); - dtl.put("is_issued", "0"); - dtl.put("plan_qty", ivt2.getDoubleValue("change_qty")); - dtl.put("real_qty", ivt2.getDoubleValue("change_qty")); - dtl.put("is_overdue", ivt2.getString("is_overdue")); - dtl.put("instorage_time", ivt2.getString("instorage_time")); - // 如果所属仓位是虚拟区 则将分配明细状态变为生成 - JSONObject jsonSect = wo_sect.query("sect_id = '" + ivt2.getString("sect_id") + "'").uniqueResult(0); - if (StrUtil.equals(jsonSect.getString("sect_type_attr"), "09")) { - dtl.put("work_status", "01"); - } else { - dtl.put("work_status", "00"); - } - - if (jo_mst.getString("is_overdue").equals("1")) { - // 判断是否超期 - if (ivt2.getString("is_overdue").equals("1")) { - dtl.put("work_status", "01"); - } - } - - wo_dis.insert(dtl); - } - //记录需锁定的仓位 - Struct_map.put(ivt.getString("struct_id"), ivt); - // 为零结束 - if (unassign_qty == 0) { - break; - } - } - } - - } else { - // 确定子卷: 根据子卷找到库存出掉 - jsonMap.put("flag", "1"); - jsonMap.put("material_id", dtl.getString("material_id")); - jsonMap.put("pcsn", dtl.getString("pcsn")); - jsonMap.put("box_no", dtl.getString("box_no")); - jsonMap.put("sect_id", whereJson.getString("sect_id")); - jsonMap.put("stor_id", whereJson.getString("stor_id")); - - JSONObject jsonIvt = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().uniqueResult(0); - if (ObjectUtil.isEmpty(jsonIvt)) { - throw new BadRequestException("库存不足"); - } - - double canuse_qty = jsonIvt.getDoubleValue("canuse_qty"); - assign_qty = NumberUtil.add(assign_qty, canuse_qty); - jsonIvt.put("change_qty", canuse_qty + ""); - unassign_qty = 0; - - //更新库存 - jsonIvt.put("bill_type_scode", jo_mst.getString("bill_type")); - jsonIvt.put("inv_id", dtl.getString("iostorinv_id")); - jsonIvt.put("bill_code", jo_mst.getString("bill_code")); - jsonIvt.put("bill_table", "ST_IVT_IOStorInv"); - storPublicService.IOStor(jsonIvt, "11"); - //生成分配明细 - dtl.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId()); - dtl.put("sect_id", jsonIvt.getString("sect_id")); - dtl.put("sect_code", jsonIvt.getString("sect_code")); - dtl.put("sect_name", jsonIvt.getString("sect_name")); - dtl.put("struct_id", jsonIvt.getString("struct_id")); - dtl.put("struct_code", jsonIvt.getString("struct_code")); - dtl.put("struct_name", jsonIvt.getString("struct_name")); - dtl.put("pcsn", jsonIvt.getString("pcsn")); - dtl.put("box_no", jsonIvt.getString("storagevehicle_code")); - dtl.put("storagevehicle_id", jsonIvt.getString("storagevehicle_id")); - dtl.put("storagevehicle_code", jsonIvt.getString("storagevehicle_code")); - dtl.put("storagevehicle_type", jsonIvt.getString("storagevehicle_type")); - dtl.put("is_issued", "0"); - dtl.put("plan_qty", jsonIvt.getDoubleValue("change_qty")); - dtl.put("real_qty", jsonIvt.getDoubleValue("change_qty")); - dtl.put("is_overdue", jsonIvt.getString("is_overdue")); - dtl.put("instorage_time", jsonIvt.getString("instorage_time")); - // 如果所属仓位是虚拟区 则将分配明细状态变为生成 - JSONObject jsonSect = wo_sect.query("sect_id = '" + jsonIvt.getString("sect_id") + "'").uniqueResult(0); - if (StrUtil.equals(jsonSect.getString("sect_type_attr"), "09")) { - dtl.put("work_status", "01"); - } else { - dtl.put("work_status", "00"); - } - - if (jo_mst.getString("is_overdue").equals("1")) { - // 判断是否超期 - if (jsonIvt.getString("is_overdue").equals("1")) { - dtl.put("work_status", "01"); - } - } - - wo_dis.insert(dtl); - //记录需锁定的仓位 - Struct_map.put(jsonIvt.getString("struct_id"), jsonIvt); - - } - HashMap map_dtl = new HashMap(); - //更新明细 - map_dtl.put("unassign_qty", unassign_qty + ""); - map_dtl.put("assign_qty", assign_qty + ""); - if (unassign_qty == 0) { - map_dtl.put("bill_status", "40"); - } else { - map_dtl.put("bill_status", "30"); - } - wo_dtl.update(map_dtl, "iostorinvdtl_id='" + dtl.getString("iostorinvdtl_id") + "'"); - - // 判断是否还有相同物料相同仓位的明细 - JSONObject map = new JSONObject(); - map.put("flag", "4"); - map.put("material_id", dtl.getString("material_id")); - map.put("iostorinv_id", iostorinv_id); - map.put("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id")); - - JSONArray dtlArr = WQL.getWO("ST_OUTIVT01").addParamMap(map).process().getResultJSONArray(0); - for (int h = 0; h < dtlArr.size(); h++) { - JSONObject json = dtlArr.getJSONObject(h); - - JSONObject ivt = WQL.getWO("ST_OUTIVT01") - .addParam("flag", "1") - .addParam("material_id", json.getString("material_id")) - .addParam("pcsn", json.getString("pcsn")) - .process().uniqueResult(0); - - //更新库存 - ivt.put("change_qty", ivt.getDoubleValue("canuse_qty")); - ivt.put("bill_type_scode", jo_mst.getString("bill_type")); - ivt.put("inv_id", json.getString("iostorinv_id")); - ivt.put("bill_code", jo_mst.getString("bill_code")); - ivt.put("bill_table", "ST_IVT_IOStorInv"); - storPublicService.IOStor(ivt, "11"); - //生成分配明细 - json.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId()); - json.put("sect_id", ivt.getString("sect_id")); - json.put("sect_code", ivt.getString("sect_code")); - json.put("sect_name", ivt.getString("sect_name")); - json.put("struct_id", ivt.getString("struct_id")); - json.put("struct_code", ivt.getString("struct_code")); - json.put("struct_name", ivt.getString("struct_name")); - json.put("pcsn", ivt.getString("pcsn")); - json.put("box_no", ivt.getString("storagevehicle_code")); - json.put("storagevehicle_id", ivt.getString("storagevehicle_id")); - json.put("storagevehicle_code", ivt.getString("storagevehicle_code")); - json.put("storagevehicle_type", ivt.getString("storagevehicle_type")); - json.put("is_issued", "0"); - json.put("plan_qty", ivt.getDoubleValue("change_qty")); - json.put("real_qty", ivt.getDoubleValue("change_qty")); - json.put("is_overdue", ivt.getString("is_overdue")); - json.put("instorage_time", ivt.getString("instorage_time")); - // 如果所属仓位是虚拟区 则将分配明细状态变为生成 - JSONObject jsonSect = wo_sect.query("sect_id = '" + ivt.getString("sect_id") + "'").uniqueResult(0); - if (StrUtil.equals(jsonSect.getString("sect_type_attr"), "09")) { - json.put("work_status", "01"); - } else { - json.put("work_status", "00"); - } - - // 判断是否超期 - if (jo_mst.getString("is_overdue").equals("1")) { - if (ivt.getString("is_overdue").equals("1")) { - json.put("work_status", "01"); - } - } - - wo_dis.insert(json); - - // 更新明细 - HashMap map_dtl2 = new HashMap(); - map_dtl2.put("unassign_qty", "0"); - map_dtl2.put("assign_qty", ivt.getString("change_qty")); - map_dtl2.put("bill_status", "40"); - wo_dtl.update(map_dtl2, "iostorinvdtl_id='" + json.getString("iostorinvdtl_id") + "'"); - } - //更新主表状态 - this.updateMststatus(iostorinv_id); - //锁定起点点位、仓位 - Collection c = Struct_map.values(); - Iterator it = c.iterator(); - JSONObject from_start = new JSONObject(); - from_start.put("lock_type", "3"); - for (; it.hasNext(); ) { - JSONObject Struct = it.next(); - from_start.put("struct_id", Struct.getString("struct_id")); - from_start.put("inv_type", jo_mst.getString("bill_type")); - from_start.put("inv_id", jo_mst.getString("iostorinv_id")); - from_start.put("inv_code", jo_mst.getString("bill_code")); - storPublicService.updateStructAndPoint(from_start); - } - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - @SneakyThrows - public void allCancel(JSONObject whereJson) { - //出库分配表 - WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - //出库明细表 - WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); - //出库主表 - WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - //任务表 - WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); - //移库单明细表 - WQLObject move_dtl = WQLObject.getWQLObject("ST_IVT_MoveInvDtl"); - //移库单主表 - WQLObject move_mst = WQLObject.getWQLObject("ST_IVT_MoveInv"); - - String iostorinv_id = whereJson.getString("iostorinv_id"); - //查询主表信息 - JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - //查询未生成和生成未下发的分配记录 - JSONArray diss = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParam("flag", "5") - .addParam("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id")) - .addParam("iostorinvdis_id", whereJson.getString("iostorinvdis_id")) - .addParam("task_id", whereJson.getString("task_id")) - .addParam("iostorinv_id", iostorinv_id) - .addParam("bill_status", "01") - .addParam("is_issued", "0") - .process() - .getResultJSONArray(0); - if (ObjectUtil.isEmpty(diss)) { - throw new BadRequestException("不存在可以取消的出库分配明细"); - } - - RLock lock = redissonClient.getLock("all_cancelDivOne"); - boolean tryLock = lock.tryLock(0,60, TimeUnit.SECONDS); - - try { - if (tryLock) { - for (int i = 0; i < diss.size(); i++) { - JSONObject dis = diss.getJSONObject(i); - HashMap map = new HashMap<>(); - - String iostorinvdtl_id = dis.getString("iostorinvdtl_id"); - //统计【出入库单分配表】执行状态大于等于执行中,或【任务指令表】任务状态大于等于下发时的记录和 - JSONArray dtl = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParam("flag", "4") - .addParam("iostorinvdtl_id", iostorinvdtl_id) - .process() - .getResultJSONArray(0); - //若存在记录,则不可取消该出库明细对应的任何分配记录 - if (dtl.size() != 0) { - throw new BadRequestException("存在出库明细对应任务下发、执行中或完成!"); - } - double plan_qty = dis.getDoubleValue("plan_qty"); - //更新库存 - dis.put("change_qty", plan_qty + ""); - dis.put("bill_type_scode", jo_mst.getString("bill_type")); - dis.put("inv_id", iostorinv_id); - dis.put("bill_code", jo_mst.getString("bill_code")); - dis.put("bill_table", "ST_IVT_IOStorInv"); - storPublicService.IOStor(dis, "12"); - //删除【出入库单分配表】中分配记录 - wo_dis.delete("iostorinvdis_id='" + dis.getString("iostorinvdis_id") + "'"); - //更新【出入库单明细表】中分配记录 - JSONObject jo_dtl = wo_dtl.query("iostorinvdtl_id = '" + iostorinvdtl_id + "'").uniqueResult(0); - - - jo_dtl.put("assign_qty", NumberUtil.sub(jo_dtl.getDoubleValue("assign_qty"), plan_qty)); - jo_dtl.put("unassign_qty", NumberUtil.sub(jo_dtl.getDoubleValue("plan_qty"), jo_dtl.getDoubleValue("assign_qty"))); - - if (jo_dtl.getDoubleValue("assign_qty") < 0) { - jo_dtl.put("assign_qty", 0); - } - - if (jo_dtl.getDoubleValue("unassign_qty") > jo_dtl.getDoubleValue("plan_qty")) { - jo_dtl.put("unassign_qty", jo_dtl.getDoubleValue("plan_qty")); - } - - if (jo_dtl.getDoubleValue("unassign_qty") == jo_dtl.getDoubleValue("plan_qty")) { - jo_dtl.put("bill_status", "10"); - } else { - jo_dtl.put("bill_status", "30"); - } - wo_dtl.update(jo_dtl); - //更新主表状态 - this.updateMststatus(iostorinv_id); - //判断是否存在同单据的同起点仓位的分配 - JSONArray flag = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParam("flag", "5") - .addParam("is_issued", "0") - .addParam("struct_id", dis.getString("struct_id")) - .addParam("iostorinv_id", iostorinv_id) - .addParam("bill_status", "01") - .process() - .getResultJSONArray(0); - if (flag.size() == 0) {//仓位载具冻结数为0 - //任务号不为空 - if (ObjectUtil.isNotEmpty(dis.getString("task_id"))) { - // 判断是否有移库的任务:有就取消掉 - JSONObject jsonTask = wo_Task.query("task_id = '" + dis.getString("task_id") + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonTask)) { - JSONArray moveArrTask = wo_Task.query("task_group_id = '" + jsonTask.getString("task_group_id") + "' and task_type = '010505'").getResultJSONArray(0); - - for (int j = 0; j < moveArrTask.size(); j++) { - JSONObject jsonMoveTask = moveArrTask.getJSONObject(j); - // 调用删除移库单 - JSONObject jsonMoveDtl = move_dtl.query("task_id = '" + jsonMoveTask.getString("task_id") + "'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonMoveDtl)) { - JSONObject jsonMoveMst = move_mst.query("moveinv_id = '" + jsonMoveDtl.getString("moveinv_id") + "' and is_delete = '0'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonMoveMst)) { - HandMoveStorServiceImpl bean = SpringContextHolder.getBean(HandMoveStorServiceImpl.class); - bean.deleteById(jsonMoveMst.getString("moveinv_id")); - } - } - - } - } - - //更新对应任务为删除 - map.put("is_delete", "1"); - wo_Task.update(map, "task_id='" + dis.getString("task_id") + "'"); - - } - //解锁起点仓位点位 - JSONObject from_start = new JSONObject(); - from_start.put("struct_id", dis.getString("struct_id")); - from_start.put("lock_type", "1"); - storPublicService.updateStructAndPoint2(from_start); - //解锁终点仓位点位 - if (StrUtil.isNotEmpty(dis.getString("point_code"))) { - JSONObject from_end = new JSONObject(); - from_end.put("point_code", dis.getString("point_code")); - from_end.put("lock_type", "1"); - storPublicService.updateStructAndPoint2(from_end); - } - } else {//仓位载具扔有冻结数,需改任务类型为拣选出库 - //任务号不为空 - /* if (ObjectUtil.isNotEmpty(dis.getString("task_id"))) { - //更新对应任务为拣选出库 - map.put("taskdtl_type", "05"); - wo_Task.update(map, "task_id='" + dis.getString("task_id") + "'"); - }*/ - } - } - } else { - throw new BadRequestException("其他出库单当前正在取消分配,请等待几秒再进行操作!"); - } - - } finally { - if (lock.isLocked() && lock.isHeldByCurrentThread()) { - lock.unlock(); - } - } - - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void oneCancel(JSONObject whereJson) { - //出库分配表 - WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - //出库明细表 - WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); - //出库主表 - WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - //任务表 - WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); - - String iostorinv_id = whereJson.getString("iostorinv_id"); - //查询主表信息 - JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - // 查询此分配明细下的所有相同箱号的分配明细-- 如果为分拣出库则只需要更新当前子卷库存 - JSONArray diss; - if (jo_mst.getString("bill_type").equals("1011")) { - diss = wo_dis.query("pcsn = '" + whereJson.getString("pcsn") + "' and iostorinv_id = '" + iostorinv_id + "'").getResultJSONArray(0); - - } else { - diss = wo_dis.query("box_no = '" + whereJson.getString("storagevehicle_code") + "' and iostorinv_id = '" + iostorinv_id + "'").getResultJSONArray(0); - - } - - for (int i = 0; i < diss.size(); i++) { - JSONObject dis = diss.getJSONObject(i); - HashMap map = new HashMap<>(); - - String iostorinvdtl_id = dis.getString("iostorinvdtl_id"); - //统计【出入库单分配表】执行状态大于等于执行中,或【任务指令表】任务状态大于等于下发时的记录和 - JSONArray dtl = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParam("flag", "4") - .addParam("iostorinvdtl_id", iostorinvdtl_id) - .process() - .getResultJSONArray(0); - //若存在记录,则不可取消该出库明细对应的任何分配记录 - if (dtl.size() != 0) { - throw new BadRequestException("存在出库明细对应任务下发、执行中或完成!"); - } - double plan_qty = dis.getDoubleValue("plan_qty"); - //更新库存 - dis.put("change_qty", plan_qty + ""); - dis.put("bill_type_scode", jo_mst.getString("bill_type")); - dis.put("inv_id", iostorinv_id); - dis.put("bill_code", jo_mst.getString("bill_code")); - dis.put("bill_table", "ST_IVT_IOStorInv"); - storPublicService.IOStor(dis, "12"); - //删除【出入库单分配表】中分配记录 - wo_dis.delete("iostorinvdis_id='" + dis.getString("iostorinvdis_id") + "'"); - //更新【出入库单明细表】中分配记录 - JSONObject jo_dtl = wo_dtl.query("iostorinvdtl_id = '" + iostorinvdtl_id + "'").uniqueResult(0); - - - jo_dtl.put("assign_qty", NumberUtil.sub(jo_dtl.getDoubleValue("assign_qty"), plan_qty)); - jo_dtl.put("unassign_qty", NumberUtil.sub(jo_dtl.getDoubleValue("plan_qty"), jo_dtl.getDoubleValue("assign_qty"))); - - if (jo_dtl.getDoubleValue("assign_qty") < 0) { - jo_dtl.put("assign_qty", 0); - } - - if (jo_dtl.getDoubleValue("unassign_qty") > jo_dtl.getDoubleValue("plan_qty")) { - jo_dtl.put("unassign_qty", jo_dtl.getDoubleValue("plan_qty")); - } - - if (jo_dtl.getDoubleValue("unassign_qty") == jo_dtl.getDoubleValue("plan_qty")) { - jo_dtl.put("bill_status", "10"); - } else { - jo_dtl.put("bill_status", "30"); - } - - if (jo_dtl.getDoubleValue("unassign_qty") == 0) { - jo_dtl.put("bill_status", "40"); - } - - wo_dtl.update(jo_dtl); - //更新主表状态 - this.updateMststatus(iostorinv_id); - //判断是否存在同单据的同起点仓位的分配 - JSONArray flag = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParam("flag", "5") - .addParam("is_issued", "0") - .addParam("struct_id", dis.getString("struct_id")) - .addParam("iostorinv_id", iostorinv_id) - .addParam("bill_status", "01") - .process() - .getResultJSONArray(0); - if (flag.size() == 0) {//仓位载具冻结数为0 - //任务号不为空 - if (ObjectUtil.isNotEmpty(dis.getString("task_id"))) { - //更新对应任务为删除 - map.put("is_delete", "1"); - wo_Task.update(map, "task_id='" + dis.getString("task_id") + "'"); - } - //解锁起点仓位点位: 判断此仓位是否还有库存 - List ivtList = WQLObject.getWQLObject("st_ivt_structivt") - .query("struct_id = '" + dis.getString("struct_id") + "'") - .getResultJSONArray(0).toJavaList(JSONObject.class); - - boolean is_zero = ivtList.stream() - .allMatch(row -> row.getDoubleValue("frozen_qty") == 0); - - if (is_zero) { - JSONObject from_start = new JSONObject(); - from_start.put("struct_id", dis.getString("struct_id")); - from_start.put("lock_type", "1"); - storPublicService.updateStructAndPoint2(from_start); - //解锁终点仓位点位 - if (StrUtil.isNotEmpty(dis.getString("point_code"))) { - JSONObject from_end = new JSONObject(); - from_end.put("point_code", dis.getString("point_code")); - from_end.put("lock_type", "1"); - storPublicService.updateStructAndPoint2(from_end); - } - } - - } else {//仓位载具扔有冻结数,需改任务类型为拣选出库 - //任务号不为空 - /* if (ObjectUtil.isNotEmpty(dis.getString("task_id"))) { - //更新对应任务为拣选出库 - map.put("taskdtl_type", "05"); - wo_Task.update(map, "task_id='" + dis.getString("task_id") + "'"); - }*/ - } - } - - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void setPoint(JSONObject whereJson) { - //出库分配表 - WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - //点位表 - WQLObject wo_Point = WQLObject.getWQLObject("SCH_BASE_Point"); - //任务表 - WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); - //出库主表 - WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - //仓位表 - WQLObject attrTab = WQLObject.getWQLObject("ST_IVT_StructAttr"); - // 库存表 - WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); - - String struct_id = whereJson.getString("struct_id"); - String point_code = whereJson.getString("point_code"); // 终点 - String iostorinv_id = whereJson.getString("iostorinv_id"); - - //查询主表信息 - JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jo_mst)) { - throw new BadRequestException("未查到相关出库单"); - } - - JSONObject jsonPoint2 = wo_Point.query("lock_type='1' and (vehicle_code='' or vehicle_code IS NULL) and point_code='" + point_code + "'").uniqueResult(0); - //如果终点站点被锁定或者有载具号,则不允许设置点位 - if (ObjectUtil.isEmpty(jsonPoint2)) { - throw new BadRequestException("该站点被锁定或者有载具号,不允许设置!"); - } - - // 查询未生成和生成未下发的分配记录 - JSONObject dis = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParam("flag", "5") - .addParam("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id")) - .addParam("iostorinvdis_id", whereJson.getString("iostorinvdis_id")) - .addParam("struct_id", struct_id) - .addParam("iostorinv_id", iostorinv_id) - .addParam("bill_status", "01") - .addParam("is_issued", "0") - .process() - .uniqueResult(0); - if (ObjectUtil.isEmpty(dis)) { - throw new BadRequestException("分配明细不存在或已执行、完成、!"); - } - - String task_status = dis.getString("task_status"); - String task_id = dis.getString("task_id"); - - if (StrUtil.isNotEmpty(task_status) && "05,06,07".contains(task_status)) { - throw new BadRequestException("该任务已执行,不可重新设置站点!"); - } - - if (ObjectUtil.isNotEmpty(task_id)) { - //若任务不为空,则为变更出库目的站点 - JSONObject task = wo_Task.query("task_id='" + task_id + "'").uniqueResult(0); - //更新任务 - task.put("point_code2", jsonPoint2.getString("point_code")); - wo_Task.update(task); - } else { - /* - * 生成任务: - * 1.判断此条分配明细的 ‘仓位’在此主表下的分配明细是否有相同的 ‘仓位’ - * a.如果有:有则合并只生成一条任务 - * b.没有:则正常生成 - * 2.判断此货位是否被挡住 - * a.挡住:判断哪边的货位比较少 , 生成移库单 - * b.没挡住:正常生成 - */ - JSONObject jsonPoint1 = wo_Point.query("source_id = '" + dis.getString("struct_id") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonPoint1)) { - throw new BadRequestException("起点点位不存在"); - } - - // 创建任务 - JSONObject param = new JSONObject(); - param.put("task_type", "010503"); - param.put("vehicle_code", dis.getString("box_no")); - param.put("task_name", "task_name"); - param.put("point_code1", jsonPoint1.getString("point_code")); - param.put("point_code2", jsonPoint2.getString("point_code")); - param.put("material_id", dis.getString("material_id")); - param.put("task_group_id", ""); // 任务组 - param.put("sort_seq", ""); // 任务组顺序号 - - String create_task_id = outTask.createTask(param); - - // 更新分配状态、任务标识、出库点位 - JSONObject jsonTask = wo_Task.query("task_id = '" + create_task_id + "'").uniqueResult(0); - JSONObject jsonUpdateMap = new JSONObject(); - jsonUpdateMap.put("work_status", "01"); - jsonUpdateMap.put("task_id", jsonTask.getLong("task_id")); - jsonUpdateMap.put("point_id", jsonPoint2.getLong("point_id")); - wo_dis.update(jsonUpdateMap, "iostorinvdis_id = '" + dis.getString("iostorinvdis_id") + "'"); - - // 1.判断此条分配明细的 ‘仓位’在此主表下的分配明细是否有相同的 ‘仓位’ - JSONArray disArr = wo_dis.query("struct_id = '" + dis.getString("struct_id") + - "' and iostorinv_id = '" + dis.getString("iostorinv_id") + - "' and iostorinvdis_id <> '" + dis.getString("iostorinvdis_id") + - "' and work_status = '00'").getResultJSONArray(0); - - // 依次更新相同仓位的分配明细状态、任务标识、出库点位 - for (int i = 0; i < disArr.size(); i++) { - JSONObject jsonObject = disArr.getJSONObject(i); - jsonObject.put("work_status", "01"); - jsonObject.put("task_id", jsonTask.getLong("task_id")); - jsonObject.put("point_id", jsonPoint2.getLong("point_id")); - wo_dis.update(jsonObject); - } - - // 2.判断此货位是否被挡住 - JSONObject jsonAttr = attrTab.query("struct_id = '" + dis.getString("struct_id") + "'").uniqueResult(0); - - // 判断此仓位是‘双通’还是’单通‘ - if (StrUtil.equals(jsonAttr.getString("placement_type"), "01")) { - - JSONObject map = new JSONObject(); - map.put("flag", "2"); - map.put("struct_code", jsonAttr.getString("struct_code")); - map.put("sect_id", jsonAttr.getString("sect_id")); - - // 判断左边是否被挡住 - JSONObject jsonIsBlockL = WQL.getWO("ST_OUTIVT03").addParamMap(map).process().uniqueResult(0); - - // 判断右边是否被挡住 - map.put("flag", "1"); - JSONObject jsonIsBlockR = WQL.getWO("ST_OUTIVT03").addParamMap(map).process().uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonIsBlockL) && ObjectUtil.isNotEmpty(jsonIsBlockR)) { - // 都被挡住判断哪边被挡住的货位少 - map.put("flag", "3"); - map.put("out_order_seq", jsonAttr.getString("out_order_seq")); - JSONArray jsonIsBlockAll = WQL.getWO("ST_OUTIVT03").addParamMap(map).process().getResultJSONArray(0); - - int blockLeft = 0; // 左边个数 - int blockRigth = 0; // 右边个数 - for (int i = 0; i < jsonIsBlockAll.size(); i++) { - JSONObject json = jsonIsBlockAll.getJSONObject(i); - - if (i == 0) { - blockRigth = json.getIntValue("num"); - } - if (i == 1) { - blockRigth = json.getIntValue("num"); - } - } - - // 更新第一个任务 任务组、任务顺序号 - jsonTask.put("task_group_id", IdUtil.getSnowflake(1, 1).nextId()); - jsonTask.put("sort_seq", 1); - wo_Task.update(jsonTask); - - JSONArray jsonAllBlockPoint = new JSONArray(); - if (blockLeft > blockRigth) { - // 从右边生成移库单 - map.put("flag", "4"); - map.put("block_num", jsonAttr.getString("block_num")); - map.put("row_num", jsonAttr.getString("row_num")); - - jsonAllBlockPoint = WQL.getWO("ST_OUTIVT03").addParamMap(map).process().getResultJSONArray(0); - - } else { - // 从左边生成移库单 - map.put("flag", "5"); - map.put("block_num", jsonAttr.getString("block_num")); - map.put("row_num", jsonAttr.getString("row_num")); - - jsonAllBlockPoint = WQL.getWO("ST_OUTIVT03").addParamMap(map).process().getResultJSONArray(0); - } - - for (int i = 0; i < jsonAllBlockPoint.size(); i++) { - JSONObject json = jsonAllBlockPoint.getJSONObject(i); - - JSONObject mapParam = new JSONObject();// 生成移库单传入参数 - JSONArray table = new JSONArray(); // 明细参数 - mapParam.put("bill_status", "10"); - mapParam.put("bill_type", "21"); - mapParam.put("buss_type", "21"); - mapParam.put("biz_date", DateUtil.today()); - mapParam.put("stor_code", "CP01"); - mapParam.put("stor_id", "1582991156504039424"); - mapParam.put("stor_name", "成品仓库"); - mapParam.put("is_task", "1"); - - // 查询移入货位 - JSONObject moveParam = new JSONObject(); - moveParam.put("box_no", json.getString("storagevehicle_code")); - moveParam.put("sect_id", RegionTypeEnum.ZZ01.getId()); - JSONObject jsonMove = rawAssistIStorService.autoDis(moveParam); - // 查询移出货位的库存物料 - JSONObject jsonMoveIvt = WQL.getWO("ST_OUTIVT03") - .addParam("flag", "6") - .addParam("struct_id", json.getString("struct_id")) - .process().uniqueResult(0); - - // 移库单明细 - JSONObject jsonMoveDtl = new JSONObject(); - jsonMoveDtl.put("is_task", "2"); - jsonMoveDtl.put("turnout_sect_id", json.getLongValue("sect_id")); - jsonMoveDtl.put("turnout_sect_code", json.getString("sect_code")); - jsonMoveDtl.put("turnout_sect_name", json.getString("sect_name")); - jsonMoveDtl.put("turnout_struct_id", json.getLongValue("struct_id")); - jsonMoveDtl.put("turnout_struct_code", json.getString("struct_code")); - jsonMoveDtl.put("turnout_struct_name", json.getString("struct_name")); - jsonMoveDtl.put("material_id", jsonMoveIvt.getLongValue("material_id")); - jsonMoveDtl.put("pcsn", jsonMoveIvt.getString("pcsn")); - jsonMoveDtl.put("quality_scode", "01"); - jsonMoveDtl.put("qty_unit_id", jsonMoveIvt.getLongValue("qty_unit_id")); - jsonMoveDtl.put("qty_unit_name", jsonMoveIvt.getString("unit_name")); - jsonMoveDtl.put("qty", jsonMoveIvt.getDoubleValue("canuse_qty")); - jsonMoveDtl.put("storagevehicle_code", json.getString("storagevehicle_code")); - jsonMoveDtl.put("turnin_sect_id", jsonMove.getLongValue("sect_id")); - jsonMoveDtl.put("turnin_sect_code", jsonMove.getString("sect_code")); - jsonMoveDtl.put("turnin_sect_name", jsonMove.getString("sect_name")); - jsonMoveDtl.put("turnin_struct_id", jsonMove.getLongValue("struct_id")); - jsonMoveDtl.put("turnin_struct_code", jsonMove.getString("struct_code")); - jsonMoveDtl.put("turnin_struct_name", jsonMove.getString("struct_name")); - jsonMoveDtl.put("source_billdtl_id", dis.getLongValue("iostorinvdis_id")); - - // 生成任务 - JSONObject param2 = new JSONObject(); - param2.put("task_type", "010503"); - param2.put("vehicle_code", json.getString("storagevehicle_code")); - param2.put("task_name", "task_name"); - param2.put("point_code1", json.getString("point_code")); - param2.put("point_code2", jsonMove.getString("struct_code")); - param2.put("task_group_id", jsonTask.getLongValue("task_group_id")); // 任务组 - param2.put("sort_seq", jsonTask.getIntValue("sort_seq") + i + 1); // 任务组顺序号 - String move_task_id = outTask.createTask(param2); - - // 回显移库明细任务id - jsonMoveDtl.put("task_id", move_task_id); - table.add(jsonMoveDtl); - // 更新任务处理类 - JSONObject jsonTaskMove = wo_Task.query("task_id = '" + move_task_id + "'").uniqueResult(0); - jsonTaskMove.put("task_type", "010505"); - jsonTaskMove.put("handle_class", HandMoveStorAcsTask.class.getName()); - wo_Task.update(jsonTaskMove); - - mapParam.put("tableData", table); - // 调用移库单新增方法 - if (ObjectUtil.isNotEmpty(jsonAllBlockPoint)) { - handMoveStorService.insertDtl2(mapParam); - } - } - - } - } else { - JSONObject map = new JSONObject(); - map.put("struct_code", jsonAttr.getString("struct_code")); - map.put("sect_id", jsonAttr.getString("sect_id")); - map.put("out_order_seq", jsonAttr.getString("out_order_seq")); - map.put("block_num", jsonAttr.getString("block_num")); - map.put("row_num", jsonAttr.getString("row_num")); - - JSONArray jsonAllBlockPoint = new JSONArray(); - if (StrUtil.equals(jsonAttr.getString("placement_type"), "02")) { - // 02-左通 - map.put("flag", "2"); - // 判断左边是否被挡住 - JSONObject jsonIsBlockL = WQL.getWO("ST_OUTIVT03").addParamMap(map).process().uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonIsBlockL)) { - // 更新第一个任务 任务组、任务顺序号 - jsonTask.put("task_group_id", IdUtil.getSnowflake(1, 1).nextId()); - jsonTask.put("sort_seq", 1); - wo_Task.update(jsonTask); - // 从左边生成移库单 - map.put("flag", "5"); - jsonAllBlockPoint = WQL.getWO("ST_OUTIVT03").addParamMap(map).process().getResultJSONArray(0); - } - } - - if (StrUtil.equals(jsonAttr.getString("placement_type"), "03")) { - // 03-右通 - map.put("flag", "1"); - JSONObject jsonIsBlockR = WQL.getWO("ST_OUTIVT03").addParamMap(map).process().uniqueResult(0); - - // 判断左边是否被挡住 - if (ObjectUtil.isNotEmpty(jsonIsBlockR)) { - // 更新第一个任务 任务组、任务顺序号 - jsonTask.put("task_group_id", IdUtil.getSnowflake(1, 1).nextId()); - jsonTask.put("sort_seq", 1); - wo_Task.update(jsonTask); - // 从右边生成移库单 - map.put("flag", "4"); - jsonAllBlockPoint = WQL.getWO("ST_OUTIVT03").addParamMap(map).process().getResultJSONArray(0); - } - } - - for (int i = 0; i < jsonAllBlockPoint.size(); i++) { - JSONObject json = jsonAllBlockPoint.getJSONObject(i); - - JSONObject mapParam = new JSONObject();// 生成移库单传入参数 - JSONArray table = new JSONArray(); // 明细参数 - mapParam.put("bill_status", "10"); - mapParam.put("bill_type", "21"); - mapParam.put("buss_type", "21"); - mapParam.put("biz_date", DateUtil.today()); - mapParam.put("stor_code", "CP01"); - mapParam.put("stor_id", "1582991156504039424"); - mapParam.put("stor_name", "成品仓库"); - mapParam.put("is_task", "1"); - - // 查询移入货位 - JSONObject moveParam = new JSONObject(); - moveParam.put("box_no", json.getString("storagevehicle_code")); - moveParam.put("sect_id", RegionTypeEnum.ZZ01.getId()); - JSONObject jsonMove = rawAssistIStorService.autoDis(moveParam); - // 查询移出货位的库存物料 - JSONObject jsonMoveIvt = WQL.getWO("ST_OUTIVT03") - .addParam("flag", "6") - .addParam("struct_id", json.getString("struct_id")) - .process().uniqueResult(0); - - // 移库单明细 - JSONObject jsonMoveDtl = new JSONObject(); - jsonMoveDtl.put("is_task", "2"); - jsonMoveDtl.put("turnout_sect_id", json.getLongValue("sect_id")); - jsonMoveDtl.put("turnout_sect_code", json.getString("sect_code")); - jsonMoveDtl.put("turnout_sect_name", json.getString("sect_name")); - jsonMoveDtl.put("turnout_struct_id", json.getLongValue("struct_id")); - jsonMoveDtl.put("turnout_struct_code", json.getString("struct_code")); - jsonMoveDtl.put("turnout_struct_name", json.getString("struct_name")); - jsonMoveDtl.put("material_id", jsonMoveIvt.getLongValue("material_id")); - jsonMoveDtl.put("pcsn", jsonMoveIvt.getString("pcsn")); - jsonMoveDtl.put("quality_scode", "01"); - jsonMoveDtl.put("qty_unit_id", jsonMoveIvt.getLongValue("qty_unit_id")); - jsonMoveDtl.put("qty_unit_name", jsonMoveIvt.getString("unit_name")); - jsonMoveDtl.put("qty", jsonMoveIvt.getDoubleValue("canuse_qty")); - jsonMoveDtl.put("storagevehicle_code", json.getString("storagevehicle_code")); - jsonMoveDtl.put("turnin_sect_id", jsonMove.getLongValue("sect_id")); - jsonMoveDtl.put("turnin_sect_code", jsonMove.getString("sect_code")); - jsonMoveDtl.put("turnin_sect_name", jsonMove.getString("sect_name")); - jsonMoveDtl.put("turnin_struct_id", jsonMove.getLongValue("struct_id")); - jsonMoveDtl.put("turnin_struct_code", jsonMove.getString("struct_code")); - jsonMoveDtl.put("turnin_struct_name", jsonMove.getString("struct_name")); - jsonMoveDtl.put("source_billdtl_id", dis.getLongValue("iostorinvdis_id")); - - // 生成任务 - JSONObject param2 = new JSONObject(); - param2.put("task_type", "010503"); - param2.put("vehicle_code", json.getString("storagevehicle_code")); - param2.put("task_name", "task_name"); - param2.put("point_code1", json.getString("point_code")); - param2.put("point_code2", jsonMove.getString("struct_code")); - param2.put("task_group_id", jsonTask.getLongValue("task_group_id")); // 任务组 - param2.put("sort_seq", jsonTask.getIntValue("sort_seq") + i + 1); // 任务组顺序号 - String move_task_id = outTask.createTask(param2); - - // 回显移库明细任务id - jsonMoveDtl.put("task_id", move_task_id); - table.add(jsonMoveDtl); - // 更新任务处理类 - JSONObject jsonTaskMove = wo_Task.query("task_id = '" + move_task_id + "'").uniqueResult(0); - jsonTaskMove.put("task_type", "010505"); - jsonTaskMove.put("handle_class", HandMoveStorAcsTask.class.getName()); - wo_Task.update(jsonTaskMove); - - mapParam.put("tableData", table); - // 调用移库单新增方法 - if (ObjectUtil.isNotEmpty(jsonAllBlockPoint)) { - handMoveStorService.insertDtl2(mapParam); - } - } - } - // 下发 - outTask.immediateNotifyAcs(null); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void allSetPoint(JSONObject whereJson) { - //出库分配表 - WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - //点位表 - WQLObject wo_Point = WQLObject.getWQLObject("SCH_BASE_Point"); - //任务表 - WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); - //出库主表 - WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - //仓位表 - WQLObject attrTab = WQLObject.getWQLObject("ST_IVT_StructAttr"); - // 库存表 - WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); - - String point_code = whereJson.getString("point_code"); // 终点 - String iostorinv_id = whereJson.getString("iostorinv_id"); - String iostorinvdtl_id = whereJson.getString("iostorinvdtl_id"); - boolean checked = whereJson.getBoolean("checked"); // 是否异常出库 - - //查询主表信息 - JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jo_mst)) { - throw new BadRequestException("未查到相关出库单"); - } - - JSONObject jsonPoint2 = wo_Point.query("lock_type='1' and (vehicle_code='' or vehicle_code IS NULL) and point_code='" + point_code + "'").uniqueResult(0); - //如果终点站点被锁定或者有载具号,则不允许设置点位 - if (ObjectUtil.isEmpty(jsonPoint2)) { - throw new BadRequestException("该站点被锁定或者有载具号,不允许设置!"); - } - - // 查询此明细的所有未生成的分配明细(根据片区、排 分组) - JSONArray allRowArr = WQL.getWO("ST_OUTIVT04") - .addParam("flag", "1") - .addParam("iostorinvdtl_id", iostorinvdtl_id) - .addParam("iostorinv_id", iostorinv_id) - .process() - .getResultJSONArray(0); - - if (ObjectUtil.isEmpty(allRowArr)) { - throw new BadRequestException("当前没有可设置的分配明细"); - } - - // 判断当前排是否有其他任务正在执行 - for (int i = 0; i < allRowArr.size(); i++) { - JSONObject jsonRow = allRowArr.getJSONObject(i); - JSONArray structArr = attrTab.query("block_num = '" + jsonRow.getString("block_num") - + "' and row_num = '" + jsonRow.getString("row_num") + "' and is_used = '1' and is_delete = '0' and lock_type not in ('1','6','3')").getResultJSONArray(0); - - if (ObjectUtil.isNotEmpty(structArr)) { - throw new BadRequestException("有其他任务正在执行中,请稍后在试!"); - } - } - - ArrayList arr = new ArrayList<>(); - TranUtil.openTransaction((req, allTransactionConsumer) -> { - if (checked) { - // 查询此明细所有的层 - JSONArray layerArr = WQL.getWO("ST_OUTIVT04") - .addParam("flag", "9") - .addParam("iostorinv_id", iostorinv_id) - .process() - .getResultJSONArray(0); - - for (int i = 0; i < layerArr.size(); i++) { - JSONObject json = layerArr.getJSONObject(i); - - String layer_num = json.getString("layer_num"); - - String out_point = ""; - - switch (layer_num) { - case "1": - out_point = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("out_point_1").getValue(); - break; - case "2": - out_point = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("out_point_2").getValue(); - break; - case "3": - out_point = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("out_point_3").getValue(); - break; - default: - break; - } - - // 将这一巷道的所有木箱进行移库 - JSONObject jsonNextPoint = attrTab.query("struct_code = '" + out_point + "'").uniqueResult(0); - - JSONObject map2 = new JSONObject(); - map2.put("block_num", jsonNextPoint.getString("block_num")); - map2.put("row_num", jsonNextPoint.getString("row_num")); - map2.put("out_order_seq", jsonNextPoint.getString("out_order_seq")); - - map2.put("flag", "7"); - JSONArray paramMoveArr = WQL.getWO("ST_OUTIVT04").addParamMap(map2).process().getResultJSONArray(0); - - if (ObjectUtil.isNotEmpty(paramMoveArr)) { - JSONObject moveParam = new JSONObject(); - moveParam.put("jsonAllBlockPoint", paramMoveArr); - moveParam.put("task_group_id", IdUtil.getSnowflake(1, 1).nextId()); - this.createMove(moveParam, allTransactionConsumer); - - new HandMoveStorAcsTask().immediateNotifyAcs(null); - - // 更新任务为下发 - JSONObject param = new JSONObject(); - param.put("task_status", TaskStatusEnum.ISSUE.getCode()); - wo_Task.update(param, "task_group_id = '" + moveParam.getString("task_group_id") + "'"); - } - } - } - - formeth(allTransactionConsumer, allRowArr, iostorinv_id, point_code, checked, iostorinvdtl_id, jsonPoint2); - return arr; - }, new JSONArray()); - } - - public void formeth(Consumer allTransactionConsumer, JSONArray allRowArr, String iostorinv_id, String point_code, boolean checked, String iostorinvdtl_id, JSONObject jsonPoint2) { - for (int i = 0; i < allRowArr.size(); i++) { - // 调用当前排处理方法 - JSONObject jsonRow = allRowArr.getJSONObject(i); - jsonRow.put("iostorinv_id", iostorinv_id); - jsonRow.put("point_code", point_code); - jsonRow.put("checked", checked); - jsonRow.put("iostorinvdtl_id", iostorinvdtl_id); - jsonRow.put("point_id", jsonPoint2.getString("point_id")); - this.rowDispose(jsonRow, allTransactionConsumer); - } - } - - @Transactional(rollbackFor = Exception.class) - public void rowDispose(JSONObject jsonRow, Consumer allTransactionConsumer) { - //出库分配表 - WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - //任务表 - WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); - // 仓位表 - WQLObject attr_tab = WQLObject.getWQLObject("st_ivt_structattr"); - // 点位表 - WQLObject point_tab = WQLObject.getWQLObject("sch_base_point"); - - String point_code = jsonRow.getString("point_code"); - String iostorinvdtl_id = jsonRow.getString("iostorinvdtl_id"); - String point_id = jsonRow.getString("point_id"); - Boolean checked = jsonRow.getBoolean("checked"); - - /* - * 查询这一排的要出库的所有分配明细(正序) - */ - JSONArray disRowArr = WQL.getWO("ST_OUTIVT04") - .addParam("flag", "23") - .addParam("iostorinvdtl_id", iostorinvdtl_id) - .addParam("iostorinv_id", jsonRow.getString("iostorinv_id")) - .addParam("block_num", jsonRow.getString("block_num")) - .addParam("row_num", jsonRow.getString("row_num")) - .process().getResultJSONArray(0); - - JSONArray disRowArrNew = new JSONArray(); - String option = ""; // 1.左 2.右 -// String placement_type = jsonRow.getString("placement_type"); // 单通或双通 - - allTransactionConsumer.accept("begin"); - for (int p = 0; p < disRowArr.size(); p++) { - JSONObject jsonObject4 = disRowArr.getJSONObject(p); - String placement_type = jsonObject4.getString("placement_type"); - // 双通 - if (StrUtil.equals(placement_type, "01")) { - - // 取右边第一个 - JSONObject jsonDisRight = disRowArr.getJSONObject(0); - // 取左边第一个 - JSONObject jsonDisLeft = disRowArr.getJSONObject(disRowArr.size() - 1); - - /* - * 判断左边被挡住的个数多还是右边被挡住的个数多 - */ - // 判断右边边被挡住的个数 - JSONObject isNumMap = new JSONObject(); - isNumMap.put("flag", "3"); - isNumMap.put("block_num", jsonDisRight.getString("block_num")); - isNumMap.put("row_num", jsonDisRight.getString("row_num")); - isNumMap.put("out_order_seq", jsonDisRight.getString("out_order_seq")); - JSONArray numArrFirst = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - // 调用共用方法计算被挡个数 - JSONArray rightNumArr = this.isNum(numArrFirst); - - // 判断左边被挡住的个数 - isNumMap.put("flag", "4"); - isNumMap.put("block_num", jsonDisLeft.getString("block_num")); - isNumMap.put("row_num", jsonDisLeft.getString("row_num")); - isNumMap.put("out_order_seq", jsonDisLeft.getString("out_order_seq")); - JSONArray numArrLast = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - // 调用共用方法计算被挡个数 - JSONArray leftNumArr = this.isNum(numArrLast); - // 判断哪边少 - if (rightNumArr.size() > leftNumArr.size()) { - /* - * 左边开始 - */ - // 查询仓位被锁住的货位 - isNumMap.put("flag", "5"); - isNumMap.put("block_num", jsonDisLeft.getString("block_num")); - isNumMap.put("row_num", jsonDisLeft.getString("row_num")); - isNumMap.put("out_order_seq", jsonDisLeft.getString("out_order_seq")); - JSONArray isLockArr = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - JSONArray numArr = this.isNum(isLockArr); - // 不为空则返回报错 - if (ObjectUtil.isNotEmpty(numArr)) { - String error = ""; - - for (int k = 0; k < numArr.size(); k++) { - JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); - } - - throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!"); - } - // 重新按照排序查询 - disRowArrNew = WQL.getWO("ST_OUTIVT04") - .addParam("flag", "22") - .addParam("iostorinvdtl_id", iostorinvdtl_id) - .addParam("iostorinv_id", jsonRow.getString("iostorinv_id")) - .addParam("block_num", jsonRow.getString("block_num")) - .addParam("row_num", jsonRow.getString("row_num")) - .process().getResultJSONArray(0); - - option = "1"; - - } else if (rightNumArr.size() < leftNumArr.size()) { - /* - * 右边开始 - */ - // 查询仓位被锁住的货位 - isNumMap.put("flag", "6"); - isNumMap.put("block_num", jsonDisRight.getString("block_num")); - isNumMap.put("row_num", jsonDisRight.getString("row_num")); - isNumMap.put("out_order_seq", jsonDisRight.getString("out_order_seq")); - JSONArray isLockArr = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - JSONArray numArr = this.isNum(isLockArr); - // 不为空则返回报错 - if (ObjectUtil.isNotEmpty(numArr)) { - String error = ""; - - for (int k = 0; k < numArr.size(); k++) { - JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); - } - - throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!"); - } - - // 重新按照排序查询 - disRowArrNew = WQL.getWO("ST_OUTIVT04") - .addParam("flag", "2") - .addParam("iostorinvdtl_id", iostorinvdtl_id) - .addParam("iostorinv_id", jsonRow.getString("iostorinv_id")) - .addParam("block_num", jsonRow.getString("block_num")) - .addParam("row_num", jsonRow.getString("row_num")) - .process().getResultJSONArray(0); - - option = "2"; - } else { - /* - * 相等默认右边开始 - */ - // 查询仓位被锁住的货位 - isNumMap.put("flag", "6"); - isNumMap.put("block_num", jsonDisRight.getString("block_num")); - isNumMap.put("row_num", jsonDisRight.getString("row_num")); - isNumMap.put("out_order_seq", jsonDisRight.getString("out_order_seq")); - JSONArray isLockArr = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - JSONArray numArr = this.isNum(isLockArr); - // 不为空则返回报错 - if (ObjectUtil.isNotEmpty(numArr)) { - String error = ""; - - for (int k = 0; k < numArr.size(); k++) { - JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); - } - - throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!"); - } - - // 重新按照排序查询 - disRowArrNew = WQL.getWO("ST_OUTIVT04") - .addParam("flag", "2") - .addParam("iostorinvdtl_id", iostorinvdtl_id) - .addParam("iostorinv_id", jsonRow.getString("iostorinv_id")) - .addParam("block_num", jsonRow.getString("block_num")) - .addParam("row_num", jsonRow.getString("row_num")) - .process().getResultJSONArray(0); - - option = "2"; - } - - } else if (StrUtil.equals(placement_type, "02")) { - // 左通 - JSONObject jsonDisLeft = disRowArr.getJSONObject(disRowArr.size() - 1); - - JSONObject isNumMap = new JSONObject(); - // 查询仓位被锁住的货位 - isNumMap.put("flag", "5"); - isNumMap.put("block_num", jsonDisLeft.getString("block_num")); - isNumMap.put("row_num", jsonDisLeft.getString("row_num")); - isNumMap.put("out_order_seq", jsonDisLeft.getString("out_order_seq")); - JSONArray isLockArr = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - JSONArray numArr = this.isNum(isLockArr); - // 不为空则返回报错 - if (ObjectUtil.isNotEmpty(numArr)) { - String error = ""; - - for (int k = 0; k < numArr.size(); k++) { - JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); - } - - throw new BadRequestException("仓位:" + error + "被锁定请等待下发任务并等待任务完成"); - } - // 重新按照排序查询 - disRowArrNew = WQL.getWO("ST_OUTIVT04") - .addParam("flag", "22") - .addParam("iostorinvdtl_id", iostorinvdtl_id) - .addParam("iostorinv_id", jsonRow.getString("iostorinv_id")) - .addParam("block_num", jsonRow.getString("block_num")) - .addParam("row_num", jsonRow.getString("row_num")) - .process().getResultJSONArray(0); - - option = "1"; - - } else if (StrUtil.equals(placement_type, "03")) { - // 右通 - JSONObject jsonDisRight = disRowArr.getJSONObject(0); - JSONObject isNumMap = new JSONObject(); - // 查询仓位被锁住的货位 - isNumMap.put("flag", "6"); - isNumMap.put("block_num", jsonDisRight.getString("block_num")); - isNumMap.put("row_num", jsonDisRight.getString("row_num")); - isNumMap.put("out_order_seq", jsonDisRight.getString("out_order_seq")); - JSONArray isLockArr = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - JSONArray numArr = this.isNum(isLockArr); - // 不为空则返回报错 - if (ObjectUtil.isNotEmpty(numArr)) { - String error = ""; - - for (int k = 0; k < numArr.size(); k++) { - JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); - } - - throw new BadRequestException("仓位:" + error + "被锁定请等待下发任务并等待任务完成"); - } - - // 重新按照排序查询 - disRowArrNew = WQL.getWO("ST_OUTIVT04") - .addParam("flag", "2") - .addParam("iostorinvdtl_id", iostorinvdtl_id) - .addParam("iostorinv_id", jsonRow.getString("iostorinv_id")) - .addParam("block_num", jsonRow.getString("block_num")) - .addParam("row_num", jsonRow.getString("row_num")) - .process().getResultJSONArray(0); - - option = "2"; - } - break; - } - - /* - * 生成任务 - */ - - //已经生成任务的点位数组 - JSONArray create_rows = new JSONArray(); - boolean canOut = false; - int j = 0; - JSONObject jsonObject = disRowArrNew.getJSONObject(j); - create_rows.add(disRowArrNew.getJSONObject(j)); - - // 查询未被锁住的仓位 - JSONArray moveArr = new JSONArray(); - JSONObject map = new JSONObject(); - map.put("block_num", jsonObject.getString("block_num")); - map.put("row_num", jsonObject.getString("row_num")); - map.put("out_order_seq", jsonObject.getString("out_order_seq")); - - if (StrUtil.equals(option, "1")) { - // 左边 - map.put("flag", "7"); - moveArr = WQL.getWO("ST_OUTIVT04").addParamMap(map).process().getResultJSONArray(0); - } else { - // 右边 - map.put("flag", "8"); - moveArr = WQL.getWO("ST_OUTIVT04").addParamMap(map).process().getResultJSONArray(0); - } - - // 创建任务组 - long task_group_id = IdUtil.getSnowflake(1, 1).nextId(); - - /*-----------------------update开始------------------------------*/ - - // 判断是否需要生成移库 - if (ObjectUtil.isNotEmpty(moveArr)) { - JSONObject moveParam = new JSONObject(); - moveParam.put("jsonAllBlockPoint", moveArr); - moveParam.put("iostorinvdis_id", jsonObject.getString("iostorinvdis_id")); - moveParam.put("task_group_id", task_group_id); - this.createMove(moveParam, allTransactionConsumer); - } - - // 判断是否是异常出库口 - if (checked) { - JSONObject jsonStartPoint = attr_tab.query("struct_code = '" + jsonObject.getString("struct_code") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonStartPoint)) { - throw new BadRequestException("起始点位异常!"); - } - - String layer_num = jsonStartPoint.getString("layer_num"); - - switch (layer_num) { - case "1": - point_code = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("out_point_1").getValue(); - break; - case "2": - point_code = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("out_point_2").getValue(); - break; - case "3": - point_code = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("out_point_3").getValue(); - break; - default: - throw new BadRequestException("起点楼层异常:" + jsonStartPoint.getString("struct_code")); - } - point_id = point_tab.query("point_code = '" + point_code + "'").uniqueResult(0).getString("point_id"); - } - allTransactionConsumer.accept(jsonObject.getString("struct_code")); - // 创建任务 - JSONObject param = new JSONObject(); - param.put("task_type", "010503"); - param.put("vehicle_code", jsonObject.getString("box_no")); - param.put("task_name", ""); - param.put("point_code1", jsonObject.getString("struct_code")); - param.put("point_code2", point_code); - param.put("material_id", jsonObject.getString("material_id")); - param.put("task_group_id", ""); // 任务组 - param.put("sort_seq", ""); // 任务组顺序号 - - String create_task_id = outTask.createTask(param); - - // 更新分配状态、任务标识、出库点位 - JSONObject jsonTask = wo_Task.query("task_id = '" + create_task_id + "'").uniqueResult(0); - JSONObject jsonUpdateMap = new JSONObject(); - jsonUpdateMap.put("work_status", "01"); - jsonUpdateMap.put("task_id", jsonTask.getLong("task_id")); - jsonUpdateMap.put("point_id", point_id); - wo_dis.update(jsonUpdateMap, "iostorinvdis_id = '" + jsonObject.getString("iostorinvdis_id") + "'"); - - // 1.判断此条分配明细的 ‘仓位’在此主表下的分配明细是否有相同的 ‘仓位’ - JSONArray disArr = wo_dis.query("struct_id = '" + jsonObject.getString("struct_id") + - "' and iostorinv_id = '" + jsonObject.getString("iostorinv_id") + - "' and iostorinvdis_id <> '" + jsonObject.getString("iostorinvdis_id") + - "' and work_status = '00'").getResultJSONArray(0); - - // 依次更新相同仓位的分配明细状态、任务标识、出库点位 - for (int n = 0; n < disArr.size(); n++) { - JSONObject jsonObject2 = disArr.getJSONObject(n); - jsonObject2.put("work_status", "01"); - jsonObject2.put("task_id", jsonTask.getLong("task_id")); - jsonObject2.put("point_id", point_id); - wo_dis.update(jsonObject2); - } - - // 更新出库任务:任务组和顺序号 - JSONObject jsonTaskLast1 = WQL.getWO("QST_IVT_CHECKOUTBILL").addParam("flag", "13").addParam("task_group_id", task_group_id + "").process().uniqueResult(0); - jsonTask.put("task_group_id", task_group_id); - if (ObjectUtil.isEmpty(jsonTaskLast1)) { - jsonTask.put("sort_seq", 1); - } else { - jsonTask.put("sort_seq", jsonTaskLast1.getIntValue("sort_seq") + 1); - } - wo_Task.update(jsonTask); - - outTask.immediateNotifyAcs(null); - /* - * 判断下一个出库仓位是否相邻 - */ - int out_order_seq = jsonObject.getIntValue("out_order_seq"); - boolean canAdd = true; - int nextNum = j + 1; - while (canAdd) { - // 判断数组是否到头 - if (nextNum <= disRowArrNew.size() - 1) { - JSONObject jsonNext = disRowArrNew.getJSONObject(nextNum); - int out_order_seq_next = jsonNext.getIntValue("out_order_seq"); - if (Math.abs(out_order_seq_next - out_order_seq) != nextNum) { - // 下发当前任务组 - outTask.immediateNotifyAcs(null); - - // 更新任务组 - task_group_id = IdUtil.getSnowflake(1, 1).nextId(); - canAdd = false; - - } else { - create_rows.add(jsonNext); - // 查询此任务组最后一个生成的任务 - JSONObject jsonTaskLast = WQL.getWO("QST_IVT_CHECKOUTBILL").addParam("flag", "13").addParam("task_group_id", task_group_id + "").process().uniqueResult(0); - // 创建任务并添加到任务组 - allTransactionConsumer.accept(jsonNext.getString("struct_code")); - JSONObject param2 = new JSONObject(); - param2.put("task_type", "010503"); - param2.put("vehicle_code", jsonNext.getString("box_no")); - param2.put("task_name", ""); - param2.put("point_code1", jsonNext.getString("struct_code")); - param2.put("point_code2", point_code); - param2.put("material_id", jsonNext.getString("material_id")); - param2.put("task_group_id", task_group_id); // 任务组 - param2.put("sort_seq", jsonTaskLast.getIntValue("sort_seq") + 1); // 任务组顺序号 - - String create_task_id2 = outTask.createTask(param2); - - outTask.immediateNotifyAcs(null); - - // 更新分配状态、任务标识、出库点位 - JSONObject jsonTask2 = wo_Task.query("task_id = '" + create_task_id2 + "'").uniqueResult(0); - JSONObject jsonUpdateMap2 = new JSONObject(); - jsonUpdateMap2.put("work_status", "01"); - jsonUpdateMap2.put("task_id", jsonTask2.getLong("task_id")); - jsonUpdateMap2.put("point_id", point_id); - wo_dis.update(jsonUpdateMap2, "iostorinvdis_id = '" + jsonNext.getString("iostorinvdis_id") + "'"); - - // 1.判断此条分配明细的 ‘仓位’在此主表下的分配明细是否有相同的 ‘仓位’ - JSONArray disArr2 = wo_dis.query("struct_id = '" + jsonNext.getString("struct_id") + - "' and iostorinv_id = '" + jsonNext.getString("iostorinv_id") + - "' and iostorinvdis_id <> '" + jsonNext.getString("iostorinvdis_id") + - "' and work_status = '00'").getResultJSONArray(0); - - // 依次更新相同仓位的分配明细状态、任务标识、出库点位 - for (int m = 0; m < disArr2.size(); m++) { - JSONObject jsonObject3 = disArr2.getJSONObject(m); - jsonObject3.put("work_status", "01"); - jsonObject3.put("task_id", jsonTask2.getLong("task_id")); - jsonObject3.put("point_id", point_id); - wo_dis.update(jsonObject3); - } - - nextNum++; - } - } else { - canAdd = false; - canOut = true; - } - } - - - if (canOut) { - // 下发当前任务组 - outTask.immediateNotifyAcs(null); - disRowArrNew.clear(); - - // 更新任务组 - task_group_id = IdUtil.getSnowflake(1, 1).nextId(); - } else { - // 迭代调用自身 - this.rowDispose(jsonRow, allTransactionConsumer); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void oneSetPoint2(JSONObject whereJson) { - TranUtil.openTransaction((req, allTransactionConsumer) -> { - allTransactionConsumer.accept("begin"); - //出库分配表 - WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - //点位表 - WQLObject wo_Point = WQLObject.getWQLObject("SCH_BASE_Point"); - //任务表 - WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); - //出库主表 - WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - //仓位表 - WQLObject attrTab = WQLObject.getWQLObject("ST_IVT_StructAttr"); - - String struct_id = whereJson.getString("struct_id"); - String point_code = whereJson.getString("point_code"); // 终点 - String iostorinv_id = whereJson.getString("iostorinv_id"); - String iostorinvdtl_id = whereJson.getString("iostorinvdtl_id"); - String iostorinvdis_id = whereJson.getString("iostorinvdis_id"); - boolean checked = whereJson.getBoolean("checked"); // 是否异常出库 - String point_id = ""; - - //查询主表信息 - JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jo_mst)) { - throw new BadRequestException("未查到相关出库单"); - } - - JSONObject jsonPoint2 = wo_Point.query("lock_type='1' and (vehicle_code='' or vehicle_code IS NULL) and point_code='" + point_code + "'").uniqueResult(0); - //如果终点站点被锁定或者有载具号,则不允许设置点位 - if (ObjectUtil.isEmpty(jsonPoint2)) { - throw new BadRequestException("该站点被锁定或者有载具号,不允许设置!"); - } - point_id = jsonPoint2.getString("point_id"); - - // 查询未生成和生成未下发的分配记录 - JSONArray disArrOne = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParam("flag", "5") - .addParam("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id")) - .addParam("iostorinvdis_id", whereJson.getString("iostorinvdis_id")) - .addParam("struct_id", struct_id) - .addParam("iostorinv_id", iostorinv_id) - .addParam("bill_status", "01") - .addParam("is_issued", "0") - .process() - .getResultJSONArray(0); - if (ObjectUtil.isEmpty(disArrOne)) { - throw new BadRequestException("分配明细不存在或已执行、完成、!"); - } - - // 取第一个 - JSONObject jsonNoe = disArrOne.getJSONObject(0); - - JSONArray disRowArrNew = new JSONArray(); - String option = ""; // 1.左 2.右 - String placement_type = whereJson.getString("placement_type"); // 单通或双通 - // 双通 - if (StrUtil.equals(placement_type, "01")) { - - /* - * 判断左边被挡住的个数多还是右边被挡住的个数多 - */ - // 判断右边边被挡住的个数 - JSONObject isNumMap = new JSONObject(); - isNumMap.put("flag", "3"); - isNumMap.put("block_num", jsonNoe.getString("block_num")); - isNumMap.put("row_num", jsonNoe.getString("row_num")); - isNumMap.put("out_order_seq", jsonNoe.getString("out_order_seq")); - JSONArray numArrFirst = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - // 调用共用方法计算被挡个数 - JSONArray rightNumArr = this.isNum(numArrFirst); - - // 判断左边被挡住的个数 - isNumMap.put("flag", "4"); - isNumMap.put("block_num", jsonNoe.getString("block_num")); - isNumMap.put("row_num", jsonNoe.getString("row_num")); - isNumMap.put("out_order_seq", jsonNoe.getString("out_order_seq")); - JSONArray numArrLast = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - // 调用共用方法计算被挡个数 - JSONArray leftNumArr = this.isNum(numArrLast); - // 判断哪边少 - if (rightNumArr.size() > leftNumArr.size()) { - /* - * 左边开始 - */ - // 查询仓位被锁住的货位 - isNumMap.put("flag", "5"); - isNumMap.put("block_num", jsonNoe.getString("block_num")); - isNumMap.put("row_num", jsonNoe.getString("row_num")); - isNumMap.put("out_order_seq", jsonNoe.getString("out_order_seq")); - JSONArray isLockArr = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - JSONArray numArr = this.isNum(isLockArr); - // 不为空则返回报错 - if (ObjectUtil.isNotEmpty(numArr)) { - String error = ""; - - for (int k = 0; k < numArr.size(); k++) { - JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); - } - - throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!"); - } - // 重新按照排序查询 - disRowArrNew = WQL.getWO("ST_OUTIVT04") - .addParam("flag", "22") - .addParam("iostorinvdtl_id", iostorinvdtl_id) - .addParam("iostorinvdis_id", iostorinvdis_id) - .process().getResultJSONArray(0); - - option = "1"; - - } else if (rightNumArr.size() < leftNumArr.size()) { - /* - * 右边开始 - */ - // 查询仓位被锁住的货位 - isNumMap.put("flag", "6"); - isNumMap.put("block_num", jsonNoe.getString("block_num")); - isNumMap.put("row_num", jsonNoe.getString("row_num")); - isNumMap.put("out_order_seq", jsonNoe.getString("out_order_seq")); - JSONArray isLockArr = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - JSONArray numArr = this.isNum(isLockArr); - // 不为空则返回报错 - if (ObjectUtil.isNotEmpty(numArr)) { - String error = ""; - - for (int k = 0; k < numArr.size(); k++) { - JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); - } - - throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!"); - } - - // 重新按照排序查询 - disRowArrNew = WQL.getWO("ST_OUTIVT04") - .addParam("flag", "2") - .addParam("iostorinvdtl_id", iostorinvdtl_id) - .addParam("iostorinvdis_id", iostorinvdis_id) - .process().getResultJSONArray(0); - - option = "2"; - } else { - /* - * 相等默认右边开始 - */ - // 查询仓位被锁住的货位 - isNumMap.put("flag", "6"); - isNumMap.put("block_num", jsonNoe.getString("block_num")); - isNumMap.put("row_num", jsonNoe.getString("row_num")); - isNumMap.put("out_order_seq", jsonNoe.getString("out_order_seq")); - JSONArray isLockArr = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - JSONArray numArr = this.isNum(isLockArr); - // 不为空则返回报错 - if (ObjectUtil.isNotEmpty(numArr)) { - String error = ""; - - for (int k = 0; k < numArr.size(); k++) { - JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); - } - - throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!"); - } - - // 重新按照排序查询 - disRowArrNew = WQL.getWO("ST_OUTIVT04") - .addParam("flag", "2") - .addParam("iostorinvdtl_id", iostorinvdtl_id) - .addParam("iostorinvdis_id", iostorinvdis_id) - .process().getResultJSONArray(0); - - option = "2"; - } - - } else if (StrUtil.equals(placement_type, "02")) { - // 左通 - - JSONObject isNumMap = new JSONObject(); - // 查询仓位被锁住的货位 - isNumMap.put("flag", "5"); - isNumMap.put("block_num", jsonNoe.getString("block_num")); - isNumMap.put("row_num", jsonNoe.getString("row_num")); - isNumMap.put("out_order_seq", jsonNoe.getString("out_order_seq")); - JSONArray isLockArr = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - JSONArray numArr = this.isNum(isLockArr); - // 不为空则返回报错 - if (ObjectUtil.isNotEmpty(numArr)) { - String error = ""; - - for (int k = 0; k < numArr.size(); k++) { - JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); - } - - throw new BadRequestException("仓位:" + error + "被锁定请等待下发任务并等待任务完成"); - } - // 重新按照排序查询 - disRowArrNew = WQL.getWO("ST_OUTIVT04") - .addParam("flag", "22") - .addParam("iostorinvdtl_id", iostorinvdtl_id) - .addParam("iostorinvdis_id", iostorinvdis_id) - .process().getResultJSONArray(0); - - option = "1"; - - } else if (StrUtil.equals(placement_type, "03")) { - // 右通 - JSONObject isNumMap = new JSONObject(); - // 查询仓位被锁住的货位 - isNumMap.put("flag", "6"); - isNumMap.put("block_num", jsonNoe.getString("block_num")); - isNumMap.put("row_num", jsonNoe.getString("row_num")); - isNumMap.put("out_order_seq", jsonNoe.getString("out_order_seq")); - JSONArray isLockArr = WQL.getWO("ST_OUTIVT04").addParamMap(isNumMap).process().getResultJSONArray(0); - - JSONArray numArr = this.isNum(isLockArr); - // 不为空则返回报错 - if (ObjectUtil.isNotEmpty(numArr)) { - String error = ""; - - for (int k = 0; k < numArr.size(); k++) { - JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); - } - - throw new BadRequestException("仓位:" + error + "被锁定请等待下发任务并等待任务完成!"); - } - - // 重新按照排序查询 - disRowArrNew = WQL.getWO("ST_OUTIVT04") - .addParam("flag", "2") - .addParam("iostorinvdtl_id", iostorinvdtl_id) - .addParam("iostorinvdis_id", iostorinvdis_id) - .process().getResultJSONArray(0); - - option = "2"; - } - - /* - * 循环生成任务 - */ - boolean canOut = false; - int j = 0; - JSONObject jsonObject = disRowArrNew.getJSONObject(j); - - // 查询未被锁住的仓位 - JSONArray moveArr = new JSONArray(); - JSONObject map = new JSONObject(); - map.put("block_num", jsonObject.getString("block_num")); - map.put("row_num", jsonObject.getString("row_num")); - map.put("out_order_seq", jsonObject.getString("out_order_seq")); - - if (StrUtil.equals(option, "1")) { - // 左边 - map.put("flag", "7"); - moveArr = WQL.getWO("ST_OUTIVT04").addParamMap(map).process().getResultJSONArray(0); - } else { - // 右边 - map.put("flag", "8"); - moveArr = WQL.getWO("ST_OUTIVT04").addParamMap(map).process().getResultJSONArray(0); - } - - // 创建任务组 - long task_group_id = IdUtil.getSnowflake(1, 1).nextId(); - - // 判断是否需要生成移库 - if (ObjectUtil.isNotEmpty(moveArr)) { - JSONObject moveParam = new JSONObject(); - moveParam.put("jsonAllBlockPoint", moveArr); - moveParam.put("iostorinvdis_id", jsonObject.getString("iostorinvdis_id")); - moveParam.put("task_group_id", task_group_id); - this.createMove(moveParam, allTransactionConsumer); - } - - // 判断是否是异常出库口 - if (checked) { - JSONObject jsonStartPoint = attrTab.query("struct_code = '" + jsonObject.getString("struct_code") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonStartPoint)) { - throw new BadRequestException("起始点位异常!"); - } - - String layer_num = jsonStartPoint.getString("layer_num"); - - switch (layer_num) { - case "1": - point_code = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("out_point_1").getValue(); - break; - case "2": - point_code = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("out_point_2").getValue(); - break; - case "3": - point_code = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("out_point_3").getValue(); - break; - default: - throw new BadRequestException("起点楼层异常:" + jsonStartPoint.getString("struct_code")); - } - point_id = wo_Point.query("point_code = '" + point_code + "'").uniqueResult(0).getString("point_id"); - } - allTransactionConsumer.accept(jsonObject.getString("struct_code")); - // 创建任务 - JSONObject param = new JSONObject(); - param.put("task_type", "010503"); - param.put("vehicle_code", jsonObject.getString("box_no")); - param.put("task_name", ""); - param.put("point_code1", jsonObject.getString("struct_code")); - param.put("point_code2", point_code); - param.put("material_id", jsonObject.getString("material_id")); - param.put("task_group_id", ""); // 任务组 - param.put("sort_seq", ""); // 任务组顺序号 - - String create_task_id = outTask.createTask(param); - - // 更新分配状态、任务标识、出库点位 - JSONObject jsonTask = wo_Task.query("task_id = '" + create_task_id + "'").uniqueResult(0); - JSONObject jsonUpdateMap = new JSONObject(); - jsonUpdateMap.put("work_status", "01"); - jsonUpdateMap.put("task_id", jsonTask.getLong("task_id")); - jsonUpdateMap.put("point_id", point_id); - wo_dis.update(jsonUpdateMap, "iostorinvdis_id = '" + jsonObject.getString("iostorinvdis_id") + "'"); - - // 1.判断此条分配明细的 ‘仓位’在此主表下的分配明细是否有相同的 ‘仓位’ - JSONArray disArr = wo_dis.query("struct_id = '" + jsonObject.getString("struct_id") + - "' and iostorinv_id = '" + jsonObject.getString("iostorinv_id") + - "' and iostorinvdis_id <> '" + jsonObject.getString("iostorinvdis_id") + - "' and work_status = '00'").getResultJSONArray(0); - - // 依次更新相同仓位的分配明细状态、任务标识、出库点位 - for (int n = 0; n < disArr.size(); n++) { - JSONObject jsonObject2 = disArr.getJSONObject(n); - jsonObject2.put("work_status", "01"); - jsonObject2.put("task_id", jsonTask.getLong("task_id")); - jsonObject2.put("point_id", point_id); - wo_dis.update(jsonObject2); - } - - // 更新出库任务:任务组和顺序号 - JSONObject jsonTaskLast1 = wo_Task.query("task_group_id = '" + task_group_id + "' order by sort_seq DESC").uniqueResult(0); - jsonTask.put("task_group_id", task_group_id); - if (ObjectUtil.isEmpty(jsonTaskLast1)) { - jsonTask.put("sort_seq", 1); - } else { - jsonTask.put("sort_seq", jsonTaskLast1.getIntValue("sort_seq") + 1); - } - wo_Task.update(jsonTask); - - /* - * 判断下一个出库仓位是否相邻 - */ - int out_order_seq = jsonObject.getIntValue("out_order_seq"); - boolean canAdd = true; - int nextNum = j + 1; - while (canAdd) { - // 判断数组是否到头 - if (nextNum <= disRowArrNew.size() - 1) { - JSONObject jsonNext = disRowArrNew.getJSONObject(nextNum); - int out_order_seq_next = jsonNext.getIntValue("out_order_seq"); - if (Math.abs(out_order_seq_next - out_order_seq) != nextNum) { - // 下发当前任务组 - outTask.immediateNotifyAcs(null); - - // 更新任务组 - task_group_id = IdUtil.getSnowflake(1, 1).nextId(); - canAdd = false; - - } else { - // 查询此任务组最后一个生成的任务 - JSONObject jsonTaskLast = wo_Task.query("task_group_id = '" + task_group_id + "' order by sort_seq DESC").uniqueResult(0); - // 创建任务并添加到任务组 - allTransactionConsumer.accept(jsonNext.getString("struct_code")); - JSONObject param2 = new JSONObject(); - param2.put("task_type", "010503"); - param2.put("vehicle_code", jsonNext.getString("box_no")); - param2.put("task_name", ""); - param2.put("point_code1", jsonNext.getString("struct_code")); - param2.put("point_code2", point_code); - param2.put("material_id", jsonNext.getString("material_id")); - param2.put("task_group_id", task_group_id); // 任务组 - param2.put("sort_seq", jsonTaskLast.getIntValue("sort_seq") + 1); // 任务组顺序号 - - String create_task_id2 = outTask.createTask(param2); - - outTask.immediateNotifyAcs(null); - - // 更新分配状态、任务标识、出库点位 - JSONObject jsonTask2 = wo_Task.query("task_id = '" + create_task_id2 + "'").uniqueResult(0); - JSONObject jsonUpdateMap2 = new JSONObject(); - jsonUpdateMap2.put("work_status", "01"); - jsonUpdateMap2.put("task_id", jsonTask2.getLong("task_id")); - jsonUpdateMap2.put("point_id", point_id); - wo_dis.update(jsonUpdateMap2, "iostorinvdis_id = '" + jsonNext.getString("iostorinvdis_id") + "'"); - - // 1.判断此条分配明细的 ‘仓位’在此主表下的分配明细是否有相同的 ‘仓位’ - JSONArray disArr2 = wo_dis.query("struct_id = '" + jsonNext.getString("struct_id") + - "' and iostorinv_id = '" + jsonNext.getString("iostorinv_id") + - "' and iostorinvdis_id <> '" + jsonNext.getString("iostorinvdis_id") + - "' and work_status = '00'").getResultJSONArray(0); - - // 依次更新相同仓位的分配明细状态、任务标识、出库点位 - for (int m = 0; m < disArr2.size(); m++) { - JSONObject jsonObject3 = disArr2.getJSONObject(m); - jsonObject3.put("work_status", "01"); - jsonObject3.put("task_id", jsonTask2.getLong("task_id")); - jsonObject3.put("point_id", point_id); - wo_dis.update(jsonObject3); - } - - nextNum++; - } - } else { - canAdd = false; - canOut = true; - } - } - - if (canOut) { - // 下发当前任务组 - outTask.immediateNotifyAcs(null); - disRowArrNew.clear(); - - // 更新任务组 - task_group_id = IdUtil.getSnowflake(1, 1).nextId(); - } else { - } - return null; - }, new JSONArray()); - } - - @Transactional(rollbackFor = Exception.class) - public void createMove(JSONObject whereJson, Consumer allTransactionConsumer) { - //任务表 - WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); - - JSONArray jsonAllBlockPoint = whereJson.getJSONArray("jsonAllBlockPoint"); - String is_move = whereJson.getString("is_move"); - - for (int i = 0; i < jsonAllBlockPoint.size(); i++) { - JSONObject json = jsonAllBlockPoint.getJSONObject(i); - - if (ObjectUtil.isNotEmpty(allTransactionConsumer)) { - allTransactionConsumer.accept(json.getString("struct_code")); - } - JSONObject jsonAttr = attrTab.query("struct_code = '" + json.getString("struct_code") + "'").uniqueResult(0); - - JSONObject mapParam = new JSONObject();// 生成移库单传入参数 - JSONArray table = new JSONArray(); // 明细参数 - if (ObjectUtil.isNotEmpty(is_move)) { - mapParam.put("bill_type", "28"); - mapParam.put("buss_type", "28"); - mapParam.put("bill_status", "20"); - - } else { - mapParam.put("bill_type", "21"); - mapParam.put("buss_type", "21"); - mapParam.put("bill_status", "10"); - } - mapParam.put("biz_date", DateUtil.today()); - mapParam.put("stor_code", "CP01"); - mapParam.put("stor_id", "1582991156504039424"); - mapParam.put("stor_name", "成品仓库"); - mapParam.put("is_task", "1"); - - // 查询移入货位 - JSONObject moveParam = new JSONObject(); - moveParam.put("box_no", json.getString("storagevehicle_code")); - moveParam.put("sect_id", RegionTypeEnum.ZZ01.getId()); - moveParam.put("layer_num", jsonAttr.getString("layer_num")); - JSONObject jsonMove = rawAssistIStorService.autoDisMove(moveParam); - // 查询移出货位的库存物料 - JSONObject jsonMoveIvt = WQL.getWO("ST_OUTIVT03") - .addParam("flag", "6") - .addParam("struct_id", json.getString("struct_id")) - .process().uniqueResult(0); - - // 移库单明细 - JSONObject jsonMoveDtl = new JSONObject(); - jsonMoveDtl.put("is_task", "2"); - jsonMoveDtl.put("turnout_sect_id", json.getLongValue("sect_id")); - jsonMoveDtl.put("turnout_sect_code", json.getString("sect_code")); - jsonMoveDtl.put("turnout_sect_name", json.getString("sect_name")); - jsonMoveDtl.put("turnout_struct_id", json.getLongValue("struct_id")); - jsonMoveDtl.put("turnout_struct_code", json.getString("struct_code")); - jsonMoveDtl.put("turnout_struct_name", json.getString("struct_name")); - jsonMoveDtl.put("material_id", jsonMoveIvt.getLongValue("material_id")); - jsonMoveDtl.put("pcsn", jsonMoveIvt.getString("pcsn")); - jsonMoveDtl.put("quality_scode", "01"); - jsonMoveDtl.put("qty_unit_id", jsonMoveIvt.getLongValue("qty_unit_id")); - jsonMoveDtl.put("qty_unit_name", jsonMoveIvt.getString("unit_name")); - jsonMoveDtl.put("qty", jsonMoveIvt.getDoubleValue("canuse_qty")); - jsonMoveDtl.put("storagevehicle_code", json.getString("storagevehicle_code")); - jsonMoveDtl.put("turnin_sect_id", jsonMove.getLongValue("sect_id")); - jsonMoveDtl.put("turnin_sect_code", jsonMove.getString("sect_code")); - jsonMoveDtl.put("turnin_sect_name", jsonMove.getString("sect_name")); - jsonMoveDtl.put("turnin_struct_id", jsonMove.getLongValue("struct_id")); - jsonMoveDtl.put("turnin_struct_code", jsonMove.getString("struct_code")); - jsonMoveDtl.put("turnin_struct_name", jsonMove.getString("struct_name")); - jsonMoveDtl.put("source_billdtl_id", whereJson.getLongValue("iostorinvdis_id")); - - // 生成任务 - JSONObject param2 = new JSONObject(); - param2.put("task_type", "010503"); - param2.put("vehicle_code", json.getString("storagevehicle_code")); - param2.put("point_code1", json.getString("struct_code")); - param2.put("point_code2", jsonMove.getString("struct_code")); - param2.put("task_group_id", whereJson.getLongValue("task_group_id")); // 任务组 - param2.put("sort_seq", i + 1); // 任务组顺序号 - String move_task_id = outTask.createTask(param2); - - // 回显移库明细任务id - jsonMoveDtl.put("task_id", move_task_id); - table.add(jsonMoveDtl); - // 更新任务处理类 - JSONObject jsonTaskMove = wo_Task.query("task_id = '" + move_task_id + "'").uniqueResult(0); - jsonTaskMove.put("task_type", "010505"); - jsonTaskMove.put("handle_class", HandMoveStorAcsTask.class.getName()); - wo_Task.update(jsonTaskMove); - - mapParam.put("tableData", table); - // 调用移库单新增方法 - if (ObjectUtil.isNotEmpty(jsonAllBlockPoint)) { - handMoveStorService.insertDtl2(mapParam); - } - - moveStorAcsTask.immediateNotifyAcs(null); - } - } - - /** - * 被挡的个数 - * - * @param arr - * @return - */ - /* public JSONArray isNum(JSONArray arr) { - WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); // 任务表 - - JSONArray result = new JSONArray(); - - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - String struct_code = json.getString("struct_code"); - - JSONObject jsonTask1 = taskTab.query("point_code1 = '" + struct_code + "' and task_status in ('05','06')").uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonTask1)) { - result.add(json); - } - } - - return result; - }*/ - public JSONArray isNum(JSONArray arr) { - StringJoiner joiner = new StringJoiner(",", "(", ")"); - JSONArray result = new JSONArray(); - if (ObjectUtil.isNotEmpty(arr)) { - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - joiner.add("'" + json.getString("struct_code") + "'"); - } - JSONArray task_ja = WQL.getWO("QST_IVT_CHECKOUTBILL").addParam("struct_codes", joiner.toString()).addParam("flag", "14").process().getResultJSONArray(0); - for (int i = 0; i < arr.size(); i++) { - JSONObject jo = arr.getJSONObject(i); - String struct_code = jo.getString("struct_code"); - boolean flag = true; - for (int j = 0; j < task_ja.size(); j++) { - JSONObject task_jo = task_ja.getJSONObject(j); - if (task_jo.getString("point_code1").equals(struct_code)) { - flag = false; - break; - } - } - if (flag) { - result.add(jo); - } - } - } - return result; - } - - @Transactional(rollbackFor = Exception.class) - public boolean is_trueOrFalse(JSONObject json) { - /* - * 判断此货位在此出库单分配明细中是否存在: - * 1.如果存在: - * 1)判断此货位是否生成任务:生成:则没有任务组 = false,未生成:报错 - * 2.如果不存在:则判断此货位是否被锁住 - * 1)未锁住:生成移库单 = true - * 2)锁住:判断是否生成任务,生成:则不用生成移库单 = false;未生成则报错 - */ - WQLObject disTab = WQLObject.getWQLObject("st_ivt_iostorinvdis"); // 出入库分配明细表 - WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); // 任务表 - - if (ObjectUtil.isEmpty(json)) { - // 如果为空说明未堵住 - return false; - } - - String struct_code = json.getString("struct_code"); - String iostorinv_id = json.getString("iostorinv_id"); - - if (ObjectUtil.isEmpty(struct_code)) { - throw new BadRequestException("校验仓位不能为空"); - } - - boolean param = false; - - if (StrUtil.equals(json.getString("option"), "1")) { - // 单通 - // 判断此货位在此出库单中是否存在 - JSONObject jsondis = disTab.query("iostorinv_id = '" + iostorinv_id + "' and struct_code = '" + struct_code + "'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsondis)) { - // 存在:判断是否生成任务 - if (!StrUtil.equals(jsondis.getString("work_status"), "00")) { - param = false; - } else { - throw new BadRequestException("此仓位不可生成任务,请按照顺序选择!"); - } - } else { - // 不存在: 判断此货位是否被锁住 - if (StrUtil.equals(json.getString("lock_type"), "1")) { - // 未锁住:返回true - param = true; - } else { - // 锁住:判断是否生成任务,生成:则不用生成移库单 = false;未生成则报错 - JSONObject jsonTask1 = taskTab.query("point_code1 = '" + struct_code + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - JSONObject jsonTask2 = taskTab.query("point_code2 = '" + struct_code + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonTask1) && ObjectUtil.isEmpty(jsonTask2)) { - // 未生成任务 - throw new BadRequestException("挡住仓位" + struct_code + "已锁定但未生成任务,请按照顺序选择"); - } else { - // 已生成 - param = false; - } - } - } - } else if (StrUtil.equals(json.getString("option"), "2")) { - // 双通 - // 判断此货位在此出库单中是否存在 - JSONObject jsondis = disTab.query("iostorinv_id = '" + iostorinv_id + "' and struct_code = '" + struct_code + "'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsondis)) { - param = false; - } else { - // 不存在: 判断此货位是否被锁住 - if (StrUtil.equals(json.getString("lock_type"), "1")) { - // 未锁住:返回true - param = true; - } else { - // 锁住:判断是否生成任务,生成:则不用生成移库单 = false;未生成则报错 - JSONObject jsonTask1 = taskTab.query("point_code1 = '" + struct_code + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - JSONObject jsonTask2 = taskTab.query("point_code2 = '" + struct_code + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonTask1) && ObjectUtil.isEmpty(jsonTask2)) { - // 未生成任务 - param = true; - } else { - // 已生成 - param = false; - } - } - } - } else if (StrUtil.equals(json.getString("option"), "3")) { - // 判断此货位在此出库单中是否存在 - JSONObject jsondis = disTab.query("iostorinv_id = '" + iostorinv_id + "' and struct_code = '" + struct_code + "'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsondis)) { - // 存在:判断是否生成任务 - if (!StrUtil.equals(jsondis.getString("work_status"), "00")) { - param = true; - } else { - param = false; - } - } else { - // 不存在: 判断此货位是否被锁住 - if (StrUtil.equals(json.getString("lock_type"), "1")) { - // 未锁住:返回true - param = false; - } else { - // 锁住:判断是否生成任务,生成:则不用生成移库单 = false;未生成则报错 - JSONObject jsonTask1 = taskTab.query("point_code1 = '" + struct_code + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - JSONObject jsonTask2 = taskTab.query("point_code2 = '" + struct_code + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonTask1) && ObjectUtil.isEmpty(jsonTask2)) { - // 未生成任务 - param = false; - } else { - // 已生成 - param = true; - } - } - } - } else if (StrUtil.equals(json.getString("option"), "4")) { - if (StrUtil.equals(json.getString("lock_type"), "1")) { - // 未锁住:返回true - param = true; - } else { - // 锁住:判断是否生成任务,生成:则不用生成移库单 = false;未生成则报错 - JSONObject jsonTask1 = taskTab.query("point_code1 = '" + struct_code + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - JSONObject jsonTask2 = taskTab.query("point_code2 = '" + struct_code + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonTask1) && ObjectUtil.isEmpty(jsonTask2)) { - // 未生成任务 - param = true; - } else { - // 已生成 - param = false; - } - } - } - return param; - } - - @Override - public JSONArray getStructIvt(Map whereJson) { - HashMap map = new HashMap(whereJson); - if (StrUtil.isNotEmpty(map.get("remark"))) { - map.put("remark", "%" + map.get("remark") + "%"); - } - JSONArray jo = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParam("flag", "3") - .addParam("material_id", map.get("material_id")) - .addParam("pcsn", map.get("pcsn")) - .addParam("sap_pcsn", map.get("sap_pcsn")) - .addParam("iostorinv_id", map.get("iostorinv_id")) - .addParam("stor_id", map.get("stor_id")) - .addParam("sect_id", map.get("sect_id")) - .addParam("remark", map.get("remark")) - .addParam("sale_order_name", map.get("source_bill_code")) - .process() - .getResultJSONArray(0); - return jo; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void manualDiv(JSONObject form) { - //出库分配表 - WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - //出库明细表 - WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); - //出库主表 - WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - //库区表 - WQLObject wo_sect = WQLObject.getWQLObject("st_ivt_sectattr"); - - //定义需要更新的仓位集合 - HashMap Struct_map = new HashMap<>(); - JSONObject whereJson = form.getJSONObject("row"); - JSONArray rows = form.getJSONArray("rows"); - String iostorinv_id = whereJson.getString("iostorinv_id"); - //查询主表信息 - JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jo_mst)) { - throw new BadRequestException("当前订单无可分配出库明细"); - } - - // 如果是发货出库则判断运费和物流公司不能为空 - String bill_type = jo_mst.getString("bill_type"); - if (StrUtil.equals(bill_type, "1001")) { - String trans_code = jo_mst.getString("trans_code"); - String estimated_freight = jo_mst.getString("estimated_freight"); - - if (ObjectUtil.isEmpty(trans_code)) { - throw new BadRequestException("物流公司不能为空"); - } - if (ObjectUtil.isEmpty(estimated_freight)) { - throw new BadRequestException("预估运费不能为空"); - } - - } - - //查询生成和未分配完的明细 - JSONObject dtl = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParam("flag", "2") - .addParam("bill_status", "30") - .addParam("unassign_flag", "1") - .addParam("iostorinv_id", iostorinv_id) - .addParam("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id")) - .process() - .uniqueResult(0); - if (ObjectUtil.isEmpty(dtl)) { - throw new BadRequestException("当前订单无可分配出库明细"); - } - - // 判断此明细是否有子卷号:没有则过滤箱号、将此箱子里的所有子卷带出来 - if (ObjectUtil.isEmpty(dtl.getString("pcsn"))) { - HashSet boxSet = new HashSet<>(); - JSONArray boxArr = new JSONArray(); - - for (int i = 0; i < rows.size(); i++) { - JSONObject json = rows.getJSONObject(i); - boxSet.add(json.getString("storagevehicle_code")); - } - - for (String box_no : boxSet) { - JSONArray boxIvtArr = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParam("flag", "3") - .addParam("box_no", box_no) - .process() - .getResultJSONArray(0); - - boxArr.addAll(boxIvtArr); - } - rows.clear(); - rows.addAll(boxArr); - } - - double assign_qty = dtl.getDoubleValue("assign_qty"); - double unassign_qty = dtl.getDoubleValue("unassign_qty"); - double plan_qty = dtl.getDoubleValue("plan_qty"); - - if (rows.size() != 0) { - for (int j = 0; j < rows.size(); j++) { - JSONObject ivt = rows.getJSONObject(j); - - double canuse_qty = ivt.getDoubleValue("ivt_qty"); - assign_qty = NumberUtil.add(assign_qty, canuse_qty); - - if (unassign_qty >= canuse_qty) { -// unassign_qty = unassign_qty - canuse_qty; - unassign_qty = NumberUtil.sub(unassign_qty, canuse_qty); - ivt.put("change_qty", canuse_qty + ""); - } else { - ivt.put("change_qty", canuse_qty + ""); - unassign_qty = 0; - } - //更新库存 - ivt.put("bill_type_scode", jo_mst.getString("bill_type")); - ivt.put("inv_id", dtl.getString("iostorinv_id")); - ivt.put("bill_code", jo_mst.getString("bill_code")); - ivt.put("bill_table", "ST_IVT_IOStorInv"); - storPublicService.IOStor(ivt, "11"); - //生成分配明细 - dtl.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId()); - dtl.put("sect_id", ivt.getString("sect_id")); - dtl.put("sect_code", ivt.getString("sect_code")); - dtl.put("sect_name", ivt.getString("sect_name")); - dtl.put("struct_id", ivt.getString("struct_id")); - dtl.put("struct_code", ivt.getString("struct_code")); - dtl.put("struct_name", ivt.getString("struct_name")); - dtl.put("pcsn", ivt.getString("pcsn")); - dtl.put("box_no", ivt.getString("storagevehicle_code")); - dtl.put("storagevehicle_id", ivt.getString("storagevehicle_id")); - dtl.put("storagevehicle_code", ivt.getString("storagevehicle_code")); - dtl.put("storagevehicle_type", ivt.getString("storagevehicle_type")); - dtl.put("is_issued", "0"); - dtl.put("plan_qty", ivt.getDoubleValue("change_qty")); - dtl.put("real_qty", ivt.getDoubleValue("change_qty")); - dtl.put("is_overdue", ivt.getString("is_overdue")); - dtl.put("instorage_time", ivt.getString("instorage_time")); - // 如果所属仓位是虚拟区 则将分配明细状态变为生成 - JSONObject jsonSect = wo_sect.query("sect_id = '" + ivt.getString("sect_id") + "'").uniqueResult(0); - if (StrUtil.equals(jsonSect.getString("sect_type_attr"), "09")) { - dtl.put("work_status", "01"); - } else { - dtl.put("work_status", "00"); - } - - // 判断是否超期 - if (jo_mst.getString("is_overdue").equals("1")) { - if (ivt.getString("is_overdue").equals("1")) { - dtl.put("work_status", "01"); - } - } - - wo_dis.insert(dtl); - //记录需锁定的仓位 - Struct_map.put(ivt.getString("struct_id"), ivt); - /* if (unassign_qty == 0) { - break; - }*/ - } -// HashMap map_dtl = new HashMap(); - JSONObject map_dtl = new JSONObject(); - //更新明细 - map_dtl.put("unassign_qty", unassign_qty + ""); - map_dtl.put("assign_qty", assign_qty + ""); - if (map_dtl.getDoubleValue("unassign_qty") <= 0) { - map_dtl.put("bill_status", "40"); - } else { - map_dtl.put("bill_status", "30"); - } - wo_dtl.update(map_dtl, "iostorinvdtl_id='" + dtl.getString("iostorinvdtl_id") + "'"); - } - - // 判断是否还有相同物料相同仓位的明细 - if (ObjectUtil.isNotEmpty(dtl.getString("pcsn"))) { - JSONObject jsonMap = new JSONObject(); - jsonMap.put("flag", "4"); - jsonMap.put("material_id", dtl.getString("material_id")); - jsonMap.put("box_no", dtl.getString("box_no")); - jsonMap.put("iostorinv_id", iostorinv_id); - jsonMap.put("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id")); - - JSONArray dtlArr = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().getResultJSONArray(0); - for (int i = 0; i < dtlArr.size(); i++) { - JSONObject json = dtlArr.getJSONObject(i); - - JSONObject ivt = WQL.getWO("ST_OUTIVT01") - .addParam("flag", "1") - .addParam("material_id", json.getString("material_id")) - .addParam("pcsn", json.getString("pcsn")) - .process().uniqueResult(0); - - //更新库存 - ivt.put("change_qty", ivt.getDoubleValue("canuse_qty")); - ivt.put("bill_type_scode", jo_mst.getString("bill_type")); - ivt.put("inv_id", json.getString("iostorinv_id")); - ivt.put("bill_code", jo_mst.getString("bill_code")); - ivt.put("bill_table", "ST_IVT_IOStorInv"); - storPublicService.IOStor(ivt, "11"); - //生成分配明细 - json.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId()); - json.put("sect_id", ivt.getString("sect_id")); - json.put("sect_code", ivt.getString("sect_code")); - json.put("sect_name", ivt.getString("sect_name")); - json.put("struct_id", ivt.getString("struct_id")); - json.put("struct_code", ivt.getString("struct_code")); - json.put("struct_name", ivt.getString("struct_name")); - json.put("pcsn", ivt.getString("pcsn")); - json.put("box_no", ivt.getString("storagevehicle_code")); - json.put("storagevehicle_id", ivt.getString("storagevehicle_id")); - json.put("storagevehicle_code", ivt.getString("storagevehicle_code")); - json.put("storagevehicle_type", ivt.getString("storagevehicle_type")); - json.put("is_issued", "0"); - json.put("plan_qty", ivt.getDoubleValue("change_qty")); - json.put("real_qty", ivt.getDoubleValue("change_qty")); - json.put("is_overdue", ivt.getString("is_overdue")); - json.put("instorage_time", ivt.getString("instorage_time")); - // 如果所属仓位是虚拟区 则将分配明细状态变为生成 - JSONObject jsonSect = wo_sect.query("sect_id = '" + ivt.getString("sect_id") + "'").uniqueResult(0); - if (StrUtil.equals(jsonSect.getString("sect_type_attr"), "09")) { - json.put("work_status", "01"); - } else { - json.put("work_status", "00"); - } - - // 判断是否超期 - if (jo_mst.getString("is_overdue").equals("1")) { - if (ivt.getString("is_overdue").equals("1")) { - json.put("work_status", "01"); - } - } - - wo_dis.insert(json); - - // 更新明细 - HashMap map_dtl = new HashMap(); - map_dtl.put("unassign_qty", "0"); - map_dtl.put("assign_qty", ivt.getString("change_qty")); - map_dtl.put("bill_status", "40"); - wo_dtl.update(map_dtl, "iostorinvdtl_id='" + json.getString("iostorinvdtl_id") + "'"); - } - } - - //更新主表状态 - this.updateMststatus(iostorinv_id); - //锁定点位、仓位 - Collection c = Struct_map.values(); - Iterator it = c.iterator(); - for (; it.hasNext(); ) { - JSONObject Struct = it.next(); - //锁定起点仓位点位 - JSONObject from_start = new JSONObject(); - from_start.put("struct_id", Struct.getString("struct_id")); - from_start.put("lock_type", "3"); - from_start.put("inv_type", jo_mst.getString("bill_type")); - from_start.put("inv_id", jo_mst.getString("iostorinv_id")); - from_start.put("inv_code", jo_mst.getString("bill_code")); - storPublicService.updateStructAndPoint(from_start); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void confirm(JSONObject form) { - //出库分配表 - WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - //出库明细表 - WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); - //出库主表 - WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - // 物料表 - WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase"); - // 任务表 - WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); - // 库区表 - WQLObject sectTab = WQLObject.getWQLObject("st_ivt_sectattr"); - // 子卷包装关系表 - WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); - //包装关系出入库记录表 - WQLObject sub_record = WQLObject.getWQLObject("pdm_bi_subpackagerelationrecord"); - - String iostorinv_id = form.getString("iostorinv_id"); - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - - //查询主表信息 - JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jo_mst)) { - throw new BadRequestException("未查到相关出库单"); - } - - //判断分配明细中是否有未生成状态的分配明细 - JSONArray disArr = wo_dis.query("iostorinv_id = '" + iostorinv_id + "' and work_status = '00'").getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(disArr)) { - throw new BadRequestException("有未生成状态的分配明细,不允许强制确认"); - } - - //查询生成和未分配完的明细 - JSONArray dtls = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParam("flag", "2") - .addParam("bill_status", "50") - .addParam("iostorinv_id", iostorinv_id) - .process() - .getResultJSONArray(0); - - if (dtls.size() != 0) { - for (int i = 0; i < dtls.size(); i++) { - JSONObject dtl = dtls.getJSONObject(i); - HashMap map_dtl = new HashMap<>(); - //更新明细状态 - map_dtl.put("bill_status", "99"); - wo_dtl.update(map_dtl, "iostorinvdtl_id='" + dtl.getString("iostorinvdtl_id") + "'"); - } - } - - HashMap map_mst = new HashMap<>(); - map_mst.put("bill_status", "99"); - map_mst.put("confirm_optid", currentUserId + ""); - map_mst.put("confirm_optname", nickName); - map_mst.put("confirm_time", now); - //更新主表状态 - wo_mst.update(map_mst, "iostorinv_id = '" + iostorinv_id + "'"); - //查询需要更新库存的分配记录 - JSONArray diss = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParam("flag", "55") - .addParam("iostorinv_id", iostorinv_id) - .process() - .getResultJSONArray(0); - for (int i = 0; i < diss.size(); i++) { - JSONObject dis = diss.getJSONObject(i); - double plan_qty = dis.getDoubleValue("plan_qty"); - double real_qty = dis.getDoubleValue("real_qty"); - //全出判断是否全出 - if ("02".equals(dis.getString("task_type"))) { - if (Double.compare(plan_qty, real_qty) != 0) { - throw new BadRequestException(dis.getString("storagevehicle_code") + "全出载具未完成出库!"); - } - } - //未出部分,按取消分配处理 - if (Double.compare(real_qty, plan_qty) != 0) { - dis.put("change_qty", plan_qty - real_qty); - dis.put("bill_type_scode", jo_mst.getString("bill_type")); - dis.put("inv_id", iostorinv_id); - dis.put("bill_code", jo_mst.getString("bill_code")); - dis.put("bill_table", "ST_IVT_IOStorInv"); - storPublicService.IOStor(dis, "12"); - } - //更新已出库重量 - if (real_qty != 0) { - dis.put("change_qty", real_qty); - dis.put("bill_type_scode", jo_mst.getString("bill_type")); - dis.put("inv_id", iostorinv_id); - dis.put("bill_code", jo_mst.getString("bill_code")); - dis.put("bill_table", "ST_IVT_IOStorInv"); - - if (jo_mst.getString("is_overdue").equals("1")) { - if (dis.getString("is_overdue").equals("1")) { - storPublicService.IOStor(dis, "12"); - } else { - storPublicService.IOStor(dis, "21"); - } - } else { - storPublicService.IOStor(dis, "21"); - } - } - - // 更新分配明细执行状态为 - 99 - JSONObject jsonDis = wo_dis.query("iostorinvdis_id = '" + dis.getString("iostorinvdis_id") + "'").uniqueResult(0); - jsonDis.put("work_status", "99"); - wo_dis.update(jsonDis); - - if (jo_mst.getString("is_overdue").equals("1")) { - if (dis.getString("is_overdue").equals("1")) { - continue; - } - } - - //查询对应明细 - JSONObject dtl_jo = WQLObject.getWQLObject("st_ivt_iostorinvdtl").query("iostorinvdtl_id = '" + dis.getString("iostorinvdtl_id") + "'").uniqueResult(0); - // 更新子卷包装关系表 状态 - 3 - JSONObject jsonSub = subTab.query("container_name = '" + dis.getString("pcsn") + "' and package_box_sn = '" + dis.getString("box_no") + "' and status = '2'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonSub)) - //查询对应的包装关系出入库记录表 - { - jsonSub = sub_record.query("container_name = '" + dis.getString("pcsn") + "' and package_box_sn = '" + dis.getString("box_no") + "' and status = '2' AND bill_code = '" + jo_mst.getString("bill_code") + "'").uniqueResult(0); - } - if (ObjectUtil.isEmpty(jsonSub)) { - throw new BadRequestException("此子卷不存在或不为入库状态:" + dis.getString("pcsn")); - - } - // 如果是拆分入库则将包装关系改为生成状态 - if ("1005".equals(jo_mst.getString("bill_type")) || ("1009".equals(jo_mst.getString("bill_type")))) { - jsonSub.put("status", "0"); - } else { - jsonSub.put("status", "3"); - } - - if (jo_mst.getString("bill_type").equals("1011")) { - // 更新子卷包装净重 - double net_weight = NumberUtil.sub(jsonSub.getDoubleValue("net_weight"), plan_qty); - jsonSub.put("net_weight",net_weight); - - if (net_weight <= 0) { - jsonSub.put("status","3"); - } else { - jsonSub.put("status","2"); - } - } - - subTab.update(jsonSub); - - // 解锁起点 - JSONObject from_start = new JSONObject(); - from_start.put("struct_id", dis.getString("struct_id")); - from_start.put("lock_type", "1"); - from_start.put("is_overdue", dis.getString("is_overdue")); - - if (jo_mst.getString("is_overdue").equals("1")) { - if (dis.getString("is_overdue").equals("1")) { - from_start.put("storagevehicle_code", dis.getString("box_no")); - } else { - from_start.put("storagevehicle_code", ""); - } - } else { - from_start.put("storagevehicle_code", ""); - } - - if (jo_mst.getString("bill_type").equals("1011")) { - // 判断此木箱下的所有子卷净重是否为0,如果为0则清空载具 - List packageList = subTab.query("package_box_sn = '" + jsonSub.getString("package_box_sn") + "'") - .getResultJSONArray(0).toJavaList(JSONObject.class); - - boolean is_zero = packageList.stream() - .allMatch(row -> row.getDoubleValue("net_weight") <= 0); - - if (is_zero) { - from_start.put("storagevehicle_code", ""); - } else { - from_start.put("bill_type","1011"); - from_start.put("storagevehicle_code", jsonSub.getString("package_box_sn")); - } - } - - storPublicService.updateStructAndPoint(from_start); - - //插入包装关系出入库记录表 - jsonSub.put("bill_code", jo_mst.getString("bill_code")); - jsonSub.put("bill_id", jo_mst.getString("iostorinv_id")); - jsonSub.put("bill_type", jo_mst.getString("bill_type")); - jsonSub.put("io_type", "1"); - jsonSub.put("insert_time", DateUtil.now()); - jsonSub.put("record_id", IdUtil.getSnowflake(1, 1).nextId()); - sub_record.insert(jsonSub); - - // 更新对应任务为完成 - JSONObject jsonTask = taskTab.query("task_id = '" + jsonDis.getString("task_id") + "' and task_status < '07'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonTask)) { - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskTab.update(jsonTask); - } - - } - - JSONObject out_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - if ("1004".equals(out_jo.getString("bill_type"))) { - //调拨出库自动生成调拨入库单 - WQLObject dtl_wql = WQLObject.getWQLObject("st_ivt_iostorinvdtl"); - WQLObject mst_wql = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - WQLObject dis_wql = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - - //校验主表状态为生成 - if (!"99".equals(out_jo.getString("bill_status"))) { - throw new BadRequestException("主表状态必须为完成!"); - } - - JSONObject mst_row = mst_wql.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - - JSONArray dis_rows = new JSONArray(); - - if (jo_mst.getString("is_overdue").equals("1")) { - dis_rows = dis_wql.query("iostorinv_id = '" + iostorinv_id + "' and is_overdue = '0'").getResultJSONArray(0); - } else { - dis_rows = dis_wql.query("iostorinv_id = '" + iostorinv_id + "'").getResultJSONArray(0); - } - - //生成手工入库单 - String new_iostorinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - String bill_code = CodeUtil.getNewCode("IO_CODE"); - jo_mst.put("iostorinv_id", new_iostorinv_id); - jo_mst.put("bill_code", bill_code); - jo_mst.put("io_type", "0"); - jo_mst.put("bill_type", "0004"); - jo_mst.put("buss_type", ((String) jo_mst.get("bill_type")).substring(0, 4)); - //查询移入仓库的信息 - JSONObject in_stor = WQLObject.getWQLObject("st_ivt_bsrealstorattr").query("stor_id = '" + out_jo.getString("out_stor_id") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(in_stor)) { - throw new BadRequestException("未查询到对应的移入仓库信息!"); - } - jo_mst.put("stor_id", in_stor.getString("stor_id")); - jo_mst.put("stor_code", in_stor.getString("stor_code")); - jo_mst.put("stor_name", in_stor.getString("stor_name")); - jo_mst.put("bill_status", "30"); - jo_mst.put("input_optid", currentUserId + ""); - jo_mst.put("input_optname", nickName); - jo_mst.put("input_time", now); - jo_mst.put("update_optid", currentUserId + ""); - jo_mst.put("update_optname", nickName); - jo_mst.put("update_time", now); - jo_mst.put("out_stor_id", out_jo.getString("stor_id")); - - double total_qty = 0.00; - for (int i = 0; i < dis_rows.size(); i++) { - //插入明细表 - String iostorinvdtl_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - JSONObject dis_row = dis_rows.getJSONObject(i); - //查询对应的出库单明细 - JSONObject dtl_row = dtl_wql.query("iostorinvdtl_id = '" + dis_row.getString("iostorinvdtl_id") + "'").uniqueResult(0); - dis_row.put("iostorinvdtl_id", iostorinvdtl_id); - dis_row.put("iostorinv_id", new_iostorinv_id); - dis_row.put("seq_no", i + 1); - dis_row.put("bill_status", "30"); - dis_row.put("real_qty", "0"); - dis_row.put("vbeln", dtl_row.getString("vbeln")); - dis_row.put("source_billdtl_id", dtl_row.getString("iostorinvdtl_id")); - dis_row.put("source_bill_type", mst_row.getString("bill_type")); - dis_row.put("source_bill_code", dtl_row.getString("source_bill_code")); - dis_row.put("source_bill_table", "ST_IVT_IOStorInvDtl"); - dis_row.put("assign_qty", dis_row.getString("plan_qty")); - dis_row.put("unassign_qty", "0"); - //插入调拨明细表 - dtl_wql.insert(dis_row); - - dis_row.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId()); - dis_row.put("seq_no", 1); - dis_row.put("sect_id", ""); - dis_row.put("sect_code", ""); - dis_row.put("sect_name", ""); - dis_row.put("struct_id", ""); - dis_row.put("struct_code", ""); - dis_row.put("struct_name", ""); - dis_row.put("work_status", "00"); - dis_row.put("real_qty", "0"); - dis_row.put("point_id", ""); - dis_row.put("task_id", ""); - //插入分配表 - dis_wql.insert(dis_row); - - total_qty = NumberUtil.add(total_qty,dis_row.getDoubleValue("plan_qty")); - - //将包装关系中对应的记录状态改为包装 - HashMap map = new HashMap<>(); - map.put("status", "1"); - WQLObject.getWQLObject("PDM_BI_SubPackageRelation").update(map, "package_box_SN = '" + dis_row.getString("box_no") + "' AND status = '3'"); - } - - // 查询所有明细并计算实际重量 - List dtlList = dtl_wql.query("iostorinv_id = '" + iostorinv_id + "'") - .getResultJSONArray(0).toJavaList(JSONObject.class); - - double assign_qty = dtlList.stream() - .map(row -> row.getDoubleValue("assign_qty")) - .reduce(Double::sum).orElse(0.00); - - jo_mst.put("detail_count", dis_rows.size()); - // jo_mst.put("total_qty", total_qty); - jo_mst.put("total_qty", assign_qty); - mst_wql.insert(jo_mst); - } - - /*if (out_jo.getString("bill_type").equals("1003")) { - //更新改切子卷为该子卷的分切计划 - JSONObject source_dtl = WQLObject.getWQLObject("st_ivt_iostorinvdtl").query("iostorinv_id = '" + iostorinv_id + "' AND IFNULL(source_billdtl_id,'') <> ''").uniqueResult(0); - - JSONObject jsonPlan = WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").query("package_box_sn = '" + source_dtl.getString("box_no") + "'").uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonPlan)) throw new BadRequestException("未找到对应改制计划"); - - JSONObject map = new JSONObject(); - map.put("is_parent_ok", "1"); - - WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(map, "package_box_sn = '" + source_dtl.getString("box_no") + "'"); - - }*/ - - if ("1003".equals(out_jo.getString("bill_type")) || "1006".equals(out_jo.getString("bill_type"))) { - //如果为返检出库或者改切出库删除对应的包装关系 - JSONArray dis_rows = new JSONArray(); - if (jo_mst.getString("is_overdue").equals("1")) { - dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + iostorinv_id + "' and is_overdue = '0'").getResultJSONArray(0); - } else { - dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + iostorinv_id + "'").getResultJSONArray(0); - } - - for (int i = 0; i < dis_rows.size(); i++) { - JSONObject dis_row = dis_rows.getJSONObject(i); - String sect_code = dis_row.getString("sect_code"); - JSONObject sect_jo = WQLObject.getWQLObject("st_ivt_sectattr").query("sect_code = '" + sect_code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(sect_jo)) { - throw new BadRequestException("未查询到对应的库区!"); - } - //如果是虚拟区的出库,直接把包装关系删除;如果为立库的包装关系,将解绑删除标识置为1。当发货区解绑时,删除包装关系 - String pcsn = dis_row.getString("pcsn"); - if ("09".equals(sect_jo.getString("sect_type_attr"))) { - WQLObject.getWQLObject("pdm_bi_subpackagerelation").delete("container_name = '" + pcsn + "'"); - } else { - HashMap map = new HashMap<>(); - map.put("need_delete", "1"); - WQLObject.getWQLObject("pdm_bi_subpackagerelation").update(map, "container_name = '" + pcsn + "'"); - } - - } - } - - - /* - * 回传: - * 销售出库:sap、mes - * 改切出库:sap - */ - /*String isUpload = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("is_upload").getValue(); - if (StrUtil.equals(isUpload, "1")) { - String bill_type = jo_mst.getString("bill_type"); - // 销售出库 - if (StrUtil.equals(bill_type, "1001")) { - // 1.回传sap - JSONArray paramSapMstArr = new JSONArray(); - - JSONObject paramSapMst = new JSONObject(); - paramSapMst.put("ZACTION", "P"); - paramSapMst.put("BUDAT", jo_mst.getString("biz_date")); - paramSapMst.put("ZZYGYF", jo_mst.getString("estimated_freight")); - paramSapMst.put("ZZYFGY", jo_mst.getString("trans_code")); - - JSONArray paramDtlArr = new JSONArray(); - JSONArray dtlArr = wo_dtl.query("iostorinv_id = '" + jo_mst.getString("iostorinv_id") + "'").getResultJSONArray(0); - for (int i = 0; i < dtlArr.size(); i++) { - JSONArray paramDisArr = new JSONArray(); - JSONObject json = dtlArr.getJSONObject(i); - JSONObject jsonMater = materTab.query("material_id = '" + json.getString("material_id") + "'").uniqueResult(0); - - // 明细 - JSONObject jsonDtl = new JSONObject(); - jsonDtl.put("VBELN", json.getString("vbeln")); // 交货 - paramSapMst.put("VBELN", json.getString("vbeln")); // 主表交货 - jsonDtl.put("POSNR", json.getString("posnr")); // 项目 - jsonDtl.put("MATNR", jsonMater.getString("material_code")); - - // 分配明细 - JSONArray disArr = wo_dis.query("iostorinvdtl_id = '" + json.getString("iostorinvdtl_id") + "'").getResultJSONArray(0); - for (int j = 0; j < disArr.size(); j++) { - JSONObject json2 = disArr.getJSONObject(j); - JSONObject jsonDis = new JSONObject(); - - JSONObject jsonSect = sectTab.query("sect_id = '" + json2.getString("sect_id") + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonSect)) { - jsonDtl.put("LGORT", jsonSect.getString("ext_id")); // 明細储存地点 - } - - JSONObject jsonSub = subTab.query("container_name = '" + json2.getString("pcsn") + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonSub)) { - jsonDis.put("CHARG", jsonSub.getString("sap_pcsn")); // sap批次 - } - jsonDis.put("VBELN", json.getString("vbeln")); // 交货 - jsonDis.put("POSNR", json.getString("posnr")); // 项目 - jsonDis.put("LFIMG", json2.getString("real_qty")); - jsonDis.put("VRKME", json.getString("qty_unit_name")); - jsonDis.put("PIKMG", json2.getString("real_qty")); - jsonDis.put("VRKMP", json2.getString("qty_unit_name")); - paramDisArr.add(jsonDis); - } - jsonDtl.put("CHARG_T", paramDisArr); - paramDtlArr.add(jsonDtl); - } - paramSapMst.put("ITEM", paramDtlArr); - paramSapMstArr.add(paramSapMst); - - JSONObject param = new JSONObject(); - param.put("HEAD", paramSapMstArr); - - // 调用接口回传 - try { - new LmsToSapServiceImpl().returnDelivery(param); - } catch (Exception e) { - throw new BadRequestException("回传sap失败:"+e.getMessage()); - } - - // 2.回传mes - JSONObject paramMesMst = new JSONObject(); - String userName = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("MES_USERNAME").getValue(); - String passWord = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("MES_PASSWORD").getValue(); - - paramMesMst.put("UserName", userName); - paramMesMst.put("Password", passWord); - paramMesMst.put("OutboundOrderNum", jo_mst.getString("bill_code")); - paramMesMst.put("OutboundUser", jo_mst.getString("confirm_optname")); - paramMesMst.put("OutboundTime", jo_mst.getString("confirm_time")); - - JSONArray boxArr = WQL.getWO("ST_OUTIVT02").addParam("flag", "2") - .addParam("iostorinv_id", jo_mst.getString("iostorinv_id")) - .process().getResultJSONArray(0); - - JSONArray paramArr = new JSONArray(); - for (int i = 0; i < boxArr.size(); i++) { - JSONObject json = boxArr.getJSONObject(i); - JSONObject jsonBox = new JSONObject(); - - jsonBox.put("PackageBoxSN", json.getString("num")); - paramArr.add(jsonBox); - } - paramMesMst.put("item", paramArr); - - try { - // 调用接口回传 - new LmsToMesServiceImpl().childRollFGOutboundComplete(paramMesMst); - } catch (Exception e) { - throw new BadRequestException("回传mes失败:"+e.getMessage()); - } - - } - // 手工出库 - if (StrUtil.equals(bill_type, "1009")) { - // 1.回传sap - JSONArray paramSapMstArr = new JSONArray(); - - JSONObject paramSapMst = new JSONObject(); - paramSapMst.put("ZACTION", "R"); - paramSapMst.put("BUDAT", jo_mst.getString("biz_date")); - paramSapMst.put("ZZYGYF", jo_mst.getString("estimated_freight")); - paramSapMst.put("ZZYFGY", jo_mst.getString("trans_code")); - - String vbeln = ""; - - JSONArray paramDtlArr = new JSONArray(); - JSONArray dtlArr = wo_dtl.query("iostorinv_id = '" + jo_mst.getString("iostorinv_id") + "'").getResultJSONArray(0); - for (int i = 0; i < dtlArr.size(); i++) { - JSONArray paramDisArr = new JSONArray(); - JSONObject json = dtlArr.getJSONObject(i); - JSONObject jsonMater = materTab.query("material_id = '" + json.getString("material_id") + "'").uniqueResult(0); - - vbeln = json.getString("vbeln"); - - // 明细 - JSONObject jsonDtl = new JSONObject(); - jsonDtl.put("VBELN", json.getString("vbeln")); // 交货 - paramSapMst.put("VBELN", json.getString("vbeln")); // 主表交货 - jsonDtl.put("POSNR", json.getString("posnr")); // 项目 - jsonDtl.put("MATNR", jsonMater.getString("material_code")); - - // 分配明细 - JSONArray disArr = wo_dis.query("iostorinvdtl_id = '" + json.getString("iostorinvdtl_id") + "'").getResultJSONArray(0); - for (int j = 0; j < disArr.size(); j++) { - JSONObject json2 = disArr.getJSONObject(j); - JSONObject jsonDis = new JSONObject(); - - JSONObject jsonSect = sectTab.query("sect_id = '" + json2.getString("sect_id") + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonSect)) { - jsonDtl.put("LGORT", jsonSect.getString("ext_id")); // 明細储存地点 - } - - JSONObject jsonSub = subTab.query("container_name = '" + json2.getString("pcsn") + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonSub)) { - jsonDis.put("CHARG", jsonSub.getString("sap_pcsn")); // sap批次 - } - jsonDis.put("VBELN", json.getString("vbeln")); // 交货 - jsonDis.put("POSNR", json.getString("posnr")); // 项目 - jsonDis.put("LFIMG", json2.getString("real_qty")); - jsonDis.put("VRKME", json.getString("qty_unit_name")); - jsonDis.put("PIKMG", json2.getString("real_qty")); - jsonDis.put("VRKMP", json2.getString("qty_unit_name")); - paramDisArr.add(jsonDis); - } - jsonDtl.put("CHARG_T", paramDisArr); - paramDtlArr.add(jsonDtl); - } - paramSapMst.put("ITEM", paramDtlArr); - paramSapMstArr.add(paramSapMst); - - JSONObject param = new JSONObject(); - param.put("HEAD", paramSapMstArr); - - if (ObjectUtil.isNotEmpty(vbeln)) { - try { - // 调用接口回传 - new LmsToSapServiceImpl().returnDelivery(param); - } catch (Exception e) { - throw new BadRequestException("回传sap失败:"+e.getMessage()); - } - - } - } - - // 改切出库 - if (StrUtil.equals(bill_type, "1003")) { - JSONObject paramMst = new JSONObject(); - JSONArray paramArr = new JSONArray(); - - // 去除日期中的横杠、冒号、空格 - String biz_date = jo_mst.getString("biz_date"); - String response = biz_date.replaceAll("[[\\s-:punct:]]", ""); - - paramMst.put("BLDAT", response); // 去掉- - paramMst.put("BUDAT", response); // 去掉- - paramMst.put("BKTXT", jo_mst.getString("bill_code")); // 凭证抬头文本: 出库主表单据号 - paramMst.put("XBLNR", jo_mst.getString("input_optname")); // 参考:出库单创建人name - - JSONArray disArr = wo_dis.query("iostorinv_id = '" + jo_mst.getString("iostorinv_id") + "'").getResultJSONArray(0); - for (int i = 0; i < disArr.size(); i++) { - JSONObject json = disArr.getJSONObject(i); - JSONObject jsonMater = materTab.query("material_id = '" + json.getString("material_id") + "'").uniqueResult(0); - - JSONObject jsonDtl = new JSONObject(); - jsonDtl.put("RSPOS", i + 1); - jsonDtl.put("MATNR", jsonMater.getString("material_code")); - jsonDtl.put("BWART", "311"); - jsonDtl.put("MENGE", json.getDoubleValue("real_qty")); - jsonDtl.put("MEINS", json.getString("qty_unit_name")); - jsonDtl.put("WERKS", "2460"); - - JSONObject jsonSect = sectTab.query("sect_id = '" + json.getString("sect_id") + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonSect)) { - jsonDtl.put("LGORT", jsonSect.getString("ext_id")); // 库存地点:库区外部标识 - } - - JSONObject jsonSub = subTab.query("container_name = '" + json.getString("pcsn") + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonSub)) { - String sale_order_name = jsonSub.getString("sale_order_name"); - - // 销售订单:子卷包装关系 - 前内容 - jsonDtl.put("KDAUF", sale_order_name.substring(0, sale_order_name.indexOf("-"))); - // 销售订单行项目:子卷包装关系 - 后内容 - jsonDtl.put("KDPOS", sale_order_name.substring(sale_order_name.indexOf("-") + 1, sale_order_name.length())); - } - - jsonDtl.put("CHARG", json.getString("pcsn")); - jsonDtl.put("UMLGO", "AB01"); // 收货库存地点:线边库外部标识 - jsonDtl.put("UMCHA", json.getString("pcsn")); - paramArr.add(jsonDtl); - } - paramMst.put("T_ITEM", paramArr); - - try { - // 调用接口回传 - new LmsToSapServiceImpl().returnMoveDtl(paramMst); - } catch (Exception e) { - throw new BadRequestException("回传sap失败:"+e.getMessage()); - } - - //调用母卷配送到位接口 - JSONObject mes_jo = new JSONObject(); - - //查询该子卷对应的分切计划 - //JSONArray cut_rows = WQLObject.getWQLObject("") - JSONObject source_dtl = WQLObject.getWQLObject("st_ivt_iostorinvdtl").query("iostorinv_id = '"+iostorinv_id+"' AND IFNULL(source_billdtl_id,'') <> ''").uniqueResult(0); - mes_jo.put("container_name", source_dtl.getString("pcsn")); - mes_jo.put("package_box_sn", disArr.getJSONObject(0).getString("box_no")); - mes_jo.put("warehouse", "3"); - new LmsToMesServiceImpl().cutPlanMomRollDeliveryComplete(mes_jo); - } - - }*/ - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void confirmOrder(JSONObject form) { - //出库分配表 - WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - //出库明细表 - WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); - //出库主表 - WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - // 任务表 - WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); - // 子卷包装关系表 - WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); - //包装关系出入库记录表 - WQLObject sub_record = WQLObject.getWQLObject("pdm_bi_subpackagerelationrecord"); - - String iostorinv_id = form.getString("iostorinv_id"); - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - - //查询主表信息 - JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jo_mst)) { - throw new BadRequestException("未查到相关出库单"); - } - - //判断分配明细中是否有未生成状态的分配明细 - JSONArray disArr = wo_dis.query("iostorinv_id = '" + iostorinv_id + "' and work_status = '00'").getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(disArr)) { - throw new BadRequestException("有未生成状态的分配明细,不允许强制确认"); - } - - // 查询是否有未完成的任务 - List isTaskEmp = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParam("flag", "555") - .addParam("iostorinv_id", iostorinv_id) - .process() - .getResultJSONArray(0) - .toJavaList(JSONObject.class); - - if (ObjectUtil.isNotEmpty(isTaskEmp)) { - // 拼接字符串 - String box_no = isTaskEmp.stream() - .map(row -> row.getString("box_no")) - .distinct() - .collect(Collectors.joining(",")); - - throw new BadRequestException("请先完成载具对应的出库任务:" + box_no); - } - - //查询生成和未分配完的明细 - JSONArray dtls = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParam("flag", "2") - .addParam("bill_status", "50") - .addParam("iostorinv_id", iostorinv_id) - .process() - .getResultJSONArray(0); - - if (dtls.size() != 0) { - for (int i = 0; i < dtls.size(); i++) { - JSONObject dtl = dtls.getJSONObject(i); - HashMap map_dtl = new HashMap<>(); - //更新明细状态 - map_dtl.put("bill_status", "99"); - wo_dtl.update(map_dtl, "iostorinvdtl_id='" + dtl.getString("iostorinvdtl_id") + "'"); - } - } - - HashMap map_mst = new HashMap<>(); - map_mst.put("bill_status", "99"); - map_mst.put("confirm_optid", currentUserId + ""); - map_mst.put("confirm_optname", nickName); - map_mst.put("confirm_time", now); - //更新主表状态 - wo_mst.update(map_mst, "iostorinv_id = '" + iostorinv_id + "'"); - - //查询需要更新库存的分配记录 - JSONArray diss = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParam("flag", "55") - .addParam("iostorinv_id", iostorinv_id) - .process() - .getResultJSONArray(0); - for (int i = 0; i < diss.size(); i++) { - JSONObject dis = diss.getJSONObject(i); - // 判断是否是主存区的仓位, 是否发超期 - if ("ZC01,ZZ01".contains(dis.getString("sect_code"))) { - - if (jo_mst.getString("is_overdue").equals("1")) { - // 不发超期 - if (!dis.getString("is_overdue").equals("1")) { - continue; - } - } else { - continue; - } - } - - double plan_qty = dis.getDoubleValue("plan_qty"); - double real_qty = dis.getDoubleValue("real_qty"); - //未出部分,按取消分配处理 - if (Double.compare(real_qty, plan_qty) != 0) { - dis.put("change_qty", plan_qty - real_qty); - dis.put("bill_type_scode", jo_mst.getString("bill_type")); - dis.put("inv_id", iostorinv_id); - dis.put("bill_code", jo_mst.getString("bill_code")); - dis.put("bill_table", "ST_IVT_IOStorInv"); - storPublicService.IOStor(dis, "12"); - } - //更新已出库重量 - if (real_qty != 0) { - dis.put("change_qty", real_qty); - dis.put("bill_type_scode", jo_mst.getString("bill_type")); - dis.put("inv_id", iostorinv_id); - dis.put("bill_code", jo_mst.getString("bill_code")); - dis.put("bill_table", "ST_IVT_IOStorInv"); - - if (jo_mst.getString("is_overdue").equals("1")) { - if (dis.getString("is_overdue").equals("1")) { - storPublicService.IOStor(dis, "12"); - } else { - storPublicService.IOStor(dis, "21"); - } - } else { - storPublicService.IOStor(dis, "21"); - } - } - - // 更新分配明细执行状态为 - 99 - JSONObject jsonDis = wo_dis.query("iostorinvdis_id = '" + dis.getString("iostorinvdis_id") + "'").uniqueResult(0); - jsonDis.put("work_status", "99"); - wo_dis.update(jsonDis); - - if (jo_mst.getString("is_overdue").equals("1")) { - if (dis.getString("is_overdue").equals("1")) { - // 解锁起点 - JSONObject from_start = new JSONObject(); - from_start.put("struct_id", dis.getString("struct_id")); - from_start.put("lock_type", "1"); - from_start.put("is_overdue", dis.getString("is_overdue")); - from_start.put("storagevehicle_code", dis.getString("box_no")); - storPublicService.updateStructAndPoint(from_start); - - continue; - } - } - - // 更新子卷包装关系表 状态 - 3 - JSONObject jsonSub = subTab.query("container_name = '" + dis.getString("pcsn") + "' and package_box_sn = '" + dis.getString("box_no") + "' and status = '2'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonSub)) - //查询对应的包装关系出入库记录表 - { - jsonSub = sub_record.query("container_name = '" + dis.getString("pcsn") + "' and package_box_sn = '" + dis.getString("box_no") + "' and status = '2' AND bill_code = '" + jo_mst.getString("bill_code") + "'").uniqueResult(0); - } - if (ObjectUtil.isEmpty(jsonSub)) { - throw new BadRequestException("此子卷不存在或不为入库状态:" + dis.getString("pcsn")); - - } - // 如果是拆分入库则将包装关系改为生成状态 - if ("1005".equals(jo_mst.getString("bill_type")) || ("1009".equals(jo_mst.getString("bill_type")))) { - jsonSub.put("status", "0"); - } else { - jsonSub.put("status", "3"); - } - - if (jo_mst.getString("bill_type").equals("1011")) { - // 更新子卷包装净重 - double net_weight = NumberUtil.sub(jsonSub.getDoubleValue("net_weight"), plan_qty); - jsonSub.put("net_weight",net_weight); - - if (net_weight <= 0) { - jsonSub.put("status","3"); - } else { - jsonSub.put("status","2"); - } - } - - subTab.update(jsonSub); - - // 解锁起点 - JSONObject from_start = new JSONObject(); - from_start.put("struct_id", dis.getString("struct_id")); - from_start.put("lock_type", "1"); - from_start.put("is_overdue", dis.getString("is_overdue")); - - if (jo_mst.getString("is_overdue").equals("1")) { - if (dis.getString("is_overdue").equals("1")) { - from_start.put("storagevehicle_code", dis.getString("box_no")); - } else { - from_start.put("storagevehicle_code", ""); - } - } else { - from_start.put("storagevehicle_code", ""); - } - - if (jo_mst.getString("bill_type").equals("1011")) { - // 判断此木箱下的所有子卷净重是否为0,如果为0则清空载具 - List packageList = subTab.query("package_box_sn = '" + jsonSub.getString("package_box_sn") + "'") - .getResultJSONArray(0).toJavaList(JSONObject.class); - - boolean is_zero = packageList.stream() - .allMatch(row -> row.getDoubleValue("net_weight") <= 0); - - if (is_zero) { - from_start.put("storagevehicle_code", ""); - } else { - from_start.put("bill_type","1011"); - from_start.put("storagevehicle_code", jsonSub.getString("package_box_sn")); - } - } - - storPublicService.updateStructAndPoint(from_start); - - //插入包装关系出入库记录表 - jsonSub.put("bill_code", jo_mst.getString("bill_code")); - jsonSub.put("bill_id", jo_mst.getString("iostorinv_id")); - jsonSub.put("bill_type", jo_mst.getString("bill_type")); - jsonSub.put("io_type", "1"); - jsonSub.put("insert_time", DateUtil.now()); - jsonSub.put("record_id", IdUtil.getSnowflake(1, 1).nextId()); - sub_record.insert(jsonSub); - - // 更新对应任务为完成 - JSONObject jsonTask = taskTab.query("task_id = '" + jsonDis.getString("task_id") + "' and task_status < '07'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonTask)) { - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskTab.update(jsonTask); - } - - } - - JSONObject out_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - if ("1004".equals(out_jo.getString("bill_type"))) { - //调拨出库自动生成调拨入库单 - WQLObject dtl_wql = WQLObject.getWQLObject("st_ivt_iostorinvdtl"); - WQLObject mst_wql = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - WQLObject dis_wql = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - - //校验主表状态为生成 - if (!"99".equals(out_jo.getString("bill_status"))) { - throw new BadRequestException("主表状态必须为完成!"); - } - - JSONObject mst_row = mst_wql.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - - JSONArray dis_rows = new JSONArray(); - - if (jo_mst.getString("is_overdue").equals("1")) { - dis_rows = dis_wql.query("iostorinv_id = '" + iostorinv_id + "' and is_overdue = '0'").getResultJSONArray(0); - } else { - dis_rows = dis_wql.query("iostorinv_id = '" + iostorinv_id + "'").getResultJSONArray(0); - } - - //生成手工入库单 - String new_iostorinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - String bill_code = CodeUtil.getNewCode("IO_CODE"); - jo_mst.put("iostorinv_id", new_iostorinv_id); - jo_mst.put("bill_code", bill_code); - jo_mst.put("io_type", "0"); - jo_mst.put("bill_type", "0004"); - jo_mst.put("buss_type", ((String) jo_mst.get("bill_type")).substring(0, 4)); - //查询移入仓库的信息 - JSONObject in_stor = WQLObject.getWQLObject("st_ivt_bsrealstorattr").query("stor_id = '" + out_jo.getString("out_stor_id") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(in_stor)) { - throw new BadRequestException("未查询到对应的移入仓库信息!"); - } - jo_mst.put("stor_id", in_stor.getString("stor_id")); - jo_mst.put("stor_code", in_stor.getString("stor_code")); - jo_mst.put("stor_name", in_stor.getString("stor_name")); - jo_mst.put("bill_status", "30"); - jo_mst.put("input_optid", currentUserId + ""); - jo_mst.put("input_optname", nickName); - jo_mst.put("input_time", now); - jo_mst.put("update_optid", currentUserId + ""); - jo_mst.put("update_optname", nickName); - jo_mst.put("update_time", now); - jo_mst.put("out_stor_id", out_jo.getString("stor_id")); - - double total_qty = 0.00; - for (int i = 0; i < dis_rows.size(); i++) { - //插入明细表 - String iostorinvdtl_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - JSONObject dis_row = dis_rows.getJSONObject(i); - //查询对应的出库单明细 - JSONObject dtl_row = dtl_wql.query("iostorinvdtl_id = '" + dis_row.getString("iostorinvdtl_id") + "'").uniqueResult(0); - dis_row.put("iostorinvdtl_id", iostorinvdtl_id); - dis_row.put("iostorinv_id", new_iostorinv_id); - dis_row.put("seq_no", i + 1); - dis_row.put("bill_status", "30"); - dis_row.put("real_qty", "0"); - dis_row.put("vbeln", dtl_row.getString("vbeln")); - dis_row.put("source_billdtl_id", dtl_row.getString("iostorinvdtl_id")); - dis_row.put("source_bill_type", mst_row.getString("bill_type")); - dis_row.put("source_bill_code", dtl_row.getString("source_bill_code")); - dis_row.put("source_bill_table", "ST_IVT_IOStorInvDtl"); - dis_row.put("assign_qty", dis_row.getString("plan_qty")); - dis_row.put("unassign_qty", "0"); - //插入调拨明细表 - dtl_wql.insert(dis_row); - - dis_row.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId()); - dis_row.put("seq_no", 1); - dis_row.put("sect_id", ""); - dis_row.put("sect_code", ""); - dis_row.put("sect_name", ""); - dis_row.put("struct_id", ""); - dis_row.put("struct_code", ""); - dis_row.put("struct_name", ""); - dis_row.put("work_status", "00"); - dis_row.put("real_qty", "0"); - dis_row.put("point_id", ""); - dis_row.put("task_id", ""); - //插入分配表 - dis_wql.insert(dis_row); - - total_qty = NumberUtil.add(total_qty,dis_row.getDoubleValue("plan_qty")); - - //将包装关系中对应的记录状态改为包装 - HashMap map = new HashMap<>(); - map.put("status", "1"); - WQLObject.getWQLObject("PDM_BI_SubPackageRelation").update(map, "package_box_SN = '" + dis_row.getString("box_no") + "' AND status = '3'"); - } - - // 查询所有明细并计算实际重量 - List dtlList = dtl_wql.query("iostorinv_id = '" + iostorinv_id + "'") - .getResultJSONArray(0).toJavaList(JSONObject.class); - - double assign_qty = dtlList.stream() - .map(row -> row.getDoubleValue("assign_qty")) - .reduce(Double::sum).orElse(0.00); - - jo_mst.put("detail_count", dis_rows.size()); - // jo_mst.put("total_qty", total_qty); - jo_mst.put("total_qty", assign_qty); - mst_wql.insert(jo_mst); - } - - if ("1003".equals(out_jo.getString("bill_type")) || "1006".equals(out_jo.getString("bill_type"))) { - //如果为返检出库或者改切出库删除对应的包装关系 - JSONArray dis_rows = new JSONArray(); - if (jo_mst.getString("is_overdue").equals("1")) { - dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + iostorinv_id + "' and is_overdue = '0'").getResultJSONArray(0); - } else { - dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + iostorinv_id + "'").getResultJSONArray(0); - } - - for (int i = 0; i < dis_rows.size(); i++) { - JSONObject dis_row = dis_rows.getJSONObject(i); - String sect_code = dis_row.getString("sect_code"); - JSONObject sect_jo = WQLObject.getWQLObject("st_ivt_sectattr").query("sect_code = '" + sect_code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(sect_jo)) { - throw new BadRequestException("未查询到对应的库区!"); - } - //如果是虚拟区的出库,直接把包装关系删除;如果为立库的包装关系,将解绑删除标识置为1。当发货区解绑时,删除包装关系 - String pcsn = dis_row.getString("pcsn"); - if ("09".equals(sect_jo.getString("sect_type_attr"))) { - WQLObject.getWQLObject("pdm_bi_subpackagerelation").delete("container_name = '" + pcsn + "'"); - } else { - HashMap map = new HashMap<>(); - map.put("need_delete", "1"); - WQLObject.getWQLObject("pdm_bi_subpackagerelation").update(map, "container_name = '" + pcsn + "'"); - } - - } - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void issueTask(JSONObject whereJson) { - //任务表 - WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); - - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - - JSONObject jsonTask = wo_Task.query("task_id = '" + whereJson.getString("task_id") + "'").uniqueResult(0); - - // 调用出库任务类下发任务 - new OutTask().immediateNotifyAcs(jsonTask.getString("task_id")); - - // 更新任务状态为下发 - jsonTask.put("task_status", TaskStatusEnum.ISSUE.getCode()); - jsonTask.put("update_optid", currentUserId); - jsonTask.put("update_optname", nickName); - jsonTask.put("update_time", now); - wo_Task.update(jsonTask); - - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void finishTask(JSONObject whereJson) { - //出库分配表 - WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - //出库明细表 - WQLObject wo_dtl = WQLObject.getWQLObject("st_ivt_iostorinvdtl"); - //出库主表 - WQLObject wo_mst = WQLObject.getWQLObject("st_ivt_iostorinv"); - //任务表 - WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); - //子卷包装关系表 - WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); - //包装关系出入库记录表 - WQLObject sub_record = WQLObject.getWQLObject("pdm_bi_subpackagerelationrecord"); - - // 查询任务对应的分配明细 - JSONArray disJsonArr = WQL.getWO("QST_IVT_CHECKOUTBILL") - .addParam("flag", "55") - .addParam("task_id", whereJson.getString("task_id")) - .process().getResultJSONArray(0); - - // 查询主表 - JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + disJsonArr.getJSONObject(0).getString("iostorinv_id") + "'").uniqueResult(0); - String iostorinv_id = jo_mst.getString("iostorinv_id"); - - for (int i = 0; i < disJsonArr.size(); i++) { - JSONObject dis = disJsonArr.getJSONObject(i); - - double plan_qty = dis.getDoubleValue("plan_qty"); - double real_qty = dis.getDoubleValue("real_qty"); - - //未出部分,按取消分配处理 - if (Double.compare(real_qty, plan_qty) != 0) { - dis.put("change_qty", plan_qty - real_qty); - dis.put("bill_type_scode", jo_mst.getString("bill_type")); - dis.put("inv_id", iostorinv_id); - dis.put("bill_code", jo_mst.getString("bill_code")); - dis.put("bill_table", "ST_IVT_IOStorInv"); - storPublicService.IOStor(dis, "12"); - } - //更新已出库重量 - if (real_qty != 0) { - dis.put("change_qty", real_qty); - dis.put("bill_type_scode", jo_mst.getString("bill_type")); - dis.put("inv_id", iostorinv_id); - dis.put("bill_code", jo_mst.getString("bill_code")); - dis.put("bill_table", "ST_IVT_IOStorInv"); - - if (jo_mst.getString("is_overdue").equals("1")) { - if (dis.getString("is_overdue").equals("1")) { - storPublicService.IOStor(dis, "12"); - } else { - storPublicService.IOStor(dis, "21"); - } - } else { - storPublicService.IOStor(dis, "21"); - } - } - - // 更新分配明细执行状态为 - 99 - JSONObject jsonDis = wo_dis.query("iostorinvdis_id = '" + dis.getString("iostorinvdis_id") + "'").uniqueResult(0); - jsonDis.put("work_status", "99"); - wo_dis.update(jsonDis); - - if (jo_mst.getString("is_overdue").equals("1")) { - if (dis.getString("is_overdue").equals("1")) { - continue; - } - } - - // 更新子卷包装关系表 状态 - 3 - JSONObject jsonSub = subTab.query("container_name = '" + dis.getString("pcsn") + "' and package_box_sn = '" + dis.getString("box_no") + "' and status = '2'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonSub)) - //查询对应的包装关系出入库记录表 - { - jsonSub = sub_record.query("container_name = '" + dis.getString("pcsn") + "' and package_box_sn = '" + dis.getString("box_no") + "' and status = '2' AND bill_code = '" + jo_mst.getString("bill_code") + "'").uniqueResult(0); - } - if (ObjectUtil.isEmpty(jsonSub)) { - throw new BadRequestException("此子卷不存在或不为入库状态:" + dis.getString("pcsn")); - - } - // 如果是拆分入库则将包装关系改为生成状态 - if ("1005".equals(jo_mst.getString("bill_type")) || ("1009".equals(jo_mst.getString("bill_type")))) { - jsonSub.put("status", "0"); - } else { - jsonSub.put("status", "3"); - } - - if (jo_mst.getString("bill_type").equals("1011")) { - // 更新子卷包装净重 - double net_weight = NumberUtil.sub(jsonSub.getDoubleValue("net_weight"), plan_qty); - jsonSub.put("net_weight",net_weight); - - if (net_weight <= 0) { - jsonSub.put("status","3"); - } else { - jsonSub.put("status","2"); - } - } - - subTab.update(jsonSub); - - - if ("1003".equals(jo_mst.getString("bill_type")) || "1006".equals(jo_mst.getString("bill_type"))) { - //如果为返检出库或者改切出库删除对应的包装关系 - JSONArray dis_rows = new JSONArray(); - if (jo_mst.getString("is_overdue").equals("1")) { - dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + iostorinv_id + "' and is_overdue = '0' and box_no = '"+jsonSub.getString("package_box_sn")+"'").getResultJSONArray(0); - } else { - - dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + iostorinv_id + "' and box_no = '"+jsonSub.getString("package_box_sn")+"'").getResultJSONArray(0); - } - - for (int j = 0; j < dis_rows.size(); j++) { - JSONObject dis_row = dis_rows.getJSONObject(j); - String sect_code = dis_row.getString("sect_code"); - JSONObject sect_jo = WQLObject.getWQLObject("st_ivt_sectattr").query("sect_code = '" + sect_code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(sect_jo)) { - throw new BadRequestException("未查询到对应的库区!"); - } - //如果是虚拟区的出库,直接把包装关系删除;如果为立库的包装关系,将解绑删除标识置为1。当发货区解绑时,删除包装关系 - String pcsn = dis_row.getString("pcsn"); - if ("09".equals(sect_jo.getString("sect_type_attr"))) { - WQLObject.getWQLObject("pdm_bi_subpackagerelation").delete("container_name = '" + pcsn + "'"); - } else { - HashMap map = new HashMap<>(); - map.put("need_delete", "1"); - WQLObject.getWQLObject("pdm_bi_subpackagerelation").update(map, "container_name = '" + pcsn + "'"); - } - - } - } - - // 解锁起点 - JSONObject from_start = new JSONObject(); - from_start.put("struct_id", dis.getString("struct_id")); - from_start.put("lock_type", "1"); - from_start.put("is_overdue", dis.getString("is_overdue")); - - if (jo_mst.getString("is_overdue").equals("1")) { - if (dis.getString("is_overdue").equals("1")) { - from_start.put("storagevehicle_code", dis.getString("box_no")); - } else { - from_start.put("storagevehicle_code", ""); - } - } else { - from_start.put("storagevehicle_code", ""); - } - - if (jo_mst.getString("bill_type").equals("1011")) { - // 判断此木箱下的所有子卷净重是否为0,如果为0则清空载具 - List packageList = subTab.query("package_box_sn = '" + jsonSub.getString("package_box_sn") + "'") - .getResultJSONArray(0).toJavaList(JSONObject.class); - - boolean is_zero = packageList.stream() - .allMatch(row -> row.getDoubleValue("net_weight") <= 0); - - if (is_zero) { - from_start.put("storagevehicle_code", ""); - } else { - from_start.put("bill_type","1011"); - from_start.put("storagevehicle_code", jsonSub.getString("package_box_sn")); - } - } - - storPublicService.updateStructAndPoint(from_start); - - //插入包装关系出入库记录表 - jsonSub.put("bill_code", jo_mst.getString("bill_code")); - jsonSub.put("bill_id", jo_mst.getString("iostorinv_id")); - jsonSub.put("bill_type", jo_mst.getString("bill_type")); - jsonSub.put("io_type", "1"); - jsonSub.put("insert_time", DateUtil.now()); - jsonSub.put("record_id", IdUtil.getSnowflake(1, 1).nextId()); - sub_record.insert(jsonSub); - - } - - HashMap map = new HashMap<>(); - map.put("task_status", TaskStatusEnum.FINISHED.getCode()); - map.put("finished_type", "01"); - map.put("update_optid", SecurityUtils.getCurrentUserId() + ""); - map.put("update_optname", SecurityUtils.getCurrentNickName()); - map.put("update_time", DateUtil.now()); - - //更新任务为完成 - wo_Task.update(map, "task_id='" + whereJson.getString("task_id") + "'"); - - // 查询此任务下所有的分配明细 - JSONArray disArr = wo_dis.query("task_id='" + whereJson.getString("task_id") + "'").getResultJSONArray(0); - for (int i = 0; i < disArr.size(); i++) { - JSONObject json = disArr.getJSONObject(i); - // 更新分配明细为完成 - json.put("work_status", "99"); - wo_dis.update(json); - - // 判断此明细下是否还有未完成的分配明细 - JSONObject jsonDtl = wo_dtl.query("iostorinvdtl_id = '" + json.getString("iostorinvdtl_id") + "'").uniqueResult(0); - JSONArray disArr2 = wo_dis.query("iostorinvdtl_id = '" + jsonDtl.getString("iostorinvdtl_id") + "' and work_status <> '99'").getResultJSONArray(0); - if (ObjectUtil.isEmpty(disArr2)) { - // 更新明细为完成 - jsonDtl.put("bill_status", "99"); - wo_dtl.update(jsonDtl); - } - } - - //判断是否还有未完成的明细 - JSONArray ja = wo_dtl.query("bill_status<>'99' and iostorinv_id='" + disArr.getJSONObject(0).getString("iostorinv_id") + "'").getResultJSONArray(0); - if (ja.size() == 0) { - this.confirmOrder(jo_mst); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void cancleTaskfinish(JSONObject whereJson) { - //出库明细表 - WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); - //出库分配表 - WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); - //任务表 - WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); - //出库主表 - WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - - String iostorinv_id = whereJson.getString("iostorinv_id"); - String task_id = whereJson.getString("task_id"); - - // 更新任务状态 - JSONObject jsonTask = wo_Task.query("task_id ='" + task_id + "'").uniqueResult(0); - jsonTask.put("task_status", TaskStatusEnum.ISSUE.getCode()); - jsonTask.put("update_optid", currentUserId); - jsonTask.put("update_optname", nickName); - jsonTask.put("update_time", now); - wo_Task.update(jsonTask); - - //查询主表信息 - JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jo_mst)) { - throw new BadRequestException("未查到相关出库单"); - } - - if ("99".equals(jo_mst.getString("bill_status"))) { - throw new BadRequestException("已完成单据不允许取消完成!"); - } - - // 查询此任务下的所有分配明细 - JSONArray disArr = wo_dis.query("task_id ='" + task_id + "'").getResultJSONArray(0); - - for (int i = 0; i < disArr.size(); i++) { - JSONObject jsonDis = disArr.getJSONObject(i); - - // 更新分配明细状态 - jsonDis.put("work_status", "01"); - wo_dis.update(jsonDis); - - // 更新明细状态 - JSONObject jsonDtl = wo_dtl.query("iostorinvdtl_id = '" + jsonDis.getString("iostorinvdtl_id") + "'").uniqueResult(0); - jsonDtl.put("bill_status", "40"); - } - } - - @Override - public JSONArray getInvTypes() { - //查询单据字段类型 - JSONArray ja = WQL.getWO("ST_PUB_QUERY_01") - .addParam("flag", "4") - .process() - .getResultJSONArray(0); - return ja; - } - - @Override - public JSONObject getParamByCodeType(JSONObject form) { - String bill_type = form.getString("bill_type"); - if (StrUtil.isEmpty(bill_type)) { - throw new BadRequestException("出库单类型不能为空!"); - } - Map whereJson = new HashMap(); - String io_flag = form.getString("io_flag"); - whereJson.put("io_code", bill_type.substring(0, 4)); - whereJson.put("io_flag", "01"); - if (StrUtil.isNotEmpty(bill_type)) { - whereJson.put("io_flag", io_flag); - } - JSONArray ja = null; - JSONObject ret = new JSONObject(); - if (ja.size() != 0) { - for (int i = 0; i < ja.size(); i++) { - JSONObject jo = ja.getJSONObject(i); - if (bill_type.equals(jo.getString("code"))) { - ret = jo; - break; - } - } - } else { - throw new BadRequestException("出库类型系统参数查询失败!"); - } - return ret; - } - - @Override - public JSONArray schAreaType(JSONObject form) { - String ids = form.getString("ids"); - //查询单据字段类型 - JSONArray ja = WQL.getWO("ST_PUB_QUERY_01") - .addParam("flag", "5") - .addParam("ids", ids) - .process() - .getResultJSONArray(0); - return ja; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void backConfirm(JSONObject whereJson) { - WQLObject dtl_wql = WQLObject.getWQLObject("st_ivt_iostorinvdtl"); - WQLObject mst_wql = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - - JSONObject mst_row = mst_wql.query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "'").uniqueResult(0); - //校验主表状态为生成 - String bill_status = mst_row.getString("bill_status"); - if (!"10".equals(bill_status)) { - throw new BadRequestException("主表状态必须为生成状态!"); - } - JSONArray dtl_rows = dtl_wql.query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "'").getResultJSONArray(0); - - //生成手工入库库单 - String iostorinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - String bill_code = CodeUtil.getNewCode("IO_CODE"); - - for (int i = 0; i < dtl_rows.size(); i++) { - JSONObject dtl_row = dtl_rows.getJSONObject(i); - dtl_row.put("source_billdtl_id", dtl_row.getString("iostorinvdtl_id")); - dtl_row.put("source_bill_type", mst_row.getString("bill_type")); - dtl_row.put("source_bill_code", mst_row.getString("bill_code")); - dtl_row.put("source_bill_table", "ST_IVT_IOStorInvDtl"); - dtl_row.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId()); - dtl_row.put("iostorinv_id", iostorinv_id); - dtl_wql.insert(dtl_row); - } - - mst_row.put("iostorinv_id", iostorinv_id); - mst_row.put("bill_code", bill_code); - mst_row.put("io_type", "0"); - mst_row.put("bill_type", "000401"); - mst_row.put("buss_type", ((String) mst_row.get("bill_type")).substring(0, 4)); - mst_wql.insert(mst_row); - - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - JSONObject mst_row2 = mst_wql.query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "'").uniqueResult(0); - - mst_row2.put("bill_status", "99"); - mst_row2.put("confirm_optid", currentUserId); - mst_row2.put("confirm_optname", nickName); - mst_row2.put("confirm_time", now); - //更新主表状态为99 - mst_wql.update(mst_row2); - - HashMap map = new HashMap<>(); - map.put("bill_status", "99"); - dtl_wql.update(map, "iostorinv_id = '" + whereJson.get("iostorinv_id") + "'"); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public JSONArray getType() { - JSONArray jsonArr = WQL.getWO("QST_IVT_CHECKOUTBILL").addParam("flag", "11").process().getResultJSONArray(0); - return jsonArr; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void moneySubmit(JSONObject whereJson) { - WQLObject mstTab = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - mstTab.update(whereJson); - - // 回传sap - JSONObject jsonMst = mstTab.query("iostorinv_id = '" + whereJson.getString("iostorinv_id") + "'").uniqueResult(0); - - // 判断单据是否是完成状态:只回传完成状态的单据 - if (jsonMst.getString("bill_status").equals("99")) { - if (!jsonMst.getString("upload_sap").equals("1")) { - JSONArray jsonArr = new JSONArray(); - jsonArr.add(jsonMst); - - JSONObject param = new JSONObject(); - param.put("rows", jsonArr); - inAndOutReturnService.uploadSAP(param); - } - } - } - - @Override - public void downloadExcel(HttpServletResponse response, Map whereJson) throws IOException { - - WQLObject custTab = WQLObject.getWQLObject("MD_CS_CustomerBase"); // 客户基本信息表 - WQLObject mstTab = WQLObject.getWQLObject("ST_IVT_IOStorInv"); // 出入库主表 - WQLObject dtlTab = WQLObject.getWQLObject("st_ivt_iostorinvdtl"); // 出入库明细表 - WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); // 子卷包装关系表 - WQLObject tranTab = WQLObject.getWQLObject("MD_CS_TransportationBase"); // 物流公司表 - WQLObject storTab = WQLObject.getWQLObject("st_ivt_bsrealstorattr"); // 实物仓库表 - - - JSONObject jsonMst = mstTab.query("iostorinv_id = '" + MapUtil.getStr(whereJson, "iostorinv_id") + "'").uniqueResult(0); - String cust_code = jsonMst.getString("cust_code"); - - JSONObject jsonCust = custTab.query("cust_code = '" + cust_code + "'").uniqueResult(0); - String bill_type = jsonMst.getString("bill_type"); - - int j = Integer.parseInt((String) whereJson.get("j")); - - HashMap oneMap = new HashMap<>(); - // 2.获取输出流 - ServletOutputStream outputStream = response.getOutputStream(); - String code_template = ""; - int shd_dtl_num = 0; // 送货单明细数 - - // 调拨发货单 - if (StrUtil.equals(bill_type, "1004") || StrUtil.equals(bill_type, "1009")) { - shd_dtl_num = 44; - //1.获取系统参数模板地址 - code_template = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("allot_order").getValue(); - - // 5.单组填充 - JSONObject jsonDtl = dtlTab.query("iostorinv_id = '" + jsonMst.getString("iostorinv_id") + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonDtl) && StrUtil.equals(bill_type, "1004")) { - // 调拨单号 - oneMap.put("vbeln", jsonMst.getString("bill_code")); - // 调出仓库 - oneMap.put("out_stor", jsonMst.getString("stor_code")); - // 调入仓库 - JSONObject jsonStor = storTab.query("stor_id = '" + jsonMst.getString("out_stor_id") + "'").uniqueResult(0); - oneMap.put("in_stor", jsonStor.getString("stor_code")); - - } - String pageNow = String.valueOf(j + 1); // 页码 - oneMap.put("page", pageNow + "/" + MapUtil.getStr(whereJson, "pageNum")); - oneMap.put("consignee", jsonMst.getString("consignee")); // 收货单位 - oneMap.put("receiver", jsonMst.getString("receiver")); // 收货人 - String receiptaddress = jsonMst.getString("receiptaddress"); - oneMap.put("receiptaddress", receiptaddress); // 收货地址 - oneMap.put("receiptphone", jsonMst.getString("receiptphone")); // 收货人联系电话 - // 物流公司 - JSONObject jsonTran = tranTab.query("cust_code = '" + jsonMst.getString("trans_code") + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonTran)) { - oneMap.put("logisticscompany", jsonTran.getString("cust_name")); - } - oneMap.put("drivername", jsonMst.getString("drivername")); // 司机 - oneMap.put("carno", jsonMst.getString("carno")); // 车牌号 - oneMap.put("driverphone", jsonMst.getString("driverphone")); // 司机联系电话 - // 总箱数 - JSONArray jsonAllBox = WQL.getWO("ST_OUTIVT02").addParam("flag", "4").addParam("iostorinv_id", MapUtil.getStr(whereJson, "iostorinv_id")).process().getResultJSONArray(0); - oneMap.put("all_box", jsonAllBox.size()); - // 总毛重 - double all_box_qty = 0; - for (int t = 0; t < jsonAllBox.size(); t++) { - JSONObject json = jsonAllBox.getJSONObject(t); - all_box_qty = NumberUtil.add(all_box_qty, json.getDoubleValue("box_qty")); - } - oneMap.put("all_box_qty", NumberUtil.round(all_box_qty, 2).toString()); - oneMap.put("deliveryaddress", jsonMst.getString("deliveryaddress")); // 送货方地址 - oneMap.put("deliveryname", jsonMst.getString("deliveryname")); // 送货方联系人 - oneMap.put("deliveryphone", jsonMst.getString("deliveryphone")); // 送货方联系电话 - oneMap.put("contractno", jsonMst.getString("contractno")); // 合同号 - } else { - - if (ObjectUtil.isEmpty(jsonCust)) { - shd_dtl_num = 44; - //1.根据出入库主表中 收货单位 查询客户表中的模板路径 - code_template = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("PRINT_TEMPLE").getValue(); - - } else { - shd_dtl_num = jsonCust.getIntValue("shd_dtl_num"); - - if (ObjectUtil.isEmpty(shd_dtl_num)) { - throw new BadRequestException("客户编码:"+cust_code+",送货单明细数未配置,请先去配置!"); - } - //1.根据出入库主表中 收货单位 查询客户表中的模板路径 - code_template = jsonCust.getString("shd_print_no"); - - if (StrUtil.isEmpty(code_template)) { - throw new BadRequestException("客户编码:"+cust_code+",送货单打印模板号未配置,请先去配置!"); - } - } - - JSONObject jsonDtl = dtlTab.query("iostorinv_id = '" + jsonMst.getString("iostorinv_id") + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonDtl)) { - // 送货单号 - oneMap.put("vbeln", jsonDtl.getString("vbeln")); - // 订单号 - String source_bill_code = jsonDtl.getString("source_bill_code"); - if (ObjectUtil.isNotEmpty(source_bill_code)) { - try { - oneMap.put("order_no", source_bill_code.substring(0, source_bill_code.indexOf("-"))); - } catch (Exception e) { - oneMap.put("order_no", source_bill_code); - } - } - } - String pageNow = String.valueOf(j + 1); // 页码 - oneMap.put("page", pageNow + "/" + MapUtil.getStr(whereJson, "pageNum")); - oneMap.put("consignee", jsonMst.getString("consignee")); // 收货单位 - oneMap.put("receiver", jsonMst.getString("receiver")); // 收货人 - String receiptaddress = jsonMst.getString("receiptaddress"); - /* StrBuilder strBuilder = new StrBuilder(receiptaddress); - - if (receiptaddress.length() > 10) { - strBuilder.insert(11,"\n"); - }*/ - oneMap.put("receiptaddress", receiptaddress); // 收货地址 - oneMap.put("receiptphone", jsonMst.getString("receiptphone")); // 收货人联系电话 - // 物流公司 - JSONObject jsonTran = tranTab.query("cust_code = '" + jsonMst.getString("trans_code") + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonTran)) { - oneMap.put("logisticscompany", jsonTran.getString("cust_name")); - } - oneMap.put("drivername", jsonMst.getString("drivername")); // 司机 - oneMap.put("carno", jsonMst.getString("carno")); // 车牌号 - oneMap.put("driverphone", jsonMst.getString("driverphone")); // 司机联系电话 - // 总箱数 - JSONArray jsonAllBox = WQL.getWO("ST_OUTIVT02").addParam("flag", "4").addParam("iostorinv_id", MapUtil.getStr(whereJson, "iostorinv_id")).process().getResultJSONArray(0); - oneMap.put("all_box", jsonAllBox.size()); - // 总毛重 - double all_box_qty = 0; - for (int t = 0; t < jsonAllBox.size(); t++) { - JSONObject json = jsonAllBox.getJSONObject(t); - all_box_qty = NumberUtil.add(all_box_qty, json.getDoubleValue("box_qty")); - } - oneMap.put("all_box_qty", NumberUtil.round(all_box_qty, 2).toString()); - oneMap.put("deliveryaddress", jsonMst.getString("deliveryaddress")); // 送货方地址 - oneMap.put("deliveryname", jsonMst.getString("deliveryname")); // 送货方联系人 - oneMap.put("deliveryphone", jsonMst.getString("deliveryphone")); // 送货方联系电话 - oneMap.put("contractno", jsonMst.getString("contractno")); // 合同号 - } - - // 6.多组填充 - JSONArray dtlArr = WQL.getWO("ST_OUTIVT02").addParam("flag", "3").addParam("iostorinv_id", MapUtil.getStr(whereJson, "iostorinv_id")).process().getResultJSONArray(0); - - - if (shd_dtl_num > dtlArr.size()) { - double all_qty = 0; - String order_no = ""; - ArrayList> flData = new ArrayList<>(); - WriteSheet sheet = EasyExcel.writerSheet().build(); - double all_real = 0; // 总毛总 - for (int i = 0; i < dtlArr.size(); i++) { - JSONObject json = dtlArr.getJSONObject(i); - - JSONObject jsonSub = subTab.query("package_box_sn = '" + json.getString("box_no") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonSub)) { - throw new BadRequestException("没有查询到子卷包装"); - } - order_no = jsonSub.getString("sale_order_name"); - - // 规格: 厚度*幅宽 - String material_spec = jsonSub.getString("thickness_request") + "*" + jsonSub.getString("width_standard"); - // 箱号 - String box_no = json.getString("box_no"); - String sub_box_no = ""; - if (ObjectUtil.isNotEmpty(box_no)) { - try { - sub_box_no = box_no.substring(box_no.lastIndexOf("@") + 1, box_no.length()); - } catch (Exception e) { - sub_box_no = box_no; - } - } - - HashMap mapFL = new HashMap<>(); - // 明细 -// String date_of_production = jsonSub.getString("date_of_production").replaceAll("[[\\s-:punct:]]", ""); -// mapFL.put("date_of_production", date_of_production); // 批号 : 子卷包装生产日期 - mapFL.put("material_name", json.getString("material_name")); - mapFL.put("material_spec", material_spec); -// mapFL.put("qty_unit_name", "KG"); - mapFL.put("box_no", sub_box_no); - mapFL.put("qty", NumberUtil.round(json.getString("qty"), 1).doubleValue()); // 净重 - if (ObjectUtil.isNotEmpty(jsonSub.getString("real_weight"))) { - mapFL.put("real_weight", NumberUtil.round(jsonSub.getString("box_weight"), 1).doubleValue()); // 毛重 - all_real = NumberUtil.add(String.valueOf(all_real), jsonSub.getString("box_weight")).doubleValue(); - } else { - mapFL.put("real_weight", NumberUtil.round(jsonSub.getString("box_weight"), 1).doubleValue()); // 毛重 - all_real = NumberUtil.add(String.valueOf(all_real), jsonSub.getString("box_weight")).doubleValue(); - } - - flData.add(mapFL); - all_qty = NumberUtil.add(String.valueOf(all_qty), json.getString("qty")).doubleValue(); - } - // 订单号 - /* if (ObjectUtil.isNotEmpty(order_no)) { - oneMap.put("order_no",order_no.substring(0,order_no.indexOf("-"))); - }*/ - ExcelWriter workBook = EasyExcel.write(outputStream, null).withTemplate(code_template).build(); - - oneMap.put("all_qty", NumberUtil.round(all_qty, 1)); // 合计 - oneMap.put("all_real", NumberUtil.round(all_real,1)); // 总毛重 - workBook.fill(oneMap, sheet); - workBook.fill(new FillWrapper("data", flData), sheet); - workBook.finish(); - } else { - - double div = NumberUtil.div(dtlArr.size(), shd_dtl_num); - double ceil = Math.ceil(div); - Integer integer = Integer.valueOf(String.valueOf(NumberUtil.round(ceil, 0))); - - double all_qty = 0; - double all_real = 0; - String order_no = ""; - ArrayList> flData = new ArrayList<>(); - for (int i = j * shd_dtl_num; i < (j + 1) * shd_dtl_num; i++) { - if (i == dtlArr.size()) { - break; - } - - JSONObject json = dtlArr.getJSONObject(i); - JSONObject jsonSub = subTab.query("package_box_sn = '" + json.getString("box_no") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonSub)) { - throw new BadRequestException("没有查询到子卷包装"); - } - order_no = jsonSub.getString("sale_order_name"); - - // 规格: 厚度*幅宽 - String material_spec = jsonSub.getString("thickness_request") + "*" + jsonSub.getString("width_standard"); - // 箱号 - String box_no = json.getString("box_no"); - String sub_box_no = ""; - if (ObjectUtil.isNotEmpty(box_no)) { - try { - sub_box_no = box_no.substring(box_no.lastIndexOf("@") + 1, box_no.length()); - } catch (Exception e) { - sub_box_no = box_no; - } - } - - HashMap mapFL = new HashMap<>(); - // 明细 -// String date_of_production = jsonSub.getString("date_of_production").replaceAll("[[\\s-:punct:]]", ""); -// mapFL.put("date_of_production", date_of_production); // 批号 : 子卷包装生产日期 - mapFL.put("material_name", json.getString("material_name")); - mapFL.put("material_spec", material_spec); -// mapFL.put("qty_unit_name", "KG"); - mapFL.put("box_no", sub_box_no); - mapFL.put("qty", NumberUtil.round(json.getString("qty"), 1).doubleValue()); - if (ObjectUtil.isNotEmpty(jsonSub.getString("real_weight"))) { - mapFL.put("real_weight", NumberUtil.round(jsonSub.getString("box_weight"), 1).doubleValue()); // 毛重 - all_real = NumberUtil.add(String.valueOf(all_real), jsonSub.getString("box_weight")).doubleValue(); - } else { - mapFL.put("real_weight", NumberUtil.round(jsonSub.getString("box_weight"), 1).doubleValue()); // 毛重 - all_real = NumberUtil.add(String.valueOf(all_real), jsonSub.getString("box_weight")).doubleValue(); - } - flData.add(mapFL); - - // 计算合计重量 - all_qty = NumberUtil.add(String.valueOf(all_qty), json.getString("qty")).doubleValue(); - - } - // 订单号 - ExcelWriter workBook = EasyExcel.write(outputStream, null).withTemplate(code_template).build(); - oneMap.put("all_qty", NumberUtil.round(all_qty, 1)); // 合计 - oneMap.put("all_real", NumberUtil.round(all_real,1)); // 总毛重 - WriteSheet sheet = EasyExcel.writerSheet(0).build(); - workBook.fill(oneMap, sheet); - workBook.fill(new FillWrapper("data", flData), sheet); - workBook.finish(); - } - } - - @Override - public JSONObject getDisNum(Map whereJson) { - JSONArray dtlArr = WQL.getWO("ST_OUTIVT02").addParam("flag", "3").addParam("iostorinv_id", MapUtil.getStr(whereJson, "iostorinv_id")).process().getResultJSONArray(0); - - JSONObject json = new JSONObject(); - json.put("num", dtlArr.size()); - return json; - } - - - @Override - public JSONArray queryBox(JSONObject whereJson) { - - JSONArray data = whereJson.getJSONArray("data"); - // 先过滤相同的箱号 - HashSet boxSet = new HashSet<>(); - for (int i = 0; i < data.size(); i++) { - JSONObject json = data.getJSONObject(i); - boxSet.add(json.getString("box_no")); - } - - JSONArray array = new JSONArray(); - // 遍历 - for (String box_no : boxSet) { - JSONArray boxArr = WQL.getWO("QST_IVT_CHECKOUTBILL").addParam("flag", "77").addParam("box_no", box_no).process().getResultJSONArray(0); - array.addAll(boxArr); - } - return array; - } - - /** - * 更新主表状态 - * - * @param iostorinv_id - */ - void updateMststatus(String iostorinv_id) { - //出库主表 - WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); - //出库明细表 - WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); - - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - //查询主表信息 - JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - jo_mst.put("update_optid", currentUserId + ""); - jo_mst.put("update_optname", nickName); - jo_mst.put("update_time", now); - jo_mst.put("dis_optid", currentUserId + ""); - jo_mst.put("dis_optname", nickName); - jo_mst.put("dis_time", now); - //更新主表状态 - JSONArray dtls_40 = wo_dtl.query("bill_status='40' and iostorinv_id = '" + iostorinv_id + "'").getResultJSONArray(0); - //已分配完明细数小于总明细数 - if (dtls_40.size() < jo_mst.getInteger("detail_count")) { - JSONArray dtls_30 = wo_dtl.query("bill_status='30' and iostorinv_id = '" + iostorinv_id + "'").getResultJSONArray(0); - //存在分配完的明细 - if (dtls_40.size() != 0) {//分配中明细数不为0 - jo_mst.put("bill_status", "30"); - } else if (dtls_40.size() == 0) { - //不存在分配中和分配完的明细 - if (dtls_30.size() == 0) { - jo_mst.put("bill_status", "10"); - }//存在分配中的明细 - else if (dtls_30.size() != 0) { - jo_mst.put("bill_status", "30"); - } - } - } else {//已分配完明细数等于总明细数 - jo_mst.put("bill_status", "40"); - } - wo_mst.update(jo_mst); - } - - /** - * 判断仓位上可用数是否为0,0返回true,非0返回false - * - * @param code 载具编码或者仓位编码 - */ - boolean canuse_is_zero(String code) { - //仓位库存表 - WQLObject wo_StructIvt = WQLObject.getWQLObject("ST_IVT_StructIvt"); - //仓位表 - WQLObject wo_Struct = WQLObject.getWQLObject("ST_IVT_StructAttr"); - if (StrUtil.isEmpty(code)) { - throw new BadRequestException("仓位编码不能为空!"); - } - //查询仓位信息 - JSONObject jo_mst = wo_Struct.query("struct_code = '" + code + "'").uniqueResult(0); - if (jo_mst != null) { - //查询可用数大于0的记录数 - JSONArray ja = wo_StructIvt.query("canuse_qty>0 and struct_code = '" + code + "'").getResultJSONArray(0); - if (ja.size() != 0) { - return false; - } - } else { - throw new BadRequestException("查询不到相关仓位!"); - } - return true; - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/returns/rest/InAndOutReturnlController.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/returns/rest/InAndOutReturnlController.java index d063c76..659d649 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/returns/rest/InAndOutReturnlController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/returns/rest/InAndOutReturnlController.java @@ -6,7 +6,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.modules.logging.annotation.Log; import org.nl.modules.wql.util.SpringContextHolder; -import org.nl.wms.st.outbill.service.impl.CheckOutBillServiceImpl; import org.nl.wms.st.returns.service.InAndOutReturnService; import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; @@ -68,8 +67,7 @@ public class InAndOutReturnlController { @GetMapping(value = "/download") public void download(HttpServletResponse response, @RequestParam Map whereJson) throws IOException { - JSONArray outBillDis = SpringContextHolder.getBean(CheckOutBillServiceImpl.class).getOutBillDis(whereJson); - inAndOutReturnService.download(outBillDis, response); + //inAndOutReturnService.download(outBillDis, response); } } diff --git a/lms/nladmin-system/src/main/resources/config/application-dev.yml b/lms/nladmin-system/src/main/resources/config/application-dev.yml index 66a8bd0..21022a3 100644 --- a/lms/nladmin-system/src/main/resources/config/application-dev.yml +++ b/lms/nladmin-system/src/main/resources/config/application-dev.yml @@ -43,9 +43,9 @@ spring: reset-enable: false filters: DruidFilter,stat - url: jdbc:mysql://localhost:3306/lms?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true + url: jdbc:mysql://localhost:3306/lanzhou_lms?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true username: root - password: 123456 + password: root slave: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver @@ -84,9 +84,9 @@ spring: reset-enable: false filters: DruidFilter,stat - url: jdbc:mysql://127.0.0.1:3306/lms?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true + url: jdbc:mysql://127.0.0.1:3306/lanzhou_lms?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true username: root - password: 123456 + password: root rules: readwrite-splitting: data-sources: diff --git a/lms/nladmin-system/src/main/resources/config/application.yml b/lms/nladmin-system/src/main/resources/config/application.yml index a9fc878..a435e11 100644 --- a/lms/nladmin-system/src/main/resources/config/application.yml +++ b/lms/nladmin-system/src/main/resources/config/application.yml @@ -6,7 +6,7 @@ spring: freemarker: check-template-location: false profiles: - active: prod + active: dev jackson: time-zone: GMT+8 data: