diff --git a/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java b/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java index ffd1c03..4c8b604 100644 --- a/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java +++ b/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java @@ -160,5 +160,4 @@ public class RkInfoController extends BaseController return toAjax(rkInfoService.refundMaterial(dto)); } - } diff --git a/src/main/java/com/zg/project/wisdom/domain/dto/StockOutDTO.java b/src/main/java/com/zg/project/wisdom/domain/dto/StockOutDTO.java index 7bd5829..4ca9242 100644 --- a/src/main/java/com/zg/project/wisdom/domain/dto/StockOutDTO.java +++ b/src/main/java/com/zg/project/wisdom/domain/dto/StockOutDTO.java @@ -36,17 +36,12 @@ public class StockOutDTO { /** 领取项目描述*/ private String xmMsCk; - /** 出库列表 */ + /** 出库明细 */ private List ckList; - - /** 审核签字图片(发起人签字) */ + /** 发起人签字图 */ private String signatureUrl; - /** 审核照片列表(可多张) */ - private List photoUrls; - - /** 审批人ID(用于记录签字流转) */ + /** 审批人ID */ private String approverId; - } diff --git a/src/main/java/com/zg/project/wisdom/domain/dto/StockOutItemDTO.java b/src/main/java/com/zg/project/wisdom/domain/dto/StockOutItemDTO.java index b3187aa..6734873 100644 --- a/src/main/java/com/zg/project/wisdom/domain/dto/StockOutItemDTO.java +++ b/src/main/java/com/zg/project/wisdom/domain/dto/StockOutItemDTO.java @@ -8,10 +8,19 @@ import lombok.Data; @Data public class StockOutItemDTO { - /** 出库记录 ID(库存 ID) */ + /** 出库记录ID(rk_info.id) */ private Long id; /** 出库备注 */ private String ckRemark; + /** 库位码 */ + private String pcode; + + /** 托盘码 */ + private String trayCode; + + /** 现场照片(单张) */ + private String photoUrl; // ✅ 一物一图绑定 + } diff --git a/src/main/java/com/zg/project/wisdom/domain/vo/AuditSignatureReviewVO.java b/src/main/java/com/zg/project/wisdom/domain/vo/AuditSignatureReviewVO.java index ab92a22..1716a38 100644 --- a/src/main/java/com/zg/project/wisdom/domain/vo/AuditSignatureReviewVO.java +++ b/src/main/java/com/zg/project/wisdom/domain/vo/AuditSignatureReviewVO.java @@ -1,5 +1,6 @@ package com.zg.project.wisdom.domain.vo; +import com.zg.framework.aspectj.lang.annotation.Excel; import com.zg.project.wisdom.domain.AuditSignature; import lombok.Data; @@ -36,6 +37,14 @@ public class AuditSignatureReviewVO { /** 是否当前记录(1是,0否) */ private String isCurrent; + private String ckType; + + private String ckTypeName; + + private String teamCode; + + private String teamName; + /** 审核时间 */ private Date signTime; diff --git a/src/main/java/com/zg/project/wisdom/mapper/AuditSignatureMapper.java b/src/main/java/com/zg/project/wisdom/mapper/AuditSignatureMapper.java index a47ccb9..6d074bb 100644 --- a/src/main/java/com/zg/project/wisdom/mapper/AuditSignatureMapper.java +++ b/src/main/java/com/zg/project/wisdom/mapper/AuditSignatureMapper.java @@ -85,7 +85,7 @@ public interface AuditSignatureMapper /** * 查询现场图片URL(按入库ID) */ - AuditSignature selectPhotoUrlByRkId(@Param("rkId") Long rkId); + AuditSignature selectPhotoUrlByBillNo(@Param("billNo") String billNo); /** * 查询审批记录列表(按主表ID) diff --git a/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java b/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java index f81a4a6..e435f3f 100644 --- a/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java +++ b/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java @@ -85,11 +85,6 @@ public interface RkInfoMapper */ List selectSapNoByBillNo(String billNo); - /** - * 根据单据编号删除入库单据 - * @param billNo - */ - void deleteByBillNo(String billNo); /** @@ -187,4 +182,29 @@ public interface RkInfoMapper * 根据入库单据编号查询入库单据 */ List selectRkInfoListByBillNo(String billNo); + + /** + * 根据出库单据编号查询入库单据 + */ + List selectRkInfoListByBillNoCk(String billNo); + + /** + * 删除入库单据 + */ + void markDeleteByBillNo(RkInfo rk); + + /** + * 删除出库单据 + */ + void markDeleteByBillNoCk(RkInfo rk); + + /** + * 删除入库单据 + */ + void deleteByBillNo(String billNo); + + /** + * 出库驳回时恢复单据表数据状态 + */ + void revertRkInfoStatusByBillNoCk(RkInfo revert); } diff --git a/src/main/java/com/zg/project/wisdom/service/impl/AuditSignatureServiceImpl.java b/src/main/java/com/zg/project/wisdom/service/impl/AuditSignatureServiceImpl.java index 39f43b1..81195f9 100644 --- a/src/main/java/com/zg/project/wisdom/service/impl/AuditSignatureServiceImpl.java +++ b/src/main/java/com/zg/project/wisdom/service/impl/AuditSignatureServiceImpl.java @@ -130,45 +130,84 @@ public class AuditSignatureServiceImpl implements IAuditSignatureService throw new ServiceException("该记录已审核,不能重复操作"); } - // 3. 更新审核状态 - audit.setAuditResult(audit.getAuditResult()); // 必须为 "1"(通过)或 "0"(驳回) - audit.setApproverId(userId); // 设置审核人 - audit.setRemark(audit.getRemark()); // 设置审核意见 - audit.setUpdateBy(userId); - audit.setUpdateTime(DateUtils.getNowDate()); - audit.setApproverSignUrl(audit.getApproverSignUrl()); - - auditSignatureMapper.updateAuditSignature(audit); - - RkInfo rk = new RkInfo(); - rk.setBillNo(audit.getBillNo()); - rk.setUpdateBy(userId); - rk.setUpdateTime(DateUtils.getNowDate()); - if ("1".equals(audit.getAuditResult())) { - // 审核通过:rk_info.status = 1(驳回) - rk.setStatus("1"); - rk.setIsChuku("0"); - // 获取该 bill_no 下所有 rk_info 记录 - List rkList = rkInfoMapper.selectRkInfoListByBillNo(audit.getBillNo()); - // 提取所有非空的 gys_jh_id 并去重 - Set jhIdSet = rkList.stream() - .map(RkInfo::getGysJhId) - .filter(Objects::nonNull) - .collect(Collectors.toSet()); - - // 批量更新对应供应计划的状态 - for (Long jhId : jhIdSet) { - gysJhMapper.updateStatusById(jhId); - } - } else if ("0".equals(audit.getAuditResult())) { - // 审核驳回:rk_info.status = 2(已入库) - rk.setStatus("2"); + // 2.1 校验审核结果是否为空 + if (StringUtils.isBlank(audit.getAuditResult())) { + throw new ServiceException("审核结果不能为空"); } - rkInfoMapper.updateStatusByBillNo(rk); + // ✅ 如果是驳回,设置当前记录 is_current = 0 + if ("0".equals(audit.getAuditResult())) { + audit.setIsCurrent("0"); + } + // 3. 更新审核记录本身 + audit.setApproverId(userId); + audit.setUpdateBy(userId); + audit.setUpdateTime(DateUtils.getNowDate()); + auditSignatureMapper.updateAuditSignature(audit); + + // 4. 构建更新 rk_info 的状态记录(或删除记录) + RkInfo rk = new RkInfo(); + rk.setUpdateBy(userId); + rk.setUpdateTime(DateUtils.getNowDate()); + + if ("0".equals(db.getBillType())) { + rk.setBillNo(db.getBillNo()); // 入库 + } else if ("1".equals(db.getBillType())) { + rk.setBillNoCk(db.getBillNo()); // 出库 + } + + // 5. 处理审核结果 + if ("1".equals(audit.getAuditResult())) { + rk.setStatus("1"); // 审核通过 + if ("0".equals(db.getBillType())) { + rk.setIsChuku("0"); // 入库:已入库 + } else if ("1".equals(db.getBillType())) { + rk.setIsChuku("1"); // 出库:已出库 + } + + // ✅ 如果是入库且通过,更新供应计划状态 + if ("0".equals(db.getBillType())) { + List rkList = rkInfoMapper.selectRkInfoListByBillNo(audit.getBillNo()); + Set jhIdSet = rkList.stream() + .map(RkInfo::getGysJhId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + for (Long jhId : jhIdSet) { + gysJhMapper.updateStatusById(jhId); + } + } + + // ✅ 更新 rk_info 状态 + rkInfoMapper.updateStatusByBillNo(rk); + + } else if ("0".equals(audit.getAuditResult())) { + rk.setStatus("2"); // 审核驳回 + rk.setIsDelete("1"); // 逻辑删除 + rk.setUpdateBy(userId); + rk.setUpdateTime(DateUtils.getNowDate()); + + // ✅ 调用统一逻辑删除方法 + if ("0".equals(db.getBillType())) { + rk.setBillNo(db.getBillNo()); + rkInfoMapper.markDeleteByBillNo(rk); + } else if ("1".equals(db.getBillType())) { + rk.setBillNoCk(db.getBillNo()); + rkInfoMapper.markDeleteByBillNoCk(rk); + // ✅ 恢复入库状态 + RkInfo revert = new RkInfo(); + revert.setBillNoCk(db.getBillNo()); // 出库单号 + revert.setStatus("1"); // 入库通过 + revert.setIsChuku("0"); // 未出库 + revert.setUpdateBy(userId); + revert.setUpdateTime(DateUtils.getNowDate()); + rkInfoMapper.revertRkInfoStatusByBillNoCk(revert); + } + } } + @Override public List selectAuditSignatureReviewList(AuditSignature filter) { @@ -186,7 +225,11 @@ public class AuditSignatureServiceImpl implements IAuditSignatureService if (!billNoSet.isEmpty()) { List rkInfoList = rkInfoMapper.selectOneForEachBillNo(new ArrayList<>(billNoSet)); rkInfoMap = rkInfoList.stream() - .collect(Collectors.toMap(RkInfo::getBillNo, Function.identity(), (a, b) -> a)); + .collect(Collectors.toMap( + rk -> StringUtils.isNotBlank(rk.getBillNoCk()) ? rk.getBillNoCk() : rk.getBillNo(), + Function.identity(), + (a, b) -> a + )); } // 3. 构造返回结果列表 @@ -202,6 +245,8 @@ public class AuditSignatureServiceImpl implements IAuditSignatureService vo.setCangkuName(rk.getCangkuName()); vo.setWlTypeName(rk.getWlTypeName()); vo.setLihuoYName(rk.getLihuoYName()); + vo.setCkTypeName(rk.getCkTypeName()); + vo.setTeamName(rk.getTeamName()); vo.setLihuoY(rk.getLihuoY()); } diff --git a/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java b/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java index 04ab92a..21e4993 100644 --- a/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java +++ b/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java @@ -96,7 +96,7 @@ public class RkInfoServiceImpl implements IRkInfoService } // 查询现场图片 + 审核结果(image_type = '1') - AuditSignature signature = auditSignatureMapper.selectPhotoUrlByRkId(info.getId()); + AuditSignature signature = auditSignatureMapper.selectPhotoUrlByBillNo(info.getBillNo()); if (signature != null) { info.setScenePhotoUrl(signature.getSignUrl()); info.setAuditResult(signature.getAuditResult()); @@ -467,7 +467,7 @@ public class RkInfoServiceImpl implements IRkInfoService Date now = DateUtils.getNowDate(); // Step 1: 判断是否需要审核 - boolean needAudit = "1".equals(configService.selectConfigByKey("stock.audit.enabled")); + boolean needAudit = "1".equals(configService.selectConfigByKey("rk.audit.enabled")); // Step 2: 生成出库单据号 String billNo = BillNoUtil.generateTodayBillNo("CK"); @@ -475,86 +475,88 @@ public class RkInfoServiceImpl implements IRkInfoService // Step 3: 批量更新 rk_info 出库字段 for (StockOutItemDTO item : dto.getCkList()) { RkInfo update = new RkInfo(); - update.setId(item.getId()); // 主键ID - update.setBillNoCk(billNo); // 出库单号 - update.setCkType(dto.getCkType()); // 出库类型 - update.setTeamCode(dto.getTeamCode()); // 施工队编码 - update.setLyTime(dto.getLyTime()); // 出库时间(领用时间) - update.setCkLihuoY(dto.getCkLihuoY()); // 出库理货员 - update.setCkRemark(item.getCkRemark()); // 出库备注 - update.setXmNoCk(dto.getXmNoCk()); // 项目编号 - update.setXmMsCk(dto.getXmMsCk()); // 项目描述 - update.setUpdateBy(userId); // 修改人 - update.setUpdateTime(now); // 修改时间 + update.setId(item.getId()); + update.setBillNoCk(billNo); + update.setCkType(dto.getCkType()); + update.setTeamCode(dto.getTeamCode()); + update.setLyTime(dto.getLyTime()); + update.setCkLihuoY(dto.getCkLihuoY()); + update.setCkRemark(item.getCkRemark()); + update.setXmNoCk(dto.getXmNoCk()); + update.setXmMsCk(dto.getXmMsCk()); + update.setUpdateBy(userId); + update.setUpdateTime(now); if ("JLCK".equals(dto.getCkType())) { - update.setIsBorrowed("1"); // 是否借料 - update.setBorrowTime(dto.getBorrowTime()); // 借用时间 - update.setReturnTime(dto.getReturnTime()); // 归还时间 + update.setIsBorrowed("1"); + update.setBorrowTime(dto.getBorrowTime()); + update.setReturnTime(dto.getReturnTime()); } if (needAudit) { - update.setStatus("3"); // 出库待审核 - update.setIsChuku("0"); // 不可直接出库,等待审批 + update.setStatus("3"); // 出库待审核 + update.setIsChuku("2"); } else { - update.setIsChuku("1"); // 审核关闭,直接出库 - update.setStatus("1"); // 设置为审核通过 + update.setIsChuku("1"); + update.setStatus("1"); // 审核通过 } rkInfoMapper.updateById(update); } - // Step 4: 如果开启审核,写入签字记录 + // Step 4: 如果启用审核,写入签字记录 if (needAudit) { List recordList = new ArrayList<>(); - // === 判断是否是重新提交(存在发起人记录) === + // 先检查是否已有发起人记录(逻辑规范化) boolean hasOldSign = auditSignatureMapper.existsCurrentSigner(billNo, "0"); - if (hasOldSign) { - auditSignatureMapper.updateIsCurrentToZero(billNo, "0"); // 标记旧记录为历史 + auditSignatureMapper.updateIsCurrentToZero(billNo, "0"); } - // === 发起人签字记录 === + // ✅ 插入发起人签字记录(无论是否有签字图) AuditSignature sign = new AuditSignature(); - sign.setBillNo(billNo); // 单据号(出库单号) - sign.setBillType("1"); // 单据类型:1=出库 - sign.setSignerId(userId); // 签字人ID(发起人) - sign.setSignerRole("0"); // 角色:0=发起人 - sign.setSignUrl(dto.getSignatureUrl()); // 签字图 URL - sign.setSignTime(now); // 签字时间 - sign.setImageType("0"); // 图片类型:0=签字图 - sign.setApproverId(dto.getApproverId()); // 审批人ID - sign.setIsCurrent("1"); // 当前记录 - sign.setIsDelete("0"); // 未删除 - sign.setCreateBy(userId); // 创建人 - sign.setCreateTime(now); // 创建时间 + sign.setBillNo(billNo); + sign.setBillType("1"); // 出库 + sign.setSignerId(userId); + sign.setSignerRole("0"); // 发起人 + sign.setSignUrl(dto.getSignatureUrl()); // 允许为空 + sign.setImageType("0"); // 签字图 + sign.setSignTime(now); + sign.setAuditResult("2"); + sign.setApproverId(dto.getApproverId()); + sign.setIsCurrent("1"); + sign.setIsDelete("0"); + sign.setCreateBy(userId); + sign.setCreateTime(now); recordList.add(sign); - // === 多张现场照片记录 === - if (dto.getPhotoUrls() != null) { - for (String url : dto.getPhotoUrls()) { - if (url == null || url.trim().isEmpty()) continue; + // ✅ 插入每条出库明细的现场拍照记录(photoUrl不为空才插) + for (StockOutItemDTO item : dto.getCkList()) { + if (StringUtils.isBlank(item.getPhotoUrl())) continue; - AuditSignature photo = new AuditSignature(); - photo.setBillNo(billNo); // 单据号 - photo.setBillType("1"); // 出库 - photo.setSignerId(userId); // 拍照人 - photo.setSignerRole("2"); // 角色:2=拍照人 - photo.setSignUrl(url); // 照片URL - photo.setImageType("1"); // 图片类型:1=照片 - photo.setSignTime(now); // 拍照时间 - photo.setApproverId(dto.getApproverId()); // 审批人ID - photo.setIsCurrent("1"); // 当前记录 - photo.setIsDelete("0"); // 未删除 - photo.setCreateBy(userId); // 创建人 - photo.setCreateTime(now); // 创建时间 - recordList.add(photo); - } + AuditSignature photo = new AuditSignature(); + photo.setBillNo(billNo); + photo.setBillType("1"); + photo.setSignerId(userId); + photo.setSignerRole("2"); // 拍照人 + photo.setSignUrl(item.getPhotoUrl()); + photo.setImageType("1"); // 现场图 + photo.setSignTime(now); + photo.setApproverId(dto.getApproverId()); + photo.setIsCurrent("1"); + photo.setAuditResult("2"); + photo.setIsDelete("0"); + photo.setCreateBy(userId); + photo.setCreateTime(now); + photo.setRkId(item.getId()); + photo.setPcode(item.getPcode()); + photo.setTrayCode(item.getTrayCode()); + recordList.add(photo); } if (!recordList.isEmpty()) { - auditSignatureMapper.batchInsert(recordList); // 批量插入签字记录 + auditSignatureMapper.batchInsert(recordList); } } diff --git a/src/main/resources/mybatis/wisdom/AuditSignatureMapper.xml b/src/main/resources/mybatis/wisdom/AuditSignatureMapper.xml index 1c56df2..d24f290 100644 --- a/src/main/resources/mybatis/wisdom/AuditSignatureMapper.xml +++ b/src/main/resources/mybatis/wisdom/AuditSignatureMapper.xml @@ -91,13 +91,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND is_delete = '0' - @@ -350,25 +351,38 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + update rk_info @@ -458,18 +479,59 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ly_time = #{lyTime}, borrow_time = #{borrowTime}, return_time = #{returnTime}, + status = #{status}, WHERE id = #{id} UPDATE rk_info - SET status = #{status}, - update_by = #{updateBy}, - is_chuku = #{isChuku}, - update_time = #{updateTime} - WHERE bill_no = #{billNo} - AND is_delete = '0' + + status = #{status}, + is_chuku = #{isChuku}, + update_by = #{updateBy}, + update_time = #{updateTime}, + + + + bill_no = #{billNo} + + + bill_no_ck = #{billNoCk} + + + + UPDATE rk_info + SET is_delete = #{isDelete}, + status = #{status}, + update_by = #{updateBy}, + update_time = #{updateTime} + WHERE bill_no = #{billNo} + AND status IN ('0', '2') + + + + UPDATE rk_info + SET is_delete = #{isDelete}, + status = #{status}, + update_by = #{updateBy}, + update_time = #{updateTime} + WHERE bill_no_ck = #{billNoCk} + AND status IN ('0', '2') + + + + UPDATE rk_info + SET status = #{status}, + is_chuku = #{isChuku}, + update_by = #{updateBy}, + update_time = #{updateTime} + WHERE bill_no_ck = #{billNoCk} + AND is_delete = '0' + AND bill_no IS NOT NULL + + + \ No newline at end of file