From 9265065bea5a40bcaced67857cb3ba22324ce06c Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 09 十一月 2026 13:28:31 +0800
Subject: [PATCH] feat(seal): 实现印章编辑与删除功能及优化上传组件

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/seal/PdSealService.java |   43 +++++++++++++++++++++++++++++++++++++------
 1 files changed, 37 insertions(+), 6 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/seal/PdSealService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/seal/PdSealService.java
index a8f4255..2bfa482 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/seal/PdSealService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/seal/PdSealService.java
@@ -30,8 +30,39 @@
     public List<Map<String,Object>> seals(boolean activeOnly) {
         return jdbc.queryForList("SELECT id,name,enabled,create_time FROM pd_seal WHERE tenant_id=? AND deleted=0" + (activeOnly ? " AND enabled=1" : "") + " ORDER BY id DESC", tenant());
     }
+    public byte[] getImage(long id) {
+        var rows = jdbc.queryForList("SELECT image_data FROM pd_seal WHERE id=? AND tenant_id=? AND deleted=0", id, tenant());
+        if (rows.isEmpty()) throw fail("鍗扮珷涓嶅瓨鍦�");
+        return (byte[]) rows.get(0).get("image_data");
+    }
     public long upload(String name, MultipartFile file, Long userId) throws Exception {
+        checkName(name);
+        byte[] data = readImage(file);
+        String imageHash = hash(data);
+        var keys = new GeneratedKeyHolder();
+        jdbc.update(c -> { var ps=c.prepareStatement("INSERT INTO pd_seal(name,image_data,image_hash,enabled,created_by,tenant_id) VALUES(?,?,?,1,?,?)", Statement.RETURN_GENERATED_KEYS); ps.setString(1,name.trim()); ps.setBytes(2,data); ps.setString(3,imageHash); ps.setLong(4,userId); ps.setLong(5,tenant()); return ps; }, keys);
+        return Objects.requireNonNull(keys.getKey()).longValue();
+    }
+    public void update(long id, String name, MultipartFile file) throws Exception {
+        checkName(name);
+        int updated;
+        if (file == null || file.isEmpty()) {
+            updated = jdbc.update("UPDATE pd_seal SET name=? WHERE id=? AND tenant_id=? AND deleted=0", name.trim(), id, tenant());
+        } else {
+            byte[] data = readImage(file);
+            updated = jdbc.update("UPDATE pd_seal SET name=?,image_data=?,image_hash=? WHERE id=? AND tenant_id=? AND deleted=0", name.trim(), data, hash(data), id, tenant());
+        }
+        if (updated != 1) throw fail("鍗扮珷涓嶅瓨鍦�");
+    }
+    public void delete(long id) {
+        Integer pending = jdbc.queryForObject("SELECT COUNT(*) FROM pd_seal_application WHERE seal_id=? AND tenant_id=? AND status=1", Integer.class, id, tenant());
+        if (pending != null && pending > 0) throw fail("璇ュ嵃绔犳湁杩涜涓殑鐢ㄥ嵃瀹℃壒鐢宠锛岃寰呭鎵瑰畬鎴愬悗鍐嶅垹闄�");
+        if (jdbc.update("UPDATE pd_seal SET deleted=1 WHERE id=? AND tenant_id=? AND deleted=0", id, tenant()) != 1) throw fail("鍗扮珷涓嶅瓨鍦�");
+    }
+    private void checkName(String name) {
         if (name == null || name.isBlank() || name.length() > 100) throw fail("鍗扮珷鍚嶇О涓嶈兘涓虹┖涓斾笉鑳借秴杩�100瀛�");
+    }
+    private byte[] readImage(MultipartFile file) throws Exception {
         if (file == null || file.isEmpty() || file.getSize() > 2 * 1024 * 1024) throw fail("璇蜂笂浼犱笉瓒呰繃2MB鐨凱NG鍗扮珷鍥剧墖");
         byte[] data = file.getBytes();
         byte[] sig = {(byte)137,80,78,71,13,10,26,10};
@@ -43,10 +74,10 @@
             try { reader.setInput(input); if (reader.getWidth(0) > 2048 || reader.getHeight(0) > 2048) throw fail("鍥剧墖灏哄涓嶈兘瓒呰繃2048脳2048"); reader.read(0); }
             finally { reader.dispose(); }
         }
-        String hash = HexFormat.of().formatHex(MessageDigest.getInstance("SHA-256").digest(data));
-        var keys = new GeneratedKeyHolder();
-        jdbc.update(c -> { var ps=c.prepareStatement("INSERT INTO pd_seal(name,image_data,image_hash,enabled,created_by,tenant_id) VALUES(?,?,?,1,?,?)", Statement.RETURN_GENERATED_KEYS); ps.setString(1,name.trim()); ps.setBytes(2,data); ps.setString(3,hash); ps.setLong(4,userId); ps.setLong(5,tenant()); return ps; }, keys);
-        return Objects.requireNonNull(keys.getKey()).longValue();
+        return data;
+    }
+    private String hash(byte[] data) throws Exception {
+        return HexFormat.of().formatHex(MessageDigest.getInstance("SHA-256").digest(data));
     }
     public void setEnabled(long id, boolean enabled) {
         if (jdbc.update("UPDATE pd_seal SET enabled=? WHERE id=? AND tenant_id=? AND deleted=0", enabled, id, tenant()) != 1) throw fail("鍗扮珷涓嶅瓨鍦�");
@@ -80,11 +111,11 @@
         if (instance == null || instance.isBlank()) throw fail("瀹℃壒璁板綍涓嶅畬鏁达紝鏃犳硶涓嬭浇");
         boolean humanApproval = taskService.getTaskListByProcessInstanceId(instance, true).stream().anyMatch(task -> {
             var vars = task.getTaskLocalVariables();
-            if (vars == null || !Integer.valueOf(2).equals(vars.get("TASK_STATUS")) || task.getAssignee() == null || task.getAssignee().equals(String.valueOf(userId))) return false;
+            if (vars == null || !Integer.valueOf(2).equals(vars.get("TASK_STATUS")) || task.getAssignee() == null) return false;
             Object reason = vars.get("TASK_REASON");
             return Arrays.stream(cn.iocoder.yudao.module.bpm.enums.task.BpmReasonEnum.values()).noneMatch(item -> Objects.equals(item.getReason(), reason));
         });
-        if (!humanApproval) throw fail("鏈壘鍒板叾浠栧鎵逛汉鐨勪汉宸ラ�氳繃璁板綍锛屾棤娉曚笅杞�");
+        if (!humanApproval) throw fail("鏈壘鍒颁汉宸ュ鎵归�氳繃璁板綍锛屾棤娉曚笅杞�");
         byte[] snapshot=(byte[])rows.get(0).get("document_snapshot"), image=(byte[])rows.get(0).get("seal_image");
         var out=new ByteArrayOutputStream(); boolean found=false;
         try(var zin=new ZipInputStream(new ByteArrayInputStream(snapshot)); var zout=new ZipOutputStream(out)) { ZipEntry entry; while((entry=zin.getNextEntry())!=null){byte[] bytes=zin.readAllBytes(); if(entry.getName().equals("word/media/seal.png")){bytes=image;found=true;} zout.putNextEntry(new ZipEntry(entry.getName())); zout.write(bytes); zout.closeEntry();} }

--
Gitblit v1.9.3