consum-base/src/main/java/com/consum/base/config/WhWarningImportVerifyHandler.java
New file @@ -0,0 +1,102 @@ package com.consum.base.config; import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult; import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler; import com.consum.base.pojo.WarnConfImEntity; import com.consum.base.service.BaseGoodsModelsServiceImpl; import com.consum.base.service.BaseGoodsTemplateServiceImpl; import com.consum.base.service.BaseWarehouseServiceImpl; import com.consum.model.po.BaseGoodsModels; import com.consum.model.po.BaseGoodsTemplate; import com.consum.model.po.BaseWarehouse; import com.iplatform.core.BeanContextAware; import com.walker.infrastructure.utils.CollectionUtils; import java.util.HashMap; import java.util.List; import java.util.StringJoiner; /** * @ClassName WhWarningImportVerifyHandler * @Author cy * @Date 2023/11/22 * @Description * @Version 1.0 **/ public class WhWarningImportVerifyHandler implements IExcelVerifyHandler<WarnConfImEntity> { //保存所有数据 private HashMap<String, Integer> containMap; // 当前人机构 private Long agencyId; private BaseWarehouseServiceImpl baseWarehouseService; private BaseGoodsTemplateServiceImpl baseGoodsTemplateService; private BaseGoodsModelsServiceImpl baseGoodsModelsService; public WhWarningImportVerifyHandler(Long agencyId) { this.agencyId = agencyId; this.containMap = new HashMap<>(); this.baseWarehouseService = BeanContextAware.getBeanByType(BaseWarehouseServiceImpl.class); this.baseGoodsTemplateService = BeanContextAware.getBeanByType(BaseGoodsTemplateServiceImpl.class); this.baseGoodsModelsService = BeanContextAware.getBeanByType(BaseGoodsModelsServiceImpl.class); } @Override public ExcelVerifyHandlerResult verifyHandler(WarnConfImEntity param) { StringJoiner joiner = new StringJoiner(";"); String warehouseName = param.getWarehouseName(); String goodsTemplateName = param.getGoodsTemplateName(); String goodsModelName = param.getGoodsModelName(); Integer lowerLimit = param.getLowerLimit(); Integer upperLimit = param.getUpperLimit(); int rowNum = param.getRowNum(); String modelStr = warehouseName + "&" + goodsTemplateName + "&" + goodsModelName; if (containMap.containsKey(modelStr)) { Integer firstLine = containMap.get(modelStr); joiner.add("数据与第" + firstLine + "行重复"); String errMsg = joiner.toString(); return new ExcelVerifyHandlerResult(false, errMsg); } else { containMap.put(modelStr, rowNum); } if (lowerLimit == null && upperLimit == null) { joiner.add("库存上限、下限不能全为空"); } if (upperLimit != null && lowerLimit != null && upperLimit < lowerLimit) { joiner.add("库存上限不能小于下限"); } BaseWarehouse warehouse = baseWarehouseService.getWarehouseByAgencyId(agencyId, warehouseName); if (warehouse == null) { joiner.add("仓库名称有误"); } else { param.setBaseWarehouseId(warehouse.getId()); } List<BaseGoodsTemplate> baseGoodsTemplates = baseGoodsTemplateService.queryGoodsTemplateByCategoryId(agencyId, null, (short) 1, goodsTemplateName); if (CollectionUtils.isEmpty(baseGoodsTemplates)) { joiner.add("物品名称有误"); String errMsg = joiner.toString(); return new ExcelVerifyHandlerResult(false, errMsg); } Long goodsTemplatesId = baseGoodsTemplates.get(0).getId(); param.setGoodsTemplateId(goodsTemplatesId); BaseGoodsModels models = new BaseGoodsModels(); models.setGoodsTemplatesId(goodsTemplatesId); models.setStates(1); models.setModelName(goodsModelName); BaseGoodsModels goodsModels = baseGoodsModelsService.getByModelNameAndGoodsTemplatesId(models); if (goodsModels == null) { joiner.add("物品型号名称有误"); } else { param.setBaseGoodsModelsId(goodsModels.getId()); } if (joiner.length() != 0) { String errMsg = joiner.toString(); return new ExcelVerifyHandlerResult(false, errMsg); } return new ExcelVerifyHandlerResult(true); } } consum-base/src/main/java/com/consum/base/controller/BaseGoodsTemplateController.java
@@ -8,11 +8,7 @@ import com.consum.base.service.BaseGoodsTemplateServiceImpl; import com.consum.base.service.BaseWarehouseServiceImpl; import com.consum.base.service.LWhGoodsService; import com.consum.model.po.BaseGoodsModels; import com.consum.model.po.BaseGoodsTemplate; import com.consum.model.po.BaseWarehouse; import com.consum.model.po.FinSysTenantUser; import com.consum.model.po.SDictData; import com.consum.model.po.*; import com.consum.model.vo.BaseGoodsTemplateVo; import com.walker.db.page.GenericPager; import com.walker.infrastructure.utils.StringUtils; @@ -20,18 +16,14 @@ import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.compress.utils.Lists; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; 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 org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @Description 物品模板 @@ -191,7 +183,7 @@ @GetMapping("/query/goodsTemplate") public ResponseValue queryGoodsTemplateByCategoryId(Long agencyId, Long categoryId) { List<BaseGoodsTemplate> list = this.baseGoodsTemplateService.queryGoodsTemplateByCategoryId(agencyId, categoryId); List<BaseGoodsTemplate> list = this.baseGoodsTemplateService.queryGoodsTemplateByCategoryId(agencyId, categoryId,null,null); if (list == null) { return ResponseValue.error("查询失败!"); } consum-base/src/main/java/com/consum/base/controller/LWhWarningConfigController.java
@@ -1,8 +1,13 @@ package com.consum.base.controller; import cn.afterturn.easypoi.excel.ExcelImportUtil; import cn.afterturn.easypoi.excel.entity.ImportParams; import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; import cn.hutool.core.convert.Convert; import com.consum.base.BaseController; import com.consum.base.config.WhWarningImportVerifyHandler; import com.consum.base.core.utils.CommonUtil; import com.consum.base.pojo.WarnConfImEntity; import com.consum.base.pojo.WhWarningConfigParam; import com.consum.base.pojo.query.WhWarningConfigQry; import com.consum.base.service.BaseWarehouseServiceImpl; @@ -12,17 +17,32 @@ import com.consum.model.po.WhWarningConfig; import com.fasterxml.jackson.databind.ObjectMapper; import com.walker.db.page.GenericPager; import com.walker.file.FileInfo; import com.walker.infrastructure.utils.NumberGenerator; import com.walker.web.ResponseCode; import com.walker.web.ResponseValue; import io.swagger.annotations.Api; import org.apache.commons.lang3.StringUtils; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @ClassName LWhWarningConfigController @@ -175,4 +195,170 @@ } return ResponseValue.success(lWhWarningConfigService.select(param)); } /** * @return 获取项目导入的模板 * @throws IOException */ @PostMapping("getWarnConfImportTemplate") public ResponseEntity<InputStreamResource> getProjectImportTemplate() throws IOException { // 从当前项目资源目录获取文件 org.springframework.core.io.Resource resource = new ClassPathResource("import/warningConfImp.xls"); // 获取文件输入流 InputStream inputStream = resource.getInputStream(); // 设置HTTP响应头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); String encodedFilename = URLEncoder.encode("库存预警配置导入模板.xls", "UTF-8"); headers.setContentDispositionFormData("attachment", encodedFilename); // 创建InputStreamResource对象,将文件输入流包装起来 InputStreamResource resourceToDownload = new InputStreamResource(inputStream); // 返回带有文件输入流的ResponseEntity对象 return ResponseEntity .status(HttpStatus.OK) .headers(headers) .body(resourceToDownload); } @PostMapping("import") public ResponseValue warnConfImport(MultipartFile multipartFile) throws Exception { String originalFilename = multipartFile.getOriginalFilename(); if (!"xls".equals(originalFilename.substring(originalFilename.lastIndexOf(".") + 1))) { return ResponseValue.error(ResponseCode.ERROR.getCode(), "文件格式有误!"); } FinSysTenantUser sysInfo = this.getSysInfo(); if (sysInfo == null) { return ResponseValue.error(ResponseCode.ERROR.getCode(), "当前登录用户为空"); } ImportParams params = new ImportParams(); params.setHeadRows(1); params.setNeedVerify(true); WhWarningImportVerifyHandler whWarningImportVerifyHandler = new WhWarningImportVerifyHandler(Long.valueOf(sysInfo.getTenantId())); params.setVerifyHandler(whWarningImportVerifyHandler); ExcelImportResult<WarnConfImEntity> result = ExcelImportUtil.importExcelMore(multipartFile.getInputStream(), WarnConfImEntity.class, params); boolean verfiyFail = result.isVerfiyFail(); if (verfiyFail) { StringBuilder errmsg = new StringBuilder(); List<WarnConfImEntity> failList = result.getFailList(); for (int i = 0; i < failList.size() && i < 20; i++) { WarnConfImEntity entity = failList.get(i); errmsg.append("第") .append(entity.getRowNum()) .append("行的错误是:") .append(entity.getErrorMsg()) .append("\r\n"); } InputStream inputStream = new ByteArrayInputStream(errmsg.toString().getBytes(StandardCharsets.UTF_8)); FileInfo fileInfo = uploadFileToLocal(inputStream, NumberGenerator.generatorHexUUID() + ".txt", "-1", 111, 0, "-1"); String url = fileInfo.getUrl(); return ResponseValue.error(ResponseCode.PARAM_NOT_VALID.getCode(), url); } List<WarnConfImEntity> excelList = result.getList(); ArrayList<WhWarningConfig> configArrayList = new ArrayList<>(excelList.size()); // 按baseWarehouseId属性分组 Map<Long, List<WarnConfImEntity>> groupedData = excelList.stream().collect(Collectors.groupingBy(WarnConfImEntity::getBaseWarehouseId)); for (Map.Entry<Long, List<WarnConfImEntity>> entry : groupedData.entrySet()) { Long baseWarehouseId = entry.getKey(); List<WarnConfImEntity> houseModelList = entry.getValue(); // 提取id并存储到新列表 List<Long> modelIdList = houseModelList.stream() .map(WarnConfImEntity::getBaseGoodsModelsId) .collect(Collectors.toList()); List<Map<String, Object>> queryModelIsExistList = lWhWarningConfigService.queryModelIsExist(0, baseWarehouseId, modelIdList); if (CollectionUtils.isEmpty(queryModelIsExistList)) { // 全部为新增 for (WarnConfImEntity warnConfImEntity : houseModelList) { // 新增 WhWarningConfig whWarningConfig = new WhWarningConfig(); whWarningConfig.setId(NumberGenerator.getLongSequenceNumber()); whWarningConfig.setWarehouseType(0); whWarningConfig.setBaseWarehouseId(warnConfImEntity.getBaseWarehouseId()); whWarningConfig.setBaseGoodsTemplateId(warnConfImEntity.getGoodsTemplateId()); whWarningConfig.setBaseGoodsModelsId(warnConfImEntity.getBaseGoodsModelsId()); whWarningConfig.setUpperLimit(warnConfImEntity.getUpperLimit()); whWarningConfig.setLowerLimit(warnConfImEntity.getLowerLimit()); if (whWarningConfig.getBaseGoodsModelsId() == null) { whWarningConfig.setGoodsType(1); } else { whWarningConfig.setGoodsType(2); } configArrayList.add(whWarningConfig); } } else { // 提取id并存储到新列表 List<Long> dbExistModelIdList = queryModelIsExistList.stream() .map(map -> Convert.toLong(map.get("baseGoodsModelsId"))) .collect(Collectors.toList()); for (WarnConfImEntity warnConfImEntity : houseModelList) { Long baseGoodsModelsId = warnConfImEntity.getBaseGoodsModelsId(); WhWarningConfig whWarningConfig = new WhWarningConfig(); whWarningConfig.setWarehouseType(0); whWarningConfig.setBaseWarehouseId(warnConfImEntity.getBaseWarehouseId()); whWarningConfig.setBaseGoodsModelsId(warnConfImEntity.getBaseGoodsModelsId()); whWarningConfig.setUpperLimit(warnConfImEntity.getUpperLimit()); whWarningConfig.setLowerLimit(warnConfImEntity.getLowerLimit()); if (dbExistModelIdList.contains(baseGoodsModelsId)) { // 修改 limitEditByModeInfo(whWarningConfig); } else { // 新增 whWarningConfig.setId(NumberGenerator.getLongSequenceNumber()); whWarningConfig.setBaseGoodsTemplateId(warnConfImEntity.getGoodsTemplateId()); if (whWarningConfig.getBaseGoodsModelsId() == null) { whWarningConfig.setGoodsType(1); } else { whWarningConfig.setGoodsType(2); } configArrayList.add(whWarningConfig); } } } } if (!CollectionUtils.isEmpty(configArrayList)) { int flag = lWhWarningConfigService.insertBatch(configArrayList); } return ResponseValue.success("导入成功!", 1); } private String KU_CUN_UPD_BY_MODE_INFO = "update WH_WARNING_CONFIG set "; public int limitEditByModeInfo(WhWarningConfig config) { StringBuilder sql = new StringBuilder(KU_CUN_UPD_BY_MODE_INFO); Integer lowerLimit = config.getLowerLimit(); if (lowerLimit == null) { sql.append("lower_limit=null"); } else { sql.append("lower_limit=" + lowerLimit); } Integer upperLimit = config.getUpperLimit(); if (upperLimit == null) { sql.append(",upper_Limit=null"); } else { sql.append(",upper_Limit=" + upperLimit); } sql.append(" where 1=1"); Integer warehouseType = config.getWarehouseType(); if (warehouseType != null) { sql.append(" and warehouse_Type=" + warehouseType); } Long baseWarehouseId = config.getBaseWarehouseId(); if (baseWarehouseId != null) { sql.append(" and BASE_WAREHOUSE_ID=" + baseWarehouseId); } Long baseGoodsModelsId = config.getBaseGoodsModelsId(); if (baseGoodsModelsId != null) { sql.append(" and BASE_GOODS_MODELS_ID=" + baseGoodsModelsId); } lWhWarningConfigService.update(sql.toString()); return 1; } } consum-base/src/main/java/com/consum/base/pojo/WarnConfImEntity.java
New file @@ -0,0 +1,59 @@ package com.consum.base.pojo; import cn.afterturn.easypoi.excel.annotation.Excel; import cn.afterturn.easypoi.handler.inter.IExcelDataModel; import cn.afterturn.easypoi.handler.inter.IExcelModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @ClassName WarnConfImEntity * @Author cy * @Date 2023/11/22 * @Description * @Version 1.0 **/ @Data public class WarnConfImEntity implements IExcelDataModel, IExcelModel { @ApiModelProperty("仓库名称") @Excel(name = "仓库名称") private String warehouseName; @Excel(name = "物品名称") @ApiModelProperty(value = "物品名称") private String goodsTemplateName; @Excel(name = "型号名称") @ApiModelProperty("型号名称") private String goodsModelName; @Excel(name = "保底库存") @ApiModelProperty("保底库存") private Integer lowerLimit; @Excel(name = "封顶库存") @ApiModelProperty("封顶库存") private Integer upperLimit; @ApiModelProperty("物品id") private Long goodsTemplateId; @ApiModelProperty("仓库id") private Long baseWarehouseId; @ApiModelProperty("物品型号id") private Long baseGoodsModelsId; /** * 行号 */ private int rowNum; /** * 错误消息 */ private String errorMsg; } consum-base/src/main/java/com/consum/base/service/BaseGoodsModelsServiceImpl.java
@@ -54,6 +54,10 @@ //物品模板id sql.append(" and GOODS_TEMPLATES_ID =:GOODS_TEMPLATES_ID "); paramts.put("GOODS_TEMPLATES_ID", models.getGoodsTemplatesId()); if (models.getStates() != null){ sql.append(" and STATES =:states "); paramts.put("states", models.getStates()); } return this.get(sql.toString(), paramts, new BaseGoodsModels()); } consum-base/src/main/java/com/consum/base/service/BaseGoodsTemplateServiceImpl.java
@@ -4,24 +4,21 @@ import com.consum.base.core.CodeGeneratorService; import com.consum.base.core.utils.IdUtil; import com.consum.base.pojo.BaseGoodsTemplateParam; import com.consum.model.po.BaseCategory; import com.consum.model.po.BaseGoodsModels; import com.consum.model.po.BaseGoodsTemplate; import com.consum.model.po.FinSysTenantUser; import com.consum.model.po.SDictData; import com.consum.model.po.*; import com.consum.model.vo.BaseGoodsTemplateVo; import com.iplatform.model.po.S_user_core; import com.walker.db.page.GenericPager; import com.walker.infrastructure.utils.DateUtils; import com.walker.infrastructure.utils.StringUtils; import com.walker.jdbc.service.BaseServiceImpl; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @Description 物品模板 @@ -303,7 +300,15 @@ return this.select(goodsTemplate); } public List<BaseGoodsTemplate> queryGoodsTemplateByCategoryId(Long agencyId, Long categoryId) { /** * @param agencyId * @param categoryId * @param states * @param goodsName 全匹配!!! * @return */ public List<BaseGoodsTemplate> queryGoodsTemplateByCategoryId(Long agencyId, Long categoryId, Short states, String goodsName) { StringBuilder sql = new StringBuilder("SELECT * FROM base_goods_template WHERE 1=1 "); Map<String, Object> params = new HashMap<>(); if (agencyId != null) { @@ -314,6 +319,14 @@ sql.append("AND CATEGORY_ID=:categoryId "); params.put("categoryId", categoryId); } if (states != null) { sql.append("AND STATES=:states "); params.put("states", states); } if (StringUtils.isNotEmpty(goodsName)) { sql.append(" and GOODS_NAME =:goodsName "); params.put("goodsName", goodsName); } return this.select(sql.toString(), params, new BaseGoodsTemplate()); } } consum-base/src/main/java/com/consum/base/service/BaseWarehouseServiceImpl.java
@@ -9,6 +9,7 @@ import com.consum.model.po.FinSysTenantDepartment; import com.consum.model.po.SDictData; import com.walker.db.page.GenericPager; import com.walker.infrastructure.utils.CollectionUtils; import com.walker.infrastructure.utils.StringUtils; import com.walker.jdbc.service.BaseServiceImpl; import org.springframework.beans.BeanUtils; @@ -208,4 +209,23 @@ } return null; } public BaseWarehouse getWarehouseByAgencyId(Long agencyId, String warehouseName) { StringBuilder sql = new StringBuilder("SELECT * FROM base_warehouse WHERE STATES= 1"); Map<String, Object> param = new HashMap<>(); if (agencyId != null) { sql.append(" and AGENCY_ID =:agencyId "); param.put("agencyId", agencyId); } if (StringUtils.isNotEmpty(warehouseName)) { sql.append(" and WAREHOUSE_NAME =:warehouseName "); param.put("warehouseName", warehouseName); } sql.append(" limit 1"); List<BaseWarehouse> select = select(sql.toString(), param, new BaseWarehouse()); if (CollectionUtils.isEmpty(select)) { return null; } return select.get(0); } } consum-base/src/main/java/com/consum/base/service/LWhWarningConfigServiceImpl.java
@@ -3,11 +3,13 @@ import com.consum.base.core.utils.MapperUtil; import com.consum.base.pojo.query.WhWarningConfigQry; import com.walker.db.page.GenericPager; import com.walker.infrastructure.utils.CollectionUtils; import com.walker.infrastructure.utils.StringUtils; import com.walker.jdbc.service.BaseServiceImpl; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; /** @@ -27,7 +29,6 @@ HashMap<String, Object> paramts = (HashMap<String, Object>) configListQueryMap.get("paramts"); return selectSplit(sql.toString(), paramts, param.getPageNum(), param.getPageSize(), new MapperUtil()); } private Map<String, Object> getConfigListQueryMap(WhWarningConfigQry param) { @@ -76,4 +77,27 @@ return configListQueryMap; } private String QUERY_MODEL_IS_EXIST = ""; public List<Map<String, Object>> queryModelIsExist(Integer warehouseType, Long baseWarehouseId, List<Long> modelIds) { StringBuilder sql = new StringBuilder("select WAREHOUSE_TYPE, BASE_WAREHOUSE_ID, BASE_GOODS_MODELS_ID from WH_WARNING_CONFIG where 1=1"); HashMap<String, Object> paramts = new HashMap<>(); //仓库类型 if (warehouseType != null) { sql.append(" AND WAREHOUSE_TYPE = :warehouseType"); paramts.put("warehouseType", warehouseType); } if (baseWarehouseId != null) { sql.append(" AND BASE_WAREHOUSE_ID = :warehouseId"); paramts.put("warehouseId", baseWarehouseId); } if (!CollectionUtils.isEmpty(modelIds)) { sql.append(" AND BASE_GOODS_MODELS_ID in(:modelIds)"); paramts.put("modelIds", org.apache.commons.lang3.StringUtils.join(modelIds, ",")); } return select(sql.toString(), paramts, new MapperUtil()); } } deploy-jar-single/src/main/resources/import/warningConfImp.xlsBinary files differ