package com.consum.base.controller; 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; import jakarta.annotation.Resource; 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.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import com.consum.base.BaseController; import com.consum.base.core.utils.CommonUtil; import com.consum.base.core.utils.IdUtil; import com.consum.base.handler.WhWarningImportVerifyHandler; import com.consum.base.pojo.WarnConfImEntity; import com.consum.base.pojo.WhWarningConfigParam; import com.consum.base.pojo.query.WhWarningConfigQry; import com.consum.base.service.BaseWarehouseService; import com.consum.base.service.LWhWarningConfigService; import com.consum.model.po.BaseWarehouse; import com.consum.model.po.FinSysTenantUser; 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 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; /** * @ClassName LWhWarningConfigController * @Author cy * @Date 2023/11/20 * @Description * @Version 1.0 **/ @RestController @RequestMapping("/pc/warehouse/warningConfig") // @Api(value = "库存阀值", tags = "库存阀值") public class LWhWarningConfigController extends BaseController { @Resource private LWhWarningConfigService lWhWarningConfigService; @Resource private BaseWarehouseService baseWarehouseService; private ObjectMapper mapper = new ObjectMapper(); /** * @Description 新增 */ @PostMapping("/add") public ResponseValue add() throws Exception { WhWarningConfigParam param = CommonUtil.getObjFromReqBody(WhWarningConfigParam.class); WhWarningConfigParam param2 = new WhWarningConfigParam(); CommonUtil.copyProperties(param, param2); param = param2; String modelConfigStr = param.getModelConfigStr(); Long baseWarehouseId = param.getBaseWarehouseId(); Long baseGoodsTemplateId = param.getBaseGoodsTemplateId(); if (param.getWarehouseType() == null || baseWarehouseId == null || baseGoodsTemplateId == null || StringUtils.isEmpty(modelConfigStr)) { return ResponseValue.error("缺少必要参数"); } /*当前登录人只能看到自己机构下的列表*/ FinSysTenantUser sysInfo = this.getSysInfo(); if (sysInfo == null) { return ResponseValue.error("登录用户信息不存在"); } String tenantId = sysInfo.getTenantId(); BaseWarehouse baseWarehouse = baseWarehouseService.getById(baseWarehouseId); if (baseWarehouse == null) { return ResponseValue.error("仓库不存在!"); } Long warehouseAgencyId = baseWarehouse.getAgencyId(); if (warehouseAgencyId == null || !warehouseAgencyId.toString().startsWith(tenantId)) { return ResponseValue.error("操作失败!"); } List> list = mapper.readValue(modelConfigStr, List.class); if (CollectionUtils.isEmpty(list)) { return ResponseValue.error("缺少必要参数"); } WhWarningConfig queryIsExist = new WhWarningConfig(); queryIsExist.setWarehouseType(0); queryIsExist.setBaseGoodsModelsId(baseWarehouseId); ArrayList configArrayList = new ArrayList<>(list.size()); for (Map item : list) { Long baseGoodsModelsId = Convert.toLong(item.get("baseGoodsModelsId")); queryIsExist.setBaseGoodsModelsId(baseGoodsModelsId); List containWarningConfig = lWhWarningConfigService.select(queryIsExist); if (!CollectionUtils.isEmpty(containWarningConfig)) { return ResponseValue.error("记录已存在!"); } Integer lowerLimit = Convert.toInt(item.get("lowerLimit")); Integer upperLimit = Convert.toInt(item.get("upperLimit")); if (lowerLimit == null && lowerLimit == null) { return ResponseValue.error("库存上限、下限不能全为空!"); } if (upperLimit != null && upperLimit < 0) { return ResponseValue.error("库存限制不能小于0!"); } if (lowerLimit != null && lowerLimit < 0) { return ResponseValue.error("库存限制不能小于0!"); } if (upperLimit != null && lowerLimit != null && upperLimit < lowerLimit) { return ResponseValue.error("库存上限不能小于下限!"); } WhWarningConfig whWarningConfig = new WhWarningConfig(); whWarningConfig.setId(IdUtil.generateId()); whWarningConfig.setWarehouseType(0); whWarningConfig.setBaseWarehouseId(baseWarehouseId); whWarningConfig.setBaseGoodsTemplateId(baseGoodsTemplateId); whWarningConfig.setBaseGoodsModelsId(baseGoodsModelsId); whWarningConfig.setUpperLimit(upperLimit); whWarningConfig.setLowerLimit(lowerLimit); if (whWarningConfig.getBaseGoodsModelsId() == null) { whWarningConfig.setGoodsType(1); } else { whWarningConfig.setGoodsType(2); } configArrayList.add(whWarningConfig); } int flag = lWhWarningConfigService.insertBatch(configArrayList); return flag > 0 ? ResponseValue.success(1) : ResponseValue.error("操作失败!"); } /** * @Description 修改 */ @PostMapping("/upd") public ResponseValue upd() { WhWarningConfig param = CommonUtil.getObjFromReqBody(WhWarningConfig.class); WhWarningConfig param2 = new WhWarningConfig(); CommonUtil.copyProperties(param, param2); param = param2; if (param.getId() == null || (param.getUpperLimit() == null && param.getLowerLimit() == null)) { return ResponseValue.error("库存上限、下限不能全为空!"); } if (param.getUpperLimit() != null && param.getLowerLimit() != null && param.getUpperLimit() < param.getLowerLimit()) { return ResponseValue.error("库存上限不能小于下限!"); } // 更新 int flag = lWhWarningConfigService.save(param); return flag > 0 ? ResponseValue.success(1) : ResponseValue.error("操作失败!"); } @DeleteMapping("del") public ResponseValue delById() { WhWarningConfig param = CommonUtil.getObjFromReqBody(WhWarningConfig.class); WhWarningConfig param2 = new WhWarningConfig(); CommonUtil.copyProperties(param, param2); param = param2; if (param.getId() == null) { return ResponseValue.error("id为空"); } int num = baseWarehouseService.delete(param); return num > 0 ? ResponseValue.success(1) : ResponseValue.error("删除失败!"); } @GetMapping("/getList") public ResponseValue getConfigList() { WhWarningConfigQry param = CommonUtil.getObjFromReq(WhWarningConfigQry.class); WhWarningConfigQry param2 = new WhWarningConfigQry(); CommonUtil.copyProperties(param, param2); param = param2; /*当前登录人只能看到自己机构下的列表*/ FinSysTenantUser sysInfo = this.getSysInfo(); String tenantId = sysInfo.getTenantId(); Long paramAgencyId = param.getAgencyId(); if (paramAgencyId == null || !paramAgencyId.toString().startsWith(tenantId)) { param.setAgencyId(Long.valueOf(tenantId)); } GenericPager> genericPager = lWhWarningConfigService.getConfigListWithPage(param); return ResponseValue.success(genericPager); } @GetMapping("/getById") public ResponseValue getById() { WhWarningConfig param = CommonUtil.getObjFromReq(WhWarningConfig.class); WhWarningConfig param2 = new WhWarningConfig(); CommonUtil.copyProperties(param, param2); param = param2; WhWarningConfig whWarningConfig = lWhWarningConfigService.get(param); return ResponseValue.success(whWarningConfig); } @GetMapping("/getConfigList") public ResponseValue getWarnConfigList() { WhWarningConfig param = CommonUtil.getObjFromReq(WhWarningConfig.class); WhWarningConfig param2 = new WhWarningConfig(); CommonUtil.copyProperties(param, param2); param = param2; if (param.getBaseWarehouseId() == null || param.getWarehouseType() == null || (param.getBaseGoodsModelsId() == null || param.getBaseGoodsTemplateId() == null)) { return ResponseValue.error("缺少必要参数"); } return ResponseValue.success(lWhWarningConfigService.select(param)); } /** * @return 获取项目导入的模板 * @throws IOException */ @GetMapping("getWarnConfImportTemplate") public ResponseEntity 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 result = ExcelImportUtil.importExcelMore(multipartFile.getInputStream(), WarnConfImEntity.class, params); boolean verfiyFail = result.isVerfiyFail(); if (verfiyFail) { StringBuilder errmsg = new StringBuilder(); List 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 excelList = result.getList(); ArrayList configArrayList = new ArrayList<>(excelList.size()); // 按baseWarehouseId属性分组 Map> groupedData = excelList.stream().collect(Collectors.groupingBy(WarnConfImEntity::getBaseWarehouseId)); for (Map.Entry> entry : groupedData.entrySet()) { Long baseWarehouseId = entry.getKey(); List houseModelList = entry.getValue(); // 提取id并存储到新列表 List modelIdList = houseModelList.stream() .map(WarnConfImEntity::getBaseGoodsModelsId) .collect(Collectors.toList()); List> queryModelIsExistList = lWhWarningConfigService.queryModelIsExist(0, baseWarehouseId, modelIdList); if (CollectionUtils.isEmpty(queryModelIsExistList)) { // 全部为新增 for (WarnConfImEntity warnConfImEntity : houseModelList) { // 新增 WhWarningConfig whWarningConfig = new WhWarningConfig(); whWarningConfig.setId(IdUtil.generateId()); 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 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(IdUtil.generateId()); 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; } }