浏览代码

禀议书控件赋值3个字段修改

CRK 3 周之前
父节点
当前提交
081f0da644

+ 1 - 1
src/main/java/com/muzhi/changguchuan/seal/config/SealProperties.java

@@ -55,7 +55,7 @@ public class SealProperties {
     private String targetFormUuid;
 
     /** 审批流程表单中用于回写印章图片的字段编码。 */
-    @Value("${seal.target.image-field:imageField_mubc0xwk}")
+    @Value("${seal.target.image-field:,imageField_mubc0xwk}")
     private String targetImageField;
 
     /** 生成文件的根目录;相对路径会解析到 Java 程序运行目录下。 */

+ 3 - 0
src/main/java/com/muzhi/changguchuan/seal/controller/SealController.java

@@ -75,6 +75,9 @@ public class SealController {
         if (StringUtils.isEmpty(request.getApprovalTime())) {
             request.setApprovalTime(params.get("approvalTime"));
         }
+        if (StringUtils.isEmpty(request.getCodeid())) {
+            request.setCodeid(params.get("codeid"));
+        }
         if (StringUtils.isEmpty(request.getTemplateImageUrl())) {
             request.setTemplateImageUrl(params.get("templateImageUrl"));
         }

+ 13 - 0
src/main/java/com/muzhi/changguchuan/seal/model/SealApprovalRequest.java

@@ -20,6 +20,9 @@ public class SealApprovalRequest {
     /** 审批通过时间,可传毫秒时间戳、ISO 时间或 yyyy-MM-dd 日期。 */
     private String approvalTime;
 
+    /** 本次印章图片需要回写的宜搭图片控件编码。 */
+    private String codeid;
+
     /** 可选的底图 URL;未传时读取固定的宜搭底图实例。 */
     private String templateImageUrl;
 
@@ -63,6 +66,16 @@ public class SealApprovalRequest {
         this.approvalTime = approvalTime;
     }
 
+    /** 返回本次需要回写的宜搭图片控件编码。 */
+    public String getCodeid() {
+        return codeid;
+    }
+
+    /** 设置本次需要回写的宜搭图片控件编码。 */
+    public void setCodeid(String codeid) {
+        this.codeid = codeid;
+    }
+
     /** 返回请求中指定的底图 URL。 */
     public String getTemplateImageUrl() {
         return templateImageUrl;

+ 17 - 7
src/main/java/com/muzhi/changguchuan/seal/service/impl/SealServiceImpl.java

@@ -119,7 +119,8 @@ public class SealServiceImpl implements SealService {
                 instanceId, formUuid, targetContent == null ? 0 : targetContent.size());
 
         String approvalDate = resolveApprovalDate(request.getApprovalTime(), properties.getTimeZone());
-        String existingUrl = findExistingUrl(targetContent, properties.getTargetImageField());
+        String targetImageField = selectTargetImageField(request.getCodeid(), properties.getTargetImageField());
+        String existingUrl = findExistingUrl(targetContent, targetImageField);
         if (existingUrl != null && existingUrl.startsWith(trimTrailingSlash(properties.getPublicBaseUrl()))) {
             // 已存在本服务生成的文件时执行幂等返回,不重复下载、绘图和回写。
             log.info("[seal] 检测到已生成的印章 URL,跳过重复处理,instanceId={}, fileUrl={}", instanceId, existingUrl);
@@ -133,8 +134,8 @@ public class SealServiceImpl implements SealService {
         log.info("[seal] 日期绘制完成,approvalDate={}, outputBytes={}", approvalDate, stampedBytes.length);
         StoredFile storedFile = store(stampedBytes, instanceId, approvalDate);
         log.info("[seal] 印章文件保存完成,path={}, url={}", storedFile.path, storedFile.url);
-        updateTarget(appType, formUuid, instanceId, storedFile, accessToken);
-        log.info("[seal] 印章 URL 回写宜搭完成,instanceId={}, fieldId={}", instanceId, properties.getTargetImageField());
+        updateTarget(appType, formUuid, instanceId, targetImageField, storedFile, accessToken);
+        log.info("[seal] 印章 URL 回写宜搭完成,instanceId={}, fieldId={}", instanceId, targetImageField);
         return new SealResult(instanceId, formUuid, storedFile.path.toString(), storedFile.url, approvalDate);
     }
 
@@ -504,9 +505,10 @@ public class SealServiceImpl implements SealService {
     }
 
     /** 使用宜搭 UpdateFormData 接口,把公网图片地址写入图片上传字段。 */
-    private void updateTarget(String appType, String formUuid, String instanceId, StoredFile file, String accessToken) {
+    private void updateTarget(String appType, String formUuid, String instanceId, String targetImageField,
+                              StoredFile file, String accessToken) {
         log.info("[seal.yida] UpdateFormData 开始,appType={}, formUuid={}, instanceId={}, fieldId={}, fileUrl={}",
-                appType, formUuid, instanceId, properties.getTargetImageField(), file.url);
+                appType, formUuid, instanceId, targetImageField, file.url);
         // 图片字段使用宜搭兼容的数组对象结构,保留名称、大小和各类访问地址。
         Map<String, Object> image = new LinkedHashMap<>();
         image.put("name", file.name);
@@ -518,7 +520,7 @@ public class SealServiceImpl implements SealService {
         List<Map<String, Object>> images = new ArrayList<>();
         images.add(image);
         Map<String, Object> formData = new HashMap<>();
-        formData.put(properties.getTargetImageField(), images);
+        formData.put(targetImageField, images);
         try {
             com.aliyun.dingtalkyida_2_0.Client client = createClientV2();
             UpdateFormDataHeaders headers = new UpdateFormDataHeaders();
@@ -540,11 +542,19 @@ public class SealServiceImpl implements SealService {
             }
         } catch (Exception e) {
             log.error("[seal.yida] UpdateFormData 失败,instanceId={}, fieldId={}, error={}",
-                    instanceId, properties.getTargetImageField(), summarize(e), e);
+                    instanceId, targetImageField, summarize(e), e);
             throw new IllegalStateException("回写宜搭印章图片失败:" + e.getMessage(), e);
         }
     }
 
+    /** 请求传入控件编码时优先使用;未传时保持原固定字段配置。 */
+    static String selectTargetImageField(String codeid, String configuredField) {
+        if (codeid != null && !codeid.trim().isEmpty()) {
+            return codeid.trim();
+        }
+        return configuredField;
+    }
+
     /** 读取业务表单中已有的印章 URL,用于幂等判断。 */
     private String findExistingUrl(JSONObject content, String fieldId) {
         JSONObject formData = getFieldContainer(content);