package com.vincent.rsf.server.manager.service.impl; import cn.afterturn.easypoi.excel.ExcelImportUtil; import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.manager.enums.OrderSourceType; import com.vincent.rsf.server.manager.enums.OrderType; import com.vincent.rsf.server.manager.enums.OrderWorkType; import com.vincent.rsf.server.common.utils.ExcelUtil; import com.vincent.rsf.server.manager.entity.Companys; import com.vincent.rsf.server.manager.entity.Matnr; import com.vincent.rsf.server.manager.entity.Purchase; import com.vincent.rsf.server.manager.entity.excel.PurchaseTemplate; import com.vincent.rsf.server.manager.enums.CompanysType; import com.vincent.rsf.server.manager.mapper.PurchaseItemMapper; import com.vincent.rsf.server.manager.entity.PurchaseItem; import com.vincent.rsf.server.manager.service.CompanysService; import com.vincent.rsf.server.manager.service.MatnrService; import com.vincent.rsf.server.manager.service.PurchaseItemService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.vincent.rsf.server.manager.service.PurchaseService; import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.system.utils.SerialRuleUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @Service("purchaseItemService") public class PurchaseItemServiceImpl extends ServiceImpl implements PurchaseItemService { @Autowired private PurchaseService purchaseService; @Autowired private MatnrService matnrService; @Autowired private CompanysService companysService; /** * @author Ryan * @date 2025/5/6 * @description: PO单导入功能 * @version 1.0 */ @Override @Transactional(rollbackFor = Exception.class) public R excelImport(MultipartFile file, Long loginUserId) throws Exception { ExcelImportResult result = ExcelImportUtil.importExcelMore(file.getInputStream(), PurchaseTemplate.class, ExcelUtil.getDefaultImportParams()); if (result.getList().isEmpty()) { throw new CoolException("物料导入失败!!"); } if (result.getList().isEmpty()) { throw new CoolException("表格内容不能为空!!"); } List resultList = result.getList(); Map> listMap = resultList.stream().collect(Collectors.groupingBy(PurchaseTemplate::getPoCode)); for (String key : listMap.keySet()) { List list = listMap.get(key); Purchase serviceOne = purchaseService.getOne(new LambdaQueryWrapper().eq(Purchase::getCode, key)); if (!Objects.isNull(serviceOne)) { // return R.error(serviceOne.getCode() + "单据已存在!!"); throw new CoolException(serviceOne.getCode() + "单据已存在!!"); } PurchaseTemplate template = list.stream().findFirst().get(); Purchase purchase = new Purchase(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date date = dateFormat.parse(template.getArrTime()); BeanUtils.copyProperties(template, purchase); purchase.setCode(template.getPoCode()); if (StringUtils.isBlank(template.getPoCode())) { String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_ORDER_PO_CODE, purchase); purchase.setCode(ruleCode); } purchase.setType(OrderType.getTypeVal(template.getType())) .setWkType(OrderWorkType.getWorkType(template.getWkType())) .setSource(OrderSourceType.ORDER_SOURCE_TYPE_EXCEL.desc) .setPreArr(date) .setCreateBy(loginUserId) .setUpdateBy(loginUserId); if (!purchaseService.save(purchase)) { throw new CoolException("主单保存失败!!"); } List items = new ArrayList<>(); for (PurchaseTemplate purchaseTemplate : list) { PurchaseItem item = new PurchaseItem(); if (StringUtils.isBlank(purchaseTemplate.getMatnrCode())) { throw new CoolException(purchaseTemplate.getPoCode() + ":物料编码不能为空!!"); } Matnr matnr = matnrService.getOne(new LambdaQueryWrapper().eq(Matnr::getCode, purchaseTemplate.getMatnrCode())); if (Objects.isNull(matnr)) { throw new CoolException(purchaseTemplate.getMatnrCode() + "物料不存在!!"); } item.setMatnrName(matnr.getName()) .setMatnrCode(matnr.getCode()) .setPlatItemId(purchaseTemplate.getPlatItemId()) .setAnfme(purchaseTemplate.getAnfme()) .setPurchaseId(purchase.getId()) .setUnit(matnr.getUnit()) .setNromQty(matnr.getNromNum()) .setSplrBatch(purchaseTemplate.getSplrBatch()) .setCreateBy(loginUserId) .setUpdateBy(loginUserId); if (StringUtils.isNotBlank(purchaseTemplate.getSplrCode())) { Companys companys = companysService.getOne(new LambdaQueryWrapper() .eq(Companys::getType, CompanysType.COMPANYS_TYPE_SUPPLIER.val) .eq(Companys::getCode, purchaseTemplate.getSplrCode())); if (!Objects.isNull(companys)) { item.setSplrCode(companys.getCode()).setSplrName(companys.getName()); } else { throw new CoolException("供应商:" + template.getSplrName() + "不存在!!"); } } else { throw new CoolException("供应商不能为空!!"); } if (!this.save(item)) { throw new CoolException("单据明细保存失败!!"); } items.add(item); } double anfmes = items.stream().mapToDouble(PurchaseItem::getAnfme).sum(); purchase.setAnfme(anfmes); if (!purchaseService.updateById(purchase)) { throw new CoolException("主单数量修改失败!!"); } } return R.ok("导入成功!!"); } }