订单管理相关

This commit is contained in:
潘荣晟
2025-10-22 17:29:29 +08:00
parent c5467b2c71
commit 4d85ea4ebd
38 changed files with 2667 additions and 61 deletions

View File

@@ -39,4 +39,19 @@ public class OnlyOfficeCallbackController {
response.put("error", 0);
return new ResponseEntity<>(response, HttpStatus.OK);
}
/**
* 处理OnlyOffice文档编辑服务发送的回调
*/
@PostMapping("/contract /callback/{id}")
@PermitAll
@TenantIgnore
public ResponseEntity<Map<String, Integer>> handleContractCallback(@RequestBody OnlyOfficeCallback callback, @PathVariable String id,@RequestParam("fileName") String fileName) {
// 处理回调逻辑
callbackService.processContractCallback(callback,id,fileName);
// 返回必须的响应否则OnlyOffice会显示错误
Map<String, Integer> response = new HashMap<>();
response.put("error", 0);
return new ResponseEntity<>(response, HttpStatus.OK);
}
}

View File

@@ -9,4 +9,11 @@ public interface OnlyOfficeCallbackService {
* @param callback 回调数据
*/
void processCallback(OnlyOfficeCallback callback,String id,String fileName);
/**
* 处理OnlyOffice回调
* @param callback 回调数据
*/
void processContractCallback(OnlyOfficeCallback callback,String id,String fileName);
}

View File

@@ -209,4 +209,159 @@ public class OnlyOfficeCallbackServiceImpl implements OnlyOfficeCallbackService
}
@Override
public void processContractCallback(OnlyOfficeCallback callback, String id, String fileName) {
log.info("收到OnlyOffice文档回调: {}", callback.getKey());
log.info("回调状态: {}", callback.getStatus());
// 根据不同的状态处理回调
switch (callback.getStatus()) {
case 1:
handleContractEditingStatus(callback, id,fileName);
break;
case 2:
handleContractDocumentSaved(callback, id,fileName);
break;
case 3:
handleContractSaveError(callback, id,fileName);
break;
case 4:
handleContractDocumentClosedWithoutChanges(callback, id,fileName);
break;
case 6:
handleContractForcedSave(callback, id,fileName);
break;
case 7:
handleContractForcedSaveError(callback, id,fileName);
break;
default:
log.warn("收到未知的回调状态: {}", callback.getStatus());
}
}
/**
* 处理文档正在编辑的状态
*/
private void handleContractEditingStatus(OnlyOfficeCallback callback, String id,String fileName) {
log.info("文档 {} 正在被以下用户编辑: {}",
callback.getKey(), callback.getUsers());
// 处理用户操作(连接或断开连接)
if (callback.getActions() != null) {
for (Action action : callback.getActions()) {
String actionType = switch (action.getType()) {
case 0 -> "断开了连接";
case 1 -> "连接成功";
case 2 -> "在中点击了强制保存";
default -> "在中执行了未知操作";
};
log.info("用户 {} {}", action.getUserId(), actionType);
}
}
}
/**
* 处理文档已保存的状态
*/
private void handleContractDocumentSaved(OnlyOfficeCallback callback, String id,String fileName) {
log.info("文档 {} 已准备好保存", callback.getKey());
saveContractDocument(callback, id,fileName);
// 处理历史记录
// handleHistoryChanges(callback,id);
}
/**
* 处理保存错误的状态
*/
private void handleContractSaveError(OnlyOfficeCallback callback, String id,String fileName) {
log.error("保存文档 {} 时出错", callback.getKey());
// 可以在这里添加错误处理逻辑,如发送通知等
}
/**
* 处理文档关闭且无更改的状态
*/
private void handleContractDocumentClosedWithoutChanges(OnlyOfficeCallback callback, String id,String fileName) {
log.info("文档 {} 已关闭,未做任何更改", callback.getKey());
// 可以在这里添加清理资源等逻辑
}
/**
* 处理强制保存的状态
*/
private void handleContractForcedSave(OnlyOfficeCallback callback, String id,String fileName) {
log.info("文档 {} 执行强制保存。类型: {}",
callback.getKey(), callback.getForceSaveType());
saveContractDocument(callback, id,fileName);
// 处理历史记录
handleHistoryChanges(callback, id);
// 如果是表单提交,处理表单数据
if (callback.getForceSaveType() == 3 && callback.getFormsDataUrl() != null) {
handleFormSubmission(callback, id);
}
}
/**
* 处理强制保存错误的状态
*/
private void handleContractForcedSaveError(OnlyOfficeCallback callback, String id,String fileName) {
log.error("文档 {} 强制保存时出错", callback.getKey());
// 可以在这里添加错误处理逻辑
}
/**
* 保存文档到存储
*/
private void saveContractDocument(OnlyOfficeCallback callback, String id,String fileName) {
if (callback.getUrl() == null) {
log.error("文件路径为空");
return;
}
try {
MultipartFile file = downloadFileAsMultipart(callback.getUrl());
// 1. 验证文件是否为空
String directory = "模版实例";
FileCreateReqDTO fileCreateReqDTO = new FileCreateReqDTO();
fileCreateReqDTO.setName(fileName);
fileCreateReqDTO.setContent(file.getBytes());
fileCreateReqDTO.setType(file.getContentType()); // 使用真实的MIME类型
fileCreateReqDTO.setDirectory(directory); // 设置文件存储目录
if (file.getSize() <=0){
log.error("文件大小为0");
return;
}
// 7. 调用文件服务创建文件
CommonResult<FileRespDTO> result = fileApi.createFileWithReturn(fileCreateReqDTO);
if (result.isSuccess()) {
// 创建文件成功,处理结果
result.getData().setContent(null);
log.info("文件创建成功文件ID{}", result.getData());
// 创建文件成功,处理结果
FileRespDTO fileRespDTO = result.getData();
Map<String, Object> fileInfo = new HashMap<>();
fileInfo.put("id",String.valueOf(fileRespDTO.getId()));
fileInfo.put("name", fileRespDTO.getName());
fileInfo.put("directory", fileRespDTO.getDirectory());
templateInstanceService.updateTemplateInstanceFileUrlByInstanceId(id, JSONObject.toJSONString(fileInfo));
} else {
// 创建文件失败,处理错误
log.error("文件创建失败,错误信息:{}", result.getMsg());
}
log.info("文件创建结果:{}", result);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

View File

@@ -68,4 +68,11 @@ public interface TmplInscBsnRelService {
* @param tmplInscBsnRelRespVO 类
*/
void getTmplInscBsnRelDetails(TmplInscBsnRelRespVO tmplInscBsnRelRespVO);
/**
* 跟新cntt
*
* @param bsnId ,params
*/
void updateCntt(Long bsnId,String params);
}

View File

@@ -145,6 +145,20 @@ public class TmplInscBsnRelServiceImpl implements TmplInscBsnRelService {
}
}
@Override
public void updateCntt(Long bsnId, String params) {
List<TmplInscBsnRelDO> tmplInscBsnRelDOS = tmplInscBsnRelMapper.selectList(new LambdaQueryWrapper<TmplInscBsnRelDO>()
.eq(TmplInscBsnRelDO::getBsnId, bsnId).orderByDesc(TmplInscBsnRelDO::getVer)
);
if (tmplInscBsnRelDOS.isEmpty()) {
throw exception(TEMPLATE_INSTANCE_FILE_NOT_EXISTS);
}
TmplInscBsnRelDO tmplInscBsnRelDO = tmplInscBsnRelDOS.get(0);
tmplInscBsnRelDO.setCntt( params);
tmplInscBsnRelMapper.updateById(tmplInscBsnRelDO);
log.info("更新业务实例cntt字段值成功");
}
//业务条款
private List<TmplInscItmBsnRespVO> setTmplInscItmBsnRespVOS(TmplInscBsnRelRespVO tmplInscBsnRelRespVO) {
List<TmplInscItmBsnRespVO> tmplInscItmBsnRespVOS = BeanUtils.toBean(SpringUtil.getBean(TmplInscItmBsnMapper.class).selectList(new LambdaQueryWrapper<TmplInscItmBsnDO>()
@@ -152,7 +166,7 @@ public class TmplInscBsnRelServiceImpl implements TmplInscBsnRelService {
), TmplInscItmBsnRespVO.class);
tmplInscItmBsnRespVOS.forEach(tmplInscItmBsnRespVO -> {
tmplInscBsnRelRespVO.getInstanceItemRespVOS().forEach(instanceItemRespVO -> {
if (tmplInscItmBsnRespVO.getInscItmId().equals(instanceItemRespVO.getId())){
if (tmplInscItmBsnRespVO.getInscItmId().equals(instanceItemRespVO.getId())) {
tmplInscItmBsnRespVO.setItmName(instanceItemRespVO.getItmName());
}
});
@@ -273,4 +287,6 @@ public class TmplInscBsnRelServiceImpl implements TmplInscBsnRelService {
log.info("删除业务实例条款值【{}】", ids);
}
}
}