package com.vincent.rsf.server.api.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.vincent.rsf.common.domain.CommonReponse; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.api.config.RemotesInfoProperties; import com.vincent.rsf.server.api.entity.dto.PoItemsDto; import com.vincent.rsf.server.api.entity.enums.OrderType; import com.vincent.rsf.server.api.entity.params.ErpInspectItem; import com.vincent.rsf.server.api.entity.params.ErpInspectParams; import com.vincent.rsf.server.common.config.SysStockFlowProperties; import com.vincent.rsf.server.manager.entity.AsnOrder; import com.vincent.rsf.server.manager.entity.AsnOrderItem; import com.vincent.rsf.server.manager.entity.PurchaseItem; import com.vincent.rsf.server.manager.service.AsnOrderItemService; import com.vincent.rsf.server.manager.service.AsnOrderService; import com.vincent.rsf.server.manager.service.PurchaseItemService; import com.vincent.rsf.server.manager.service.PurchaseService; import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.api.controller.params.Order; import com.vincent.rsf.server.system.utils.SerialRuleUtils; import com.vincent.rsf.server.api.service.ErpApiService; import com.vincent.rsf.server.manager.entity.Purchase; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import java.util.*; import java.util.stream.Collectors; /** * @author Ryan * @version 1.0 * @title ErpApiServiceImpl * @description * @create 2025/3/4 16:27 */ @Slf4j @Service("erpApiService") public class ErpApiServiceImpl implements ErpApiService { @Autowired private PurchaseService purchaseService; @Autowired private PurchaseItemService purchaseItemService; @Autowired private AsnOrderService asnOrderService; @Autowired private AsnOrderItemService asnOrderItemService; @Autowired private RestTemplate restTemplate; @Autowired private RemotesInfoProperties remotesInfoProperties; @Autowired private RemotesInfoProperties.ApiInfo apiInfo; @Override @Transactional(rollbackFor = Exception.class) public boolean syncPurchasee(List orders) { if (orders.isEmpty()) { throw new CoolException("单据内容不能为空!!"); } orders.forEach(ors -> { Purchase purchase = new Purchase(); BeanUtils.copyProperties(ors, purchase); String wkVal = SerialRuleUtils.generateRuleCode(SerialRuleCode.PURCHASE_CODE, purchase); purchase.setCode(wkVal) .setType(OrderType.ORDER_PURCHASE_IN.type); if (!purchaseService.save(purchase)) { throw new CoolException("采购单据保存失败"); } //判断子列表不为空 if (!ors.getChildren().isEmpty()) { ArrayList list = new ArrayList<>(); ors.getChildren().forEach(orderItem -> { PurchaseItem item = new PurchaseItem(); BeanUtils.copyProperties(orderItem, item); item.setPurchaseId(purchase.getId()); list.add(item); }); if (!purchaseItemService.saveBatch(list)) { throw new CoolException("采购单明细保存失败!!"); } } }); return true; } /** * @author Ryan * @description 上报质检列表 * @params [items 列表] * @return boolean * @time 2025/3/7 09:12 */ @Override @Transactional(rollbackFor = Exception.class) public boolean reportInspectNotify(List items) { if (items.isEmpty()) { throw new CoolException("上报内容为空!!"); } List inspectParams = new ArrayList<>(); Map> listMap = items.stream().collect(Collectors.groupingBy(PoItemsDto::getPurchaseId)); listMap.keySet().forEach(key -> { Purchase purchase = purchaseService.getOne(new LambdaQueryWrapper().eq(Purchase::getId, Long.valueOf(key))); if (Objects.isNull(purchase)) { throw new CoolException("采购单信息有误!!"); } ErpInspectParams params = new ErpInspectParams(); List inspectItems = new ArrayList<>(); //赋值erp主单编码,编号 params.setPoId(purchase.getErpId()) .setPoCode(purchase.getErpCode()); List dtos = listMap.get(key); if (dtos.isEmpty()) { throw new CoolException("单据信息错误!!"); } dtos.forEach(dto -> { ErpInspectItem inspect= new ErpInspectItem(); BeanUtils.copyProperties(dto, inspect); //赋值erp明细编码 inspect.setPoItemId(dto.getErpItemId()); inspectItems.add(inspect); }); params.setChildren(inspectItems); inspectParams.add(params); }); MultiValueMap params = new LinkedMultiValueMap<>(); //获取上报质检接口 String url = remotesInfoProperties.getBaseUrl() + apiInfo.getNotifyInspect(); // 设置请求参数 params.add("params", JSONObject.toJSONString(inspectParams)); log.info("请求地址:{},请求参数:{}", url, JSONObject.toJSONString(inspectParams)); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); HttpEntity httpEntity = new HttpEntity<>(params, headers); // 请求 ResponseEntity exchange = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class); log.info("下发任务 返回结果:{}", exchange); if (Objects.isNull(exchange.getBody()) || exchange.getBody() == null) { throw new CoolException("下发任务失败!!"); } else { CommonReponse reponse = (CommonReponse) JSON.parse(exchange.getBody()); if (reponse.getCode() == 0) { //修改asn上报状态 Set itemSets = items.stream().map(PoItemsDto::getId).collect(Collectors.toSet()); Set longSet = new HashSet<>(); itemSets.forEach(set -> { longSet.add(Long.parseLong(set)); }); List asnOrderItems = asnOrderItemService.list(new LambdaQueryWrapper().in(AsnOrderItem::getPoDetlId, longSet)); if (asnOrderItems.isEmpty()) { throw new CoolException("ASN单据不存在!!"); } List list = asnOrderItems.stream().map(AsnOrderItem::getId).collect(Collectors.toList()); /************************** 修改ASN明细单状态 ******************************/ if (!asnOrderItemService.update(new LambdaUpdateWrapper().in(AsnOrderItem::getId, list).set(AsnOrderItem::getStatus, 1))) { throw new CoolException("ASN明细单据状态修改失败!!"); } /************************** 修改ASN主单数据 ******************************/ //获取ASN明细订单标识 List ids = asnOrderItems.stream().map(AsnOrderItem::getAsnId).collect(Collectors.toList()); //ASN明细单据分组 Map> asnIds = asnOrderItems.stream().collect(Collectors.groupingBy(AsnOrderItem::getAsnId)); ids.forEach(id -> { int count = asnOrderService.count(new LambdaQueryWrapper().in(AsnOrder::getId, id)); if (count == asnIds.get(id).size()) { if (!asnOrderService.update(new LambdaUpdateWrapper().eq(AsnOrder::getId, id).set(AsnOrder::getStatus, 1))) { throw new CoolException("ASN主单状态修改失败!!"); } } else { if (!asnOrderService.update(new LambdaUpdateWrapper().eq(AsnOrder::getId, id).set(AsnOrder::getStatus, 2))) { throw new CoolException("ASN主单状态修改失败!!"); } } }); return true; } else { throw new CoolException(reponse.getMsg()); } } } }