OMS批量签名

This commit is contained in:
秦鸿展
2026-07-29 14:29:56 +08:00
parent f660c66027
commit c852ef1b8b
7 changed files with 314 additions and 0 deletions
@@ -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
*
* <p>OMS端批量签名时,通过此DTO调用WMS的批量签名接口,
* 更新WMS stock_in_order / stock_out_order 表的签名字段。</p>
*/
@Data
public class SignatureBatchFeignDTO {
@ApiModelProperty("入库单ID列表")
private List<Long> inOrderIds;
@ApiModelProperty("出库单ID列表")
private List<Long> 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;
}
@@ -119,6 +119,12 @@ public class RemoteWmsFallbackFactory implements FallbackFactory<WmsServiceFeign
public AjaxResult genPickingOrderByOms(StockOutOrderDTO stockOutOrderDTO) {
return null;
}
@Override
public AjaxResult batchSignWms(SignatureBatchFeignDTO dto) {
log.error("WMS批量签名调用失败");
return AjaxResult.error("WMS批量签名调用失败:" + cause.getMessage());
}
};
}
}
@@ -6,7 +6,9 @@ import com.mhd.oms.domain.electronicSignature.entity.ElectronicSignatureMaterial
import com.mhd.oms.interfaces.dto.electronicSignature.ElectronicSignatureQueryDTO;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.Date;
import java.util.List;
/**
@@ -53,4 +55,38 @@ public interface ElectronicSignatureMapper extends BaseMapper<ElectronicSignatur
*/
@Select("SELECT * FROM NGWL_TEST_OMS.ELECTRONIC_SIGNATURE_MATERIAL_DETAIL WHERE SIGNATURE_ID = #{signatureId} AND DEL_FLAG = 1")
List<ElectronicSignatureMaterialDetail> selectMaterialDetailBySignatureId(@Param("signatureId") Long signatureId);
/**
* 批量签名:根据签名ID列表更新签名信息
*/
@Update("<script>"
+ "UPDATE NGWL_TEST_OMS.ELECTRONIC_SIGNATURE SET "
+ "SIGNATURE_STATUS = 2, "
+ "SIGNATURE_TIME = #{signatureTime}, "
+ "<if test='signaturePic != null and signaturePic != \"\"'>SIGNATURE_PIC = #{signaturePic}, </if>"
+ "<if test='evidencePics != null and evidencePics != \"\"'>EVIDENCE_PICS = #{evidencePics}, </if>"
+ "<if test='signatureRemark != null and signatureRemark != \"\"'>SIGNATURE_REMARK = #{signatureRemark}, </if>"
+ "<if test='signatureMode != null'>SIGNATURE_MODE = #{signatureMode}, </if>"
+ "UPDATE_TIME = #{signatureTime} "
+ "WHERE SIGNATURE_ID IN "
+ "<foreach collection='signatureIds' item='id' open='(' separator=',' close=')'>#{id}</foreach>"
+ " AND DEL_FLAG = 1 AND SIGNATURE_STATUS = 1"
+ "</script>")
int batchUpdateSign(@Param("signatureIds") List<Long> signatureIds,
@Param("signatureTime") Date signatureTime,
@Param("signaturePic") String signaturePic,
@Param("evidencePics") String evidencePics,
@Param("signatureRemark") String signatureRemark,
@Param("signatureMode") Integer signatureMode);
/**
* 根据签名ID列表批量查询
*/
@Select("<script>"
+ "SELECT * FROM NGWL_TEST_OMS.ELECTRONIC_SIGNATURE "
+ "WHERE SIGNATURE_ID IN "
+ "<foreach collection='signatureIds' item='id' open='(' separator=',' close=')'>#{id}</foreach>"
+ " AND DEL_FLAG = 1"
+ "</script>")
List<ElectronicSignature> selectBySignatureIds(@Param("signatureIds") List<Long> signatureIds);
}
@@ -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);
}
/**
* 批量签名:勾选多条记录后批量签名
*
* <p>业务流程:
* 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表
* </p>
*/
@Transactional(rollbackFor = Exception.class)
public int batchSign(ElectronicSignatureBatchSignDTO dto) {
List<Long> signatureIds = dto.getSignatureIds();
if (CollectionUtil.isEmpty(signatureIds)) {
return 0;
}
// 1. 查询签名记录,获取 orderId + orderType
List<ElectronicSignature> 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<Long> inOrderIds = signatureList.stream()
.filter(s -> "IN".equals(s.getOrderType()))
.map(ElectronicSignature::getOrderId)
.distinct()
.collect(Collectors.toList());
List<Long> 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;
}
}
@@ -0,0 +1,30 @@
package com.mhd.oms.interfaces.dto.electronicSignature;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* 电子签名批量签名请求DTO
*
* <p>勾选多条记录后批量签名,更新OMS电子签名表 + 调用WMS更新入/出库单表。</p>
*/
@Data
public class ElectronicSignatureBatchSignDTO {
@ApiModelProperty(value = "签名ID列表", required = true)
private List<Long> signatureIds;
@ApiModelProperty("手写签名图片(base64或URL,单张)")
private String signaturePic;
@ApiModelProperty("拍照取证图片URL列表(多张)")
private List<String> evidencePics;
@ApiModelProperty("签名备注")
private String signatureRemark;
@ApiModelProperty("签名方式:1-电子签名 2-附件上传 3-扫二维码 4-系统自动")
private Integer signatureMode;
}
@@ -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);
}
/**
* 勾选记录批量签名
*
* <p>前端勾选多条待签名的电子签名记录,传入签名ID列表(signatureIds)、签名图片(signaturePic)、
* 签名备注(signatureRemark)、签名方式(signatureMode),后端:</p>
* <ul>
* <li>更新 OMS ELECTRONIC_SIGNATURE 表:signatureStatus=2(已签名)、signatureTime=当前时间、signaturePic、evidencePics、signatureRemark、signatureMode</li>
* <li>通过 Feign 调用 WMS 更新 stock_in_order / stock_out_order 表的对应签名字段</li>
* </ul>
*/
@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");
@@ -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入/出库单签名字段)
*
* <p>OMS端批量签名后,通过Feign调用此API,
* 更新WMS stock_in_order / stock_out_order 表的签名状态、签名时间、签名图片、签名备注。</p>
*/
@Slf4j
@RestController
@RequestMapping("/stockSignatureApi")
@Api(tags = "库存签名(OMS→WMS")
public class StockSignatureApi extends BaseController {
@Autowired
private StockInOrderApplicationService stockInOrderApplicationService;
@Autowired
private StockOutOrderApplicationService stockOutOrderApplicationService;
/**
* 批量签名(OMS→WMS
*
* <p>接收SignatureBatchFeignDTO,映射为BatchSignatureDTO后,分别调用
* StockInOrderApplicationService.batchSignature 和
* StockOutOrderApplicationService.batchSignature。</p>
*/
@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<String>
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);
}
}