指令同步日志

This commit is contained in:
1378012178@qq.com 2025-07-31 16:23:59 +08:00
parent 212b627879
commit fe39e1d0c1
16 changed files with 185 additions and 23 deletions

View File

@ -31,6 +31,10 @@ public class OrgAllInfo implements Serializable {
* 协议+域名
*/
private String url;
/**
* 协议+域名
*/
private String contextPath;
/**
* 省份
*/

View File

@ -153,5 +153,6 @@ public class DirectiveAsyncMQDto implements Serializable {
//情绪标签json字符串有idlabel
private String emotionTagsObj;
//资源请求接口域名+项目上下文路径
private String api;
}

View File

@ -28,4 +28,6 @@ public class DirectiveMQDto {
private List<BodyTagMQDto> bodyTagList;
//情绪标签字典项
private List<EmotionTagMQDto> emotionTagList;
//是否同步指令资源
private boolean izSyncMedia;
}

View File

@ -3,6 +3,7 @@ package com.nu.modules.async.entity;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@ -57,4 +58,11 @@ public class AsyncStatus implements Serializable {
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "更新日期")
private java.util.Date updateTime;
/**目标机构编码*/
@Excel(name = "目标机构编码", width = 15)
@ApiModelProperty(value = "目标机构编码")
private java.lang.String targetOrgCode;
//目标机构名称
@TableField(exist = false)
private String zOrgName;
}

View File

@ -18,6 +18,8 @@
<result property="status" column="zstatus"/>
<result property="msg" column="zmsg"/>
<result property="updateTime" column="zupdataTime"/>
<result property="targetOrgCode" column="targetOrgCode"/>
<result property="zOrgName" column="zOrgName"/>
</collection>
</resultMap>
@ -26,7 +28,7 @@
f.id as id,
f.primary_key as primaryKey,
f.org_code as orgCode,
f.org_name as orgName,
md.depart_name as orgName,
f.type as type,
f.descr as descr,
f.create_by as createBy,
@ -36,9 +38,13 @@
z.name as zname,
z.status as zstatus,
z.msg as zmsg,
z.update_time as zupdataTime
z.update_time as zupdataTime,
z.target_org_code as targetOrgCode,
sd.depart_name as zOrgName
from nu_async_main f
left join sys_depart md on f.org_code = md.org_code
left join nu_async_status z on f.id = z.pkid
left join sys_depart sd on z.target_org_code = sd.org_code
<where>
<if test="records !=null and !records.isEmpty()">
f.id in

View File

@ -17,4 +17,6 @@ public interface IAsyncMainService extends IService<AsyncMain> {
List<AsyncMain> pageList(List<AsyncMain> records, AsyncMain dto);
Map<String,List<AsyncMain>> listByType(AsyncMain am);
void saveData(String dataSourceCode,AsyncMain asyncMain);
}

View File

@ -1,6 +1,8 @@
package com.nu.modules.async.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nu.modules.async.entity.AsyncMain;
import com.nu.modules.async.entity.AsyncStatus;
/**
* @Description: 数据同步子表-状态记录表
@ -9,5 +11,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
* @Version: V1.0
*/
public interface IAsyncStatusService extends IService<com.nu.modules.async.entity.AsyncStatus> {
void saveData(String dataSourceCode,AsyncStatus asyncStatus);
}

View File

@ -1,6 +1,7 @@
package com.nu.modules.async.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.collect.Maps;
import com.nu.enums.MQStatus;
@ -75,4 +76,10 @@ public class AsyncMainServiceImpl extends ServiceImpl<AsyncMainMapper, AsyncMain
result.put("processingList", processingList);
return result;
}
@Override
@DS("dataSourceCode")
public void saveData(String dataSourceCode,AsyncMain asyncMain) {
baseMapper.insert(asyncMain);
}
}

View File

@ -1,5 +1,7 @@
package com.nu.modules.async.service.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.nu.modules.async.entity.AsyncStatus;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -13,4 +15,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@Service
public class AsyncStatusServiceImpl extends ServiceImpl<com.nu.modules.async.mapper.AsyncStatusMapper, com.nu.modules.async.entity.AsyncStatus> implements com.nu.modules.async.service.IAsyncStatusService {
@Override
@DS("dataSourceCode")
public void saveData(String dataSourceCode,AsyncStatus asyncStatus) {
baseMapper.insert(asyncStatus);
}
}

View File

@ -1,5 +1,6 @@
package com.nu.modules.servicedirective.controller;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@ -7,7 +8,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.beust.jcommander.internal.Maps;
import com.nu.dto.DirectiveAsyncMQDto;
import com.nu.dto.DirectiveMQDto;
import com.nu.modules.directivetag.body.entity.DirectiveBodyTag;
import com.nu.modules.directivetag.body.service.IDirectiveBodyTagService;
import com.nu.modules.directivetag.emotion.entity.DirectiveEmotionTag;
import com.nu.modules.servicedirective.entity.ConfigServiceDirective;
import com.nu.modules.servicedirective.entity.DirectiveSyncDto;
import com.nu.modules.servicedirective.service.IConfigServiceDirectiveService;
@ -394,29 +398,63 @@ public class ConfigServiceDirectiveController extends JeecgController<ConfigServ
/**
* @param dataSourceCode 源数据机构编码
* @param syncIds 新增指令的id逗号拼接
* @param upIds 更新指令的id逗号拼接
* @param syncOrgCodes 同步给哪些机构
* @param syncOption 新增指令需要更新哪些内容 all(业务字段+指令资源 business业务字段 media指令资源
* @return
*/
@AutoLog(value = "服务指令-指令同步")
@ApiOperation(value = "服务指令-指令同步", notes = "服务指令-指令同步")
@PostMapping(value = "/syncDirective")
@DS("#dataSourceCode")
public Result<Map> syncDirective(@RequestParam(name = "dataSourceCode") String dataSourceCode,@RequestBody DirectiveSyncDto dto) {
public Result<Map> syncDirective(@RequestParam(name = "dataSourceCode") String dataSourceCode, @RequestBody DirectiveSyncDto dto) {
//处理接口地址
String fullPath = "";
if ("all".equals(dto.getSyncOption()) || "media".equals(dto.getSyncOption()) || StringUtils.isNotBlank(dto.getUpIds())) {
JSONObject deptInfo = configServiceDirectiveService.getDeptInfo("master",dataSourceCode);
String url = deptInfo.getString("url");
String contextPath = deptInfo.getString("contextPath");
String baseUrl = url.endsWith("/") ? url.substring(0, url.length() - 1) : url;
String normalizedContextPath = contextPath.startsWith("/") ? contextPath : "/" + contextPath;
normalizedContextPath = normalizedContextPath.endsWith("/")
? normalizedContextPath.substring(0, normalizedContextPath.length() - 1)
: normalizedContextPath;
//接口协议域名上下文路径
fullPath = baseUrl + normalizedContextPath;
}
//同步-新增服务指令
configServiceDirectiveService.syncDirective(dto.getSyncIds(), dto.getSyncOrgCodes(), dto.getSyncOption());
//给新增的指令同步指令资源
if ("all".equals(dto.getSyncOption()) || "media".equals(dto.getSyncOption())) {
configServiceDirectiveService.syncDirective(dto.getSyncIds(), dto.getSyncOrgCodes(), dto.getSyncOption(),fullPath,dataSourceCode);
}
//同步 - 更新指令资源字段
//给待更新的指令
if (StringUtils.isNotBlank(dto.getUpIds())) {
DirectiveMQDto upDirectiveMQDto = new DirectiveMQDto();
List<ConfigServiceDirective> directives;
{
List<ConfigServiceDirective> param = Lists.newArrayList();
Arrays.stream(dto.getUpIds().split(",")).forEach(id -> {
ConfigServiceDirective configServiceDirective = new ConfigServiceDirective();
configServiceDirective.setId(id);
param.add(configServiceDirective);
});
directives = configServiceDirectiveService.pageList(param);
upDirectiveMQDto.setDirectiveList(BeanUtil.copyToList(directives, DirectiveAsyncMQDto.class));
}
List<DirectiveAsyncMQDto> upDirectiveList = upDirectiveMQDto.getDirectiveList();
for (int i = 0; i < upDirectiveList.size(); i++) {
upDirectiveList.get(i).setApi(fullPath);
}
new Thread(() -> {
for (String code : dto.getSyncOrgCodes().split(",")) {
try {
rabbitMQUtil.sendToExchange("hldy.directive", code + ".directive.createmedia", upDirectiveMQDto);
// 发送完后休眠 5 分钟
// Thread.sleep(TimeUnit.MINUTES.toMillis(5));
// } catch (InterruptedException e) {
} catch (Exception e) {
Thread.currentThread().interrupt();
break;
}
}
}).start();
}
//发送消息
return Result.ok();
}

View File

@ -1,8 +1,9 @@
package com.nu.modules.servicedirective.service;
import cn.hutool.json.JSONObject;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nu.dto.DirectiveMQDto;
import com.nu.modules.servicedirective.entity.ConfigServiceDirective;
import java.util.List;
@ -62,5 +63,9 @@ public interface IConfigServiceDirectiveService extends IService<ConfigServiceDi
void auditPass(ConfigServiceDirective dto);
//同步服务指令
void syncDirective(String syncIds, String syncOrgCodes, String syncOption);
DirectiveMQDto syncDirective(String syncIds, String syncOrgCodes, String syncOption, String fullPath, String dataSourceCode);
JSONObject getDeptInfo(String dataSourceCode,String orgCode);
List<ConfigServiceDirective> pageList(List<ConfigServiceDirective> param);
}

View File

@ -1,12 +1,18 @@
package com.nu.modules.servicedirective.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nu.dto.*;
import com.nu.enums.MQStatus;
import com.nu.modules.async.entity.AsyncMain;
import com.nu.modules.async.entity.AsyncStatus;
import com.nu.modules.async.service.IAsyncMainService;
import com.nu.modules.async.service.IAsyncStatusService;
import com.nu.modules.directivetag.body.entity.DirectiveBodyTag;
import com.nu.modules.directivetag.body.service.IDirectiveBodyTagService;
import com.nu.modules.directivetag.emotion.entity.DirectiveEmotionTag;
@ -69,6 +75,10 @@ public class ConfigServiceDirectiveServiceImpl extends ServiceImpl<ConfigService
private IDirectiveEmotionTagService emotionTagService;
@Autowired
private RabbitMQUtil rabbitMQUtil;
@Autowired
private IAsyncMainService asyncMainService;
@Autowired
private IAsyncStatusService asyncStatusService;
@Override
public List<ConfigServiceDirective> pageList(ConfigServiceDirective configServiceDirective, IPage<ConfigServiceDirective> list_) {
@ -400,12 +410,17 @@ public class ConfigServiceDirectiveServiceImpl extends ServiceImpl<ConfigService
return null;
}
@Override
public List<ConfigServiceDirective> pageList(List<ConfigServiceDirective> param) {
return baseMapper.pageList(null, param);
}
/**
* @param syncIds 需要同步的指令ID
* @param syncOrgCodes 需要同步的目标平台orgCode
*/
@Override
public void syncDirective(String syncIds, String syncOrgCodes, String syncOption) {
public DirectiveMQDto syncDirective(String syncIds, String syncOrgCodes, String syncOption, String fullPath, String dataSourceCode) {
DirectiveMQDto directiveMQDto = new DirectiveMQDto();
List<ConfigServiceDirective> directives;
List<String> directiveIds = Arrays.asList(syncIds.split(","));
@ -419,13 +434,17 @@ public class ConfigServiceDirectiveServiceImpl extends ServiceImpl<ConfigService
directives = baseMapper.pageList(null, param);
if (directives != null && !directives.isEmpty()) {
directives.stream().forEach(record -> {
//只同步业务字段的话清空指令资源字段的值
//清空指令资源字段的值
if ("business".equals(syncOption)) {
record.setPreviewFile(null);
record.setImmediateFile(null);
record.setMp3File(null);
record.setMp4File(null);
record.setServiceContent(null);
record.setPreviewFileMd5(null);
record.setImmediateFileMd5(null);
record.setMp3FileMd5(null);
record.setMp4FileMd5(null);
}
List<DirectiveBodyTag> bodyTagList = record.getBodyTagList();
@ -436,6 +455,12 @@ public class ConfigServiceDirectiveServiceImpl extends ServiceImpl<ConfigService
});
}
directiveMQDto.setDirectiveList(BeanUtil.copyToList(directives, DirectiveAsyncMQDto.class));
if ("all".equals(syncOption) || "media".equals(syncOption)) {
directiveMQDto.setIzSyncMedia(true);
directiveMQDto.getDirectiveList().stream().forEach(d -> {
d.setApi(fullPath);
});
}
}
//分类标签
{
@ -477,7 +502,40 @@ public class ConfigServiceDirectiveServiceImpl extends ServiceImpl<ConfigService
}
//给对应业务平台发送消息
Arrays.stream(syncOrgCodes.split(",")).forEach(orgCode -> {
AsyncMain asyncMain = new AsyncMain();
asyncMain.setType("directive");
asyncMain.setOrgCode(dataSourceCode);
asyncMain.setDescr("服务指令同步");
asyncMainService.saveData("master",asyncMain);
directiveMQDto.setAsyncId(asyncMain.getId());
AsyncStatus asyncStatus_data = new AsyncStatus();
asyncStatus_data.setPkid(asyncMain.getId());
asyncStatus_data.setCode("data");
asyncStatus_data.setName("数据");
asyncStatus_data.setStatus(MQStatus.LOADING.getCode() + "");
asyncStatus_data.setMsg("同步中");
asyncStatus_data.setTargetOrgCode(orgCode);
asyncStatusService.saveData("master",asyncStatus_data);
if ("all".equals(syncOption) || "media".equals(syncOption)) {
AsyncStatus asyncStatus_file = new AsyncStatus();
asyncStatus_file.setPkid(asyncMain.getId());
asyncStatus_file.setCode("file");
asyncStatus_file.setName("文件");
asyncStatus_file.setStatus(MQStatus.LOADING.getCode() + "");
asyncStatus_file.setMsg("同步中");
asyncStatus_file.setTargetOrgCode(orgCode);
asyncStatusService.saveData("master",asyncStatus_file);
}
rabbitMQUtil.sendToExchange("hldy.directive", orgCode + ".directive.syncDirective", directiveMQDto);
});
return directiveMQDto;
}
@DS("dataSourceCode")
@Override
public JSONObject getDeptInfo(String dataSourceCode,String orgCode) {
return sysBaseAPI.getOrgInfo(orgCode);
}
}

View File

@ -60,6 +60,10 @@ public class SysDepartEntity implements Serializable {
* 协议+域名
*/
private String url;
/**
* 项目访问路径
*/
private String contextPath;
/**
* 省份
*/

View File

@ -80,6 +80,10 @@ public class SysDepart implements Serializable {
*/
@Excel(name = "协议+域名", width = 30)
private String url;
/**
* 项目访问路径
*/
private String contextPath;
/**
* 省份
*/
@ -246,6 +250,7 @@ public class SysDepart implements Serializable {
Objects.equals(orgType, depart.orgType) &&
Objects.equals(orgCode, depart.orgCode) &&
Objects.equals(url, depart.url) &&
Objects.equals(contextPath, depart.contextPath) &&
Objects.equals(province, depart.province) &&
Objects.equals(city, depart.city) &&
Objects.equals(district, depart.district) &&
@ -274,7 +279,7 @@ public class SysDepart implements Serializable {
public int hashCode() {
return Objects.hash(super.hashCode(), id, parentId, departName,
departNameEn, departNameAbbr, departOrder, description, orgCategory,
orgType, orgCode, url, province, city, district, operationStartTime,
orgType, orgCode, url,contextPath, province, city, district, operationStartTime,
operationEndTime, contractStartTime, contractEndTime, mobile, fax, address, memo, status,
delFlag, createBy, createTime, updateBy, updateTime, tenantId, payableAmount);
}

View File

@ -67,6 +67,8 @@ public class SysDepartTreeModel implements Serializable {
private String url;
private String contextPath;
private String province;
private String city;
@ -138,6 +140,7 @@ public class SysDepartTreeModel implements Serializable {
this.orgType = sysDepart.getOrgType();
this.orgCode = sysDepart.getOrgCode();
this.url = sysDepart.getUrl();
this.contextPath = sysDepart.getContextPath();
this.province = sysDepart.getProvince();
this.city = sysDepart.getCity();
this.district = sysDepart.getDistrict();
@ -486,6 +489,14 @@ public class SysDepartTreeModel implements Serializable {
this.url = url;
}
public String getContextPath() {
return contextPath;
}
public void setContextPath(String contextPath) {
this.contextPath = contextPath;
}
/**
* 重写equals方法
*/
@ -510,6 +521,7 @@ public class SysDepartTreeModel implements Serializable {
Objects.equals(orgType, model.orgType) &&
Objects.equals(orgCode, model.orgCode) &&
Objects.equals(url, model.url) &&
Objects.equals(contextPath, model.contextPath) &&
Objects.equals(province, model.province) &&
Objects.equals(city, model.city) &&
Objects.equals(district, model.district) &&
@ -540,7 +552,7 @@ public class SysDepartTreeModel implements Serializable {
public int hashCode() {
return Objects.hash(id, parentId, platType, departName, departNameEn, departNameAbbr,
departOrder, description, orgCategory, orgType, orgCode, url, province, city, district,
departOrder, description, orgCategory, orgType, orgCode, url, contextPath, province, city, district,
operationStartTime, operationEndTime, contractStartTime, contractEndTime,
mobile, fax, address, memo, status, delFlag, qywxIdentifier,
createBy, createTime, updateBy, updateTime, children, directorUserIds, payableAmount);

View File

@ -1917,6 +1917,7 @@ public class SysBaseApiImpl implements ISysBaseAPI {
map.put("code",list.get(0).getOrgCode());
map.put("name",list.get(0).getDepartName());
map.put("url",list.get(0).getUrl());
map.put("contextPath",list.get(0).getContextPath());
}
return new JSONObject(map);
}