diff --git a/youchain-system/src/main/java/com/youchain/basicdata/domain/Item.java b/youchain-system/src/main/java/com/youchain/basicdata/domain/Item.java index 90e285b..760e53c 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/domain/Item.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/domain/Item.java @@ -17,10 +17,13 @@ package com.youchain.basicdata.domain; import com.youchain.base.BaseEntity; import com.youchain.modules.system.domain.Dept; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import cn.hutool.core.bean.BeanUtil; import io.swagger.annotations.ApiModelProperty; import cn.hutool.core.bean.copier.CopyOptions; +import lombok.NoArgsConstructor; import javax.persistence.*; import javax.validation.constraints.*; import java.io.Serializable; @@ -31,8 +34,11 @@ import java.io.Serializable; * @author houjianlan * @date 2023-08-07 **/ -@Entity @Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Entity @Table(name="base_item") public class Item extends BaseEntity implements Serializable { diff --git a/youchain-system/src/main/java/com/youchain/basicdata/repository/ItemRepository.java b/youchain-system/src/main/java/com/youchain/basicdata/repository/ItemRepository.java index 33f1f61..2e2539b 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/repository/ItemRepository.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/repository/ItemRepository.java @@ -1,31 +1,37 @@ /* -* 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. -*/ + * 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 com.youchain.basicdata.repository; import com.youchain.basicdata.domain.Item; +import com.youchain.basicdata.domain.Point; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; +import java.util.List; + /** -* @website https://eladmin.vip -* @author houjianlan -* @date 2023-08-16 -**/ + * @author houjianlan + * @website https://eladmin.vip + * @date 2023-08-16 + **/ public interface ItemRepository extends JpaRepository, JpaSpecificationExecutor { - @Query(" from Item i where i.code = :code and i.enabled = true") + @Query("from Item i where i.code = :code and i.enabled = true") Item findByCode(String code); + + @Query("from Item i where i.code in :codes and i.enabled = true") + List findByCodes(List codes); } diff --git a/youchain-system/src/main/java/com/youchain/basicdata/requset/ItemImportReq.java b/youchain-system/src/main/java/com/youchain/basicdata/requset/ItemImportReq.java new file mode 100644 index 0000000..f1dcc17 --- /dev/null +++ b/youchain-system/src/main/java/com/youchain/basicdata/requset/ItemImportReq.java @@ -0,0 +1,13 @@ +package com.youchain.basicdata.requset; + +import cn.idev.excel.annotation.ExcelProperty; +import lombok.Data; + +@Data +public class ItemImportReq { + @ExcelProperty("零件号") + private String code; + + @ExcelProperty("规格") + private String specs; +} diff --git a/youchain-system/src/main/java/com/youchain/basicdata/rest/ItemController.java b/youchain-system/src/main/java/com/youchain/basicdata/rest/ItemController.java index 3120586..79c5138 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/rest/ItemController.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/rest/ItemController.java @@ -20,6 +20,7 @@ import com.youchain.annotation.Log; import com.youchain.basicdata.domain.Item; import com.youchain.basicdata.service.ItemService; import com.youchain.basicdata.service.dto.ItemQueryCriteria; +import com.youchain.exception.handler.ApiResult; import com.youchain.utils.UserUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Pageable; @@ -80,13 +81,16 @@ public class ItemController { return new ResponseEntity<>(itemService.create(resources),HttpStatus.CREATED); } - @PostMapping(value = "/import_data") + @Log("导入物料") + @PostMapping(value = "/importItem") @ApiOperation("导入物料") - @Transactional - @AnonymousAccess - public ResponseEntity createSysAppUpdate( @RequestParam("file") MultipartFile multipartFile) { - return null; - + public ResponseEntity importItem(@RequestParam("file") MultipartFile multipartFile) { + try { + String result = itemService.importItem(multipartFile); + return new ResponseEntity<>(ApiResult.success(result, null), HttpStatus.OK); + }catch (Exception e){ + return new ResponseEntity<>(ApiResult.fail(e.getMessage()), HttpStatus.BAD_REQUEST); + } } @PutMapping diff --git a/youchain-system/src/main/java/com/youchain/basicdata/service/ItemService.java b/youchain-system/src/main/java/com/youchain/basicdata/service/ItemService.java index 29310e5..16df482 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/service/ItemService.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/service/ItemService.java @@ -16,9 +16,11 @@ package com.youchain.basicdata.service; import com.youchain.basicdata.domain.Item; +import com.youchain.basicdata.domain.Point; import com.youchain.basicdata.service.dto.ItemDto; import com.youchain.basicdata.service.dto.ItemQueryCriteria; import org.springframework.data.domain.Pageable; +import org.springframework.web.multipart.MultipartFile; import java.util.Map; import java.util.List; @@ -91,4 +93,20 @@ public interface ItemService { */ Item validateItem(String itemCode); + + /** + * 批量查询物料 + * + * @param codes 点位集合 + */ + Map findByCodes(List codes); + + + /** + * 导入物料 + * + * @param multipartFile 文件 + */ + String importItem(MultipartFile multipartFile); + } diff --git a/youchain-system/src/main/java/com/youchain/basicdata/service/impl/ItemServiceImpl.java b/youchain-system/src/main/java/com/youchain/basicdata/service/impl/ItemServiceImpl.java index 46bd913..7510385 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/service/impl/ItemServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/service/impl/ItemServiceImpl.java @@ -15,30 +15,30 @@ */ package com.youchain.basicdata.service.impl; +import cn.idev.excel.FastExcel; import com.youchain.basicdata.domain.Item; +import com.youchain.basicdata.requset.ItemImportReq; import com.youchain.exception.BadRequestException; -import com.youchain.utils.FileUtil; -import com.youchain.utils.PageUtil; -import com.youchain.utils.QueryHelp; -import com.youchain.utils.ValidationUtil; +import com.youchain.modules.system.domain.Dept; +import com.youchain.utils.*; import lombok.RequiredArgsConstructor; import com.youchain.basicdata.repository.ItemRepository; import com.youchain.basicdata.service.ItemService; import com.youchain.basicdata.service.dto.ItemDto; import com.youchain.basicdata.service.dto.ItemQueryCriteria; import com.youchain.basicdata.service.mapstruct.ItemMapper; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.web.multipart.MultipartFile; -import java.util.List; -import java.util.Map; +import java.util.*; import java.io.IOException; import javax.persistence.EntityManager; import javax.servlet.http.HttpServletResponse; -import java.util.ArrayList; -import java.util.LinkedHashMap; +import java.util.stream.Collectors; /** * @author houjianlan @@ -52,7 +52,6 @@ public class ItemServiceImpl implements ItemService { private final ItemRepository itemRepository; private final ItemMapper itemMapper; - private final EntityManager entityMapper; @Override public Map queryAll(ItemQueryCriteria criteria, Pageable pageable) { @@ -142,5 +141,92 @@ public class ItemServiceImpl implements ItemService { return item; } + @Override + public Map findByCodes(List codes) { + List itemList = itemRepository.findByCodes(codes); + Map itemMap = new HashMap<>(); + for (Item item : itemList) { + itemMap.put(item.getCode(), item); + } + return itemMap; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String importItem(MultipartFile multipartFile) { + List dataList; + try { + dataList = FastExcel.read(multipartFile.getInputStream()).head(ItemImportReq.class) + .sheet() + .doReadSync(); + } catch (IOException e) { + throw new BadRequestException("数据格式存在问题,无法读取"); + } + if (CollectionUtils.isEmpty(dataList)) { + throw new BadRequestException("数据为空"); + } + + + //获取文件中所有物料编码 + List codes = dataList.stream() + .map(ItemImportReq::getCode) + .distinct() + .collect(Collectors.toList()); + + + //获取已存在的物料 + Map existingItemMap = this.findByCodes(codes); + + //新增物料集合 + List itemsToCreate = new ArrayList<>(); + + //修改物料集合 + List itemsToUpdate = new ArrayList<>(); + + for (ItemImportReq itemImportReq : dataList) { + String code = itemImportReq.getCode(); + String specs = itemImportReq.getSpecs(); + //判断是否已存在容器 + if (existingItemMap.containsKey(code)) { + //修改物料 + Item item = existingItemMap.get(code); + itemsToUpdate.add(updateItem(item, specs)); + } else { + //新增容器 + Item item = createItem(code, specs, UserUtils.getDept()); + itemsToCreate.add(item); + existingItemMap.put(code, item); + } + } + + //批量新增容器 + if (!itemsToCreate.isEmpty()) { + itemRepository.saveAll(itemsToCreate); + } + + //批量更新容器 + if (!itemsToUpdate.isEmpty()) { + itemRepository.saveAll(itemsToUpdate); + } + return ("导入成功:" + " 新增(" + itemsToCreate.size() + ")修改(" + itemsToUpdate.size() + ")"); + } + + private Item createItem(String code, String specs, Dept dept) { + return Item.builder() + .code(code) + .name(code) + .specs(specs) + .enabled(true) + .goodType("大件专用") + .unit("个") + .dept(dept) + .build(); + } + + private Item updateItem(Item item, String specs) { + item.setSpecs(specs); + return item; + } + }