package com.gs.xiaomi.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.gs.xiaomi.config.DataAcquisitionConfiguration; import com.gs.xiaomi.dto.*; import com.gs.xiaomi.entity.DeliveryDetail; import com.gs.xiaomi.entity.DeliveryMain; import com.gs.xiaomi.entity.LogisticsPackage; import com.gs.xiaomi.entity.PackageDetail; import lombok.RequiredArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @Service @Transactional(rollbackFor = Exception.class) @RequiredArgsConstructor public class XM104Service { private static final Logger log = LoggerFactory.getLogger(XM104Service.class); private final SoapApiService soapApiService; private final DeliveryMainService deliveryMainService; private final PackageDetailService packageDetailService; private final DeliveryDetailService deliveryDetailService; private final LogisticsPackageService logisticsPackageService; public void getDb() { String format = DateUtil.format(new Date(), "yyyy-MM-dd"); getXM104Save(format); } private void getXM104Save(String format) { BizDocument doc = new BizDocument(); doc.setBizDate(format); doc.setLifnr(DataAcquisitionConfiguration.LIFNR); getXM104(doc); } private void getXM104(BizDocument doc) { ZfmWsApiRequest req = new ZfmWsApiRequest(); req.setIvCode(DataAcquisitionConfiguration.IV_CODEXM104); req.setIvEvent(""); req.setIvFlag(""); req.setIvInfo(doc); req.setIvPass(DataAcquisitionConfiguration.getIvPass(DataAcquisitionConfiguration.IV_CODEXM104)); req.setIvUser(DataAcquisitionConfiguration.IV_USER); try { BizDocumentResult deliveryNo = getDeliveryNo(req); if (CollUtil.isEmpty(deliveryNo.getEtHeaders())) { log.info("【BizDocumentResult】返回列表为空,跳过处理"); log.info("获取接口列表返回: {}", deliveryNo.getEvMessage()); return; } //获取所有的ASN号 List etHeaders = deliveryNo.getEtHeaders(); List collect = etHeaders.stream().filter(distinctByKey(EtHeader::getZzasn)).collect(Collectors.toList()); collect.forEach(etHeader -> { log.info("1.获取到送货单号: {}", etHeader.getZzasn()); //根据每行ASN号获取详细的明细 doc.setZzasn(etHeader.getZzasn()); req.setIvInfo(doc); try { BizDocumentResult result = getDeliveryNo(req); if (result == null) { log.info("【BizDocumentResult】获取送货单详情信息为空,跳过处理"); return; } log.info("2.写入数据库: {}", etHeader.getZzasn()); //写入到数据库中 setDeliveryMain(result); } catch (Exception e) { log.error("【写入数据库异常】送货单: {}, 异常: {}", etHeader.getZzasn(), e.getMessage(), e); throw new RuntimeException(e); } }); } catch (Exception e) { log.error("【读取列表异常】参数: {} 异常: {}", JSON.toJSONString(req), e.getMessage(), e); throw new RuntimeException(e); } } private BizDocumentResult getDeliveryNo(ZfmWsApiRequest request) throws Exception { BizDocumentResult bizDocumentResult = soapApiService.callAndParse(DataAcquisitionConfiguration.XM104_URL, request); return bizDocumentResult; } private Predicate distinctByKey(Function keyExtractor) { Map seen = new ConcurrentHashMap<>(); return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null; } private void setDeliveryMain(BizDocumentResult result) { List etHeaders = result.getEtHeaders(); etHeaders.forEach(etHeader -> { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(DeliveryMain::getZzasn, etHeader.getZzasn()); DeliveryMain one = deliveryMainService.getOne(queryWrapper, false); if (one != null) { deliveryMainService.removeById(one.getId()); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(DeliveryDetail::getPid, one.getId()); deliveryDetailService.remove(updateWrapper); //PackageDetail LambdaUpdateWrapper updateWrapper1 = new LambdaUpdateWrapper<>(); updateWrapper1.eq(PackageDetail::getPid, one.getId()); packageDetailService.remove(updateWrapper1); //LogisticsPackage LambdaUpdateWrapper updateWrapper2 = new LambdaUpdateWrapper<>(); updateWrapper2.eq(LogisticsPackage::getPid, one.getId()); logisticsPackageService.remove(updateWrapper2); } DeliveryMain deliveryMain = new DeliveryMain(); BeanUtil.copyProperties(etHeader, deliveryMain); long id = deliveryMainService.getId(); deliveryMain.setId(id); deliveryMainService.save(deliveryMain); List items = etHeader.getItems(); if (CollUtil.isNotEmpty(items)) { List deliveryDetails = new ArrayList<>(); for (Item item : items) { DeliveryDetail deliveryDetail = new DeliveryDetail(); BeanUtil.copyProperties(item, deliveryDetail); deliveryDetail.setPid(deliveryMain.getId()); deliveryDetails.add(deliveryDetail); } deliveryDetailService.saveBatch(deliveryDetails); } List boxItems = etHeader.getBoxItems(); if (CollUtil.isNotEmpty(boxItems)) { List list = new ArrayList<>(); for (BoxItem boxItem : boxItems) { PackageDetail packageDetail = new PackageDetail(); BeanUtil.copyProperties(boxItem, packageDetail); packageDetail.setPid(deliveryMain.getId()); list.add(packageDetail); } packageDetailService.saveBatch(list); } List boxSums = etHeader.getBoxSums(); if (CollUtil.isNotEmpty(boxSums)) { List list = new ArrayList<>(); for (BoxSum boxSum : boxSums) { LogisticsPackage logisticsPackage = new LogisticsPackage(); BeanUtil.copyProperties(boxSum, logisticsPackage); logisticsPackage.setPid(deliveryMain.getId()); list.add(logisticsPackage); } logisticsPackageService.saveBatch(list); } deliveryMainService.callPdaReceiptBtn("送货单签收[BTNOK[PL017[" + etHeader.getZzasn(), ""); }); } public boolean manualSynchronization(NumbericalDto numbericalDto) { try { String[] asns = numbericalDto.getAsn().split(","); for (String asn : asns) { BizDocument doc = new BizDocument(); doc.setLifnr(DataAcquisitionConfiguration.LIFNR); doc.setZzasn(asn); getXM104(doc); } return true; } catch (Exception e) { log.error("【手动读取ASN异常】 异常: {}", e.getMessage(), e); return false; } } public boolean manualSynchronizationByDate(NumbericalDto numbericalDto) { try { BizDocument doc = new BizDocument(); doc.setLifnr(DataAcquisitionConfiguration.LIFNR); doc.setBizDate(numbericalDto.getDate()); getXM104(doc); return true; } catch (Exception e) { log.error("【手动读取ASN异常】 异常: {}", e.getMessage(), e); return false; } } }