diff --git a/CheckImport.class b/CheckImport.class new file mode 100644 index 000000000..88bed044f Binary files /dev/null and b/CheckImport.class differ diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java index e34bb9cd4..6cb701700 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.concurrent.CompletableFuture; -@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4:8017", fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://127.0.0.1:8017", fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) public interface OmsServiceFeign { @@ -66,4 +66,8 @@ public interface OmsServiceFeign { @ApiOperation("批量推送") @PostMapping("/reservationStockOutOrderApi/batchPushByNumber") public AjaxResult batchPushByNumber(@RequestBody List numberList); + + @ApiOperation("保存电子签名记录") + @PostMapping("/electronicSignatureApi/saveSignature") + public AjaxResult saveSignature(@RequestBody ElectronicSignatureSyncDTO saveDTO); } \ No newline at end of file diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/ElectronicSignatureSyncDTO.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/ElectronicSignatureSyncDTO.java new file mode 100644 index 000000000..3d64a289d --- /dev/null +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/ElectronicSignatureSyncDTO.java @@ -0,0 +1,108 @@ +package com.mhd.system.api.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 电子签名同步DTO(WMS端通过Feign调用OMS) + */ +@Data +public class ElectronicSignatureSyncDTO { + + @ApiModelProperty("订单ID") + private Long orderId; + + @ApiModelProperty("订单号") + private String orderNumber; + + @ApiModelProperty("订单类型:IN-入库 OUT-出库") + private String orderType; + + @ApiModelProperty("组织ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + private String organizationName; + + @ApiModelProperty("一级组织ID") + private Long topOrganizationId; + + @ApiModelProperty("仓库ID") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + private String warehouseName; + + @ApiModelProperty("创建人") + private Long createBy; + + @ApiModelProperty("创建人姓名") + private String createByName; + + @ApiModelProperty("物料明细列表") + private List materialDetailList; + + @Data + public static class MaterialDetailItem { + + @ApiModelProperty("物料基础信息ID") + private Long materialBaseInfoId; + + @ApiModelProperty("物料编码") + private String materialCode; + + @ApiModelProperty("物料名称") + private String materialName; + + @ApiModelProperty("数量") + private BigDecimal quantity; + + @ApiModelProperty("单位代码") + private String unitCode; + + @ApiModelProperty("单位名称") + private String unitName; + + @ApiModelProperty("批次号") + private String batchNumber; + + @ApiModelProperty("LOT编号") + private String lotNumber; + + @ApiModelProperty("仓库ID") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + private String warehouseName; + + @ApiModelProperty("库区ID") + private Long storageSectionId; + + @ApiModelProperty("库区编码") + private String storageSectionCode; + + @ApiModelProperty("库区名称") + private String storageSectionName; + + @ApiModelProperty("库位ID") + private Long storageLocationId; + + @ApiModelProperty("库位编码") + private String storageLocationCode; + + @ApiModelProperty("库位名称") + private String storageLocationName; + + @ApiModelProperty("业务唯一ID") + private Long uniqueId; + } +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/entity/ElectronicSignature.java b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/entity/ElectronicSignature.java new file mode 100644 index 000000000..2b871784b --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/entity/ElectronicSignature.java @@ -0,0 +1,71 @@ +package com.mhd.oms.domain.electronicSignature.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 电子签名主表 electronic_signature + */ +@Data +@TableName("ELECTRONIC_SIGNATURE") +public class ElectronicSignature extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("签名ID") + @TableId(type = IdType.INPUT) + private Long signatureId; + + @ApiModelProperty("订单ID") + private Long orderId; + + @ApiModelProperty("订单号") + private String orderNumber; + + @ApiModelProperty("订单类型:IN-入库 OUT-出库") + private String orderType; + + @ApiModelProperty("签名状态:1-待签名 2-已签名") + private Integer signatureStatus; + + @ApiModelProperty("签名时间") + private Date signatureTime; + + @ApiModelProperty("手写签名图片") + private String signaturePic; + + @ApiModelProperty("拍照取证图片") + private String evidencePics; + + @ApiModelProperty("签名备注") + private String signatureRemark; + + @ApiModelProperty("签名方式:1-电子签名 2-附件上传 3-扫二维码 4-系统自动") + private Integer signatureMode; + + @ApiModelProperty("组织ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + private String organizationName; + + @ApiModelProperty("一级组织ID") + private Long topOrganizationId; + + @ApiModelProperty("仓库ID") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + private String warehouseName; + + @ApiModelProperty("备注") + private String remark; +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/entity/ElectronicSignatureMaterialDetail.java b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/entity/ElectronicSignatureMaterialDetail.java new file mode 100644 index 000000000..3e5476227 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/entity/ElectronicSignatureMaterialDetail.java @@ -0,0 +1,83 @@ +package com.mhd.oms.domain.electronicSignature.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 电子签名物料明细表 electronic_signature_material_detail + */ +@Data +@TableName("ELECTRONIC_SIGNATURE_MATERIAL_DETAIL") +public class ElectronicSignatureMaterialDetail extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("明细ID") + @TableId(type = IdType.INPUT) + private Long detailId; + + @ApiModelProperty("签名ID") + private Long signatureId; + + @ApiModelProperty("物料基础信息ID") + private Long materialBaseInfoId; + + @ApiModelProperty("物料编码") + private String materialCode; + + @ApiModelProperty("物料名称") + private String materialName; + + @ApiModelProperty("数量") + private BigDecimal quantity; + + @ApiModelProperty("单位代码") + private String unitCode; + + @ApiModelProperty("单位名称") + private String unitName; + + @ApiModelProperty("批次号") + private String batchNumber; + + @ApiModelProperty("LOT编号") + private String lotNumber; + + @ApiModelProperty("仓库ID") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + private String warehouseName; + + @ApiModelProperty("库区ID") + private Long storageSectionId; + + @ApiModelProperty("库区编码") + private String storageSectionCode; + + @ApiModelProperty("库区名称") + private String storageSectionName; + + @ApiModelProperty("库位ID") + private Long storageLocationId; + + @ApiModelProperty("库位编码") + private String storageLocationCode; + + @ApiModelProperty("库位名称") + private String storageLocationName; + + @ApiModelProperty("业务唯一ID") + private Long uniqueId; + + @ApiModelProperty("备注") + private String remark; +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/facade/IElectronicSignatureMaterialDetailService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/facade/IElectronicSignatureMaterialDetailService.java new file mode 100644 index 000000000..9ce87b028 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/facade/IElectronicSignatureMaterialDetailService.java @@ -0,0 +1,22 @@ +package com.mhd.oms.domain.electronicSignature.repository.facade; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mhd.oms.domain.electronicSignature.entity.ElectronicSignatureMaterialDetail; + +import java.util.List; + +/** + * 电子签名物料明细Service接口 + */ +public interface IElectronicSignatureMaterialDetailService extends IService { + + /** + * 根据签名ID逻辑删除明细 + */ + int deleteBySignatureId(Long signatureId); + + /** + * 批量插入明细 + */ + boolean batchInsert(List detailList); +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/facade/IElectronicSignatureService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/facade/IElectronicSignatureService.java new file mode 100644 index 000000000..64c38ba68 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/facade/IElectronicSignatureService.java @@ -0,0 +1,16 @@ +package com.mhd.oms.domain.electronicSignature.repository.facade; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mhd.oms.domain.electronicSignature.entity.ElectronicSignature; +import com.mhd.oms.domain.electronicSignature.repository.todo.ElectronicSignatureDO; + +/** + * 电子签名Service接口 + */ +public interface IElectronicSignatureService extends IService { + + /** + * 保存电子签名 + */ + Boolean saveSignature(ElectronicSignatureDO electronicSignatureDO); +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/mapper/ElectronicSignatureMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/mapper/ElectronicSignatureMapper.java new file mode 100644 index 000000000..01244251f --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/mapper/ElectronicSignatureMapper.java @@ -0,0 +1,56 @@ +package com.mhd.oms.domain.electronicSignature.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mhd.oms.domain.electronicSignature.entity.ElectronicSignature; +import com.mhd.oms.domain.electronicSignature.entity.ElectronicSignatureMaterialDetail; +import com.mhd.oms.interfaces.dto.electronicSignature.ElectronicSignatureQueryDTO; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 电子签名Mapper接口 + */ +public interface ElectronicSignatureMapper extends BaseMapper { + + @Select("SELECT NGWL_TEST_OMS.SEQ_ELECTRONIC_SIGNATURE.NEXTVAL FROM DUAL") + Long nextSignatureId(); + + @Select("SELECT NGWL_TEST_OMS.SEQ_ES_MATERIAL_DETAIL.NEXTVAL FROM DUAL") + Long nextDetailId(); + + @Select("SELECT * FROM NGWL_TEST_OMS.ELECTRONIC_SIGNATURE WHERE ORDER_ID = #{orderId} AND ORDER_TYPE = #{orderType} AND DEL_FLAG = 1") + ElectronicSignature selectByOrderIdAndType(@Param("orderId") Long orderId, @Param("orderType") String orderType); + + /** + * 分页查询电子签名列表(需配合PageHelper使用) + */ + @Select("") + List selectSignatureList(@Param("params") ElectronicSignatureQueryDTO queryDTO); + + /** + * 根据签名ID查询 + */ + @Select("SELECT * FROM NGWL_TEST_OMS.ELECTRONIC_SIGNATURE WHERE SIGNATURE_ID = #{signatureId} AND DEL_FLAG = 1") + ElectronicSignature selectBySignatureId(@Param("signatureId") Long signatureId); + + /** + * 根据签名ID查询物料明细列表 + */ + @Select("SELECT * FROM NGWL_TEST_OMS.ELECTRONIC_SIGNATURE_MATERIAL_DETAIL WHERE SIGNATURE_ID = #{signatureId} AND DEL_FLAG = 1") + List selectMaterialDetailBySignatureId(@Param("signatureId") Long signatureId); +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/mapper/ElectronicSignatureMaterialDetailMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/mapper/ElectronicSignatureMaterialDetailMapper.java new file mode 100644 index 000000000..ba5f4a1a6 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/mapper/ElectronicSignatureMaterialDetailMapper.java @@ -0,0 +1,15 @@ +package com.mhd.oms.domain.electronicSignature.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mhd.oms.domain.electronicSignature.entity.ElectronicSignatureMaterialDetail; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +/** + * 电子签名物料明细Mapper接口 + */ +public interface ElectronicSignatureMaterialDetailMapper extends BaseMapper { + + @Update("UPDATE NGWL_TEST_OMS.ELECTRONIC_SIGNATURE_MATERIAL_DETAIL SET DEL_FLAG = 2 WHERE SIGNATURE_ID = #{signatureId} AND DEL_FLAG = 1") + int logicDeleteBySignatureId(@Param("signatureId") Long signatureId); +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/persistence/ElectronicSignatureImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/persistence/ElectronicSignatureImpl.java new file mode 100644 index 000000000..23187e6e5 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/persistence/ElectronicSignatureImpl.java @@ -0,0 +1,29 @@ +package com.mhd.oms.domain.electronicSignature.repository.persistence; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mhd.oms.domain.electronicSignature.entity.ElectronicSignature; +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 org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 电子签名Service业务层处理 + */ +@Service +public class ElectronicSignatureImpl extends ServiceImpl implements IElectronicSignatureService { + + @Autowired + private ElectronicSignatureMapper electronicSignatureMapper; + + @Override + public Boolean saveSignature(ElectronicSignatureDO electronicSignatureDO) { + ElectronicSignature entity = new ElectronicSignature(); + BeanUtils.copyProperties(electronicSignatureDO, entity); + Long id = electronicSignatureMapper.nextSignatureId(); + entity.setSignatureId(id); + return this.save(entity); + } +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/persistence/ElectronicSignatureMaterialDetailImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/persistence/ElectronicSignatureMaterialDetailImpl.java new file mode 100644 index 000000000..f784efda0 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/persistence/ElectronicSignatureMaterialDetailImpl.java @@ -0,0 +1,37 @@ +package com.mhd.oms.domain.electronicSignature.repository.persistence; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mhd.oms.domain.electronicSignature.entity.ElectronicSignatureMaterialDetail; +import com.mhd.oms.domain.electronicSignature.repository.facade.IElectronicSignatureMaterialDetailService; +import com.mhd.oms.domain.electronicSignature.repository.mapper.ElectronicSignatureMaterialDetailMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 电子签名物料明细Service业务层处理 + */ +@Service +public class ElectronicSignatureMaterialDetailImpl extends ServiceImpl implements IElectronicSignatureMaterialDetailService { + + @Autowired + private ElectronicSignatureMaterialDetailMapper electronicSignatureMaterialDetailMapper; + + @Override + public int deleteBySignatureId(Long signatureId) { + return electronicSignatureMaterialDetailMapper.logicDeleteBySignatureId(signatureId); + } + + @Override + public boolean batchInsert(List detailList) { + if (detailList == null || detailList.isEmpty()) { + return true; + } + for (ElectronicSignatureMaterialDetail detail : detailList) { + Long detailId = electronicSignatureMaterialDetailMapper.nextDetailId(); + detail.setDetailId(detailId); + } + return this.saveBatch(detailList); + } +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/todo/ElectronicSignatureDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/todo/ElectronicSignatureDO.java new file mode 100644 index 000000000..f2101049a --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/repository/todo/ElectronicSignatureDO.java @@ -0,0 +1,49 @@ +package com.mhd.oms.domain.electronicSignature.repository.todo; + +import com.mhd.oms.domain.electronicSignature.entity.ElectronicSignatureMaterialDetail; +import lombok.Data; + +import java.util.List; + +/** + * 电子签名保存入参 + */ +@Data +public class ElectronicSignatureDO { + + /** 订单ID */ + private Long orderId; + + /** 订单号 */ + private String orderNumber; + + /** 订单类型:IN-入库 OUT-出库 */ + private String orderType; + + /** 组织ID */ + private Long organizationId; + + /** 组织名称 */ + private String organizationName; + + /** 一级组织ID */ + private Long topOrganizationId; + + /** 仓库ID */ + private Long warehouseId; + + /** 仓库编码 */ + private String warehouseCode; + + /** 仓库名称 */ + private String warehouseName; + + /** 创建人 */ + private Long createBy; + + /** 创建人姓名 */ + private String createByName; + + /** 物料明细列表 */ + private List materialDetailList; +} 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 new file mode 100644 index 000000000..c3252365b --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/electronicSignature/service/ElectronicSignatureDomainService.java @@ -0,0 +1,108 @@ +package com.mhd.oms.domain.electronicSignature.service; + +import cn.hutool.core.util.ObjectUtil; +import com.mhd.oms.domain.electronicSignature.entity.ElectronicSignature; +import com.mhd.oms.domain.electronicSignature.entity.ElectronicSignatureMaterialDetail; +import com.mhd.oms.domain.electronicSignature.repository.facade.IElectronicSignatureMaterialDetailService; +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.ElectronicSignatureQueryDTO; +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.Date; +import java.util.List; + +/** + * 电子签名领域服务 + */ +@Service +@Slf4j +public class ElectronicSignatureDomainService { + + @Autowired + private IElectronicSignatureService electronicSignatureService; + + @Autowired + private IElectronicSignatureMaterialDetailService electronicSignatureMaterialDetailService; + + @Autowired + private ElectronicSignatureMapper electronicSignatureMapper; + + /** + * 保存电子签名记录(生成待签名记录) + * 业务规则: + * 1. 查询是否已有签名记录 + * 2. 若已签名(SIGNATURE_STATUS=2),跳过 + * 3. 若待签名(SIGNATURE_STATUS=1),覆盖明细(先逻辑删除旧明细,再插入新明细) + * 4. 若不存在,新增主表+明细 + */ + @Transactional(rollbackFor = Exception.class) + public Boolean saveSignature(ElectronicSignatureDO electronicSignatureDO) { + Long orderId = electronicSignatureDO.getOrderId(); + String orderType = electronicSignatureDO.getOrderType(); + + // 查询是否已有签名记录 + ElectronicSignature existing = electronicSignatureMapper.selectByOrderIdAndType(orderId, orderType); + + if (existing != null) { + // 已签名,跳过 + if (existing.getSignatureStatus() != null && existing.getSignatureStatus() == 2) { + log.info("订单 {} 已签名,跳过生成签名记录", electronicSignatureDO.getOrderNumber()); + return true; + } + + // 待签名,覆盖:逻辑删除旧明细,插入新明细 + log.info("订单 {} 已有待签名记录,覆盖明细", electronicSignatureDO.getOrderNumber()); + electronicSignatureMaterialDetailService.deleteBySignatureId(existing.getSignatureId()); + batchInsertDetails(existing.getSignatureId(), electronicSignatureDO.getMaterialDetailList()); + return true; + } + + // 不存在,新增 + log.info("订单 {} 生成新的待签名记录", electronicSignatureDO.getOrderNumber()); + electronicSignatureService.saveSignature(electronicSignatureDO); + + // 查询刚插入的记录以获取签名ID + ElectronicSignature newEntity = electronicSignatureMapper.selectByOrderIdAndType(orderId, orderType); + if (newEntity != null) { + batchInsertDetails(newEntity.getSignatureId(), electronicSignatureDO.getMaterialDetailList()); + } + + return true; + } + + /** + * 分页查询电子签名列表 + */ + public List querySignatureList(ElectronicSignatureQueryDTO queryDTO) { + return electronicSignatureMapper.selectSignatureList(queryDTO); + } + + /** + * 根据签名ID查询 + */ + public ElectronicSignature getSignatureById(Long signatureId) { + return electronicSignatureMapper.selectBySignatureId(signatureId); + } + + /** + * 根据签名ID查询物料明细 + */ + public List queryMaterialDetailBySignatureId(Long signatureId) { + return electronicSignatureMapper.selectMaterialDetailBySignatureId(signatureId); + } + + private void batchInsertDetails(Long signatureId, List detailList) { + if (detailList == null || detailList.isEmpty()) { + return; + } + for (ElectronicSignatureMaterialDetail detail : detailList) { + detail.setSignatureId(signatureId); + } + electronicSignatureMaterialDetailService.batchInsert(detailList); + } +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/electronicSignature/ElectronicSignatureQueryDTO.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/electronicSignature/ElectronicSignatureQueryDTO.java new file mode 100644 index 000000000..9abef62cb --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/electronicSignature/ElectronicSignatureQueryDTO.java @@ -0,0 +1,55 @@ +package com.mhd.oms.interfaces.dto.electronicSignature; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 电子签名列表查询DTO + */ +@Data +public class ElectronicSignatureQueryDTO { + + @ApiModelProperty("订单类型:IN-入库 OUT-出库") + private String orderType; + + @ApiModelProperty("订单号(模糊查询)") + private String orderNumber; + + @ApiModelProperty("签名状态:1-待签名 2-已签名") + private Integer signatureStatus; + + @ApiModelProperty("签名方式:1-电子签名 2-附件上传 3-扫二维码 4-系统自动") + private Integer signatureMode; + + @ApiModelProperty("组织ID") + private Long organizationId; + + @ApiModelProperty("组织名称(模糊查询)") + private String organizationName; + + @ApiModelProperty("仓库ID") + private Long warehouseId; + + @ApiModelProperty("仓库名称(模糊查询)") + private String warehouseName; + + @ApiModelProperty("创建时间起") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTimeFrom; + + @ApiModelProperty("创建时间止") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTimeTo; + + @ApiModelProperty("页码") + private Integer pageNum; + + @ApiModelProperty("每页条数") + private Integer pageSize; +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/electronicSignature/ElectronicSignatureSaveDTO.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/electronicSignature/ElectronicSignatureSaveDTO.java new file mode 100644 index 000000000..915ee0fe1 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/electronicSignature/ElectronicSignatureSaveDTO.java @@ -0,0 +1,108 @@ +package com.mhd.oms.interfaces.dto.electronicSignature; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 电子签名保存DTO(接收WMS端Feign调用) + */ +@Data +public class ElectronicSignatureSaveDTO { + + @ApiModelProperty("订单ID") + private Long orderId; + + @ApiModelProperty("订单号") + private String orderNumber; + + @ApiModelProperty("订单类型:IN-入库 OUT-出库") + private String orderType; + + @ApiModelProperty("组织ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + private String organizationName; + + @ApiModelProperty("一级组织ID") + private Long topOrganizationId; + + @ApiModelProperty("仓库ID") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + private String warehouseName; + + @ApiModelProperty("创建人") + private Long createBy; + + @ApiModelProperty("创建人姓名") + private String createByName; + + @ApiModelProperty("物料明细列表") + private List materialDetailList; + + @Data + public static class MaterialDetailItem { + + @ApiModelProperty("物料基础信息ID") + private Long materialBaseInfoId; + + @ApiModelProperty("物料编码") + private String materialCode; + + @ApiModelProperty("物料名称") + private String materialName; + + @ApiModelProperty("数量") + private BigDecimal quantity; + + @ApiModelProperty("单位代码") + private String unitCode; + + @ApiModelProperty("单位名称") + private String unitName; + + @ApiModelProperty("批次号") + private String batchNumber; + + @ApiModelProperty("LOT编号") + private String lotNumber; + + @ApiModelProperty("仓库ID") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + private String warehouseName; + + @ApiModelProperty("库区ID") + private Long storageSectionId; + + @ApiModelProperty("库区编码") + private String storageSectionCode; + + @ApiModelProperty("库区名称") + private String storageSectionName; + + @ApiModelProperty("库位ID") + private Long storageLocationId; + + @ApiModelProperty("库位编码") + private String storageLocationCode; + + @ApiModelProperty("库位名称") + private String storageLocationName; + + @ApiModelProperty("业务唯一ID") + private Long uniqueId; + } +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/electronicSignature/ElectronicSignatureVO.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/electronicSignature/ElectronicSignatureVO.java new file mode 100644 index 000000000..626cb7543 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/electronicSignature/ElectronicSignatureVO.java @@ -0,0 +1,127 @@ +package com.mhd.oms.interfaces.dto.electronicSignature; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 电子签名列表返回VO + */ +@Data +public class ElectronicSignatureVO { + + @ApiModelProperty("签名ID") + private Long signatureId; + + @ApiModelProperty("订单ID") + private Long orderId; + + @ApiModelProperty("订单号") + private String orderNumber; + + @ApiModelProperty("订单类型:IN-入库 OUT-出库") + private String orderType; + + @ApiModelProperty("签名状态:1-待签名 2-已签名") + private Integer signatureStatus; + + @ApiModelProperty("签名状态名称") + private String signatureStatusName; + + @ApiModelProperty("签名时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date signatureTime; + + @ApiModelProperty("手写签名图片") + private String signaturePic; + + @ApiModelProperty("拍照取证图片") + private String evidencePics; + + @ApiModelProperty("签名备注") + private String signatureRemark; + + @ApiModelProperty("签名方式:1-电子签名 2-附件上传 3-扫二维码 4-系统自动") + private Integer signatureMode; + + @ApiModelProperty("签名方式名称") + private String signatureModeName; + + @ApiModelProperty("组织ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + private String organizationName; + + @ApiModelProperty("仓库ID") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + private String warehouseName; + + @ApiModelProperty("创建人") + private Long createBy; + + @ApiModelProperty("创建人姓名") + private String createByName; + + @ApiModelProperty("创建时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("物料明细列表") + private List materialDetailList; + + @Data + public static class MaterialDetailVO { + + @ApiModelProperty("明细ID") + private Long detailId; + + @ApiModelProperty("物料基础信息ID") + private Long materialBaseInfoId; + + @ApiModelProperty("物料编码") + private String materialCode; + + @ApiModelProperty("物料名称") + private String materialName; + + @ApiModelProperty("数量") + private BigDecimal quantity; + + @ApiModelProperty("单位代码") + private String unitCode; + + @ApiModelProperty("单位名称") + private String unitName; + + @ApiModelProperty("批次号") + private String batchNumber; + + @ApiModelProperty("LOT编号") + private String lotNumber; + + @ApiModelProperty("库区编码") + private String storageSectionCode; + + @ApiModelProperty("库区名称") + private String storageSectionName; + + @ApiModelProperty("库位编码") + private String storageLocationCode; + + @ApiModelProperty("库位名称") + private String storageLocationName; + } +} 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 new file mode 100644 index 000000000..981173f92 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/electronicSignature/ElectronicSignatureApi.java @@ -0,0 +1,137 @@ +package com.mhd.oms.interfaces.facade.electronicSignature; + +import com.github.pagehelper.PageHelper; +import com.mhd.common.core.web.controller.BaseController; +import com.mhd.common.core.web.domain.AjaxResult; +import com.mhd.common.core.web.page.TableDataInfo; +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.ElectronicSignatureQueryDTO; +import com.mhd.oms.interfaces.dto.electronicSignature.ElectronicSignatureSaveDTO; +import com.mhd.oms.interfaces.dto.electronicSignature.ElectronicSignatureVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +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; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 电子签名Api + */ +@Slf4j +@RestController +@RequestMapping("/electronicSignatureApi") +@Api(tags = "电子签名") +public class ElectronicSignatureApi extends BaseController { + + @Autowired + private ElectronicSignatureDomainService electronicSignatureDomainService; + + /** + * 保存电子签名记录(WMS端Feign调用) + */ + @ApiOperation("保存电子签名记录") + @PostMapping("/saveSignature") + public AjaxResult saveSignature(@RequestBody ElectronicSignatureSaveDTO saveDTO) { + try { + ElectronicSignatureDO signatureDO = toDO(saveDTO); + electronicSignatureDomainService.saveSignature(signatureDO); + return AjaxResult.success("电子签名记录保存成功"); + } catch (Exception e) { + log.error("保存电子签名记录失败", e); + return AjaxResult.error("保存电子签名记录失败:" + e.getMessage()); + } + } + + /** + * 分页查询电子签名列表 + */ + @ApiOperation("分页查询电子签名列表") + @GetMapping("/list") + public TableDataInfo list(ElectronicSignatureQueryDTO queryDTO) { + PageHelper.startPage(queryDTO.getPageNum() == null ? 1 : queryDTO.getPageNum(), + queryDTO.getPageSize() == null ? 10 : queryDTO.getPageSize()); + List list = electronicSignatureDomainService.querySignatureList(queryDTO); + List voList = list.stream() + .map(this::toVO) + .collect(Collectors.toList()); + return getDataTable(voList); + } + + /** + * 查询签名详情(含物料明细) + */ + @ApiOperation("查询签名详情(含物料明细)") + @GetMapping("/detail") + public AjaxResult detail(Long signatureId) { + if (signatureId == null) { + return AjaxResult.error("签名ID不能为空"); + } + ElectronicSignature signature = electronicSignatureDomainService.getSignatureById(signatureId); + if (signature == null) { + return AjaxResult.error("未找到签名记录"); + } + ElectronicSignatureVO vo = toVO(signature); + // 查询物料明细 + List details = + electronicSignatureDomainService.queryMaterialDetailBySignatureId(signatureId); + if (details != null && !details.isEmpty()) { + vo.setMaterialDetailList(details.stream().map(d -> { + ElectronicSignatureVO.MaterialDetailVO dto = new ElectronicSignatureVO.MaterialDetailVO(); + BeanUtils.copyProperties(d, dto); + return dto; + }).collect(Collectors.toList())); + } + return AjaxResult.success(vo); + } + + private ElectronicSignatureDO toDO(ElectronicSignatureSaveDTO dto) { + ElectronicSignatureDO signatureDO = new ElectronicSignatureDO(); + BeanUtils.copyProperties(dto, signatureDO, "materialDetailList"); + + // 转换物料明细 + if (dto.getMaterialDetailList() != null) { + List detailList = new ArrayList<>(); + for (ElectronicSignatureSaveDTO.MaterialDetailItem item : dto.getMaterialDetailList()) { + ElectronicSignatureMaterialDetail detail = new ElectronicSignatureMaterialDetail(); + BeanUtils.copyProperties(item, detail); + detailList.add(detail); + } + signatureDO.setMaterialDetailList(detailList); + } + + return signatureDO; + } + + private ElectronicSignatureVO toVO(ElectronicSignature entity) { + ElectronicSignatureVO vo = new ElectronicSignatureVO(); + BeanUtils.copyProperties(entity, vo); + + // 签名状态名称 + if (entity.getSignatureStatus() != null) { + vo.setSignatureStatusName(entity.getSignatureStatus() == 1 ? "待签名" : entity.getSignatureStatus() == 2 ? "已签名" : null); + } + // 签名方式名称 + if (entity.getSignatureMode() != null) { + switch (entity.getSignatureMode()) { + case 1: vo.setSignatureModeName("电子签名"); break; + case 2: vo.setSignatureModeName("附件上传"); break; + case 3: vo.setSignatureModeName("扫二维码"); break; + case 4: vo.setSignatureModeName("系统自动"); break; + default: break; + } + } + return vo; + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java index 1317e2e1b..010f73777 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java @@ -2833,10 +2833,14 @@ public class StockInOrderApplicationService { entity.setSignatureStatus(dto.getSignatureStatus() != null ? dto.getSignatureStatus() : 2); entity.setSignatureTime(dto.getSignatureTime() != null ? dto.getSignatureTime() : now); entity.setSignaturePic(dto.getSignaturePic()); + if (dto.getEvidencePics() != null && !dto.getEvidencePics().isEmpty()) { + entity.setEvidencePics(String.join(",", dto.getEvidencePics())); + } entity.setSignatureRemark(dto.getSignatureRemark()); stockInOrderService.updateById(entity); success++; } return AjaxResult.success("批量签名成功,共" + success + "条"); } + } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java index 297257d60..9b91ca0c4 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java @@ -2105,6 +2105,9 @@ public class StockOutOrderApplicationService { entity.setSignatureStatus(dto.getSignatureStatus() != null ? dto.getSignatureStatus() : 2); entity.setSignatureTime(dto.getSignatureTime() != null ? dto.getSignatureTime() : now); entity.setSignaturePic(dto.getSignaturePic()); + if (dto.getEvidencePics() != null && !dto.getEvidencePics().isEmpty()) { + entity.setEvidencePics(String.join(",", dto.getEvidencePics())); + } entity.setSignatureRemark(dto.getSignatureRemark()); stockOutOrderService.updateById(entity); success++; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/entity/StockInOrder.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/entity/StockInOrder.java index db0e43999..a4e1862a3 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/entity/StockInOrder.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/entity/StockInOrder.java @@ -402,9 +402,12 @@ public class StockInOrder extends BaseVOEntity { @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date signatureTime; - @ApiModelProperty("签名图片(base64/URL)") + @ApiModelProperty("手写签名图片(base64/URL,单张)") private String signaturePic; + @ApiModelProperty("拍照取证图片(逗号分隔多张OSS URL)") + private String evidencePics; + @ApiModelProperty("签名备注") private String signatureRemark; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/repository/po/StockInOrderPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/repository/po/StockInOrderPO.java index a80ea5acc..f56d3605e 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/repository/po/StockInOrderPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/repository/po/StockInOrderPO.java @@ -466,9 +466,12 @@ public class StockInOrderPO extends BaseVOEntity { @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date signatureTime; - @ApiModelProperty("签名图片(base64/URL)") + @ApiModelProperty("手写签名图片(base64/URL)") private String signaturePic; + @ApiModelProperty("拍照取证图片(逗号分隔多张OSS URL)") + private String evidencePics; + @ApiModelProperty("签名备注") private String signatureRemark; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/repository/todo/StockInOrderDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/repository/todo/StockInOrderDO.java index 0b539d0ce..4356e21c7 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/repository/todo/StockInOrderDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/repository/todo/StockInOrderDO.java @@ -461,9 +461,12 @@ public class StockInOrderDO extends BaseVOEntity { @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date signatureTime; - @ApiModelProperty("签名图片(base64/URL)") + @ApiModelProperty("手写签名图片(base64/URL)") private String signaturePic; + @ApiModelProperty("拍照取证图片(逗号分隔多张OSS URL)") + private String evidencePics; + @ApiModelProperty("签名备注") private String signatureRemark; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/entity/StockOutOrder.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/entity/StockOutOrder.java index 18d489c24..3ea609c6c 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/entity/StockOutOrder.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/entity/StockOutOrder.java @@ -444,9 +444,12 @@ public class StockOutOrder extends BaseVOEntity { @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date signatureTime; - @ApiModelProperty("签名图片(base64/URL)") + @ApiModelProperty("手写签名图片(base64/URL,单张)") private String signaturePic; + @ApiModelProperty("拍照取证图片(逗号分隔多张OSS URL)") + private String evidencePics; + @ApiModelProperty("签名备注") private String signatureRemark; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/po/StockOutOrderPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/po/StockOutOrderPO.java index 5dbd97ba1..780d8aaf4 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/po/StockOutOrderPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/po/StockOutOrderPO.java @@ -476,9 +476,12 @@ public class StockOutOrderPO extends BaseVOEntity { @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date signatureTime; - @ApiModelProperty("签名图片(base64/URL)") + @ApiModelProperty("手写签名图片(base64/URL)") private String signaturePic; + @ApiModelProperty("拍照取证图片(逗号分隔多张OSS URL)") + private String evidencePics; + @ApiModelProperty("签名备注") private String signatureRemark; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/todo/StockOutOrderDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/todo/StockOutOrderDO.java index 443fe8f04..9139cb4b9 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/todo/StockOutOrderDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/todo/StockOutOrderDO.java @@ -523,9 +523,12 @@ public class StockOutOrderDO extends BaseVOEntity { @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date signatureTime; - @ApiModelProperty("签名图片(base64/URL)") + @ApiModelProperty("手写签名图片(base64/URL)") private String signaturePic; + @ApiModelProperty("拍照取证图片(逗号分隔多张OSS URL)") + private String evidencePics; + @ApiModelProperty("签名备注") private String signatureRemark; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java index 9f169c772..a29ab5be1 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java @@ -1,5 +1,6 @@ package com.mhd.wms.domain.stockOutOrder.service; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; @@ -14,9 +15,11 @@ import com.mhd.common.core.utils.StringUtils; import com.mhd.common.core.utils.bean.BeanUtils; import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.OmsServiceFeign; import com.mhd.system.api.SystemServiceFeign; import com.mhd.system.api.domain.BatchDetailFeignPO; import com.mhd.system.api.domain.DeliveryDetailsLink; +import com.mhd.system.api.domain.ElectronicSignatureSyncDTO; import com.mhd.system.api.domain.PackDetailFeignPO; import com.mhd.system.api.model.LoginUser; import com.mhd.wms.application.service.handoverTaskOrder.HandoverTaskOrderApplicationService; @@ -177,6 +180,8 @@ public class StockOutOrderDomainService { private ReviewOrderMapper reviewOrderMapper; @Autowired private ReviewMaterialDetailMapper reviewMaterialDetailMapper; + @Autowired + private OmsServiceFeign omsServiceFeign; /** * 分页查询出库单列表 @@ -1102,6 +1107,8 @@ public class StockOutOrderDomainService { handoverTaskOrderDO.setHandoverTaskOrderIds(handoverTaskOrderId); handoverTaskOrderDomainService.completeHandover(handoverTaskOrderDO); } + //出库交接后生成电子签名记录 + genElectronicSignature(stockOutOrder); return Boolean.TRUE; } @@ -2386,4 +2393,106 @@ public class StockOutOrderDomainService { public List queryOutStockNoticePrintDetailGF(StockOutOrderDTO stockOutOrderDTO) { return stockOutOrderService.queryOutStockNoticePrintDetailGF(stockOutOrderDTO); } + + /** + * 生成出库电子签名记录(出库交接触发,StockOutOrder实体入口) + */ + private void genElectronicSignature(StockOutOrder stockOutOrder) { + try { + StockOutOrderDO queryDO = new StockOutOrderDO(); + queryDO.setOutOrderNumber(stockOutOrder.getOutOrderNumber()); + List poList = stockOutOrderService.queryList(queryDO); + if (CollectionUtil.isEmpty(poList)) { + log.warn("生成出库电子签名记录失败,未查到出库单:{}", stockOutOrder.getOutOrderNumber()); + return; + } + genElectronicSignature(poList.get(0)); + } catch (Exception e) { + log.error("生成出库电子签名记录失败,订单号:{}", stockOutOrder.getOutOrderNumber(), e); + } + } + + /** + * 生成出库电子签名记录 + */ + private void genElectronicSignature(StockOutOrderPO stockOutOrderPO) { + try { + // 查询出库物料明细 + List detailList = outMaterialDetailService.list( + new LambdaQueryWrapper() + .eq(OutMaterialDetail::getOutOrderNumber, stockOutOrderPO.getOutOrderNumber())); + + ElectronicSignatureSyncDTO dto = new ElectronicSignatureSyncDTO(); + dto.setOrderId(stockOutOrderPO.getOutOrderId()); + dto.setOrderNumber(stockOutOrderPO.getOutOrderNumber()); + dto.setOrderType("OUT"); + dto.setOrganizationId(stockOutOrderPO.getOrganizationId()); + dto.setOrganizationName(stockOutOrderPO.getOrganizationName()); + dto.setTopOrganizationId(stockOutOrderPO.getTopOrganizationId()); + dto.setWarehouseId(stockOutOrderPO.getWarehouseId()); + dto.setWarehouseCode(stockOutOrderPO.getWarehouseCode()); + dto.setWarehouseName(stockOutOrderPO.getWarehouseName()); + + List items = new ArrayList<>(); + if (org.springframework.util.CollectionUtils.isEmpty(detailList)) { + // 回退:直接通过 IOutMaterialDetailService 查询 PO 列表 + OutMaterialDetailDO queryDO = new OutMaterialDetailDO(); + queryDO.setOutOrderNumber(stockOutOrderPO.getOutOrderNumber()); + List poList = outMaterialDetailService.queryList(queryDO); + if (!org.springframework.util.CollectionUtils.isEmpty(poList)) { + for (OutMaterialDetailPO detail : poList) { + ElectronicSignatureSyncDTO.MaterialDetailItem item = new ElectronicSignatureSyncDTO.MaterialDetailItem(); + item.setMaterialBaseInfoId(detail.getMaterialBaseInfoId()); + item.setMaterialCode(detail.getMaterialCode()); + item.setMaterialName(detail.getMaterialName()); + item.setQuantity(detail.getCheckQuantity()); + item.setUnitCode(detail.getUnitCode()); + item.setUnitName(detail.getUnitName()); + item.setBatchNumber(detail.getBatchNumber()); + item.setLotNumber(detail.getLotNo()); + item.setWarehouseId(detail.getWarehouseId()); + item.setWarehouseCode(detail.getWarehouseCode()); + item.setWarehouseName(detail.getWarehouseName()); + item.setStorageSectionId(detail.getStorageSectionId()); + item.setStorageSectionCode(detail.getStorageCode()); + item.setStorageSectionName(detail.getStorageName()); + item.setStorageLocationId(detail.getStorageLocationId()); + item.setStorageLocationCode(detail.getStorageLocationCode()); + item.setStorageLocationName(detail.getStorageLocationName()); + item.setUniqueId(detail.getUniqueId()); + items.add(item); + } + } + } else { + for (OutMaterialDetail detail : detailList) { + ElectronicSignatureSyncDTO.MaterialDetailItem item = new ElectronicSignatureSyncDTO.MaterialDetailItem(); + item.setMaterialBaseInfoId(detail.getMaterialBaseInfoId()); + item.setMaterialCode(detail.getMaterialCode()); + item.setMaterialName(detail.getMaterialName()); + item.setQuantity(detail.getCheckQuantity()); + item.setUnitCode(detail.getUnitCode()); + item.setUnitName(detail.getUnitName()); + item.setBatchNumber(detail.getBatchNumber()); + item.setLotNumber(detail.getLotNo()); + item.setWarehouseId(detail.getWarehouseId()); + item.setWarehouseCode(detail.getWarehouseCode()); + item.setWarehouseName(detail.getWarehouseName()); + item.setStorageSectionId(detail.getStorageSectionId()); + item.setStorageSectionCode(detail.getStorageCode()); + item.setStorageSectionName(detail.getStorageName()); + item.setStorageLocationId(detail.getStorageLocationId()); + item.setStorageLocationCode(detail.getStorageLocationCode()); + item.setStorageLocationName(detail.getStorageLocationName()); + item.setUniqueId(detail.getUniqueId()); + items.add(item); + } + } + dto.setMaterialDetailList(items); + + log.info("生成出库电子签名记录,订单号:{},物料条目数:{}", stockOutOrderPO.getOutOrderNumber(), items.size()); + omsServiceFeign.saveSignature(dto); + } catch (Exception e) { + log.error("生成出库电子签名记录失败,订单号:{}", stockOutOrderPO.getOutOrderNumber(), e); + } + } } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java index b2c66cbc3..c865523cb 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java @@ -22,6 +22,7 @@ import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.common.security.utils.SecurityUtils; import com.mhd.system.api.OmsServiceFeign; import com.mhd.system.api.SystemServiceFeign; +import com.mhd.system.api.domain.ElectronicSignatureSyncDTO; import com.mhd.system.api.domain.ContainerFeignPO; import com.mhd.system.api.domain.MaterialInventoryOmsParamDO; import com.mhd.system.api.model.LoginUser; @@ -877,6 +878,8 @@ public class StockShelfOrderDomainService { } if (businessOrderNumber != null) stockShelfOrderService.updateOmsReserveOrder(businessOrderNumber, shelvesQuantity == null ? null : shelvesQuantity); + //生成电子签名记录 + genElectronicSignature(stockShelfOrderPO, shelfMaterialDetailList); return true; } @@ -2016,4 +2019,54 @@ public class StockShelfOrderDomainService { } } } + + /** + * 生成入库电子签名记录(上架完成触发) + */ + private void genElectronicSignature(StockShelfOrderPO stockShelfOrderPO, List shelfMaterialDetailList) { + try { + ElectronicSignatureSyncDTO dto = new ElectronicSignatureSyncDTO(); + dto.setOrderId(stockShelfOrderPO.getShelfOrderId()); + dto.setOrderNumber(stockShelfOrderPO.getShelfOrderNumber()); + dto.setOrderType("IN"); + dto.setOrganizationId(stockShelfOrderPO.getOrganizationId()); + dto.setOrganizationName(stockShelfOrderPO.getOrganizationName()); + dto.setTopOrganizationId(stockShelfOrderPO.getTopOrganizationId()); + dto.setWarehouseId(stockShelfOrderPO.getWarehouseId()); + dto.setWarehouseCode(stockShelfOrderPO.getWarehouseCode()); + dto.setWarehouseName(stockShelfOrderPO.getWarehouseName()); + + List items = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(shelfMaterialDetailList)) { + for (ShelfMaterialDetail detail : shelfMaterialDetailList) { + ElectronicSignatureSyncDTO.MaterialDetailItem item = new ElectronicSignatureSyncDTO.MaterialDetailItem(); + item.setMaterialBaseInfoId(detail.getMaterialBaseInfoId()); + item.setMaterialCode(detail.getMaterialCode()); + item.setMaterialName(detail.getMaterialName()); + item.setQuantity(detail.getShelvesQuantity()); + item.setUnitCode(detail.getUnitCode()); + item.setUnitName(detail.getUnitName()); + item.setBatchNumber(detail.getBatchNumber()); + item.setLotNumber(detail.getLotNumber()); + item.setWarehouseId(detail.getWarehouseId()); + item.setWarehouseCode(detail.getWarehouseCode()); + item.setWarehouseName(detail.getWarehouseName()); + item.setStorageSectionId(detail.getStorageSectionId()); + item.setStorageSectionCode(detail.getStorageCode()); + item.setStorageSectionName(detail.getStorageName()); + item.setStorageLocationId(detail.getStorageLocationId()); + item.setStorageLocationCode(detail.getStorageLocationCode()); + item.setStorageLocationName(detail.getStorageLocationName()); + item.setUniqueId(detail.getUniqueId()); + items.add(item); + } + } + dto.setMaterialDetailList(items); + + log.info("生成入库电子签名记录,订单号:{},物料条目数:{}", stockShelfOrderPO.getShelfOrderNumber(), items.size()); + omsServiceFeign.saveSignature(dto); + } catch (Exception e) { + log.error("生成入库电子签名记录失败,订单号:{}", stockShelfOrderPO.getShelfOrderNumber(), e); + } + } } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/signature/BatchSignatureDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/signature/BatchSignatureDTO.java index 7018288b0..18fb841b4 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/signature/BatchSignatureDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/signature/BatchSignatureDTO.java @@ -30,9 +30,12 @@ public class BatchSignatureDTO { @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date signatureTime; - @ApiModelProperty("签名图片(base64或URL)") + @ApiModelProperty("手写签名图片(base64或URL,单张)") private String signaturePic; + @ApiModelProperty("拍照取证图片列表(base64或URL,多张)") + private List evidencePics; + @ApiModelProperty("签名备注") private String signatureRemark; diff --git a/mhd_wms/src/main/resources/mapper/stockInOrder/StockInOrderMapper.xml b/mhd_wms/src/main/resources/mapper/stockInOrder/StockInOrderMapper.xml index adbc11667..86c64e874 100644 --- a/mhd_wms/src/main/resources/mapper/stockInOrder/StockInOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/stockInOrder/StockInOrderMapper.xml @@ -108,6 +108,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -143,7 +144,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" a.CUSTOMS_BROKER_INFO, a.DELIVERY_ADDRESS, a.ENTRY_EXIT_CUSTOMS, a.ORIGIN_DESTINATION_COUNTRY, a.CARRIER, a.CONTAINER_NO, a.TRANSPORT_METHOD, a.SUPERVISION_METHOD, a.CUSTOMS_INSPECTION, a.NEED_CUSTOMS_DECLARATION, a.NEED_TRANSPORT, a.WAREHOUSE_DATE, a.COMPLETION_TIME, a.ORDER_DATE,a.stock_in_order,a.business_order_no,a.WORK_USER_ID,a.WORK_TASK_RECEIVE_STATUS,a.TASK_ISSUE_USER_ID,a.WORK_USER_NAME, - a.SIGNATURE_STATUS, a.SIGNATURE_TIME, a.SIGNATURE_PIC, a.SIGNATURE_REMARK + a.SIGNATURE_STATUS, a.SIGNATURE_TIME, a.SIGNATURE_PIC, a.EVIDENCE_PICS, a.SIGNATURE_REMARK diff --git a/mhd_wms/src/main/resources/mapper/stockOutOrder/StockOutOrderMapper.xml b/mhd_wms/src/main/resources/mapper/stockOutOrder/StockOutOrderMapper.xml index 133295d88..139d25dd3 100644 --- a/mhd_wms/src/main/resources/mapper/stockOutOrder/StockOutOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/stockOutOrder/StockOutOrderMapper.xml @@ -107,6 +107,7 @@ + @@ -129,7 +130,7 @@ a.COMPLETE_TIME,a.ORDER_DATE,a.TRANSPORT_MODE_CODE,a.TRANSPORT_MODE_NAME,a.SUPERVISION_MODE_CODE,a.SUPERVISION_MODE_NAME, a.CUSTOMS_INSPECTION_FLAG,a.NEED_DECLARE_FLAG,a.NEED_TRANSPORT_FLAG,a.picture_app,a.billing_json,a.SETTLEMENT_CURRENCY, a.SALESMAN_ID,a.SALESMAN_NAME,a.business_order_no,a.RETURN_QUANTITY,a.WORK_USER_ID,a.WORK_TASK_RECEIVE_STATUS,a.TASK_ISSUE_USER_ID,a.WORK_USER_NAME, - a.SIGNATURE_STATUS, a.SIGNATURE_TIME, a.SIGNATURE_PIC, a.SIGNATURE_REMARK + a.SIGNATURE_STATUS, a.SIGNATURE_TIME, a.SIGNATURE_PIC, a.EVIDENCE_PICS, a.SIGNATURE_REMARK