From c852ef1b8bde18fb74e0370b5c56a34ec16211a7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com>
Date: Wed, 29 Jul 2026 14:29:56 +0800
Subject: [PATCH] =?UTF-8?q?OMS=E6=89=B9=E9=87=8F=E7=AD=BE=E5=90=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../api/domain/SignatureBatchFeignDTO.java | 42 +++++++++
.../api/factory/RemoteWmsFallbackFactory.java | 6 ++
.../mapper/ElectronicSignatureMapper.java | 36 ++++++++
.../ElectronicSignatureDomainService.java | 85 +++++++++++++++++++
.../ElectronicSignatureBatchSignDTO.java | 30 +++++++
.../ElectronicSignatureApi.java | 30 +++++++
.../stockSignature/StockSignatureApi.java | 85 +++++++++++++++++++
7 files changed, 314 insertions(+)
create mode 100644 mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/SignatureBatchFeignDTO.java
create mode 100644 mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/electronicSignature/ElectronicSignatureBatchSignDTO.java
create mode 100644 mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockSignature/StockSignatureApi.java
diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/SignatureBatchFeignDTO.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/SignatureBatchFeignDTO.java
new file mode 100644
index 000000000..c3b76451e
--- /dev/null
+++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/SignatureBatchFeignDTO.java
@@ -0,0 +1,42 @@
+package com.mhd.system.api.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * OMS→WMS 批量签名 Feign DTO
+ *
+ *
OMS端批量签名时,通过此DTO调用WMS的批量签名接口,
+ * 更新WMS stock_in_order / stock_out_order 表的签名字段。
+ */
+@Data
+public class SignatureBatchFeignDTO {
+
+ @ApiModelProperty("入库单ID列表")
+ private List inOrderIds;
+
+ @ApiModelProperty("出库单ID列表")
+ private List outOrderIds;
+
+ @ApiModelProperty("签名状态:2-已签名")
+ private Integer signatureStatus;
+
+ @ApiModelProperty("签名时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date signatureTime;
+
+ @ApiModelProperty("手写签名图片(base64或URL,单张)")
+ private String signaturePic;
+
+ @ApiModelProperty("拍照取证图片(逗号分隔多张URL)")
+ private String evidencePics;
+
+ @ApiModelProperty("签名备注")
+ private String signatureRemark;
+}
diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWmsFallbackFactory.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWmsFallbackFactory.java
index e187b6c4a..1cab68d00 100644
--- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWmsFallbackFactory.java
+++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWmsFallbackFactory.java
@@ -119,6 +119,12 @@ public class RemoteWmsFallbackFactory implements FallbackFactory selectMaterialDetailBySignatureId(@Param("signatureId") Long signatureId);
+
+ /**
+ * 批量签名:根据签名ID列表更新签名信息
+ */
+ @Update("")
+ int batchUpdateSign(@Param("signatureIds") List signatureIds,
+ @Param("signatureTime") Date signatureTime,
+ @Param("signaturePic") String signaturePic,
+ @Param("evidencePics") String evidencePics,
+ @Param("signatureRemark") String signatureRemark,
+ @Param("signatureMode") Integer signatureMode);
+
+ /**
+ * 根据签名ID列表批量查询
+ */
+ @Select("")
+ List selectBySignatureIds(@Param("signatureIds") List signatureIds);
}
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/service/ElectronicSignatureDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/service/ElectronicSignatureDomainService.java
index c3252365b..d40d338a6 100644
--- a/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/service/ElectronicSignatureDomainService.java
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/service/ElectronicSignatureDomainService.java
@@ -1,5 +1,6 @@
package com.mhd.oms.domain.electronicSignature.service;
+import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.mhd.oms.domain.electronicSignature.entity.ElectronicSignature;
import com.mhd.oms.domain.electronicSignature.entity.ElectronicSignatureMaterialDetail;
@@ -7,14 +8,19 @@ import com.mhd.oms.domain.electronicSignature.repository.facade.IElectronicSigna
import com.mhd.oms.domain.electronicSignature.repository.facade.IElectronicSignatureService;
import com.mhd.oms.domain.electronicSignature.repository.mapper.ElectronicSignatureMapper;
import com.mhd.oms.domain.electronicSignature.repository.todo.ElectronicSignatureDO;
+import com.mhd.oms.interfaces.dto.electronicSignature.ElectronicSignatureBatchSignDTO;
import com.mhd.oms.interfaces.dto.electronicSignature.ElectronicSignatureQueryDTO;
+import com.mhd.system.api.WmsServiceFeign;
+import com.mhd.system.api.domain.SignatureBatchFeignDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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.stream.Collectors;
/**
* 电子签名领域服务
@@ -32,6 +38,9 @@ public class ElectronicSignatureDomainService {
@Autowired
private ElectronicSignatureMapper electronicSignatureMapper;
+ @Autowired(required = false)
+ private WmsServiceFeign wmsServiceFeign;
+
/**
* 保存电子签名记录(生成待签名记录)
* 业务规则:
@@ -105,4 +114,80 @@ public class ElectronicSignatureDomainService {
}
electronicSignatureMaterialDetailService.batchInsert(detailList);
}
+
+ /**
+ * 批量签名:勾选多条记录后批量签名
+ *
+ * 业务流程:
+ * 1. 查询OMS电子签名表,获取每条记录的 orderId + orderType
+ * 2. 更新OMS ELECTRONIC_SIGNATURE表:signatureStatus=2(已签名)、signatureTime、signaturePic、
+ * evidencePics、signatureRemark、signatureMode
+ * 3. 按订单类型分组后,调用WMS Feign更新WMS stock_in_order / stock_out_order表
+ *
+ */
+ @Transactional(rollbackFor = Exception.class)
+ public int batchSign(ElectronicSignatureBatchSignDTO dto) {
+ List signatureIds = dto.getSignatureIds();
+ if (CollectionUtil.isEmpty(signatureIds)) {
+ return 0;
+ }
+
+ // 1. 查询签名记录,获取 orderId + orderType
+ List signatureList = electronicSignatureMapper.selectBySignatureIds(signatureIds);
+ if (CollectionUtil.isEmpty(signatureList)) {
+ log.warn("批量签名失败:未找到有效的签名记录");
+ return 0;
+ }
+
+ // 2. 更新OMS电子签名表
+ Date now = new Date();
+ String evidencePicsStr = null;
+ if (CollectionUtil.isNotEmpty(dto.getEvidencePics())) {
+ evidencePicsStr = String.join(",", dto.getEvidencePics());
+ }
+
+ int updated = electronicSignatureMapper.batchUpdateSign(
+ signatureIds, now,
+ dto.getSignaturePic(),
+ evidencePicsStr,
+ dto.getSignatureRemark(),
+ dto.getSignatureMode());
+ log.info("批量签名:OMS电子签名表更新 {} 条", updated);
+
+ // 3. 按订单类型分组,调用WMS更新入/出库表
+ if (wmsServiceFeign != null) {
+ try {
+ // 分组:IN-入库、OUT-出库
+ List inOrderIds = signatureList.stream()
+ .filter(s -> "IN".equals(s.getOrderType()))
+ .map(ElectronicSignature::getOrderId)
+ .distinct()
+ .collect(Collectors.toList());
+ List outOrderIds = signatureList.stream()
+ .filter(s -> "OUT".equals(s.getOrderType()))
+ .map(ElectronicSignature::getOrderId)
+ .distinct()
+ .collect(Collectors.toList());
+
+ // 构建 WMS 批量签名 DTO(一次调用同时处理入库+出库)
+ SignatureBatchFeignDTO wmsDto = new SignatureBatchFeignDTO();
+ wmsDto.setInOrderIds(inOrderIds.isEmpty() ? null : inOrderIds);
+ wmsDto.setOutOrderIds(outOrderIds.isEmpty() ? null : outOrderIds);
+ wmsDto.setSignatureStatus(2);
+ wmsDto.setSignatureTime(now);
+ wmsDto.setSignaturePic(dto.getSignaturePic());
+ wmsDto.setEvidencePics(evidencePicsStr);
+ wmsDto.setSignatureRemark(dto.getSignatureRemark());
+
+ log.info("批量签名:调用WMS更新入/出库单,入库{}条,出库{}条",
+ inOrderIds.size(), outOrderIds.size());
+ wmsServiceFeign.batchSignWms(wmsDto);
+ } catch (Exception e) {
+ log.error("批量签名:调用WMS更新入/出库表失败", e);
+ // WMS更新失败不影响OMS表更新结果,仅记录日志
+ }
+ }
+
+ return updated;
+ }
}
diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/electronicSignature/ElectronicSignatureBatchSignDTO.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/electronicSignature/ElectronicSignatureBatchSignDTO.java
new file mode 100644
index 000000000..deaed38ca
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/electronicSignature/ElectronicSignatureBatchSignDTO.java
@@ -0,0 +1,30 @@
+package com.mhd.oms.interfaces.dto.electronicSignature;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 电子签名批量签名请求DTO
+ *
+ * 勾选多条记录后批量签名,更新OMS电子签名表 + 调用WMS更新入/出库单表。
+ */
+@Data
+public class ElectronicSignatureBatchSignDTO {
+
+ @ApiModelProperty(value = "签名ID列表", required = true)
+ private List signatureIds;
+
+ @ApiModelProperty("手写签名图片(base64或URL,单张)")
+ private String signaturePic;
+
+ @ApiModelProperty("拍照取证图片URL列表(多张)")
+ private List evidencePics;
+
+ @ApiModelProperty("签名备注")
+ private String signatureRemark;
+
+ @ApiModelProperty("签名方式:1-电子签名 2-附件上传 3-扫二维码 4-系统自动")
+ private Integer signatureMode;
+}
diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/electronicSignature/ElectronicSignatureApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/electronicSignature/ElectronicSignatureApi.java
index 981173f92..fde87cd6d 100644
--- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/electronicSignature/ElectronicSignatureApi.java
+++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/electronicSignature/ElectronicSignatureApi.java
@@ -8,6 +8,7 @@ import com.mhd.oms.domain.electronicSignature.entity.ElectronicSignature;
import com.mhd.oms.domain.electronicSignature.entity.ElectronicSignatureMaterialDetail;
import com.mhd.oms.domain.electronicSignature.repository.todo.ElectronicSignatureDO;
import com.mhd.oms.domain.electronicSignature.service.ElectronicSignatureDomainService;
+import com.mhd.oms.interfaces.dto.electronicSignature.ElectronicSignatureBatchSignDTO;
import com.mhd.oms.interfaces.dto.electronicSignature.ElectronicSignatureQueryDTO;
import com.mhd.oms.interfaces.dto.electronicSignature.ElectronicSignatureSaveDTO;
import com.mhd.oms.interfaces.dto.electronicSignature.ElectronicSignatureVO;
@@ -96,6 +97,35 @@ public class ElectronicSignatureApi extends BaseController {
return AjaxResult.success(vo);
}
+ /**
+ * 勾选记录批量签名
+ *
+ * 前端勾选多条待签名的电子签名记录,传入签名ID列表(signatureIds)、签名图片(signaturePic)、
+ * 签名备注(signatureRemark)、签名方式(signatureMode),后端:
+ *
+ * - 更新 OMS ELECTRONIC_SIGNATURE 表:signatureStatus=2(已签名)、signatureTime=当前时间、signaturePic、evidencePics、signatureRemark、signatureMode
+ * - 通过 Feign 调用 WMS 更新 stock_in_order / stock_out_order 表的对应签名字段
+ *
+ */
+ @ApiOperation("批量签名(勾选记录后批量更新签名状态为已签名)")
+ @PostMapping("/batchSign")
+ public AjaxResult batchSign(@RequestBody ElectronicSignatureBatchSignDTO dto) {
+ if (dto.getSignatureIds() == null || dto.getSignatureIds().isEmpty()) {
+ return AjaxResult.error("请选择需要签名的记录");
+ }
+ try {
+ int count = electronicSignatureDomainService.batchSign(dto);
+ if (count > 0) {
+ return AjaxResult.success("批量签名成功,共更新 " + count + " 条记录");
+ } else {
+ return AjaxResult.error("批量签名失败:未找到有效的待签名记录");
+ }
+ } catch (Exception e) {
+ log.error("批量签名失败", e);
+ return AjaxResult.error("批量签名失败:" + e.getMessage());
+ }
+ }
+
private ElectronicSignatureDO toDO(ElectronicSignatureSaveDTO dto) {
ElectronicSignatureDO signatureDO = new ElectronicSignatureDO();
BeanUtils.copyProperties(dto, signatureDO, "materialDetailList");
diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockSignature/StockSignatureApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockSignature/StockSignatureApi.java
new file mode 100644
index 000000000..c686d681d
--- /dev/null
+++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockSignature/StockSignatureApi.java
@@ -0,0 +1,85 @@
+package com.mhd.wms.interfaces.facadeApi.stockSignature;
+
+import com.mhd.common.core.web.controller.BaseController;
+import com.mhd.common.core.web.domain.AjaxResult;
+import com.mhd.system.api.domain.SignatureBatchFeignDTO;
+import com.mhd.wms.application.service.stockInOrder.StockInOrderApplicationService;
+import com.mhd.wms.application.service.stockOutOrder.StockOutOrderApplicationService;
+import com.mhd.wms.interfaces.dto.signature.BatchSignatureDTO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 库存签名API(供OMS端Feign调用,统一更新WMS入/出库单签名字段)
+ *
+ * OMS端批量签名后,通过Feign调用此API,
+ * 更新WMS stock_in_order / stock_out_order 表的签名状态、签名时间、签名图片、签名备注。
+ */
+@Slf4j
+@RestController
+@RequestMapping("/stockSignatureApi")
+@Api(tags = "库存签名(OMS→WMS)")
+public class StockSignatureApi extends BaseController {
+
+ @Autowired
+ private StockInOrderApplicationService stockInOrderApplicationService;
+
+ @Autowired
+ private StockOutOrderApplicationService stockOutOrderApplicationService;
+
+ /**
+ * 批量签名(OMS→WMS)
+ *
+ * 接收SignatureBatchFeignDTO,映射为BatchSignatureDTO后,分别调用
+ * StockInOrderApplicationService.batchSignature 和
+ * StockOutOrderApplicationService.batchSignature。
+ */
+ @ApiOperation("OMS批量签名-更新WMS入/出库单签名字段")
+ @PostMapping("/batchSign")
+ public AjaxResult batchSign(@RequestBody SignatureBatchFeignDTO dto) {
+ if (dto == null) {
+ return AjaxResult.error("请求参数不能为空");
+ }
+ boolean hasIn = dto.getInOrderIds() != null && !dto.getInOrderIds().isEmpty();
+ boolean hasOut = dto.getOutOrderIds() != null && !dto.getOutOrderIds().isEmpty();
+ if (!hasIn && !hasOut) {
+ return AjaxResult.error("请指定入库单ID列表或出库单ID列表");
+ }
+
+ // 映射 SignatureBatchFeignDTO → BatchSignatureDTO
+ BatchSignatureDTO batchDTO = new BatchSignatureDTO();
+ batchDTO.setInOrderIds(dto.getInOrderIds());
+ batchDTO.setOutOrderIds(dto.getOutOrderIds());
+ batchDTO.setSignatureStatus(dto.getSignatureStatus() != null ? dto.getSignatureStatus() : 2);
+ batchDTO.setSignatureTime(dto.getSignatureTime());
+ batchDTO.setSignaturePic(dto.getSignaturePic());
+ batchDTO.setSignatureRemark(dto.getSignatureRemark());
+ // evidencePics: Feign DTO中是comma-separated String → List
+ if (dto.getEvidencePics() != null && !dto.getEvidencePics().isEmpty()) {
+ batchDTO.setEvidencePics(java.util.Arrays.asList(dto.getEvidencePics().split(",")));
+ }
+
+ String msg = "";
+ if (hasIn) {
+ AjaxResult inResult = stockInOrderApplicationService.batchSignature(batchDTO);
+ log.info("OMS→WMS批量入库签名完成:{}条,结果:{}", dto.getInOrderIds().size(),
+ inResult != null ? inResult.get("msg") : "OK");
+ msg += "入库签名完成";
+ }
+ if (hasOut) {
+ AjaxResult outResult = stockOutOrderApplicationService.batchSignature(batchDTO);
+ log.info("OMS→WMS批量出库签名完成:{}条,结果:{}", dto.getOutOrderIds().size(),
+ outResult != null ? outResult.get("msg") : "OK");
+ if (!msg.isEmpty()) msg += ",";
+ msg += "出库签名完成";
+ }
+
+ return AjaxResult.success(msg);
+ }
+}