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
@@ -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");