|
|
|
@ -32,6 +32,9 @@ import com.gaotao.modules.sys.entity.SysUserEntity; |
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.util.*; |
|
|
|
import java.util.stream.Collectors; |
|
|
|
import com.gaotao.modules.api.entity.issueAndReturnVo.PurchaseOrderReceiptVo; |
|
|
|
import com.gaotao.modules.api.service.IfsApiIssueAndReturnService; |
|
|
|
|
|
|
|
/** |
|
|
|
* 采购管理服务实现类 |
|
|
|
@ -58,6 +61,9 @@ public class PurchaseManageServiceImpl implements PurchaseManageService { |
|
|
|
@Autowired |
|
|
|
private InventoryStockMapper inventoryStockMapper; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private IfsApiIssueAndReturnService ifsApiIssueAndReturnService; |
|
|
|
|
|
|
|
@Value("${custom.ifs-url}") |
|
|
|
private String ifsUrl; |
|
|
|
|
|
|
|
@ -129,28 +135,72 @@ public class PurchaseManageServiceImpl implements PurchaseManageService { |
|
|
|
|
|
|
|
@Override |
|
|
|
public PageUtils getCancelableReceiptList(PoReceiptQueryDto queryDto) { |
|
|
|
// 只查询状态为已接收且未取消的记录 |
|
|
|
queryDto.setStatus("ARRIVED"); |
|
|
|
IPage<Map<String, Object>> page = poReceiptMapper.getCancelableReceiptList( |
|
|
|
new Page<>(queryDto.getPage(), queryDto.getSize()), queryDto); |
|
|
|
return new PageUtils(page); |
|
|
|
try { |
|
|
|
// 验证必要参数 |
|
|
|
if (StringUtils.isBlank(queryDto.getOrderNo())) { |
|
|
|
log.warn("订单号为空,返回空结果"); |
|
|
|
return new PageUtils(new ArrayList<>(), 0, queryDto.getSize(), queryDto.getPage()); |
|
|
|
} |
|
|
|
|
|
|
|
// 调用IFS接口获取采购订单接收记录 |
|
|
|
List<PurchaseOrderReceiptVo> allReceipts = ifsApiIssueAndReturnService.getPurchaseOrderReceipt( |
|
|
|
queryDto.getOrderNo(), queryDto.getSite()); |
|
|
|
|
|
|
|
// 过滤可取消的记录(状态为已接收的记录) |
|
|
|
List<PurchaseOrderReceiptVo> cancelableReceipts = allReceipts.stream() |
|
|
|
.filter(receipt -> "To be Received".equals(receipt.getState())) |
|
|
|
.collect(Collectors.toList()); |
|
|
|
|
|
|
|
// 应用查询条件过滤 |
|
|
|
if (StringUtils.isNotBlank(queryDto.getReceiptNo())) { |
|
|
|
cancelableReceipts = cancelableReceipts.stream() |
|
|
|
.filter(receipt -> String.valueOf(receipt.getReceiptNo()).contains(queryDto.getReceiptNo())) |
|
|
|
.collect(Collectors.toList()); |
|
|
|
} |
|
|
|
|
|
|
|
if (StringUtils.isNotBlank(queryDto.getPartNo())) { |
|
|
|
cancelableReceipts = cancelableReceipts.stream() |
|
|
|
.filter(receipt -> receipt.getSourcePartNo() != null && |
|
|
|
receipt.getSourcePartNo().contains(queryDto.getPartNo())) |
|
|
|
.collect(Collectors.toList()); |
|
|
|
} |
|
|
|
|
|
|
|
if (StringUtils.isNotBlank(queryDto.getSupplierId())) { |
|
|
|
cancelableReceipts = cancelableReceipts.stream() |
|
|
|
.filter(receipt -> receipt.getSender() != null && |
|
|
|
receipt.getSender().contains(queryDto.getSupplierId())) |
|
|
|
.collect(Collectors.toList()); |
|
|
|
} |
|
|
|
|
|
|
|
// 手动分页 |
|
|
|
int page = queryDto.getPage(); |
|
|
|
int size = queryDto.getSize(); |
|
|
|
int total = cancelableReceipts.size(); |
|
|
|
int start = (page - 1) * size; |
|
|
|
int end = Math.min(start + size, total); |
|
|
|
|
|
|
|
List<PurchaseOrderReceiptVo> pagedReceipts = cancelableReceipts.subList(start, end); |
|
|
|
|
|
|
|
// 构造分页结果 |
|
|
|
PageUtils pageUtils = new PageUtils(pagedReceipts, total, size, page); |
|
|
|
return pageUtils; |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
log.error("获取可取消接收记录失败: {}", e.getMessage(), e); |
|
|
|
// 如果IFS接口调用失败,返回空结果 |
|
|
|
return new PageUtils(new ArrayList<>(), 0, queryDto.getSize(), queryDto.getPage()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
@Transactional |
|
|
|
public R cancelReceipt(Map<String, Object> params) { |
|
|
|
try { |
|
|
|
String receiptNo = (String) params.get("receiptNo"); |
|
|
|
String receiptSequence = String.valueOf(params.get("receiptSequence")); |
|
|
|
String site = (String) params.get("site"); |
|
|
|
String cancelReason = (String) params.get("cancelReason"); |
|
|
|
Double itemNo = params.get("itemNo") != null ? Double.valueOf(params.get("itemNo").toString()) : null; |
|
|
|
|
|
|
|
// 2. 调用IFS接口同步取消操作 |
|
|
|
syncCancelToIfs(receiptNo, site, itemNo, cancelReason); |
|
|
|
|
|
|
|
// 3. 更新本地记录状态 |
|
|
|
updateLocalRecordStatus(receiptNo, site, itemNo, "CANCEL", cancelReason); |
|
|
|
|
|
|
|
syncCancelToIfs(receiptSequence, site, cancelReason); |
|
|
|
return R.ok("取消接收成功"); |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
@ -204,65 +254,31 @@ public class PurchaseManageServiceImpl implements PurchaseManageService { |
|
|
|
/** |
|
|
|
* 同步取消操作到IFS |
|
|
|
*/ |
|
|
|
private void syncCancelToIfs(String receiptNo, String site, Double itemNo, String cancelReason) { |
|
|
|
private void syncCancelToIfs(String receiptSequence, String site, String cancelReason) { |
|
|
|
try { |
|
|
|
// 根据receiptNo、site、itemNo查询PoReceiptDetail记录,获取订单相关信息 |
|
|
|
LambdaQueryWrapper<PoReceiptDetail> wrapper = new LambdaQueryWrapper<>(); |
|
|
|
wrapper.eq(PoReceiptDetail::getReceiptNo, receiptNo) |
|
|
|
.eq(PoReceiptDetail::getSite, site); |
|
|
|
if (itemNo != null) { |
|
|
|
wrapper.eq(PoReceiptDetail::getItemNo, itemNo); |
|
|
|
} |
|
|
|
|
|
|
|
List<PoReceiptDetail> details = poReceiptDetailMapper.selectList(wrapper); |
|
|
|
if (details.isEmpty()) { |
|
|
|
throw new XJException("未找到对应的接收记录"); |
|
|
|
} |
|
|
|
|
|
|
|
// 对每个接收记录调用IFS取消方法 |
|
|
|
for (PoReceiptDetail detail : details) { |
|
|
|
Map<String, Object> params = Map.of( |
|
|
|
"ifsDBName", ifsDBName, |
|
|
|
"domainUserID", getCurrentDomainUserID(), |
|
|
|
"ifsSiteID", site, |
|
|
|
"ifsReceiptSequence", "2690471" |
|
|
|
); |
|
|
|
|
|
|
|
ObjectMapper objectMapper = new ObjectMapper(); |
|
|
|
String jsonBody = objectMapper.writeValueAsString(params); |
|
|
|
String ifsResponse = HttpUtils.doPost(ifsUrl + "CancelPurchaseOrderArrival", jsonBody, null); |
|
|
|
|
|
|
|
if ("IFSUpdated".equals(ifsResponse) || "\"IFSUpdated\"".equals(ifsResponse)) { |
|
|
|
log.info("IFS取消接收成功,PO号: {}", detail.getOrderNo()); |
|
|
|
} else { |
|
|
|
log.error("IFS取消接收失败,PO号: {}, 响应: {}", detail.getOrderNo(), ifsResponse); |
|
|
|
// 同步失败需要回滚前面所有的数据库操作 |
|
|
|
String errorMessage = IfsErrorMessageUtils.extractOracleErrorMessage(ifsResponse); |
|
|
|
throw new XJException(errorMessage); |
|
|
|
} |
|
|
|
Map<String, Object> params = Map.of( |
|
|
|
"ifsDBName", ifsDBName, |
|
|
|
"domainUserID", getCurrentDomainUserID(), |
|
|
|
"ifsSiteID", site, |
|
|
|
"ifsReceiptSequence", receiptSequence |
|
|
|
); |
|
|
|
|
|
|
|
ObjectMapper objectMapper = new ObjectMapper(); |
|
|
|
String jsonBody = objectMapper.writeValueAsString(params); |
|
|
|
String ifsResponse = HttpUtils.doPost(ifsUrl + "CancelPurchaseOrderArrival", jsonBody, null); |
|
|
|
|
|
|
|
if ("IFSUpdated".equals(ifsResponse) || "\"IFSUpdated\"".equals(ifsResponse)) { |
|
|
|
log.info("IFS取消接收成功,PO号: {}", receiptSequence); |
|
|
|
} else { |
|
|
|
log.error("IFS取消接收失败,PO号: {}, 响应: {}", receiptSequence, ifsResponse); |
|
|
|
// 同步失败需要回滚前面所有的数据库操作 |
|
|
|
String errorMessage = IfsErrorMessageUtils.extractOracleErrorMessage(ifsResponse); |
|
|
|
throw new XJException(errorMessage); |
|
|
|
} |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
log.error("同步IFS取消操作异常: {}", e.getMessage(), e); |
|
|
|
throw new XJException("IFS同步异常: " + e.getMessage()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 更新本地记录状态 |
|
|
|
*/ |
|
|
|
private void updateLocalRecordStatus(String receiptNo, String site, Double itemNo, String status, String cancelReason) { |
|
|
|
// 更新接收明细状态 |
|
|
|
LambdaQueryWrapper<PoReceiptDetail> detailWrapper = new LambdaQueryWrapper<>(); |
|
|
|
detailWrapper.eq(PoReceiptDetail::getReceiptNo, receiptNo) |
|
|
|
.eq(PoReceiptDetail::getSite, site); |
|
|
|
if (itemNo != null) { |
|
|
|
detailWrapper.eq(PoReceiptDetail::getItemNo, itemNo); |
|
|
|
} |
|
|
|
PoReceiptDetail detail = new PoReceiptDetail(); |
|
|
|
detail.setStatus(status); |
|
|
|
detail.setCanceIremark(cancelReason); |
|
|
|
poReceiptDetailMapper.update(detail, detailWrapper); |
|
|
|
} |
|
|
|
|
|
|
|
} |