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<PurchaseItemMapper, PurchaseItem> 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<PurchaseTemplate> resultList = result.getList(); 
 | 
        Map<String, List<PurchaseTemplate>> listMap = resultList.stream().collect(Collectors.groupingBy(item -> 
 | 
                !Objects.isNull(item.getPoCode()) ? item.getPoCode() : SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_ORDER_PO_CODE, null) 
 | 
                )); 
 | 
        for (String key : listMap.keySet()) { 
 | 
            List<PurchaseTemplate> list = listMap.get(key); 
 | 
            Purchase serviceOne = purchaseService.getOne(new LambdaQueryWrapper<Purchase>().eq(Purchase::getCode, key)); 
 | 
            if (!Objects.isNull(serviceOne)) { 
 | 
                throw new CoolException(serviceOne.getCode() +  "单据已存在!!"); 
 | 
            } 
 | 
            PurchaseTemplate template = list.stream().findFirst().get(); 
 | 
            Purchase purchase = new Purchase(); 
 | 
            Date date = 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<PurchaseItem> 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<Matnr>().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<Companys>() 
 | 
                            .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("导入成功!!"); 
 | 
    } 
 | 
} 
 |