Commit 1c6224b2 authored by 赵啸非's avatar 赵啸非

修改上传附件事件

parent 8ab87b69
...@@ -9,6 +9,10 @@ function vModel(self, dataObject) { ...@@ -9,6 +9,10 @@ function vModel(self, dataObject) {
} }
//判断是否为上传组件 //判断是否为上传组件
if(self.conf.compType === 'upload'){ if(self.conf.compType === 'upload'){
//增加上传回调事件
dataObject.attrs['on-success']= (response, file)=> {
self.$emit("input", response.url);
}
dataObject.attrs['before-upload'] = file=>{ dataObject.attrs['before-upload'] = file=>{
//非限定后缀不允许上传 //非限定后缀不允许上传
const fileName = file.name; const fileName = file.name;
...@@ -29,6 +33,7 @@ function vModel(self, dataObject) { ...@@ -29,6 +33,7 @@ function vModel(self, dataObject) {
export default { export default {
render(h) { render(h) {
let dataObject = { let dataObject = {
attrs: {}, attrs: {},
props: {}, props: {},
......
import {isAttr,jsonClone} from '../utils/index'; import { isAttr, jsonClone } from '../utils/index';
import childrenItem from './slot/index'; import childrenItem from './slot/index';
import {remoteData} from './mixin'; import { remoteData } from './mixin';
function vModel(self, dataObject) { function vModel(self, dataObject) {
if (self.conf.ele === 'el-upload') {
dataObject.attrs['on-success'] = (response, file) => {
self.$emit("input", response.url);
}
dataObject.attrs['on-remove'] = (file, fileList) => {
self.$emit('deleteUpload', file, fileList)
}
}
dataObject.on.input = val => { dataObject.on.input = val => {
self.$emit('input', val) self.$emit('input', val)
} }
...@@ -19,16 +29,16 @@ export default { ...@@ -19,16 +29,16 @@ export default {
//远程获取数据 //远程获取数据
this.getRemoteData(); this.getRemoteData();
const confClone = jsonClone(this.conf); const confClone = jsonClone(this.conf);
const children = childrenItem(h,confClone); const children = childrenItem(h, confClone);
Object.keys(confClone).forEach(key => { Object.keys(confClone).forEach(key => {
const val = confClone[key] const val = confClone[key]
if (dataObject[key]) { if (dataObject[key]) {
dataObject[key] = val dataObject[key] = val
} else if (!isAttr(key)) { } else if (!isAttr(key)) {
dataObject.props[key] = val dataObject.props[key] = val
} else if(key ==='width'){ } else if (key === 'width') {
dataObject.style= 'width:'+val; dataObject.style = 'width:' + val;
}else { } else {
dataObject.attrs[key] = val dataObject.attrs[key] = val
} }
}) })
...@@ -37,5 +47,5 @@ export default { ...@@ -37,5 +47,5 @@ export default {
return h(confClone.ele, dataObject, children) return h(confClone.ele, dataObject, children)
}, },
props: ['conf'], props: ['conf'],
mixins:[remoteData] mixins: [remoteData]
} }
...@@ -17,7 +17,6 @@ export default { ...@@ -17,7 +17,6 @@ export default {
on: {}, on: {},
style: {} style: {}
} }
//远程获取数据 //远程获取数据
this.getRemoteData(); this.getRemoteData();
const confClone = jsonClone(this.conf); const confClone = jsonClone(this.conf);
......
...@@ -17,7 +17,7 @@ public enum ComponentEnum { ...@@ -17,7 +17,7 @@ public enum ComponentEnum {
RADIO("r", "单选框"), RADIO("r", "单选框"),
DATE("date", "日期选择栏"), DATE("date", "日期选择栏"),
AREA("area", "区域选择栏"), AREA("area", "区域选择栏"),
IMAGE("image", "图片选择"), IMAGE("@image", "图片选择"),
DYNAMIC_TABLE("dt", "动态表格"),; DYNAMIC_TABLE("dt", "动态表格"),;
private String value; private String value;
......
...@@ -31,20 +31,25 @@ public class DesignImageComponent extends DesignComponent { ...@@ -31,20 +31,25 @@ public class DesignImageComponent extends DesignComponent {
columnsItem.setId(cons.getVal()); columnsItem.setId(cons.getVal());
columnsItem.set_id(cons.getVal()); columnsItem.set_id(cons.getVal());
columnsItem.setCompType("upload"); columnsItem.setCompType("upload");
columnsItem.setCompName(cons.getLabel()); columnsItem.setCompName("附件");
columnsItem.setCompIcon("button"); columnsItem.setCompIcon("att");
columnsItem.setEle("el-upload"); columnsItem.setEle("el-upload");
columnsItem.setViewType("component"); columnsItem.setViewType("component");
columnsItem.setConfig(true); columnsItem.setConfig(true);
columnsItem.setShowLabel(true); columnsItem.setShowLabel(true);
columnsItem.setLabel(cons.getLabel()); columnsItem.setLabel(cons.getLabel());
columnsItem.setLabelWidth(120); columnsItem.setLabelWidth(120);
columnsItem.setType("primary"); columnsItem.setMultiple(false);
columnsItem.setText("按钮"); columnsItem.setRequired(false);
columnsItem.setPlain(true); columnsItem.setAction(cons.getUploadFileUrl());
columnsItem.setRound(false); columnsItem.setName("file");
columnsItem.setCircle(false); columnsItem.setShowFileList(true);
columnsItem.setLoading(false); columnsItem.setListType("picture-card");
columnsItem.setShowTip(false);
columnsItem.setTips("点击按钮上传附件");
columnsItem.setAccept("jpg,png,jpeg,bmp");
columnsItem.setFileSize(10);
columnsItem.setLayout("colItem"); columnsItem.setLayout("colItem");
return columnsItem; return columnsItem;
......
...@@ -31,4 +31,7 @@ public class ComponentCons { ...@@ -31,4 +31,7 @@ public class ComponentCons {
private List<TableColItem> colList; private List<TableColItem> colList;
private String uploadFileUrl;
} }
...@@ -11,6 +11,9 @@ import com.alibaba.fastjson.JSON; ...@@ -11,6 +11,9 @@ import com.alibaba.fastjson.JSON;
import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder; import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.PictureType;
import com.deepoove.poi.data.Pictures;
import com.deepoove.poi.plugin.table.MultipleRowTableRenderPolicy; import com.deepoove.poi.plugin.table.MultipleRowTableRenderPolicy;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
...@@ -44,10 +47,7 @@ import org.springframework.util.ObjectUtils; ...@@ -44,10 +47,7 @@ import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream; import java.io.*;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
...@@ -114,7 +114,7 @@ public class DocBaseinfoServiceImpl extends AbstractCRUDServiceImpl<DocBaseinfoD ...@@ -114,7 +114,7 @@ public class DocBaseinfoServiceImpl extends AbstractCRUDServiceImpl<DocBaseinfoD
//解析模板变量 //解析模板变量
//docTemplateService.parseDocXml(subEntity, context); //docTemplateService.parseDocXml(subEntity, context);
//TODO //TODO
docTemplateService.parseDocxToJson(subEntity,context); docTemplateService.parseDocxToJson(subEntity, context);
} }
super.saveAfter(entity, context); super.saveAfter(entity, context);
} }
...@@ -268,7 +268,6 @@ public class DocBaseinfoServiceImpl extends AbstractCRUDServiceImpl<DocBaseinfoD ...@@ -268,7 +268,6 @@ public class DocBaseinfoServiceImpl extends AbstractCRUDServiceImpl<DocBaseinfoD
} }
@Override @Override
public String submitOtherSystem(String form, Long templateId, String previewPath, String mergeDocPath, Context context) { public String submitOtherSystem(String form, Long templateId, String previewPath, String mergeDocPath, Context context) {
...@@ -304,21 +303,25 @@ public class DocBaseinfoServiceImpl extends AbstractCRUDServiceImpl<DocBaseinfoD ...@@ -304,21 +303,25 @@ public class DocBaseinfoServiceImpl extends AbstractCRUDServiceImpl<DocBaseinfoD
Map<String, Object> data = mapper.readValue(docFormVo.getFormContent(), Map.class); Map<String, Object> data = mapper.readValue(docFormVo.getFormContent(), Map.class);
//遍历查看是否有图片数据,多选框 //遍历查看是否有图片数据,多选框
data.entrySet().stream().forEach(entry -> { data.entrySet().stream().forEach(entry -> {
if (entry.getKey().indexOf("image") != -1) { if (entry.getKey().indexOf("@image") != -1) {
//获取值 读取本地图片 //获取值 读取本地图片
String imagepath = uploadService.getFilePath(entry.getValue().toString()); String imagepath = uploadService.getFilePath(entry.getValue().toString());
log.info("Image path: " + imagepath); log.info("Image path: " + imagepath);
BufferedImage image = ImgUtil.read(imagepath); try {
String ext = FileUtil.getSuffix(imagepath); PictureRenderData pictureRenderData = Pictures.ofStream(new FileInputStream(imagepath), PictureType.JPEG)
String imageStr = ImgUtil.toBase64(image, ext); .size(100, 120).create();
entry.setValue(imageStr); data.put(StrUtil.removePrefixIgnoreCase(entry.getKey(),"@"),pictureRenderData);
//entry.setValue(pictureRenderData);
} catch (FileNotFoundException e) {
log.error("error", e);
}
} }
//构建填充复选框值 //构建填充复选框值
if (entry.getKey().indexOf("ck_") != -1 && entry.getKey().indexOf("v") != -1) { if (entry.getKey().indexOf("ck_") != -1 && entry.getKey().indexOf("<") != -1) {
//获取复选框选项,并渲染值 //获取复选框选项,并渲染值
String ckStr = StringUtils.substringBetween(entry.getKey(), "v", "v"); String ckStr = StringUtils.substringBetween(entry.getKey(), "<", ">");
//获取所有选项 //获取所有选项
List<String> checkboxs = StrUtil.splitTrim(ckStr, "_", -1); List<String> checkboxs = StrUtil.splitTrim(ckStr, "-", -1);
//选中的项 //选中的项
List<String> ckList = Convert.toList(String.class, entry.getValue()); List<String> ckList = Convert.toList(String.class, entry.getValue());
//合并 //合并
...@@ -337,37 +340,28 @@ public class DocBaseinfoServiceImpl extends AbstractCRUDServiceImpl<DocBaseinfoD ...@@ -337,37 +340,28 @@ public class DocBaseinfoServiceImpl extends AbstractCRUDServiceImpl<DocBaseinfoD
).collect(Collectors.joining("")); ).collect(Collectors.joining(""));
entry.setValue(ckStrs); entry.setValue(ckStrs);
} }
//TODO 单选 //TODO 单选
//绑定动态表单 //绑定动态表单
if (entry.getKey().indexOf("dt_") != -1 ) { if (entry.getKey().indexOf("dt_") != -1) {
builder.bind(entry.getKey(), new MultipleRowTableRenderPolicy()); builder.bind(entry.getKey(), new MultipleRowTableRenderPolicy());
} }
}); });
//查询是否有多选框, //查询是否有多选框,
//获取模板文件地址 //获取模板文件地址
DocTemplateEntity docTemplateEntity = docTemplateService.get(docFormVo.getTemplateId()); DocTemplateEntity docTemplateEntity = docTemplateService.get(docFormVo.getTemplateId());
if (!ObjectUtils.isEmpty(docTemplateEntity)) { if (!ObjectUtils.isEmpty(docTemplateEntity)) {
String path = filePath + docTemplateEntity.getTemplatePath(); String path = filePath + docTemplateEntity.getTemplatePath();
int index = StrUtil.lastIndexOfIgnoreCase(path, "/");
String templatePath = path.substring(0, index);
//FreeMarkerUtils.initFreeMarkerPath(templatePath);
String templateName = FileUtil.getName(path); String templateName = FileUtil.getName(path);
Configure config = builder.build(); Configure config = builder.build();
XWPFTemplate template = null; XWPFTemplate template = null;
ByteArrayOutputStream byteArrayOutputStream = null; ByteArrayOutputStream byteArrayOutputStream = null;
try { try {
// ClassPathResource classPathResource = new ClassPathResource(path);
template = XWPFTemplate.compile(path, config).render(data); template = XWPFTemplate.compile(path, config).render(data);
byteArrayOutputStream = new ByteArrayOutputStream(); byteArrayOutputStream = new ByteArrayOutputStream();
template.write(byteArrayOutputStream); template.write(byteArrayOutputStream);
MultipartFile multipartFile = new MockMultipartFile(templateName, templateName, MultipartFile multipartFile = new MockMultipartFile(templateName, templateName,
ContentType.APPLICATION_OCTET_STREAM.toString(),byteArrayOutputStream.toByteArray()); ContentType.APPLICATION_OCTET_STREAM.toString(), byteArrayOutputStream.toByteArray());
String mergedocPath = uploadService.saveFileUpload(multipartFile, "/mergedoc", context.getUser()); String mergedocPath = uploadService.saveFileUpload(multipartFile, "/mergedoc", context.getUser());
log.info("mergedocPath:" + mergedocPath); log.info("mergedocPath:" + mergedocPath);
String mergedoc = this.filePath + mergedocPath; String mergedoc = this.filePath + mergedocPath;
...@@ -376,13 +370,11 @@ public class DocBaseinfoServiceImpl extends AbstractCRUDServiceImpl<DocBaseinfoD ...@@ -376,13 +370,11 @@ public class DocBaseinfoServiceImpl extends AbstractCRUDServiceImpl<DocBaseinfoD
String preView = this.filePath + "/preview/" + fileName; String preView = this.filePath + "/preview/" + fileName;
WordUtil.convertWordToJPEG(mergedoc, preView); WordUtil.convertWordToJPEG(mergedoc, preView);
log.info("preView:" + mergedocPath); log.info("preView:" + mergedocPath);
//下载地址拼装 //下载地址拼装
String returnStr = mergedocPath + ";" + "/preview/" + fileName; String returnStr = mergedocPath + ";" + "/preview/" + fileName;
return returnStr; return returnStr;
} catch (Exception e) { } catch (Exception e) {
log.error("渲染模板失败:", e); log.error("渲染模板失败:", e);
// return new byte[0];
} finally { } finally {
try { try {
template.close(); template.close();
...@@ -391,7 +383,6 @@ public class DocBaseinfoServiceImpl extends AbstractCRUDServiceImpl<DocBaseinfoD ...@@ -391,7 +383,6 @@ public class DocBaseinfoServiceImpl extends AbstractCRUDServiceImpl<DocBaseinfoD
log.error("ioEx:", e); log.error("ioEx:", e);
} }
} }
} }
} catch (JsonProcessingException e) { } catch (JsonProcessingException e) {
log.error("转换异常", e); log.error("转换异常", e);
......
...@@ -22,6 +22,7 @@ import com.mortals.framework.web.BaseCRUDJsonMappingController; ...@@ -22,6 +22,7 @@ import com.mortals.framework.web.BaseCRUDJsonMappingController;
import com.mortals.xhx.module.doc.baseinfo.model.vo.DocBaseinfoVo; import com.mortals.xhx.module.doc.baseinfo.model.vo.DocBaseinfoVo;
import com.mortals.xhx.module.doc.baseinfo.service.DocBaseinfoService; import com.mortals.xhx.module.doc.baseinfo.service.DocBaseinfoService;
import java.util.Date;
import java.util.Map; import java.util.Map;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -89,13 +90,15 @@ public class DocBaseinfoController extends BaseCRUDJsonBodyMappingController<Doc ...@@ -89,13 +90,15 @@ public class DocBaseinfoController extends BaseCRUDJsonBodyMappingController<Doc
try { try {
String paths = this.getService().mergeFormToDoc(docFormVo, getContext()); String paths = this.getService().mergeFormToDoc(docFormVo, getContext());
String[] vals = paths.split(";"); String[] vals = paths.split(";");
// String redirectUrl = this.getService().submitOtherSystem(form, templateId, vals[0], vals[1], getContext()); String redirectUrl = this.getService().submitOtherSystem(docFormVo.getFormContent(), docFormVo.getTemplateId(), vals[0], vals[1], getContext());
jsonObject.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS); jsonObject.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
jsonObject.put("mergeDoc", vals[0]); jsonObject.put("mergeDoc", vals[0]);
jsonObject.put("preview", vals[1]); jsonObject.put("preview", vals[1]);
// jsonObject.put("redirectUrl", redirectUrl); jsonObject.put("redirectUrl", redirectUrl);
docFormService.save(docFormVo,getContext()); docFormVo.setCreateTime(new Date());
docFormVo.setCreateUserId(getContextUserId(getContext()));
docFormVo.setCreateUser("");
docFormService.save(docFormVo, getContext());
} catch (Exception e) { } catch (Exception e) {
log.error("合成表单异常", e); log.error("合成表单异常", e);
jsonObject.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE); jsonObject.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
......
...@@ -40,7 +40,7 @@ public class DocFormController extends BaseCRUDJsonBodyMappingController<DocForm ...@@ -40,7 +40,7 @@ public class DocFormController extends BaseCRUDJsonBodyMappingController<DocForm
public static void main(String[] args) { public static void main(String[] args) {
DocFormEntity docFormEntity = new DocFormEntity(); DocFormEntity docFormEntity = new DocFormEntity();
docFormEntity.setFormContent("{\"i_1_标题\":\"234\",\"date_1_会议时间\":\"2022 年 09 月 12 日\",\"i_1_会议地点\":\"24\",\"dt_1_汇报\":[{\"i_1_汇报人\":\"2313213\",\"date_1_汇报时间\":\"\",\"t_1_汇报内容\":\"1231313\",\"index\":0},{\"i_1_汇报人\":\"啊啊啊\",\"date_1_汇报时间\":\"\",\"t_1_汇报内容\":\"巴巴爸爸\",\"index\":1}],\"i_1_记录人\":\"滚滚滚\",\"ck_1_政治面貌_v党员_非党员_党员先锋岗v\":[\"党员\",\"非党员\"],\"r_1_证件类型_v身份证_军官证_残疾证v\":\"残疾证\",\"s_1_设备类型_v呼叫器_窗口屏_评价器v\":\"窗口屏\"}"); docFormEntity.setFormContent("{\"i_1_标题\":\"1231\",\"date_1_会议时间\":\"2022 年 09 月 14 日\",\"i_1_会议地点\":\"312313\",\"dt_1_汇报\":[{\"i_1_汇报人\":\"12313\",\"date_1_汇报时间\":\"\",\"t_1_汇报内容\":\"12313\",\"index\":0},{\"i_1_汇报人\":\"333\",\"date_1_汇报时间\":\"\",\"t_1_汇报内容\":\"3333\",\"index\":1}],\"i_1_记录人\":\"11123\",\"ck_1_政治面貌_<党员-非党员-党员先锋岗>\":[\"党员\"],\"r_1_证件类型_<身份证-军官证-残疾证>\":\"身份证\",\"s_1_设备类型_<呼叫器-窗口屏-评价器>\":\"窗口屏\",\"@image_1_照片\":\"/file/uploadfile/1663825533953.jpg\"}");
docFormEntity.setTemplateId(50L); docFormEntity.setTemplateId(50L);
System.out.println(JSON.toJSONString(docFormEntity)); System.out.println(JSON.toJSONString(docFormEntity));
......
...@@ -52,6 +52,9 @@ public class DocTemplateServiceImpl extends AbstractCRUDServiceImpl<DocTemplateD ...@@ -52,6 +52,9 @@ public class DocTemplateServiceImpl extends AbstractCRUDServiceImpl<DocTemplateD
@Value("${upload.path}") @Value("${upload.path}")
private String filePath; private String filePath;
@Value("${upload.url:http://localhost:8084/m/file/commonupload?prePath=/file/uploadfile}")
private String uploadUrl;
@Override @Override
protected void saveAfter(DocTemplateEntity entity, Context context) throws AppException { protected void saveAfter(DocTemplateEntity entity, Context context) throws AppException {
if (!ObjectUtils.isEmpty(entity.getDocFormEntity())) { if (!ObjectUtils.isEmpty(entity.getDocFormEntity())) {
...@@ -228,7 +231,6 @@ public class DocTemplateServiceImpl extends AbstractCRUDServiceImpl<DocTemplateD ...@@ -228,7 +231,6 @@ public class DocTemplateServiceImpl extends AbstractCRUDServiceImpl<DocTemplateD
root.setConfig(config); root.setConfig(config);
List<ListItem> collect = new ArrayList<>(); List<ListItem> collect = new ArrayList<>();
for (MetaTemplate item : template.getElementTemplates()) { for (MetaTemplate item : template.getElementTemplates()) {
System.out.println(item.variable());
//识别简单输入 //识别简单输入
String val = StrUtil.strip(item.variable(), "{{", "}}"); String val = StrUtil.strip(item.variable(), "{{", "}}");
List<String> keys = StrSplitter.split(val, "_", true, true); List<String> keys = StrSplitter.split(val, "_", true, true);
...@@ -240,6 +242,7 @@ public class DocTemplateServiceImpl extends AbstractCRUDServiceImpl<DocTemplateD ...@@ -240,6 +242,7 @@ public class DocTemplateServiceImpl extends AbstractCRUDServiceImpl<DocTemplateD
cons.setLabel(label); cons.setLabel(label);
cons.setVal(val); cons.setVal(val);
cons.setEl(item.variable()); cons.setEl(item.variable());
cons.setUploadFileUrl(uploadUrl);
if (type.equalsIgnoreCase(ComponentEnum.DYNAMIC_TABLE.getValue())) { if (type.equalsIgnoreCase(ComponentEnum.DYNAMIC_TABLE.getValue())) {
List<TableColItem> colList = new ArrayList<>(); List<TableColItem> colList = new ArrayList<>();
......
...@@ -30,8 +30,9 @@ Authorization: {{authToken}} ...@@ -30,8 +30,9 @@ Authorization: {{authToken}}
Content-Type: application/json Content-Type: application/json
{ {
"formContent": "{\"i_1_标题\":\"234\",\"date_1_会议时间\":\"2022 年 09 月 12 日\",\"i_1_会议地点\":\"24\",\"dt_1_汇报\":[{\"i_1_汇报人\":\"2313213\",\"date_1_汇报时间\":\"\",\"t_1_汇报内容\":\"1231313\",\"index\":0},{\"i_1_汇报人\":\"啊啊啊\",\"date_1_汇报时间\":\"\",\"t_1_汇报内容\":\"巴巴爸爸\",\"index\":1}],\"i_1_记录人\":\"滚滚滚\",\"ck_1_政治面貌_v党员_非党员_党员先锋岗v\":[\"党员\",\"非党员\"],\"r_1_证件类型_v身份证_军官证_残疾证v\":\"残疾证\",\"s_1_设备类型_v呼叫器_窗口屏_评价器v\":\"窗口屏\"}", "deleted": 0,
"templateId": 50 "formContent": "{\"i_1_标题\":\"1231\",\"date_1_会议时间\":\"2022 年 09 月 14 日\",\"i_1_会议地点\":\"312313\",\"dt_1_汇报\":[{\"i_1_汇报人\":\"12313\",\"date_1_汇报时间\":\"\",\"t_1_汇报内容\":\"12313\",\"index\":0},{\"i_1_汇报人\":\"333\",\"date_1_汇报时间\":\"\",\"t_1_汇报内容\":\"3333\",\"index\":1}],\"i_1_记录人\":\"11123\",\"ck_1_政治面貌_<党员-非党员-党员先锋岗>\":[\"党员\"],\"r_1_证件类型_<身份证-军官证-残疾证>\":\"身份证\",\"s_1_设备类型_<呼叫器-窗口屏-评价器>\":\"窗口屏\",\"@image_1_照片\":\"/file/uploadfile/1663825533953.jpg\"}",
"templateId": 52
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment