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); + } +}