Merge branch 'develop_migration' into 'develop_master'
Develop migration See merge request LiuChao/foton-slrs-system-rest!495
This commit is contained in:
@@ -0,0 +1,301 @@
|
||||
package com.adc.da.scheduledState.server;
|
||||
|
||||
import com.adc.da.mq.CreateStandMQService;
|
||||
import com.adc.da.person.service.IPersonCollectEOService;
|
||||
import com.adc.da.scheduledState.utils.Util;
|
||||
import com.adc.da.slrs.sarBussStandAttrInfo.dao.SarBussStandAttrInfoDao;
|
||||
import com.adc.da.slrs.sarBussStandAttrInfo.service.ISarBussStandAttrInfoService;
|
||||
import com.adc.da.slrs.sarBussionessStand.dao.SarBussionessStandDao;
|
||||
import com.adc.da.slrs.sarBussionessStand.entity.SarBussionessStand;
|
||||
import com.adc.da.slrs.sarBussionessStand.service.ISarBussionessStandService;
|
||||
import com.adc.da.slrs.sarStandItems.dao.SarStandItemsDao;
|
||||
import com.adc.da.slrs.sarStandardsInfo.entity.SarStandardsInfo;
|
||||
import com.adc.da.sys.dao.DicTypeEODao;
|
||||
import com.adc.da.utils.util.FieldConvertUtil;
|
||||
import com.adc.da.utils.util.InitStandAttrUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.json.JSONTokener;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.sql.Clob;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @Description: TODO
|
||||
* @author: super_liu
|
||||
* @date: 2022年01月25日 3:34
|
||||
*/
|
||||
@EnableScheduling
|
||||
@Component
|
||||
@Slf4j
|
||||
public class UpdateStateBussSync {
|
||||
Logger logger = LoggerFactory.getLogger(UpdateStateBussSync.class);
|
||||
|
||||
@Autowired
|
||||
private DicTypeEODao dicTypeEODao;
|
||||
|
||||
@Autowired
|
||||
private SarStandItemsDao standItemsDao;
|
||||
|
||||
@Autowired
|
||||
private CreateStandMQService createStandMQService;
|
||||
|
||||
@Autowired
|
||||
private IPersonCollectEOService personCollectEOService;
|
||||
|
||||
@Autowired
|
||||
private SarBussionessStandDao sarBussionessStandDao;
|
||||
|
||||
@Autowired
|
||||
private ISarBussionessStandService iSarBussionessStandService;
|
||||
|
||||
@Autowired
|
||||
private ISarBussStandAttrInfoService sarBussStandAttrInfoService;
|
||||
|
||||
@Autowired
|
||||
private SarBussStandAttrInfoDao sarBussStandAttrInfoEODao;
|
||||
|
||||
/**
|
||||
* 根据配置文件设置是否开启定时器
|
||||
*/
|
||||
|
||||
@Value("${isNotScheduled}")
|
||||
private boolean isNotScheduled; //是否开启定时器
|
||||
|
||||
|
||||
// 每天0点1分执行 企标标准文本状态 即将实施和现行有效状态自动变更逻辑
|
||||
// @Scheduled(cron="0 0 1 1 * ?")
|
||||
// @Scheduled(cron="*/60 * * * * ?")
|
||||
// @Scheduled(cron = "0 1 0 * * ?")
|
||||
@Async
|
||||
public void BussScheduled(){
|
||||
if(isNotScheduled){
|
||||
try{
|
||||
Thread.sleep(2000);
|
||||
logger.info("每天0点1分执行 企标标准文本状态 即将实施和现行有效状态自动变更逻辑:"+Thread.currentThread().getName() + " cron=0 1 0 * * ? --- " + new Date()+"---START-01");
|
||||
|
||||
// 发布、即将实施
|
||||
List<String> list = new ArrayList<>();
|
||||
// 发布
|
||||
list.add("6jnqba2mby");
|
||||
// 即将实施
|
||||
list.add("rpvoxsvr60");
|
||||
QueryWrapper wrapper = new QueryWrapper();
|
||||
wrapper.eq("A.VALID_FLAG","0");
|
||||
wrapper.in("A.TEXT_STATUS_BUSS",list);
|
||||
List<SarBussionessStand> getStateScheduledList = sarBussionessStandDao.getStateScheduledList(wrapper);
|
||||
if(!getStateScheduledList.isEmpty()){
|
||||
// N个实施日期中大于当前日期
|
||||
List<SarBussionessStand> getStateScheduledListToIsAfter = getStateScheduledList.stream().filter(info -> {
|
||||
if(StringUtils.isNotBlank(info.getPutTime())){
|
||||
List<String> dateList = Arrays.stream(info.getPutTime().split(",")).map(String::trim).collect(Collectors.toList());
|
||||
List<String> dateIsAfterList = dateList.stream().filter(s -> {
|
||||
if(Util.isValidDate(s)){
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
||||
LocalDateTime parse = LocalDate.parse(s, dateTimeFormatter).atStartOfDay();
|
||||
// 实施日期是否大于当前日期
|
||||
return parse.isAfter(now);
|
||||
}
|
||||
return false;
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
return !dateIsAfterList.isEmpty();
|
||||
}
|
||||
return false;
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
|
||||
// N个实施日期中小于当前时间
|
||||
List<SarBussionessStand> getStateScheduledListToIsBefore = getStateScheduledList.stream().filter(info -> {
|
||||
if(StringUtils.isNotBlank(info.getPutTime())){
|
||||
List<String> dateList = Arrays.stream(info.getPutTime().split(",")).map(String::trim).collect(Collectors.toList());
|
||||
List<String> dateIsBeforeList = dateList.stream().filter(s -> {
|
||||
if(Util.isValidDate(s)){
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
||||
LocalDateTime parse = LocalDate.parse(s, dateTimeFormatter).atStartOfDay();
|
||||
// 实施日期是否小于当前时间
|
||||
return parse.isBefore(now);
|
||||
}
|
||||
return false;
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
return !dateIsBeforeList.isEmpty();
|
||||
}
|
||||
return false;
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
// N个实施日期中大于当前日期 执行逻辑 更为即将实施
|
||||
if(!getStateScheduledListToIsAfter.isEmpty()){
|
||||
execStandDate(getStateScheduledListToIsAfter,"rpvoxsvr60");
|
||||
}
|
||||
|
||||
// N个实施日期中小于当前时间 执行逻辑 更为现行有效
|
||||
if(!getStateScheduledListToIsBefore.isEmpty()){
|
||||
execStandDate(getStateScheduledListToIsBefore,"9z741h2m3j");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
logger.info("每天0点1分执行 企标标准文本状态 即将实施和现行有效状态自动变更逻辑:"+Thread.currentThread().getName() + " cron=0 1 0 * * ? --- " + new Date()+"---End-01");
|
||||
}catch(Exception e){
|
||||
logger.info(e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 每天0点1分执行 企标标准文本状态被代替逻辑 自动变更作废状态
|
||||
// @Scheduled(cron="0 0 1 1 * ?")
|
||||
// @Scheduled(cron="*/60 * * * * ?")
|
||||
// @Scheduled(cron = "0 1 0 * * ?")
|
||||
@Async
|
||||
public void BussScheduledToAbolish(){
|
||||
if(isNotScheduled){
|
||||
try{
|
||||
Thread.sleep(2000);
|
||||
logger.info("每天0点1分执行 企标标准文本状态被代替逻辑 自动变更作废状态:"+Thread.currentThread().getName() + " cron=0 1 0 * * ? --- " + new Date()+"---START-01");
|
||||
|
||||
// 现行有效、即将实施
|
||||
List<String> list = new ArrayList<>();
|
||||
// 现行有效
|
||||
list.add("9z741h2m3j");
|
||||
// 即将实施
|
||||
list.add("rpvoxsvr60");
|
||||
QueryWrapper wrapper = new QueryWrapper();
|
||||
wrapper.eq("A.VALID_FLAG","0");
|
||||
wrapper.in("A.TEXT_STATUS_BUSS",list);
|
||||
List<SarBussionessStand> getStateScheduledList = sarBussionessStandDao.getStateScheduledList(wrapper);
|
||||
if(!getStateScheduledList.isEmpty()){
|
||||
|
||||
// 需要更新为作废状态的集合
|
||||
List<SarBussionessStand> invalidList = getStateScheduledList.stream().filter(info -> {
|
||||
if(StringUtils.isNotBlank(info.getBDTQBBHBUSS())){
|
||||
List<String> bdtList = Arrays.stream(info.getBDTQBBHBUSS().split(",")).map(String::trim).collect(Collectors.toList());
|
||||
// 现行有效、作废
|
||||
List<String> bdtStateList = new ArrayList<>();
|
||||
// 现行有效
|
||||
bdtStateList.add("9z741h2m3j");
|
||||
// 作废
|
||||
bdtStateList.add("3lqnlgmgcn");
|
||||
QueryWrapper wrapperBdt = new QueryWrapper();
|
||||
wrapperBdt.eq("VALID_FLAG","0");
|
||||
wrapperBdt.in("STAND_CODE",bdtList);
|
||||
wrapperBdt.in("TEXT_STATUS_BUSS",bdtStateList);
|
||||
List<SarBussionessStand> queryBDTBussList = sarBussionessStandDao.selectList(wrapperBdt);
|
||||
// 所有的被代替标准号中的有效标准中有一个标准标准状态是现行有效、作废
|
||||
return !queryBDTBussList.isEmpty();
|
||||
}
|
||||
return false;
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
|
||||
// 作废状态的集合 执行逻辑 更为作废
|
||||
if(!invalidList.isEmpty()){
|
||||
execStandDate(invalidList,"3lqnlgmgcn");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
logger.info("每天0点1分执行 企标标准文本状态被代替逻辑 自动变更作废状态:"+Thread.currentThread().getName() + " cron=0 1 0 * * ? --- " + new Date()+"---End-01");
|
||||
}catch(Exception e){
|
||||
logger.info(e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Async
|
||||
public void execStandDate(List<SarBussionessStand> infoList, String textStatusStand) throws Exception {
|
||||
List<SarBussionessStand> list = new ArrayList<>();
|
||||
for (SarBussionessStand info : infoList) {
|
||||
info.setTextStatusBuss(textStatusStand);
|
||||
bussAttrInfoShowSearchDetails(info);
|
||||
if (info.getAttrInfoMap() != null) {
|
||||
info.setSarStandAttrEOStr(JSONObject.toJSONString(info.getAttrInfoMap()));
|
||||
}
|
||||
createStandMQService.sendBussStandMQ(info,"update");
|
||||
|
||||
// 只批量更新文本字段
|
||||
SarBussionessStand newInfo = new SarBussionessStand();
|
||||
newInfo.setTextStatusBuss(textStatusStand);
|
||||
newInfo.setId(info.getId());
|
||||
newInfo.setModifyTime(new Date());
|
||||
list.add(newInfo);
|
||||
}
|
||||
|
||||
if(!list.isEmpty()){
|
||||
iSarBussionessStandService.updateBatchById(list);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取属性字段
|
||||
* @param row
|
||||
*/
|
||||
|
||||
public void bussAttrInfoShowSearchDetails(SarBussionessStand row) throws Exception {
|
||||
if (row != null) {
|
||||
bussAttrInfoSearchDetails(row);
|
||||
Map<String, Object> getAttrMap = row.getAttrInfoCaseMap();
|
||||
if (getAttrMap != null && getAttrMap.size() > 0) {
|
||||
for (Map.Entry<String, Object> entry : getAttrMap.entrySet()) {
|
||||
String name = entry.getKey().toUpperCase();
|
||||
String value = "";
|
||||
List<String> valArr = new ArrayList<>();
|
||||
if (entry.getValue() != null && InitStandAttrUtil.selectionFieldListBuss != null && InitStandAttrUtil.selectionFieldListBuss.size() > 0 && InitStandAttrUtil.selectionFieldListBuss.contains(name)) {
|
||||
if(org.apache.commons.lang.StringUtils.isNotBlank(entry.getValue().toString())){
|
||||
Object json= new JSONTokener(entry.getValue().toString()).nextValue();
|
||||
if(json instanceof org.json.JSONArray){
|
||||
valArr = com.alibaba.fastjson.JSONObject.parseArray(entry.getValue().toString(),String.class);
|
||||
}else {
|
||||
value = entry.getValue().toString();
|
||||
valArr = Arrays.asList(value.split(","));
|
||||
}
|
||||
if(!valArr.isEmpty()){
|
||||
value = dicTypeEODao.getDicNamesByCodes(valArr,"");
|
||||
}
|
||||
}
|
||||
entry.setValue(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void bussAttrInfoSearchDetails(SarBussionessStand row) throws Exception {
|
||||
String fieldInfo = InitStandAttrUtil.queryFieldBuss;
|
||||
String collectId = personCollectEOService.queryCollectByUserAndId(row.getId());
|
||||
row.setCollectId(collectId);
|
||||
// 查询属性表数据
|
||||
if (org.apache.commons.lang.StringUtils.isNotBlank(fieldInfo)) {
|
||||
Map<String, Object> getAttrMap = sarBussStandAttrInfoEODao.selectStandFieldAndData(fieldInfo, row.getId());
|
||||
if (InitStandAttrUtil.clobFieldList != null && !InitStandAttrUtil.clobFieldList.isEmpty()) {
|
||||
// 遍历修改所有clob类型的值
|
||||
for (String clobField : InitStandAttrUtil.clobFieldList) {
|
||||
Clob clobValue = (Clob) getAttrMap.get(clobField);
|
||||
String fieldValue = FieldConvertUtil.ClobToString(clobValue);
|
||||
getAttrMap.put(clobField, fieldValue);
|
||||
}
|
||||
}
|
||||
|
||||
row.setAttrInfoMap(getAttrMap);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,405 @@
|
||||
package com.adc.da.scheduledState.server;
|
||||
|
||||
import com.adc.da.mq.CreateStandMQService;
|
||||
import com.adc.da.person.service.IPersonCollectEOService;
|
||||
import com.adc.da.scheduledState.utils.Util;
|
||||
import com.adc.da.slrs.sarStandAttrInfo.dao.SarStandAttrInfoDao;
|
||||
import com.adc.da.slrs.sarStandAttrInfo.service.ISarStandAttrInfoService;
|
||||
import com.adc.da.slrs.sarStandItems.dao.SarStandItemsDao;
|
||||
import com.adc.da.slrs.sarStandItems.entity.FindSarItemsPageReqDTO;
|
||||
import com.adc.da.slrs.sarStandItems.entity.SarStandItems;
|
||||
import com.adc.da.slrs.sarStandardsInfo.dao.SarStandardsInfoDao;
|
||||
import com.adc.da.slrs.sarStandardsInfo.entity.SarStandardsInfo;
|
||||
import com.adc.da.slrs.sarStandardsInfo.service.ISarStandardsInfoService;
|
||||
import com.adc.da.sys.dao.DicTypeEODao;
|
||||
import com.adc.da.utils.util.FieldConvertUtil;
|
||||
import com.adc.da.utils.util.InitStandAttrUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.json.JSONTokener;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.sql.Clob;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @Description: TODO
|
||||
* @author: super_liu
|
||||
* @date: 2022年01月25日 3:34
|
||||
*/
|
||||
@EnableScheduling
|
||||
@Component
|
||||
@Slf4j
|
||||
public class UpdateStateStandSync {
|
||||
Logger logger = LoggerFactory.getLogger(UpdateStateStandSync.class);
|
||||
|
||||
@Autowired
|
||||
private DicTypeEODao dicTypeEODao;
|
||||
|
||||
@Autowired
|
||||
private SarStandItemsDao standItemsDao;
|
||||
|
||||
@Autowired
|
||||
private CreateStandMQService createStandMQService;
|
||||
|
||||
@Autowired
|
||||
private IPersonCollectEOService personCollectEOService;
|
||||
|
||||
@Autowired
|
||||
private SarStandAttrInfoDao sarStandAttrInfoEODao;
|
||||
|
||||
@Autowired
|
||||
private SarStandardsInfoDao sarStandardsInfoDao;
|
||||
|
||||
@Autowired
|
||||
private ISarStandardsInfoService iSarStandardsInfoService;
|
||||
|
||||
@Autowired
|
||||
private ISarStandAttrInfoService sarStandAttrInfoEOService;
|
||||
|
||||
/**
|
||||
* 根据配置文件设置是否开启定时器
|
||||
*/
|
||||
|
||||
@Value("${isNotScheduled}")
|
||||
private boolean isNotScheduled; //是否开启定时器
|
||||
|
||||
|
||||
// 每天0点1分执行 国内标准文本状态 即将实施和现行有效状态自动变更逻辑
|
||||
// @Scheduled(cron="0 0 1 1 * ?")
|
||||
// @Scheduled(cron="0 37 9 * * ?")
|
||||
// @Scheduled(cron = "0 1 0 * * ?")
|
||||
@Async
|
||||
public void StandScheduled(){
|
||||
if(isNotScheduled){
|
||||
try{
|
||||
Thread.sleep(2000);
|
||||
logger.info("每天0点1分执行 国内标准文本状态 即将实施和现行有效状态自动变更逻辑:"+Thread.currentThread().getName() + " cron=0 1 0 * * ? --- " + new Date()+"---START-01");
|
||||
|
||||
// 发布、即将实施 只查询国内标准
|
||||
List<String> list = new ArrayList<>();
|
||||
// 发布
|
||||
list.add("hc99551723c");
|
||||
// 即将实施
|
||||
list.add("hb0iy9z23c");
|
||||
QueryWrapper wrapper = new QueryWrapper();
|
||||
wrapper.eq("A.VALID_FLAG","0");
|
||||
wrapper.eq("STAND_TYPE","INLAND");
|
||||
wrapper.in("A.TEXT_STATUS",list);
|
||||
List<SarStandardsInfo> getStateScheduledList = sarStandardsInfoDao.getStateScheduledList(wrapper);
|
||||
if(!getStateScheduledList.isEmpty()){
|
||||
// N个实施日期中大于当前日期
|
||||
List<SarStandardsInfo> getStateScheduledListToIsAfter = getStateScheduledList.stream().filter(info -> {
|
||||
if(StringUtils.isNotBlank(info.getSSRQ())){
|
||||
List<String> dateList = Arrays.stream(info.getSSRQ().split(",")).map(String::trim).collect(Collectors.toList());
|
||||
List<String> dateIsAfterList = dateList.stream().filter(s -> {
|
||||
if(Util.isValidDate(s)){
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
||||
LocalDateTime parse = LocalDate.parse(s, dateTimeFormatter).atStartOfDay();
|
||||
// 实施日期是否大于当前日期
|
||||
return parse.isAfter(now);
|
||||
}
|
||||
return false;
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
return !dateIsAfterList.isEmpty();
|
||||
}
|
||||
return false;
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
|
||||
// N个实施日期中小于当前时间
|
||||
List<SarStandardsInfo> getStateScheduledListToIsBefore = getStateScheduledList.stream().filter(info -> {
|
||||
if(StringUtils.isNotBlank(info.getSSRQ())){
|
||||
List<String> dateList = Arrays.stream(info.getSSRQ().split(",")).map(String::trim).collect(Collectors.toList());
|
||||
List<String> dateIsBeforeList = dateList.stream().filter(s -> {
|
||||
if(Util.isValidDate(s)){
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
||||
LocalDateTime parse = LocalDate.parse(s, dateTimeFormatter).atStartOfDay();
|
||||
// 实施日期是否小于当前时间
|
||||
return parse.isBefore(now);
|
||||
}
|
||||
return false;
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
return !dateIsBeforeList.isEmpty();
|
||||
}
|
||||
return false;
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
// N个实施日期中大于当前日期 执行逻辑 更为即将实施
|
||||
if(!getStateScheduledListToIsAfter.isEmpty()){
|
||||
logger.info("=============N个实施日期中大于当前日期 执行============");
|
||||
// 文本状态更为即将实施
|
||||
execStandDate(getStateScheduledListToIsAfter,"hb0iy9z23c");
|
||||
}
|
||||
|
||||
// N个实施日期中小于当前时间 执行逻辑 更为现行有效
|
||||
if(!getStateScheduledListToIsBefore.isEmpty()){
|
||||
logger.info("=============N个实施日期中小于当前时间 执行============");
|
||||
// 文本状态更为现行有效
|
||||
execStandDate(getStateScheduledListToIsBefore,"vsaga7nwub");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
logger.info("每天0点1分执行 国内标准文本状态 即将实施和现行有效状态自动变更逻辑:"+Thread.currentThread().getName() + " cron=0 1 0 * * ? --- " + new Date()+"---End-01");
|
||||
}catch(Exception e){
|
||||
logger.info(e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 每天0点1分执行 国内标准文本状态被代替逻辑 标准自动变更废止
|
||||
// @Scheduled(cron="0 0 1 1 * ?")
|
||||
// @Scheduled(cron="*/60 * * * * ?")
|
||||
// @Scheduled(cron = "0 1 0 * * ?")
|
||||
@Async
|
||||
public void StandScheduledToAbolish(){
|
||||
if(isNotScheduled){
|
||||
try{
|
||||
Thread.sleep(2000);
|
||||
logger.info("每天0点1分执行 国内标准文本状态被代替逻辑 标准自动变更废止:"+Thread.currentThread().getName() + " cron=0 1 0 * * ? --- " + new Date()+"---START-01");
|
||||
|
||||
// 现行有效、即将实施、被代替 只查询国内标准
|
||||
List<String> list = new ArrayList<>();
|
||||
// 现行有效
|
||||
list.add("vsaga7nwub");
|
||||
// 即将实施
|
||||
list.add("hb0iy9z23c");
|
||||
// 被代替
|
||||
list.add("qke0ckro2p");
|
||||
QueryWrapper wrapper = new QueryWrapper();
|
||||
wrapper.eq("A.VALID_FLAG","0");
|
||||
wrapper.eq("STAND_TYPE","INLAND");
|
||||
wrapper.in("A.TEXT_STATUS",list);
|
||||
List<SarStandardsInfo> getStateStandScheduledList = sarStandardsInfoDao.getStateScheduledList(wrapper);
|
||||
|
||||
if(!getStateStandScheduledList.isEmpty()){
|
||||
|
||||
List<SarStandardsInfo> invalidStandToGBList = new ArrayList<>();
|
||||
List<SarStandardsInfo> bdtStandToGBList = new ArrayList<>();
|
||||
|
||||
// 当前标准的标准类别是否是GB类 GB集合逻辑
|
||||
getStateStandScheduledList.forEach(info -> {
|
||||
if(StringUtils.isNotBlank(info.getBDTBZH())){
|
||||
List<String> bdtList = Arrays.stream(info.getBDTBZH().split(",")).map(
|
||||
s -> s.replace(" ","").trim()).collect(Collectors.toList());
|
||||
// 查询等于GB的国内标准
|
||||
QueryWrapper wrapperGB = new QueryWrapper();
|
||||
wrapperGB.eq("SAR_STANDARDS_INFO.VALID_FLAG","0");
|
||||
wrapperGB.eq("SAR_STANDARDS_INFO.STAND_SORT","GB");
|
||||
wrapperGB.in("trim(replace(concat(SAR_STANDARDS_INFO.STAND_SORT,' ',SAR_STANDARDS_INFO.STAND_NUMBER,'-'," +
|
||||
"SAR_STANDARDS_INFO.STAND_YEAR),' ',''))",bdtList);
|
||||
List<SarStandardsInfo> queryGBList = sarStandardsInfoDao.selectList(wrapperGB);
|
||||
|
||||
if(!queryGBList.isEmpty()){
|
||||
int queryGbCount = queryGBList.size();
|
||||
|
||||
//被代替标准号中所有有效标准的状态都是现行有效状态
|
||||
List<SarStandardsInfo> yxList = queryGBList.stream().filter(info1 ->
|
||||
"vsaga7nwub".equals(info1.getTextStatus())).collect(Collectors.toList());
|
||||
|
||||
//被代替标准号中所有有效标准的状态都是被代替状态
|
||||
List<SarStandardsInfo> bdtStateList = queryGBList.stream().filter(info1 ->
|
||||
"qke0ckro2p".equals(info1.getTextStatus())).collect(Collectors.toList());
|
||||
|
||||
//被代替标准号中所有有效标准的状态都是废止状态
|
||||
List<SarStandardsInfo> fzList = queryGBList.stream().filter(info1 ->
|
||||
"chblaarg77".equals(info1.getTextStatus())).collect(Collectors.toList());
|
||||
|
||||
// 满足其上存入更新废止逻辑 如果只有一个被代替标准 优先更新废止状态
|
||||
if(yxList.size() == queryGbCount || bdtStateList.size() == queryGbCount || fzList.size() == queryGbCount){
|
||||
invalidStandToGBList.add(info);
|
||||
}else {
|
||||
// 被代替标准号中的有效标准的标准状态中有一个是发布、即将实施、现行有效、被代替状态的
|
||||
List<SarStandardsInfo> singleList = queryGBList.stream().filter(info1 -> {
|
||||
if("hc99551723c".equals(info1.getTextStatus()) || "hb0iy9z23c".equals(info1.getTextStatus())
|
||||
|| "vsaga7nwub".equals(info1.getTextStatus()) || "qke0ckro2p".equals(info1.getTextStatus())){
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
// 满足其上存入更新被代替逻辑
|
||||
if(!singleList.isEmpty()){
|
||||
bdtStandToGBList.add(info);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// 当前标准的标准类别是否是GB类 NOT GB集合逻辑
|
||||
List<SarStandardsInfo> bdtStandToNotGBList = getStateStandScheduledList.stream().filter(info -> {
|
||||
if(StringUtils.isNotBlank(info.getBDTBZH())){
|
||||
List<String> bdtList = Arrays.stream(info.getBDTBZH().split(",")).map(
|
||||
s -> s.replace(" ","").trim()).collect(Collectors.toList());
|
||||
|
||||
//发布、即将实施、现行有效、被代替
|
||||
List<String> bdtStateList = new ArrayList<>();
|
||||
// 发布
|
||||
bdtStateList.add("hc99551723c");
|
||||
// 作废
|
||||
bdtStateList.add("hb0iy9z23c");
|
||||
// 即将实施
|
||||
bdtStateList.add("vsaga7nwub");
|
||||
// 被代替
|
||||
bdtStateList.add("qke0ckro2p");
|
||||
|
||||
// 查询不等于GB的国内标准 且 有效的被代替标准
|
||||
QueryWrapper wrapperNotGB = new QueryWrapper();
|
||||
wrapperNotGB.eq("VALID_FLAG","0");
|
||||
wrapperNotGB.ne("STAND_SORT","GB");
|
||||
wrapperNotGB.in("TEXT_STATUS",wrapperNotGB);
|
||||
wrapperNotGB.in("trim(replace(concat(SAR_STANDARDS_INFO.STAND_SORT,' ',SAR_STANDARDS_INFO.STAND_NUMBER,'-'," +
|
||||
"SAR_STANDARDS_INFO.STAND_YEAR),' ',''))",bdtList);
|
||||
List<SarStandardsInfo> queryNotGBList = sarStandardsInfoDao.selectList(wrapperNotGB);
|
||||
|
||||
// 被代替标准号中的有效标准的标准状态中有一个是发布、即将实施、现行有效、被代替状态的
|
||||
// 满足其上过滤更新被代替数据
|
||||
return !queryNotGBList.isEmpty();
|
||||
}
|
||||
return false;
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
if(!invalidStandToGBList.isEmpty()){
|
||||
logger.info("=============被代替标准号中所有有效标准的状态都是现行有效、被代替、废止状态 执行============");
|
||||
// 文本状态更为废止状态
|
||||
execStandDate(invalidStandToGBList,"chblaarg77");
|
||||
}
|
||||
|
||||
if(!bdtStandToGBList.isEmpty()){
|
||||
logger.info("=============GB=======被代替标准号中的有效标准的标准状态中有一个是发布、即将实施、现行有效、被代替状态的 执行============");
|
||||
// 文本状态更为被代替
|
||||
execStandDate(bdtStandToGBList,"qke0ckro2p");
|
||||
}
|
||||
|
||||
if(!bdtStandToNotGBList.isEmpty()){
|
||||
logger.info("=============NOT GB ===被代替标准号中的有效标准的标准状态中有一个是发布、即将实施、现行有效、被代替状态的 执行============");
|
||||
// 文本状态更为被代替
|
||||
execStandDate(bdtStandToNotGBList,"qke0ckro2p");
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
logger.info("每天0点1分执行 国内标准文本状态被代替逻辑 标准自动变更废止:"+Thread.currentThread().getName() + " cron=0 1 0 * * ? --- " + new Date()+"---End-01");
|
||||
}catch(Exception e){
|
||||
logger.info(e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Async
|
||||
public void execStandDate(List<SarStandardsInfo> infoList, String textStatusStand) throws Exception {
|
||||
List<SarStandardsInfo> list = new ArrayList<>();
|
||||
for (SarStandardsInfo info : infoList) {
|
||||
info.setTextStatus(textStatusStand);
|
||||
standFunc(info);
|
||||
createStandMQService.sendStandMQ(info,"update");
|
||||
|
||||
// 只批量更新文本字段
|
||||
SarStandardsInfo newInfo = new SarStandardsInfo();
|
||||
newInfo.setTextStatus(textStatusStand);
|
||||
newInfo.setId(info.getId());
|
||||
newInfo.setModifyTime(new Date());
|
||||
list.add(newInfo);
|
||||
}
|
||||
|
||||
if(!list.isEmpty()){
|
||||
iSarStandardsInfoService.updateBatchById(list);
|
||||
}
|
||||
}
|
||||
|
||||
private void standFunc(SarStandardsInfo sarStandardsInfoEO) throws Exception {
|
||||
attrInfoSearchDetails(sarStandardsInfoEO);
|
||||
FindSarItemsPageReqDTO pageInfo = new FindSarItemsPageReqDTO();
|
||||
pageInfo.setStandId(sarStandardsInfoEO.getId());
|
||||
pageInfo.setFileType("FBGBJBD");
|
||||
|
||||
/**
|
||||
* SarItemVO换为sarItemVOS
|
||||
* List<SarItemVO> sarItemVOS = standItemsDao.querySarItemAndInterpretation(pageInfo);
|
||||
* .collect(Collectors.toMap(SarItemVO::getItemsNum, SarItemVO::getItemsName));
|
||||
*/
|
||||
|
||||
List<SarStandItems> sarItemVOS = standItemsDao.querySarItemAndInterpretation(pageInfo);
|
||||
if (!sarItemVOS.isEmpty()) {
|
||||
Map<String, String> collectMap = sarItemVOS.stream().filter((e) -> e.getItemsNum() != null && e.getItemsName() != null)
|
||||
.collect(Collectors.toMap(SarStandItems::getItemsNum, SarStandItems::getTermsConditions));
|
||||
sarStandardsInfoEO.setMapItems(collectMap);
|
||||
}
|
||||
if (sarStandardsInfoEO.getAttrInfoMap() != null) {
|
||||
sarStandardsInfoEO.setSarStandAttrEOStr(JSONObject.toJSONString(sarStandardsInfoEO.getAttrInfoMap()));
|
||||
}
|
||||
}
|
||||
|
||||
public void attrInfoSearchDetails(SarStandardsInfo row) throws Exception {
|
||||
if (row != null) {
|
||||
String fieldInfo = InitStandAttrUtil.queryField;
|
||||
String collectId = personCollectEOService.queryCollectByUserAndId(row.getId());
|
||||
row.setCollectId(collectId);
|
||||
// 查询属性表数据
|
||||
if (StringUtils.isNotBlank(fieldInfo)) {
|
||||
Map<String, Object> getAttrMap = sarStandAttrInfoEODao.selectStandFieldAndData(fieldInfo, row.getId());
|
||||
if (InitStandAttrUtil.clobFieldList != null && !InitStandAttrUtil.clobFieldList.isEmpty()) {
|
||||
// 遍历修改所有clob类型的值
|
||||
for (String clobField : InitStandAttrUtil.clobFieldList) {
|
||||
Clob clobValue = (Clob) getAttrMap.get(clobField);
|
||||
String fieldValue = FieldConvertUtil.ClobToString(clobValue);
|
||||
getAttrMap.put(clobField, fieldValue);
|
||||
}
|
||||
}
|
||||
|
||||
row.setAttrInfoMap(getAttrMap);
|
||||
}
|
||||
|
||||
Map<String, Object> getAttrMap = row.getAttrInfoMap();
|
||||
if (getAttrMap != null && getAttrMap.size() > 0) {
|
||||
for (Map.Entry<String, Object> entry : getAttrMap.entrySet()) {
|
||||
String name = entry.getKey();
|
||||
String value = "";
|
||||
List<String> valArr = new ArrayList<>();
|
||||
if (entry.getValue() != null && InitStandAttrUtil.selectionFieldList != null && InitStandAttrUtil.selectionFieldList.size() > 0 && InitStandAttrUtil.selectionFieldList.contains(name)) {
|
||||
if (StringUtils.isNotBlank(entry.getValue().toString())) {
|
||||
Object json = new JSONTokener(entry.getValue().toString()).nextValue();
|
||||
if (json instanceof org.json.JSONArray) {
|
||||
valArr = com.alibaba.fastjson.JSONObject.parseArray(entry.getValue().toString(), String.class);
|
||||
} else {
|
||||
value = entry.getValue().toString();
|
||||
valArr = Arrays.asList(value.split(","));
|
||||
}
|
||||
if (!valArr.isEmpty()) {
|
||||
value = dicTypeEODao.getDicNamesByCodes(valArr, "");
|
||||
}
|
||||
}
|
||||
entry.setValue(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package com.adc.da.scheduledState.utils;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @Description: TODO
|
||||
* @author: super_liu
|
||||
* @date: 2022年05月11日 15:36
|
||||
*/
|
||||
public class Util {
|
||||
/**
|
||||
* 判断字符串是否为合法的日期格式
|
||||
* @param dateStr 待判断的字符串
|
||||
* @return
|
||||
*/
|
||||
public static boolean isValidDate(String dateStr){
|
||||
//判断结果 默认为true
|
||||
boolean judgeresult=true;
|
||||
//1、首先使用SimpleDateFormat初步进行判断,过滤掉注入 yyyy-01-32 或yyyy-00-0x等格式
|
||||
//此处可根据实际需求进行调整,如需判断yyyy/MM/dd格式将参数改掉即可
|
||||
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
|
||||
try{
|
||||
//增加强判断条件,否则 诸如2022-02-29也可判断出去
|
||||
format.setLenient(false);
|
||||
Date date =format.parse(dateStr);
|
||||
}catch(Exception e){
|
||||
judgeresult=false;
|
||||
}
|
||||
//由于上述方法只能验证正常的日期格式,像诸如 0001-01-01、11-01-01,10001-01-01等无法校验,此处再添加校验年费是否合法
|
||||
String yearStr=dateStr.split("-")[0];
|
||||
if(yearStr.startsWith("0")||yearStr.length()!=4){
|
||||
judgeresult=false;
|
||||
}
|
||||
return judgeresult;
|
||||
}
|
||||
}
|
||||
@@ -46,7 +46,7 @@ public class restSearchSync {
|
||||
private boolean isNotScheduled; //是否开启定时器
|
||||
|
||||
|
||||
// 每天0点1分执行 重置ES 自动更新、新增、删除
|
||||
// 每天0点1分执行 重置ES 自动更新、新增
|
||||
// @Scheduled(cron="0 0 1 1 * ?")
|
||||
@Scheduled(cron = "0 1 0 * * ?")
|
||||
@Async
|
||||
@@ -54,14 +54,14 @@ public class restSearchSync {
|
||||
if(isNotScheduled){
|
||||
try{
|
||||
Thread.sleep(2000);
|
||||
logger.info("每天0点1分执行 重置ES 自动更新、新增、删除:"+Thread.currentThread().getName() + " cron=0 1 0 * * ? --- " + new Date()+"---START-01");
|
||||
logger.info("每天0点1分执行 重置ES 自动更新、新增:"+Thread.currentThread().getName() + " cron=0 1 0 * * ? --- " + new Date()+"---START-01");
|
||||
|
||||
SearchCenter searchCenter = new SearchCenter();
|
||||
// ALL 执行全部
|
||||
searchCenter.setExecType("ALL");
|
||||
resetSearchCenterService.syncResetALLSearchCenter(searchCenter);
|
||||
|
||||
logger.info("每天0点1分执行 重置ES 自动更新、新增、删除:"+Thread.currentThread().getName() + " cron=0 1 0 * * ? --- " + new Date()+"---End-01");
|
||||
logger.info("每天0点1分执行 重置ES 自动更新、新增:"+Thread.currentThread().getName() + " cron=0 1 0 * * ? --- " + new Date()+"---End-01");
|
||||
}catch(Exception e){
|
||||
logger.info(e.getMessage());
|
||||
}
|
||||
|
||||
+13
@@ -4,9 +4,12 @@ import com.adc.da.slrs.sarBussionessStand.entity.SarBussionessStand;
|
||||
import com.adc.da.slrs.sarBussionessStand.entity.SarBussionessStandExport;
|
||||
import com.adc.da.slrs.sarStandardsInfo.entity.RecommendVO;
|
||||
import com.adc.da.slrs.sarStandardsInfo.entity.SarBussionessStandEOPage;
|
||||
import com.adc.da.slrs.sarStandardsInfo.entity.SarStandardsInfo;
|
||||
import com.adc.da.sys.entity.UserEO;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.Date;
|
||||
@@ -23,6 +26,16 @@ import java.util.List;
|
||||
@Repository
|
||||
public interface SarBussionessStandDao extends BaseMapper<SarBussionessStand> {
|
||||
|
||||
String updateStateScheduledSql = "SELECT A.*,B.BDTQBBHBUSS FROM sar_bussioness_stand A LEFT JOIN sar_buss_stand_attr_info B ON B.STAND_ID = A.ID ${ew.customSqlSegment}";
|
||||
|
||||
/**
|
||||
* 自动更新文本状态通用查询
|
||||
* @param queryWrapper
|
||||
* @return
|
||||
*/
|
||||
@Select(updateStateScheduledSql)
|
||||
List<SarBussionessStand> getStateScheduledList(@Param("ew") QueryWrapper queryWrapper);
|
||||
|
||||
List<SarBussionessStand> queryByBussStateSync(SarBussionessStand sarBussionessStand);
|
||||
|
||||
SarBussionessStand getStandInfoByReviseStatus(String reviseStatus);
|
||||
|
||||
+12
@@ -4,8 +4,10 @@ import com.adc.da.slrs.sarStandardsInfo.entity.DSarStandardDTO;
|
||||
import com.adc.da.slrs.sarStandardsInfo.entity.RecommendVO;
|
||||
import com.adc.da.slrs.sarStandardsInfo.entity.SarStandardsInfo;
|
||||
import com.adc.da.slrs.sarStandardsInfo.entity.SarStandardsInfoEOPage;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
@@ -22,6 +24,16 @@ import java.util.List;
|
||||
@Repository
|
||||
public interface SarStandardsInfoDao extends BaseMapper<SarStandardsInfo> {
|
||||
|
||||
String updateStateScheduledSql = "SELECT A.*,B.SSRQ,B.BDTBZH FROM sar_standards_info A LEFT JOIN sar_stand_attr_info B ON B.STAND_ID = A.ID ${ew.customSqlSegment}";
|
||||
|
||||
/**
|
||||
* 自动更新文本状态通用查询
|
||||
* @param queryWrapper
|
||||
* @return
|
||||
*/
|
||||
@Select(updateStateScheduledSql)
|
||||
List<SarStandardsInfo> getStateScheduledList(@Param("ew") QueryWrapper queryWrapper);
|
||||
|
||||
List<SarStandardsInfo> getSarStandardsInfoPage(@Param("page") SarStandardsInfoEOPage page,@Param("mark")String mark);
|
||||
|
||||
List<SarStandardsInfo> getSarStandardsInfoByNum(@Param("page") SarStandardsInfoEOPage page,@Param("mark")String mark);
|
||||
|
||||
+2
@@ -224,6 +224,8 @@ public class SarStandardsInfo extends BaseEntity {
|
||||
private String ZCCSSRQ;
|
||||
@TableField(exist = false)
|
||||
private String XCXSSRQ;
|
||||
@TableField(exist = false)
|
||||
private String BDTBZH;
|
||||
|
||||
@TableField(exist = false)
|
||||
private String putTime2;
|
||||
|
||||
+7
-2
@@ -1,4 +1,9 @@
|
||||
4.13------------------
|
||||
INSERT INTO `foton_slrs_test2`.`sar_menu`(`ID`, `SOR_DIVIDE`, `MENU_NAME`, `PARENT_ID`, `PARENT_IDS`, `LEVEL`, `DISPLAY_SEQ`, `HREF`, `VALID_FLAG`, `CREATION_TIME`, `MODIFY_TIME`, `REMARKS`) VALUES ('asdzcfgk', NULL, '政策法规库', NULL, NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
5-7 新增文本状态-----
|
||||
INSERT INTO `foton_slrs`.`ts_dictype`(`ID`, `DIC_ID`, `DIC_TYPE_NAME`, `DIC_TYPE_CODE`, `DESCRIBES`, `SHOW_INDEX`, `PARENT_ID`, `TREE_PID`, `OTHERS`, `CREATION_USER`, `VALID_FLAG`, `CREATION_TIME`, `MODIFY_TIME`) VALUES ('gycree7258tly7fhrs1n', 'd1c9oygu5yvrtj8qt6w2', '发布', 'hc99551723c', '', 10, NULL, NULL, NULL, 'WY8J26MH23', '0', '2022-05-7 08:08:48', '2022-05-7 08:08:48');
|
||||
|
||||
5-7 -----新增文本状态
|
||||
INSERT INTO `foton_slrs`.`ts_dictype`(`ID`, `DIC_ID`, `DIC_TYPE_NAME`, `DIC_TYPE_CODE`, `DESCRIBES`, `SHOW_INDEX`, `PARENT_ID`, `TREE_PID`, `OTHERS`, `CREATION_USER`, `VALID_FLAG`, `CREATION_TIME`, `MODIFY_TIME`) VALUES ('gycree7258tly7fhrs1n', 'd1c9oygu5yvrtj8qt6w2', '发布', 'hc99551723c', '', 10, NULL, NULL, NULL, 'WY8J26MH23', '0', '2022-05-7 08:08:48', '2022-05-7 08:08:48');
|
||||
|
||||
5.12------------------- 新增企标文本状态 发布、即将实施
|
||||
INSERT INTO `foton_slrs`.`ts_dictype` (`ID`, `DIC_ID`, `DIC_TYPE_NAME`, `DIC_TYPE_CODE`, `DESCRIBES`, `SHOW_INDEX`, `PARENT_ID`, `TREE_PID`, `OTHERS`, `CREATION_USER`, `VALID_FLAG`, `CREATION_TIME`, `MODIFY_TIME`) VALUES ('yxje11vu7hngvakm6xor', 'qybmpmpvykzpwy511xai', '发布', '6jnqba2mby', '', '7', NULL, NULL, NULL, 'chenchunmei', '0', '2022-05-12 01:45:21', '2022-05-12 01:45:21');
|
||||
INSERT INTO `foton_slrs`.`ts_dictype` (`ID`, `DIC_ID`, `DIC_TYPE_NAME`, `DIC_TYPE_CODE`, `DESCRIBES`, `SHOW_INDEX`, `PARENT_ID`, `TREE_PID`, `OTHERS`, `CREATION_USER`, `VALID_FLAG`, `CREATION_TIME`, `MODIFY_TIME`) VALUES ('n4wyayhkmbhc58wi21rs', 'qybmpmpvykzpwy511xai', '即将实施', 'rpvoxsvr60', '', '8', NULL, NULL, NULL, 'chenchunmei', '0', '2022-05-12 01:45:56', '2022-05-12 01:45:56');
|
||||
|
||||
Reference in New Issue
Block a user