Merge branch 'master' into dev_2nd_LCYH

# Conflicts:
#	jero-boot/jero-boot-modules/src/main/java/com/jero/modules/cert/collect/service/impl/ParamsCollectManifestEOServiceImpl.java
#	jero-boot/jero-boot-modules/src/main/java/com/jero/modules/document/service/impl/BussDocumentLibraryEOServiceImpl.java
#	jero-web/src/common/lang/en-us.js
#	jero-web/src/common/lang/zh-cn.js
#	jero-web/src/views/documentTools/virtualList/components/virtualListDetails.vue
#	jero-web/src/views/projectManagement/components/ParameterItemCollectionList.vue
#	jero-web/src/views/toDoCenter/projectRegulationTasks/components/SentList.vue
#	jero-web/src/views/toDoCenter/projectRegulationTasks/components/dealtWith.vue
#	jero-web/src/views/toDoCenter/projectRegulationTasks/components/doneList.vue
This commit is contained in:
高嵩
2023-03-24 16:56:38 +08:00
30 changed files with 2081 additions and 1600 deletions
@@ -673,4 +673,17 @@ public class ParamsCollectManifestEOController extends JeroController<ParamsColl
public Result<?> certifiedEngineerUpdateDreBatch(ParamsCollectManifestVO paramsCollectManifestVO) {
return this.paramsCollectManifestEOService.certifiedEngineerUpdateDreBatch(paramsCollectManifestVO);
}
/**
* 认证工程师-批量编辑截止时间
*
* @param paramsCollectManifestVO
* @return
*/
@AutoLog(value = "参数项收集清单-认证工程师-批量编辑截止时间")
@ApiOperation(value="参数项收集清单-认证工程师-批量编辑截止时间", notes="参数项收集清单-认证工程师-批量编辑截止时间")
@PostMapping(value = "/batchEditDeadline")
public Result<?> batchEditDeadline(@RequestBody ParamsCollectManifestVO paramsCollectManifestVO) {
return this.paramsCollectManifestEOService.batchEditDeadline(paramsCollectManifestVO);
}
}
@@ -197,4 +197,7 @@ public interface IParamsCollectManifestEOService extends IService<ParamsCollectM
// 创建高级查询条件
void createAdvanceedSearchCondition(List<QueryConditionVO> queryConditionVOList, StringBuilder sqlJoin);
// 认证工程师-批量编辑截止时间
Result<?> batchEditDeadline(ParamsCollectManifestVO paramsCollectManifestVO);
}
@@ -174,6 +174,8 @@ public class ParamsCollectManifestEOServiceImpl extends ServiceImpl<ParamsCollec
@Autowired
private IProjectUserDutyTerritoryService projectUserDutyTerritoryService;
@Autowired
private IParamsCollectManifestUserTypeLogEOService paramsCollectManifestUserTypeLogEOService;
/**
* 保存
@@ -6760,4 +6762,21 @@ public class ParamsCollectManifestEOServiceImpl extends ServiceImpl<ParamsCollec
sqlJoinSb.append(" ) ");
}
}
@Override
public Result<?> batchEditDeadline(ParamsCollectManifestVO paramsCollectManifestVO) {
if (StringUtils.isEmpty(paramsCollectManifestVO.getIds())) {
throw new JeroBootException("参数不能为空!");
}
String paramsCollectManifestIds = paramsCollectManifestVO.getIds();
List<String> paramsCollectManifestIdList = Arrays.asList(paramsCollectManifestIds.split(",")).stream().distinct().collect(Collectors.toList());
LambdaUpdateWrapper<ParamsCollectManifestEO> manifestUpdateWrap = new LambdaUpdateWrapper<>();
manifestUpdateWrap.set(ParamsCollectManifestEO::getDeadline,paramsCollectManifestVO.getDeadline());
manifestUpdateWrap.in(ParamsCollectManifestEO::getId,paramsCollectManifestIdList);
this.update(manifestUpdateWrap);
return Result.OK("批量编辑截止时间成功!");
}
}
@@ -83,6 +83,20 @@ public class BussDocumentLibraryEO implements Serializable {
@ApiModelProperty(value = "对应标准")
private java.lang.String correspondingStandard;
/**代替标准*/
@ApiModelProperty(value = "代替标准")
@Dict(dicCode ="replace_standard")
private java.lang.String replaceStandard;
/**被代替标准*/
@ApiModelProperty(value = "被代替标准")
@Dict(dicCode ="replaced_standard")
private java.lang.String replacedStandard;
@TableField(exist = false)
private java.lang.String cut;
@@ -269,31 +269,13 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
String serialNumber = (String) map.get("serial_number");
String titleEn = (String) map.get("title_en");
String title = (String) map.get("title");
String category = (String)map.get("lei4_bie2");
if(StringUtils.isNotBlank(category)){
String finalCategory = category;
List<SysDictItem> stateDictItemList = dictItemList.stream()
.filter(e -> "type".equals(e.getDictCode()) && finalCategory.equals(e.getItemValue()))
.collect(Collectors.toList());
if(stateDictItemList.size() != 0){
if(CutEnum.CN.getValue().equals(cut)){
category = stateDictItemList.get(0).getItemText();
}else{
category = stateDictItemList.get(0).getEnName();
}
}
}else {
category = "";
}
//文档动态-------------------
String hrefTemp =category + " " + "<a href='/docManage/library/detail?id=" + id +
String hrefTemp ="<a href='/docManage/library/detail?id=" + id +
"&title=" + title +
"&serial_number=" + serialNumber + "'" + " target='_blank'>" + serialNumber + "</a>" + " " + titleEn + ",";
sbTemp.append(hrefTemp);
serialNumberListTemp.add(category + " " + serialNumber + " " + titleEn);
serialNumberListTempCn.add(category + " " + serialNumber + " " + title);
serialNumberListTemp.add(serialNumber + " " + titleEn);
serialNumberListTempCn.add(serialNumber + " " + title);
//---------------------------
if (documentIds.size() != 0 && documentIds.contains((String) map.get("id"))) {
serialNumberList.add(serialNumber);
@@ -539,8 +521,7 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
fieldList = fieldList.stream()
.filter(e -> !"serial_number".equals(e.getDbFieldName())
&& !"title".equals(e.getDbFieldName())
&& !"title_en".equals(e.getDbFieldName())
&& !"state".equals(e.getDbFieldName()))
&& !"title_en".equals(e.getDbFieldName()))
.collect(Collectors.toList());
if (fieldList.size() != 0) {
@@ -1756,6 +1737,9 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
continue;
}
Object value = entry.getValue();
if(key.equals("replace_standard_id")){
continue;
}
//es全文新增数据(数据转换)
// esFullText(cut, fieldList, categoryList, dictItemList, mapList, sbCn,sbEn, entry);
@@ -1980,6 +1964,26 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
String insertField = mustFields + fieldsBuilder.toString();
String insertValue = mustValues + valuesBuilder.toString();
bussDocumentLibraryEOMapper.insertInfo(insertField, insertValue);
//处理代替标准和被代替标准逻辑
Object repObj = map.get("replace_standard_id");
if(null != repObj) {
String[] replace_standard_list = repObj.toString().split(",");
for (String rs : replace_standard_list) {
BussDocumentLibraryEO bl = bussDocumentLibraryEOMapper.selectById(rs);
if (null != bl) {
String repStr = bl.getReplacedStandard();
if (StringUtils.isNotBlank(repStr)) {
if (!repStr.contains(idTemp)) {
repStr = repStr + "," + idTemp;
}
} else {
repStr = idTemp;
}
bl.setReplacedStandard(repStr);
bussDocumentLibraryEOMapper.updateById(bl);
}
}
}
String replaceStandard = StringUtils.valueOf(map.get("replace_standard"));
if (StringUtils.isNotBlank(replaceStandard)) {
@@ -2203,22 +2207,8 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
List<String> userIdList = domainUserRelService.queryDomainUserRelInfo(mapTemp);
String title = StringUtils.valueOf(map.get("title"));
String serialNumber = StringUtils.valueOf(map.get("serial_number"));
String category = StringUtils.valueOf(map.get("lei4_bie2"));
String categoryCn = "";
String titleEn = StringUtils.valueOf(map.get("title_en"));
List<SysDictItem> dictItemList = sysDictItemServiceImpl.selectItemsAll();
if(StringUtils.isNotBlank(category)){
String finalCategory = category;
List<SysDictItem> stateDictItemList = dictItemList.stream()
.filter(e -> "type".equals(e.getDictCode()) && finalCategory.equals(e.getItemValue()))
.collect(Collectors.toList());
if(stateDictItemList.size() != 0){
category = stateDictItemList.get(0).getEnName();
categoryCn = stateDictItemList.get(0).getItemText();
}
}else{
category = "";
}
Set<String> technologyTerritorySet = new HashSet<>();
String technologyTerritoryId = "";
@@ -2256,19 +2246,19 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
String href = category + " " + "<a href='/docManage/library/detail?id=" + idTemp +
String href = "<a href='/docManage/library/detail?id=" + idTemp +
"&title=" + title +
"&serial_number=" + serialNumber + "'" + " target='_blank'>" + serialNumber + "</a>" + " "+ titleEn + " ";
String hrefCn = categoryCn + " " + "<a href='/docManage/library/detail?id=" + idTemp +
String hrefCn = "<a href='/docManage/library/detail?id=" + idTemp +
"&title=" + title +
"&serial_number=" + serialNumber + "'" + " target='_blank'>" + serialNumber + "</a>" + " "+ title;
//文档动态, 文档库中新增了标准XXXX homeDocumentDynamicEOService
//The standard GB 7258-2017 Technical specifications has been added to the document library.
String msgContentCn = "文档库中新增了"+categoryCn+" "+serialNumber+" "+title;
String msgContentCn = "文档库中新增了" + serialNumber + " "+title;
String msgContentInfoCn = "文档库中新增了"+hrefCn;
HomeDocumentDynamicEO homeDocumentDynamicEO = new HomeDocumentDynamicEO();
homeDocumentDynamicEO.setMsgContent("The " + category + " " + serialNumber + " " + titleEn + " has been added to the document library.");
homeDocumentDynamicEO.setMsgContentInfo("The " + href + " has been added to the document library.");
homeDocumentDynamicEO.setMsgContent(serialNumber + " " + titleEn + " has been added to the document library.");
homeDocumentDynamicEO.setMsgContentInfo(href + " has been added to the document library.");
homeDocumentDynamicEO.setMsgContentCn(msgContentCn);
homeDocumentDynamicEO.setMsgContentInfoCn(msgContentInfoCn);
homeDocumentDynamicEOService.save(homeDocumentDynamicEO);
@@ -2286,7 +2276,7 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
String hrefTemp = backUrl + "/docManage/library/detail?id=" + idTemp;
String content = "In the "+ technologyTerritoryName
+ " technical field you subscribed to, the "+category+" "+serialNumber+" has been updated.";
+ " technical field you subscribed to, the "+serialNumber+" has been updated.";
//In the XXXX technical field you subscribed to, the standard "GBXXX" has been updated.
String contentInfo = "In the "+ technologyTerritoryName
+ " technical field you subscribed to, the "
@@ -2294,26 +2284,26 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
String msgTitle = "The " + technologyTerritoryName + " technical field you subscribed to has been updated";
String hrefYes = category + " " + "<a href='/docManage/library/detail?id=" + idTemp +
String hrefYes = "<a href='/docManage/library/detail?id=" + idTemp +
"&title=" + title +
"&serial_number=" + serialNumber + "'" + " target='_blank'>" + serialNumber + "</a>";
//消息英文--不带标签
String contentNo = "In the "+ technologyTerritoryName
+ " technical field you subscribed to, the "+
category + " " + serialNumber +" has been updated.";;
serialNumber +" has been updated.";;
//消息英文--带标签
String contentYes = "In the "+ technologyTerritoryName
+ " technical field you subscribed to, the "+
category + " " + hrefYes +" has been updated.";;
hrefYes +" has been updated.";;
//消息中文--不带标签
String contentInfoNo = "您所订阅的" + technologyTerritoryName + "技术领域中更新了" + category + " " + serialNumber;;
String contentInfoNo = "您所订阅的" + technologyTerritoryName + "技术领域中更新了" + serialNumber;;
//消息中文--带标签
String contentInfoYes = "您所订阅的" + technologyTerritoryName + "技术领域中更新了" + category + " " + hrefYes;;
String contentInfoYes = "您所订阅的" + technologyTerritoryName + "技术领域中更新了" + hrefYes;;
//封装消息的实体类
@@ -2330,9 +2320,9 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
//飞书
try {
String contentInfoFeiShu = "In the "+ technologyTerritoryName
+ " technical field you subscribed to, the "+
category + " " + serialNumber +" has been updated.";
String contentInfoFeiShuCn = "您所订阅的" + technologyTerritoryName + "技术领域中更新了" + category + " " + serialNumber;
+ " technical field you subscribed to, "+
serialNumber +" has been updated.";
String contentInfoFeiShuCn = "您所订阅的" + technologyTerritoryName + "技术领域中更新了" + serialNumber;
FeishuMsgVo feishuMsgVo = new FeishuMsgVo();
feishuMsgVo.setTitle(MessageTypeEnum.READ.getNameCn()+"/"+MessageTypeEnum.READ.getName());
@@ -2359,7 +2349,6 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
List<BussDocumentLibraryEO> list = this.list();
List<String> serialNumberList = list.stream().map(BussDocumentLibraryEO::getSerialNumber).collect(Collectors.toList());
String serialNumber = StringUtils.valueOf(map.get("serial_number"));
String category = StringUtils.valueOf(map.get("lei4_bie2"));
String id = StringUtils.valueOf(map.get("id"));
String title = StringUtils.valueOf(map.get("title"));
String titleEn = StringUtils.valueOf(map.get("title_en"));
@@ -2378,7 +2367,7 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
//普通数据字典
List<SysDictItem> dictItemList = sysDictItemServiceImpl.selectItemsAll();
//编辑时处理首页文档动态 1. 标准XXXX的状态改为 2. 标准XXXX的适用车型改为 3. 标准XXXX删除了XXXX文件 4. 标准XXXX上传了XXXX文件
homeDocumentDynamic(cut,map, serialNumber, id, title, dataList, fieldList,dictItemList,category,titleEn);
homeDocumentDynamic(cut,map, serialNumber, id, title, dataList, fieldList,dictItemList,titleEn);
try {
@@ -2694,8 +2683,28 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
//删除文档库数据
bussDocumentLibraryEOMapper.deleteById((String) map.get("id"));
bussDocumentLibraryEOMapper.insertInfo(insertField, insertValue);
//处理代替标准和被代替标准逻辑
String docId = (String) map.get("id");
Object repObj = map.get("replace_standard_id");
if(null != repObj){
String[] replace_standard_list = repObj.toString().split(",");
for (String rs : replace_standard_list) {
BussDocumentLibraryEO bl = bussDocumentLibraryEOMapper.selectById(rs);
if (null != bl) {
String repStr = bl.getReplacedStandard();
if (StringUtils.isNotBlank(repStr)) {
if (!repStr.contains(docId)) {
repStr = repStr + "," + docId;
}
} else {
repStr = docId;
}
bl.setReplacedStandard(repStr);
bussDocumentLibraryEOMapper.updateById(bl);
}
}
}
//开始更新ES
map.put("module_type", "文档库");
map.put("module_type_flag", ModuleTypeFlagEnum.DOCUMENT_LIBRARY.getValue());
map.put("create_time", new Date());
@@ -2757,21 +2766,7 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
List<Map<String, Object>> dataList,
List<OnlCgformField> fieldList,
List<SysDictItem> dictItemList,
String category,
String titleEn) {
String categoryCn = "";
if(StringUtils.isNotBlank(category)){
String finalCategory = category;
List<SysDictItem> stateDictItemList = dictItemList.stream()
.filter(e -> "type".equals(e.getDictCode()) && finalCategory.equals(e.getItemValue()))
.collect(Collectors.toList());
if(stateDictItemList.size() != 0){
category = stateDictItemList.get(0).getEnName();
categoryCn = stateDictItemList.get(0).getItemText();
}
}else{
category = "";
}
//文件类型字段
List<OnlCgformField> onlCgformFieldList = fieldList.stream()
.filter(e -> FieldTypeEnum.FILE.getValue().equals(e.getFieldShowType())).collect(Collectors.toList());
@@ -2825,13 +2820,13 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
String contentInfoFileCn = "";
if(StringUtils.isNotBlank(sbField)){
// String substring = sbField.substring(0, sbField.length() - 1);
contentFile = category + " " + serialNumber + " " + titleEn + " uploaded " + sbField;
contentFileCn = categoryCn + " " + serialNumber + " " + title + " 中上传了 " + sbFieldCn;
contentFile = serialNumber + " " + titleEn + " uploaded " + sbField;
contentFileCn = serialNumber + " " + title + " 中上传了 " + sbFieldCn;
}
if(StringUtils.isNotBlank(sbNew)){
// String substring = sbNew.substring(0, sbNew.length() - 1);
contentInfoFile = category + " " + href + " uploaded " + sbNew;
contentInfoFileCn = categoryCn + " " + hrefCn + " 中上传了" + sbNewCn;
contentInfoFile = href + " uploaded " + sbNew;
contentInfoFileCn = hrefCn + " 中上传了" + sbNewCn;
}
// if(StringUtils.isNotBlank(sbField)){
//// contentInfoFile = category + " " + href + " uploaded " + sbNew;
@@ -2850,15 +2845,15 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
StringBuilder msgContentSbCn = new StringBuilder();
StringBuilder msgContentInfoSbCn = new StringBuilder();
//适用车型
StringBuilder msgContentSbCarType = new StringBuilder("Vehicle Type of the " + category + " " + serialNumber + " " + titleEn);
StringBuilder msgContentInfoSbCarType = new StringBuilder("Vehicle Type of the " + category + " " + href);
StringBuilder msgContentSbCarTypeCn = new StringBuilder(categoryCn + " " + serialNumber + " " + title+" 的适用车型改为");
StringBuilder msgContentInfoSbCarTypeCn = new StringBuilder(categoryCn + " " + hrefCn+" 的适用车型改为");
StringBuilder msgContentSbCarType = new StringBuilder("Vehicle Type of the " + serialNumber + " " + titleEn);
StringBuilder msgContentInfoSbCarType = new StringBuilder("Vehicle Type of the " + href);
StringBuilder msgContentSbCarTypeCn = new StringBuilder(serialNumber + " " + title+" 的适用车型改为");
StringBuilder msgContentInfoSbCarTypeCn = new StringBuilder(hrefCn+" 的适用车型改为");
//状态
StringBuilder msgContentSbStatus = new StringBuilder("The Status of the " + category + " " + serialNumber + " " + titleEn);
StringBuilder msgContentInfoSbStatus = new StringBuilder("The Status of the " + category + " " + href);
StringBuilder msgContentSbStatusCn = new StringBuilder(categoryCn + " " + serialNumber + " " + title+" 的状态改为");
StringBuilder msgContentInfoSbStatusCn = new StringBuilder(categoryCn + " " + hrefCn+" 的状态改为");
StringBuilder msgContentSbStatus = new StringBuilder("The Status of the " + serialNumber + " " + titleEn);
StringBuilder msgContentInfoSbStatus = new StringBuilder("The Status of the " + href);
StringBuilder msgContentSbStatusCn = new StringBuilder(serialNumber + " " + title+" 的状态改为");
StringBuilder msgContentInfoSbStatusCn = new StringBuilder(hrefCn+" 的状态改为");
List<String> fileIdLIstTemp = new ArrayList<>();
@@ -3533,22 +3528,7 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
}
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
String serialNumber = (String) dataList.get(0).get("serial_number");
String category = (String)map.get("lei4_bie2");
String categoryCn = (String)map.get("lei4_bie2");
String technologyTerritory = (String) map.get("technology_territory");
if(StringUtils.isNotBlank(category)){
List<SysDictItem> dictItemList = sysDictItemServiceImpl.selectItemsAll();
String finalCategory = category;
List<SysDictItem> stateDictItemList = dictItemList.stream()
.filter(e -> "type".equals(e.getDictCode()) && finalCategory.equals(e.getItemValue()))
.collect(Collectors.toList());
if(stateDictItemList.size() != 0){
category = stateDictItemList.get(0).getEnName();
categoryCn = stateDictItemList.get(0).getItemText();
}
}else{
category = "";
}
//只要修改了标准,就需要向订阅用户发送消息(内容为-->XXX对“GB 7258 进行了修改请及时查看”)
//向订阅领域管理中订阅了该技术领域的人和文档库中订阅了该条文档的人发送消息
// 只有技术领域变更为订阅的技术领域这一种情况发消息, 假如订阅了技术领域A,编辑的文档的技术领域也是A,这时编辑的是其他的字段,这种情况不发消息
@@ -3614,9 +3594,9 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
//订阅管理
if(thirdIdList.size() != 0){
String contentInfoFei = "In the " + technologyTerritoryNameEn + " technical field you subscribed to, the " +
category + " " + serialNumber+" has been updated.";
String contentInfoFeiCn = "您所订阅的" + technologyTerritoryNameEn + "技术领域中更新了" + categoryCn + " " + serialNumber;
String contentInfoFei = "In the " + technologyTerritoryNameEn + " technical field you subscribed to, " +
serialNumber+" has been updated.";
String contentInfoFeiCn = "您所订阅的" + technologyTerritoryNameEn + "技术领域中更新了" + serialNumber;
try {
//跳转文档详情
String url = backUrl + "/docManage/library/detail?id=" + id;
@@ -3645,18 +3625,18 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
String contentInfo = "In the " + technologyTerritoryNameEn + " technical field you subscribed to," +sysUser.getUsername()+" changed the "+ href + " " + sbStr.toString();
String msgTitle = "The " + technologyTerritoryNameEn + " technical field you subscribed to has been updated";
//消息英文--不带标签
String contentNo = "In the " + technologyTerritoryNameEn + " technical field you subscribed to, the " +
category + " " + serialNumber+" has been updated.";;
String contentNo = "In the " + technologyTerritoryNameEn + " technical field you subscribed to, " +
serialNumber+" has been updated.";;
//消息英文--带标签
String contentYes = "In the " + technologyTerritoryNameEn + " technical field you subscribed to, the " +
category + " " + href+" has been updated.";;
String contentYes = "In the " + technologyTerritoryNameEn + " technical field you subscribed to, " +
href+" has been updated.";;
//消息中文--不带标签
String contentInfoNo = "您所订阅的" + technologyTerritoryNameEn + "技术领域中更新了" + categoryCn + " " + serialNumber;;
String contentInfoNo = "您所订阅的" + technologyTerritoryNameEn + "技术领域中更新了" + serialNumber;;
//消息中文--带标签
String contentInfoYes = "您所订阅的" + technologyTerritoryNameEn + "技术领域中更新了" + categoryCn + " " + href;;
String contentInfoYes = "您所订阅的" + technologyTerritoryNameEn + "技术领域中更新了" + href;;
// 封装消息的实体类
@@ -3685,21 +3665,21 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
//去掉a标签
sbStr = sbStr.replaceAll("<text class='highlight-class'>", "").replaceAll("</text>", "");
//您订阅的XXX已被修改
content = "In the "+category + " " + serialNumber+" you subscribed to, has been modified,Please pay attention to check.";
content = "In the "+ serialNumber+" you subscribed to, has been modified,Please pay attention to check.";
//内容详情--英文(不带标签)
String contentInfoNo = "In the "+category + " " + serialNumber+" you subscribed to, "+ sbStr.toString();
String contentInfoNo = "In the "+ serialNumber+" you subscribed to, "+ sbStr.toString();
//内容详情--英文(带标签)
String contentInfoYes = "In the "+category + " " + href+" you subscribed to, "+ sbStr.toString();
String contentInfoYes = "In the "+ href+" you subscribed to, "+ sbStr.toString();
String msgTitle = serialNumber + " you subscribed to has been updated";
//内容详情-中文(不带标签)
String sbStrCnTemp = sbStrCn.replaceAll("<text class='highlight-class'>", "").replaceAll("</text>", "");
String contentCnNo = "您所订阅的"+categoryCn+serialNumber+","+sbStrCnTemp;
String contentCnNo = "您所订阅的"+serialNumber+","+sbStrCnTemp;
//内容详情--中文(带标签)
String contentInfoCnReplace = sbStrCn.replaceAll("<text class='highlight-class'>","").replaceAll("</text>","");
String contentInfoCnYes ="您所订阅的"+categoryCn+href+","+contentInfoCnReplace;;
String contentInfoCnYes ="您所订阅的"+href+","+contentInfoCnReplace;;
//封装消息的实体类
SysAnnouncement sysAnnouncement = getSysAnnouncement(userIdListUpdate,
msgTitle,
@@ -3715,9 +3695,9 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
//订阅文档的飞书消息
try {
//英文消息
String contentInfoFei = "In the "+category + " " + serialNumber +" you subscribed to, "+ sbStr.toString();;
String contentInfoFei = "In the " + " " + serialNumber +" you subscribed to, "+ sbStr.toString();;
//中文消息
String contentInfoFeiCn ="您所订阅的"+categoryCn+ serialNumber +","+ sbStrCn.toString();;
String contentInfoFeiCn ="您所订阅的"+serialNumber +","+ sbStrCn.toString();;
//跳转文档详情
String url = backUrl + "/docManage/library/detail?id=" + id;
FeishuMsgVo feishuMsgVo = new FeishuMsgVo();
@@ -2431,7 +2431,8 @@ public class DummyInventoryInfoEOServiceImpl extends ServiceImpl<DummyInventoryI
excelName = baseList.get(0).getName() + " Virtual list.xlsx";
}
//excel
OutputStream excelOS = new FileOutputStream(path + File.separator + excelName);
String excelNameRep = excelName.replace('/', '、');
OutputStream excelOS = new FileOutputStream(path + File.separator + excelNameRep);
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
if(CutEnum.CN.getValue().equals(dummyInventoryInfoEO.getCut())){
@@ -156,12 +156,27 @@ public class ProjectLibraryBase implements Comparable<ProjectLibraryBase> {
@Override
public int compareTo(ProjectLibraryBase o) {
return Integer.valueOf(this.projectVersion)-Integer.valueOf(o.projectVersion);//升序
// return o.id-this.id;//降序
if (!this.getProjectName().equals(o.getProjectName())) {
return this.getProjectName().compareTo(o.getProjectName());//升序
}
if (!this.getYearName().equals(o.getYearName())) {
if (this.getYearName().length() != o.getYearName().length()) {
return this.getYearName().length() - o.getYearName().length();
} else {
return this.getYearName().compareTo(o.getYearName());//升序
}
}
if (!this.getTargetMarket().equals(o.getTargetMarket())) {
return this.getTargetMarket().compareTo(o.getTargetMarket());//升序
}
if (!this.getProjectVersion().equals(o.getProjectVersion())) {
return Integer.valueOf(this.projectVersion) - Integer.valueOf(o.projectVersion);//升序
}
return 0;
}
public String getShowName(){
return projectName+yearName+targetMarket+projectVersion;
public String getShowName() {
return projectName + " " + yearName + "-" + targetMarket + "-" + projectVersion;
}
@Override
@@ -10340,7 +10340,7 @@ public class ProjectLawsInventoryEOServiceImpl extends ServiceImpl<ProjectLawsIn
String dueDate = null;
QueryWrapper<ProjectTaskInventoryEO> queryProjectTaskInventoryWrapper = new QueryWrapper<>();
queryProjectTaskInventoryWrapper.isNotNull("design_p_id");
queryProjectTaskInventoryWrapper.isNotNull("design_p_id").or().isNotNull("verify_p_id");
queryProjectTaskInventoryWrapper.lambda().eq(ProjectTaskInventoryEO::getProjectLawsInventoryId, projectLawsInventoryId);
List<ProjectTaskInventoryEO> list = projectTaskInventoryEOService.list(queryProjectTaskInventoryWrapper);
@@ -10359,8 +10359,8 @@ public class ProjectLawsInventoryEOServiceImpl extends ServiceImpl<ProjectLawsIn
}
} else if (FlowTypeEnum.PREHOMOQRLC.getValue().equals(projectTaskUrgVo.getType())) {
dueDate = sdf.format(lawsInventoryEO.getPrehomoDueDate());
if (DesignComplianceStatusEnum.TO_REVIEW.getValue().equals(list.get(0).getDesignStatus())
||DesignComplianceStatusEnum.REVIEW_COMPLETED.getValue().equals(list.get(0).getDesignStatus())) {
if (DesignComplianceStatusEnum.TO_REVIEW.getValue().equals(list.get(0).getPrehomoStatus())
||DesignComplianceStatusEnum.REVIEW_COMPLETED.getValue().equals(list.get(0).getPrehomoStatus())) {
if (CutEnum.CN.getValue().equals(projectTaskUrgVo.getCut())) {
throw new JeroBootException(LAW_CN + "已经被确认,无法催办");
} else {
@@ -10372,8 +10372,8 @@ public class ProjectLawsInventoryEOServiceImpl extends ServiceImpl<ProjectLawsIn
}
} else if (FlowTypeEnum.YZFHXSCLC.getValue().equals(projectTaskUrgVo.getType())) {
dueDate = sdf.format(lawsInventoryEO.getVerifyDueDate());
if (DesignComplianceStatusEnum.TO_REVIEW.getValue().equals(list.get(0).getDesignStatus())
||DesignComplianceStatusEnum.REVIEW_COMPLETED.getValue().equals(list.get(0).getDesignStatus())) {
if (DesignComplianceStatusEnum.TO_REVIEW.getValue().equals(list.get(0).getVerifyStatus())
||DesignComplianceStatusEnum.REVIEW_COMPLETED.getValue().equals(list.get(0).getVerifyStatus())) {
if (CutEnum.CN.getValue().equals(projectTaskUrgVo.getCut())) {
throw new JeroBootException(LAW_CN + "已经被确认,无法催办");
} else {
@@ -216,6 +216,8 @@ public class ProjectLibraryBaseServiceImpl extends ServiceImpl<ProjectLibraryBas
}
/**
* 项目扩展(添加子项目--子项目基本信息、相关人员名单、法规/认证任务计划与被扩展项目保持一致)
* @param projectLibraryBase
@@ -234,8 +236,10 @@ public class ProjectLibraryBaseServiceImpl extends ServiceImpl<ProjectLibraryBas
projectLibraryBaseTemp.setExplanation(projectLibraryBase.getExplanation());
this.save(projectLibraryBaseTemp);
Date now = new Date();
//处理版本号排序问题,如果版本号插入到中间,后面版本数字顺眼
checkVersionOrder(id,projectLibraryBase.getProjectVersion(),projectId);
Date now = new Date();
//相关人员名单中添加数据
List<ProjectRelatedPersonnel> projectRelatedPersonnelList = projectRelatedPersonnelMapper.queryPageList(id,
DictCodeEnum.DUTY_TERRITORY.getValue(),
@@ -334,6 +338,33 @@ public class ProjectLibraryBaseServiceImpl extends ServiceImpl<ProjectLibraryBas
}
}
/**
* 如果创建的子项目版本号重复,处理排序
* @param id
* @param version
* @param projectId
*/
private void checkVersionOrder(String id,String version,String projectId) {
LambdaQueryWrapper<ProjectLibraryBase> wrapperVer = new LambdaQueryWrapper<>();
//查找其他统计子版本项目
wrapperVer.eq(ProjectLibraryBase::getParentId, id);
wrapperVer.orderByAsc(ProjectLibraryBase::getProjectVersion);
List<ProjectLibraryBase> clist = this.list(wrapperVer);
int tmpInt = Integer.parseInt(version);
for (ProjectLibraryBase plb : clist) {
int ver = Integer.parseInt(plb.getProjectVersion());
if(!plb.getId().equals(projectId) && ver == tmpInt){
tmpInt++;
String verStr = String.valueOf(tmpInt);
if(verStr.length() <= 1){
verStr= "0" + verStr;
}
plb.setProjectVersion(verStr);
this.updateById(plb);
}
}
}
/**检查车型名称id,年款号,目标市场,版本同时存在,报错*/
public void checkExitData(ProjectLibraryBase projectLibraryBase){
@@ -412,6 +443,7 @@ public class ProjectLibraryBaseServiceImpl extends ServiceImpl<ProjectLibraryBas
}
checkExitData(projectLibraryBase);
saveOrUpdate(projectLibraryBase);
checkVersionOrder(projectLibraryBase.getParentId(),projectLibraryBase.getProjectVersion(),projectLibraryBase.getId());
// 删除当前项目的studio与项目库 角色关系
QueryWrapper<ProjectLibraryRoleRelEO> deleteLibraryRoleRelWrapper = new QueryWrapper<>();
@@ -117,7 +117,6 @@ public class ProjectStatusBoardServiceImpl implements IProjectStatusBoardService
}
}
List<ProjectLibraryBase> projectLibraryBaseLinkedList = new LinkedList<>();
for (ProjectLibraryBase libraryBase : projectLibraryBaseList) {
if(StringUtils.isBlank(libraryBase.getParentId())){
@@ -131,13 +130,13 @@ public class ProjectStatusBoardServiceImpl implements IProjectStatusBoardService
projectLibraryBaseLinkedList.addAll(projectLibraryBaseListTemp);
}
}
projectLibraryBaseList.sort(Comparator.comparing(ProjectLibraryBase::getShowName));
Collections.sort(projectLibraryBaseList);
List<SysDictItem> dictItemList = sysDictItemServiceImpl.selectItemsByDictCode("region");
for (ProjectLibraryBase libraryBase : projectLibraryBaseList) {
targetMarket(projectLibraryBase, dictItemList, libraryBase);
Map<String,Object> mapList = new HashMap<>();
List<List<TimeNodeVO>> collect = new ArrayList<>();
List<List<TimeNodeVO>> collect;
if(ObjectUtils.isNotEmpty(startTime) && ObjectUtils.isNotEmpty(endTime)){
collect = listNew.stream().filter(e -> libraryBase.getId().equals(e.get(0).getProjectId())).collect(Collectors.toList());
}else{
@@ -147,8 +146,9 @@ public class ProjectStatusBoardServiceImpl implements IProjectStatusBoardService
if(collect.size() != 0){
index ++;
mapList.put("index",index);
mapList.put("projectName",libraryBase.getProjectName()+" "+libraryBase.getYearName()+"-"+libraryBase.getTargetMarket()+"-"+libraryBase.getProjectVersion());
mapList.put("projectName",libraryBase.getShowName());
mapList.put("data",collect);
mapList.put("projectInfo",libraryBase);
result.add(mapList);
}
}
@@ -215,9 +215,7 @@ public class ProjectStatusBoardServiceImpl implements IProjectStatusBoardService
lambdaQueryWrapper.in(ProjectTaskInventoryEO::getProjectLawsInventoryId,projectLawsInventoryEOIdAll);
projectTaskInventoryEOList = projectTaskInventoryEOService.list(lambdaQueryWrapper);
}
projectLibraryBaseList.sort(Comparator.comparing(ProjectLibraryBase::getShowName));
Collections.sort(projectLibraryBaseList);
for (ProjectLibraryBase libraryBase : projectLibraryBaseList) {
//处理目标市场
targetMarket(projectLibraryBase, dictItemList, libraryBase);
@@ -234,7 +232,7 @@ public class ProjectStatusBoardServiceImpl implements IProjectStatusBoardService
projectVersion = "00";
}
Map<String,Object> map = new HashMap<>();
map.put("projectName",libraryBase.getProjectName()+" "+libraryBase.getYearName()+"-"+libraryBase.getTargetMarket()+"-"+projectVersion);//项目名称
map.put("projectName",libraryBase.getShowName());//项目名称
map.put("targetMarket",libraryBase.getTargetMarket());//目标市场
//1. 项目当前状态--projectState(蓝/红/黄/绿)-->studio视角下的数据
@@ -56,11 +56,10 @@ public class ProjectTaskPlanningServiceImpl extends ServiceImpl<ProjectTaskPlann
*/
@Override
public void editById(ProjectTaskPlanning projectTaskPlanning) {
Date now = new Date();
projectTaskPlanning.setUpdateTime(now);
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
projectTaskPlanning.setUpdateBy(sysUser.getUsername());
saveOrUpdate(projectTaskPlanning);
if (null != projectTaskPlanning && StringUtils.isNotEmpty(projectTaskPlanning.getId())) {
deleteById(projectTaskPlanning.getId());
add(projectTaskPlanning);
}
}
/**
+4 -2
View File
@@ -1250,9 +1250,9 @@ module.exports = {
dre: 'Dre',
applicableInstructionsMarketList: 'Applicable instructions of market list',
pleaseSelectTheDataCompared: 'Please select the data to be compared',
problemLabel: 'Topic Tag',
problemLabel: 'classification',
personCharge: 'Person in charge',
addLabel: 'Add Tag',
addLabel: 'New Classification',
editLabel: 'Edit Label',
applicableMarket: 'Applicable Market',
templateMaintenance: 'Template Maintenance',
@@ -1393,6 +1393,8 @@ module.exports = {
beforedate:'In... Before date',
beforedatein:'In... Before date (inclusive)',
inRecentMonthsin6:'Within 6 months (implemented)',
batchUpdateDeadline:'Batch update deadline',
timeInterval:'Time Interval',
certificationList:'Certification List',
inspectionItems:'Inspection Items',
processReset:'Process Reset',
+4 -2
View File
@@ -1352,9 +1352,9 @@ module.exports = {
dre: '填写人',
applicableInstructionsMarketList: '市场清单适用说明',
pleaseSelectTheDataCompared: '请选择需要对比的数据',
problemLabel: '问题标签',
problemLabel: '分类',
personCharge: '负责人',
addLabel: '新增标签',
addLabel: '新增分类',
editLabel: '编辑标签',
applicableMarket: '适用市场',
templateMaintenance: '模板维护',
@@ -1494,6 +1494,8 @@ module.exports = {
beforedate:'在...日期之前',
beforedatein:'在...日期之前(包含)',
inRecentMonthsin6:'近6个月内(已实施)',
batchUpdateDeadline:'批量更新截止时间',
timeInterval:'时间区间',
certificationList:'认证清单',
inspectionItems:'检验项目',
processReset:'流程重置',
@@ -83,6 +83,7 @@
visible: false,
confirmLoading: false,
selectedRowKeys: [],
selectedRowList: [],
content: [],
loading: false,
queryParam: {},
@@ -149,16 +150,17 @@
this.visible = false
},
handleSubmit() {
let content = []
// let replace_standard_id = []
let serial_number = []
let replace_standard_id = []
if (this.selectedRowKeys && this.selectedRowKeys.length > 0) {
let content = JSON.parse(JSON.stringify(this.selectedRowKeys))
// this.content.forEach(res => {
// content.push(res.serial_number)
// replace_standard_id.push(res.id)
// })
this.$emit('input', content.join(','))
// this.$emit('change', this.query.db_field_name, replace_standard_id.join(','))
// let content = JSON.parse(JSON.stringify(this.selectedRowList))
this.selectedRowList.forEach(res => {
serial_number.push(res.serial_number)
replace_standard_id.push(res.id)
})
this.$emit('input', serial_number.join(','))
console.log(replace_standard_id)
this.$emit('change', this.query.db_field_name, replace_standard_id.join(','))
// this.$emit('changecontent', this.content)
this.visible = false
} else {
@@ -168,9 +170,11 @@
indexclick(event) {
this.$emit('input', event.target.value)
},
onSelectChange(value) {
onSelectChange(value,row) {
console.log(value)
console.log(row)
this.selectedRowKeys = value
this.selectedRowList = row
// this.content = []
// value.forEach(val => {
// this.dataList.forEach((res) => {
@@ -169,6 +169,7 @@
<Standardselection :query="item"
:disabled="disabled"
:standard="formInline"
@change="StandardselectionChange"
v-model="formInline[item.db_field_name]"/>
</a-form-model-item>
</div>
@@ -832,10 +833,11 @@
this.type = 'add'
this.getForm()
},
// StandardselectionChange(value, id) {
// this.formInline[value + '_id'] = id
// this.formInline = { ...this.formInline }
// },
StandardselectionChange(value, id) {
console.log(id)
this.formInline[value + '_id'] = id
this.formInline = { ...this.formInline }
},
PersonnelSelectionChange(value, id) {
this.formInline[value + '_id'] = id
this.formInline = { ...this.formInline }
@@ -31,17 +31,17 @@
v-model="queryParam.title"></a-input>
</div>
</a-col>
<a-col :md="12" :sm="8">
<div class="box-title-text">
<div class="title-text" :title="$t('status')">
<span>{{$t('status')}}</span>
</div>
<j-dict-select-tag class="box-input" v-model="queryParam.state"
:placeholder="$t('PleaseSelect')+$t('status')"
:type="'select'"
:triggerChange="false" :dictCode="'state'"/>
</div>
</a-col>
<!-- <a-col :md="12" :sm="8">-->
<!-- <div class="box-title-text">-->
<!-- <div class="title-text" :title="$t('status')">-->
<!-- <span>{{$t('status')}}</span>-->
<!-- </div>-->
<!-- <j-dict-select-tag class="box-input" v-model="queryParam.state"-->
<!-- :placeholder="$t('PleaseSelect')+$t('status')"-->
<!-- :type="'select'"-->
<!-- :triggerChange="false" :dictCode="'state'"/>-->
<!-- </div>-->
<!-- </a-col>-->
</template>
<span style="float: right;overflow: hidden;" class="table-page-search-submitButtons">
<a-col :md="12" :sm="24">
@@ -1,7 +1,7 @@
<template>
<div class="box">
<div class="search-text-title">
<span>{{$t('searchScope')}}:</span>
<span>{{ $t('searchScope') }}:</span>
<span>{{ queryParam.selectValue }}</span>
</div>
<a-checkbox-group v-model="checkboxText" v-if="conList.length > 0">
@@ -36,7 +36,8 @@
<template slot="title">
<span v-html="item.file_name"></span>
</template>
<span class="text-header-text" v-if="item.file_name && item.module_type_flag == 'WDK'" style="cursor: pointer"
<span class="text-header-text" v-if="item.file_name && item.module_type_flag == 'WDK'"
style="cursor: pointer"
v-html="item.file_name"></span>
</a-tooltip>
<!-- <a-tooltip placement="topLeft" :mouseEnterDelay="0.5">-->
@@ -106,11 +107,11 @@
</template>
<script>
import { getAction, postAction, downloadFile } from '@/api/manage'
import { Base64 } from 'js-base64'
import { mapGetters } from 'vuex'
import { getAction, postAction, downloadFile } from '@/api/manage'
import { Base64 } from 'js-base64'
import { mapGetters } from 'vuex'
export default {
export default {
name: 'whole',
data() {
return {
@@ -180,7 +181,7 @@
} else if (fileSuffix == '.xlsx' || fileSuffix == '.xls') {
let url = window._CONFIG['onlinePreviewDomainURL'] + '?url=' + Base64.encode(this.downLoadFileUrl + '/' + fileQuery.id.slice(0, 32) + fileSuffix)
window.open(url, '_blank')
}else if(fileSuffix == '.png' || fileSuffix == '.jpeg' || fileSuffix == '.gif' || fileSuffix == '.jpg'){
} else if (fileSuffix == '.png' || fileSuffix == '.jpeg' || fileSuffix == '.gif' || fileSuffix == '.jpg') {
let url = window._CONFIG['onlinePreviewDomainURL'] + '?url=' + Base64.encode(this.downLoadImgUrl + '/' + fileQuery.id.slice(0, 32) + fileSuffix)
window.open(url, '_blank')
} else {
@@ -230,7 +231,7 @@
if (this.conList && this.conList.length > 0) {
this.conList.forEach(val => {
val.content = val.content.replace(/<img .*?>/g, '')
val.content = val.content.replace(/<\/?p[^>]*>/gi,'')
val.content = val.content.replace(/<\/?p[^>]*>/gi, '')
})
}
this.total = res.result.total
@@ -252,7 +253,7 @@
} else if (fileSuffix == '.xlsx' || fileSuffix == '.xls') {
let url = window._CONFIG['onlinePreviewDomainURL'] + '?url=' + Base64.encode(this.downLoadFileUrl + '/' + item.file_id + fileSuffix)
window.open(url, '_blank')
}else if(fileSuffix == '.png' || fileSuffix == '.jpeg' || fileSuffix == '.gif' || fileSuffix == '.jpg'){
} else if (fileSuffix == '.png' || fileSuffix == '.jpeg' || fileSuffix == '.gif' || fileSuffix == '.jpg') {
let url = window._CONFIG['onlinePreviewDomainURL'] + '?url=' + Base64.encode(this.downLoadImgUrl + '/' + item.file_id + fileSuffix)
window.open(url, '_blank')
}
@@ -261,13 +262,13 @@
if (item.module_type_flag == 'FGYB') {
this.monthlyReportClick(item)
} else if (item.module_type_flag == 'WTZSK') {
let newUrl = this.$router.resolve({
path: '/problemKnowledgeBaseView',
let id = item.id.replace('base','')
this.$router.push({
path: '/problemknowledgeBase',
query: {
id: item.id
id: id
}
})
window.open(newUrl.href, '_blank')
} else {
let newUrl = this.$router.resolve({
path: '/docManage/library/detail',
@@ -281,55 +282,57 @@
}
}
}
}
}
</script>
<style lang="less">
.highlight-class {
.highlight-class {
color: #21c9cc;
}
}
.tooltip-index {
.tooltip-index {
max-width: calc(100% - 300px) !important;
.ant-tooltip-inner {
color: #333;
background-color: #fff !important;
}
.ant-tooltip-arrow::before {
background-color: #fff;
}
}
}
</style>
<style scoped lang="less">
.box {
.box {
padding: 0 0 0 18px;
box-sizing: border-box;
}
}
.checkbox-left {
.checkbox-left {
float: left;
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
}
}
.text-text-right {
.text-text-right {
padding: 19px 28px;
box-sizing: border-box;
margin-left: 38px;
cursor: pointer;
}
}
.null-input {
.null-input {
background-color: #F2F4F8;
}
}
.search-text-title {
.search-text-title {
margin-bottom: 22px;
}
}
.text-header {
.text-header {
margin-bottom: 11px;
.text-header-text {
@@ -355,9 +358,9 @@
/* white-space: nowrap;*/
/* overflow: hidden;*/
/*}*/
}
}
.text-content {
.text-content {
font-size: 14px;
font-weight: 400;
color: #040B29;
@@ -371,21 +374,21 @@
/*! autoprefixer: on;*/
text-justify: inter-ideograph;
word-break: break-all
}
}
.page {
.page {
text-align: right;
margin-top: 20px;
}
}
.noData {
.noData {
width: 100%;
text-align: center;
line-height: 10;
}
}
::v-deep p {
::v-deep p {
margin: 0;
padding: 0;
}
}
</style>
+8 -3
View File
@@ -143,10 +143,10 @@
:columns="columns"
>
<span slot="projectName" slot-scope="text,record" :title="text">
{{ text && text.length > 20 ? text.slice(0, 18) + '...' : text }}
{{ text }}
</span>
<span slot="fileName" slot-scope="text,record" :title="text">
{{ text && text.length > 15 ? text.slice(0, 14) + '...' : text }}
{{ text }}
</span>
<span slot="operation" slot-scope="text,record">
@@ -382,6 +382,7 @@
{
title: this.$t('fileName'),
align: 'left',
ellipsis: true,
dataIndex: 'fileName',
scopedSlots: { customRender: 'fileName' },
width: 200
@@ -389,6 +390,7 @@
{
title: this.$t('fileDeclaration'),
align: 'left',
ellipsis: true,
dataIndex: 'fileDescription',
scopedSlots: { customRender: 'projectName' },
width: 300
@@ -396,6 +398,7 @@
{
title: this.$t('uploadedBy'),
align: 'left',
ellipsis: true,
dataIndex: 'createBy',
width: 150
},
@@ -407,6 +410,7 @@
{
title: this.$t('uploadTime'),
align: 'left',
ellipsis: true,
dataIndex: 'createTime',
width: 250
},
@@ -414,6 +418,7 @@
title: this.$t('operation'),
align: 'left',
fixed: 'right',
ellipsis: true,
width: 250,
scopedSlots: { customRender: 'operation' }
}
@@ -1123,7 +1128,7 @@
</script>
<style lang="less" scoped>
@import '~@assets/less/common.less';
@import'~@assets/less/common.less';
::v-deep .ant-table-row:first-child {
background: #fff !important;
@@ -44,17 +44,17 @@
:triggerChange="false" :dictCode="'duty_territory'"/>
</div>
</a-col>
<!-- <a-col :md="6" :sm="8">-->
<!-- <div class="box-title-text">-->
<!-- <div class="title-text" :title="$t('certificationCategory')">-->
<!-- <span>{{$t('certificationCategory')}}</span>-->
<!-- </div>-->
<!-- <j-dict-select-tag class="box-input" v-model="formInline.certCategory"-->
<!-- :placeholder="$t('PleaseSelect')+$t('certificationCategory')"-->
<!-- :type="'select'"-->
<!-- :triggerChange="false" :dictCode="'cert_category'"/>-->
<!-- </div>-->
<!-- </a-col>-->
<!-- <a-col :md="6" :sm="8">-->
<!-- <div class="box-title-text">-->
<!-- <div class="title-text" :title="$t('certificationCategory')">-->
<!-- <span>{{$t('certificationCategory')}}</span>-->
<!-- </div>-->
<!-- <j-dict-select-tag class="box-input" v-model="formInline.certCategory"-->
<!-- :placeholder="$t('PleaseSelect')+$t('certificationCategory')"-->
<!-- :type="'select'"-->
<!-- :triggerChange="false" :dictCode="'cert_category'"/>-->
<!-- </div>-->
<!-- </a-col>-->
<template v-if="toggleSearchStatus">
<a-col :md="6" :sm="8">
<div class="box-title-text">
@@ -202,6 +202,11 @@
<a-icon type="copy"/>
{{$t('Assignedby')}}
</div>
<!-- 批量更新截止时间-->
<div @click="batchUpdateDeadlineClick" class="operator-text-title" v-if='currentPersonRole == "homo" '>
<a-icon type="profile"/>
{{$t('batchUpdateDeadline')}}
</div>
</template>
<!-- @click='morepop'-->
<div class="operator-text" style="position: relative "
@@ -525,6 +530,8 @@
</div>
</a-modal>
<JLoading :loading="textLoading">{{this.$t('pleaseWaitWhileRunning')}}</JLoading>
<batchUpdateDeadline ref="batchUpdateDeadlineRef" @batchUpdateDeadlineForm="batchUpdateDeadlineForm"/>
</div>
</template>
@@ -543,6 +550,7 @@
import AssignedBy from '@/components/AssignedBy/index'
import AssignedByHomo from '@/components/AssignedByHomo/index'
import ImportFileOnlyList from '@/components/ImportFileOnlyListtag/index'
import batchUpdateDeadline from './batchUpdateDeadline'
import axios from 'axios'
import { ACCESS_TOKEN } from '@/store/mutation-types'
import Vue from 'vue'
@@ -562,7 +570,8 @@
ReferenceParameter,
SynchronousSubmissionLibrary,
TaskTime,
globalAdvancedQuery
globalAdvancedQuery,
batchUpdateDeadline
},
data() {
this.statusList = [
@@ -775,8 +784,8 @@
NoEngineer: 1, // 下发收集的权限,0为没有接口人 1为由接口人 默认有
NotSelectedNoEngineerValue: [],
paramsManifest: {},
timeBatch:'',
timer:'',
timeBatch: '',
timer: ''
}
},
props: {
@@ -788,8 +797,8 @@
},
mounted() {
this.handleClick()
window.addEventListener('keyup',this.handleKeyup)
window.addEventListener('click',this.handleClick)
window.addEventListener('keyup', this.handleKeyup)
window.addEventListener('click', this.handleClick)
this.GetgetLoginUserType()
console.log(this.currentPersonRole)
if (this.$route.query.type == '1') {
@@ -833,35 +842,35 @@
},
methods: {
...mapGetters(['userInfo']),
handleKeyup(){
handleKeyup() {
clearTimeout(this.timer)
clearTimeout(this.timeBatch)
clearTimeout(this.timerOne)
this.timer = setTimeout(()=>{
this.timer = setTimeout(() => {
if (this.currentPersonRole == 'dre') {
this.handlePreservation()
}
},10000)
this.timerOne = setTimeout(()=>{
}, 10000)
this.timerOne = setTimeout(() => {
clearTimeout(this.timer)
clearTimeout(this.timeBatch)
clearTimeout(this.timerOne)
},300000)
}, 300000)
},
handleClick(){
handleClick() {
clearTimeout(this.timer)
clearTimeout(this.timeBatch)
clearTimeout(this.timerOne)
this.timer = setTimeout(()=>{
this.timer = setTimeout(() => {
if (this.currentPersonRole == 'dre') {
this.handlePreservation()
}
},10000)
this.timerOne = setTimeout(()=>{
}, 10000)
this.timerOne = setTimeout(() => {
clearTimeout(this.timer)
clearTimeout(this.timeBatch)
clearTimeout(this.timerOne)
},300000)
}, 300000)
},
handleToggleSearch() {
@@ -1918,7 +1927,7 @@
this.selectedRowKeysValue.forEach((item, index) => {
_array.push(item.id)
})
if(_array.length == 0){
if (_array.length == 0) {
return
}
let _this = this
@@ -2047,7 +2056,16 @@
this.jurisdiction = 'SDTFPTXRHOMO'
}
},
batchUpdateDeadlineClick() {
if (this.selectedRowKeysValue && this.selectedRowKeysValue.length > 0) {
this.$refs.batchUpdateDeadlineRef.getData(JSON.parse(JSON.stringify(this.selectedRowKeysValue)))
} else {
this.$message.warning(this.$t('selectLeastOne'))
}
},
batchUpdateDeadlineForm() {
this.GetgetTableList()
},
// 分配填写人确定后弹框关闭
areaVisibleAssignedbyflag(val) {
this.areaVisibleAssignedby = val
@@ -76,8 +76,8 @@
<span class="title-text-text" :title="$t('projectVersion')">{{$t('projectVersion')}}</span>
</div>
<a-form-model-item class="itemModel" prop="projectVersion">
<a-input class="box-input"
:disabled="true"
<a-input class="box-input" oninput="javascript:this.value=this.value.replace(/[^\d]$/g,'')"
:maxLength="2"
v-model="formInline.projectVersion"
:placeholder="$t('PleaseEnter')+$t('projectVersion')"/>
</a-form-model-item>
@@ -0,0 +1,196 @@
<template>
<a-modal
:title="$t('batchUpdateDeadline')"
:width="500"
:visible="visible"
:confirm-loading="confirmLoading"
:maskClosable="false"
@ok="handleOk"
@cancel="visible = false"
>
<a-form-model :model="formInline" class="formAdd" :rules="rules" ref="ruleForm">
<a-row :gutter="24">
<a-col :span="24">
<div class="box-title-text">
<div class="title-text">
<span class="Required">*</span>
<span class="title-text-text"
:title="$t('Deadline')">{{$t('Deadline')}}</span>
</div>
<a-form-model-item class="itemModel" :prop="'deadline'">
<a-date-picker class="box-input"
:placeholder="$t('PleaseSelect')+$t('Deadline')"
:getCalendarContainer="(trigger) => trigger.parentNode"
format="YYYY-MM-DD"
v-model="formInline.deadline"
style="width: 100%"/>
</a-form-model-item>
</div>
</a-col>
</a-row>
</a-form-model>
</a-modal>
</template>
<script>
import moment from 'moment'
import { postAction, putAction, getAction } from '@/api/manage'
export default {
name: 'batchUpdateDeadline',
data() {
return {
visible: false,
confirmLoading: false,
formInline: {},
rules: {
deadline: [
{
required: true,
message: this.$t('Deadline') + this.$t('cannotEmpty'),
trigger: 'change'
}
]
},
idList: []
}
},
mounted() {
},
methods: {
handleOk() {
this.$refs.ruleForm.validate(valid => {
if (valid) {
let query = {
ids: this.idList.join(','),
deadline: moment(this.formInline.deadline).format('YYYY-MM-DD HH:mm:ss')
}
this.confirmLoading = true
postAction('/params/collectManifest/batchEditDeadline', query).then((res) => {
if (res.success) {
this.visible = false
this.confirmLoading = false
this.$message.success(this.$t('OperationSuccessful'))
this.$emit('batchUpdateDeadlineForm')
} else {
this.$message.warning(this.$t('operationFailed'))
this.confirmLoading = false
}
})
}
})
},
getData(data) {
this.idList = []
if (data && data.length > 0) {
data.forEach(res => {
this.idList.push(res.id)
})
this.visible = true
this.formInline = {}
} else {
this.$message.warning(this.$t('selectLeastOne'))
}
}
}
}
</script>
<style>
.formAdd .ant-form-item-label {
width: 130px;
}
.formAdd .ant-form-item-control-wrapper {
display: inline-block;
width: 100%;
}
/*.formAdd .ant-form-item {*/
/* margin-bottom: 20px;*/
/*}*/
.itemModel .ant-form-item-control-wrapper {
width: 100%;
}
.box-input .ant-select-selection--single {
height: 38px;
}
.box-input .ant-select-selection--multiple {
height: 38px;
}
.box-input .ant-select-selection__rendered {
line-height: 38px;
height: 38px;
}
.box-input .ant-select-selection--multiple .ant-select-selection__rendered > ul > li {
margin-top: 6px;
}
.box-input .ant-calendar-picker {
line-height: 38px;
height: 38px;
}
.box-input .ant-calendar-picker-input {
height: 38px;
}
.box-input .ant-input-number-input-wrap {
line-height: 38px;
height: 38px;
}
.box-input .ant-calendar-picker-input {
padding: 4px 30px 4px 11px;
}
</style>
<style scoped>
.box-title-text {
line-height: 1.4;
display: flex;
}
.title-text {
width: 104px;
text-align: right;
display: inline-block;
font-weight: 500;
font-size: 14px;
margin-right: 16px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
height: 42px;
line-height: 42px;
}
.box-input {
display: inline-block;
height: 38px;
width: 100%;
}
.itemModel {
width: calc(100% - 130px);
display: inline-block;
margin-top: 2px;
}
.title-text-text {
margin-top: 9px;
}
.formAdd {
margin-bottom: 40px;
}
.Required{
color: red;
}
</style>
@@ -19,7 +19,8 @@
</div>
<a-form-model-item class="itemModel" prop="projectVersion">
<a-input class="box-input"
:disabled="true"
oninput="javascript:this.value=this.value.replace(/[^\d]$/g,'')"
:maxLength="2"
v-model="formInline.projectVersion"
:placeholder="$t('PleaseEnter')+$t('projectVersion')"/>
</a-form-model-item>
@@ -3,16 +3,55 @@
<div class="Virtual-detail-header" style="position: fixed;top: 0">
<div class="Virtual-detail-title">
<span>
{{this.$t('regulatoryCertificationTaskPlan')}}
{{ this.$t('regulatoryCertificationTaskPlan') }}
</span>
</div>
</div>
<div style="padding: 87px 0 0 0;background: #ffffff;height:100%">
<div class="detail-content" style="height: 100%">
<span style="float: right" class="box-top-text-right">
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row :gutter="24">
<a-col :md="6" :sm="8">
<div class="box-title-text">
<div class="title-text" :title="$t('entryName')">
<span>{{ $t('entryName') }}</span>
</div>
<a-input class="box-input" :placeholder="$t('PleaseEnter')+$t('entryName')"
v-model="queryParam.projectName"></a-input>
</div>
</a-col>
<a-col :md="6" :sm="8">
<div class="box-title-text">
<div class="title-text" :title="$t('targetMarket')">
<span>{{ $t('targetMarket') }}</span>
</div>
<j-dict-select-tag class="box-input" v-model="queryParam.targetMarket"
:placeholder="$t('PleaseSelect')+$t('targetMarket')"
:type="'select'"
:triggerChange="false" :dictCode="'region'" />
</div>
</a-col>
<a-col :md="6" :sm="8">
<div class="box-title-text">
<div class="title-text" :title="$t('projectStatus')">
<span>{{ $t('projectStatus') }}</span>
</div>
<j-dict-select-tag class="box-input" v-model="queryParam.projectStatus"
:placeholder="$t('PleaseSelect')+$t('projectStatus')"
:type="'select'"
:triggerChange="false" :dictCode="'project_status'" />
</div>
</a-col>
<a-col :md="6" :sm="8">
<div class="box-title-text">
<div class="title-text" :title="$t('timeInterval')">
<span>{{ $t('timeInterval') }}</span>
</div>
<a-range-picker
:placeholder="[this.$t('startMonth'), this.$t('endMonth')]"
format="YYYY-MM"
class="box-input"
v-model="getTime"
:mode="mode2"
:open="open"
@@ -22,22 +61,71 @@
>
<div slot="renderExtraFooter" style="width: 100%;display: block">
<div style="text-align: right;width: 100%">
<a-button type="primary" @click="okChange">{{$t('determine')}}</a-button>
<a-button type="primary" @click="okChange">{{ $t('determine') }}</a-button>
</div>
</div>
</a-range-picker>
</div>
</a-col>
<a-col :md="6" :sm="8">
<div class="box-title-text">
<div class="title-text" :title="$t('brand')">
<span>{{ $t('brand') }}</span>
</div>
<j-dict-select-tag class="box-input" v-model="queryParam.brand"
:placeholder="$t('PleaseSelect')+$t('brand')"
:type="'select'"
:triggerChange="false" :dictCode="'brand'" />
</div>
</a-col>
<span style="float: right" class="table-page-search-submitButtons">
<a-col :md="6" :sm="24">
<a-button class="box-button" type="primary" @click="searchQuery">{{ $t('query') }}</a-button>
<a-button class="box-button" style="margin-left: 8px"
@click="searchReset">{{ $t('reset') }}</a-button>
</a-col>
</span>
</a-row>
</a-form>
</div>
<!-- <span style="float: right" class="box-top-text-right">-->
<!-- <a-range-picker-->
<!-- :placeholder="[this.$t('startMonth'), this.$t('endMonth')]"-->
<!-- format="YYYY-MM"-->
<!-- v-model="getTime"-->
<!-- :mode="mode2"-->
<!-- :open="open"-->
<!-- @openChange="openChange"-->
<!-- @panelChange="panelChange"-->
<!-- @change="hodeChange"-->
<!-- >-->
<!-- <div slot="renderExtraFooter" style="width: 100%;display: block">-->
<!-- <div style="text-align: right;width: 100%">-->
<!-- <a-button type="primary" @click="okChange">{{ $t('determine') }}</a-button>-->
<!-- </div>-->
<!-- </div>-->
<!-- </a-range-picker>-->
<!-- </span>-->
<div class="box-top-content" style="position: relative">
<!-- <div id="main"></div>-->
<!-- <div class="axis-tip"></div>-->
<div class="box-top-content-right-top">
<div class="box-top-content-right-top-text" v-for="(item,index) in timeList" :key="index">{{item}}</div>
<div class="box-top-content-right-top-text" v-for="(item,index) in timeList" :key="index">{{ item }}</div>
</div>
<div style="overflow:visible;">
<div class="box-top-content-left">
<div class="box-top-content-left-text" :title="item.projectName"
<div class="box-top-content-left-text"
v-for="(item,index) in timeData" :key="index">
{{item.projectName}}
<a-tooltip overlayClassName="overlayClassName" placement="topLeft">
<template slot="title">
<div>{{ item.projectName }}</div>
<div>
{{ $t('explain') }}:{{ item.projectInfo.explanation }}
</div>
</template>
<span @click="projectInfoClick(item.projectInfo)" style="cursor: pointer">{{ item.projectName
}}</span>
</a-tooltip>
</div>
</div>
<div class="box-top-content-right">
@@ -47,12 +135,13 @@
<div class="process-content-content" :style="val.left"
v-for="(val,indexOne) in item.data[0]" :key="indexOne">
<div class="process-content-right-top" v-if="indexOne % 2 == 0" :title="val.name">{{val.name}}</div>
<div class="process-content-right-button" v-if="indexOne % 2 == 1" :title="val.name">{{val.name}}
<div class="process-content-right-top" v-if="indexOne % 2 == 0" :title="val.name">{{ val.name }}
</div>
<div class="process-content-right-button" v-if="indexOne % 2 == 1" :title="val.name">{{ val.name }}
</div>
<a-tooltip placement="topLeft" overlayClassName="tooltipColor">
<template slot="title">
<span>{{val.time.slice(0,11)}}</span>
<span>{{ val.time.slice(0, 11) }}</span>
</template>
<img v-if="val.status == 1" src="../../../../assets/done.svg" class="process-content-left" alt="">
<img v-else-if="val.status == 2" src="../../../../assets/open.svg"
@@ -67,13 +156,13 @@
</div>
<div class="box-top-content-right-xian"></div>
<div class="box-top-content-right-text">
{{handlingTime}}
{{ handlingTime }}
</div>
</div>
</div>
</div>
<JLoading :loading="loadingMain">{{this.$t('dataLoading')}}</JLoading>
<JLoading :loading="loadingMain">{{ this.$t('dataLoading') }}</JLoading>
</div>
</div>
</div>
@@ -81,11 +170,11 @@
</template>
<script>
import { getAction, postAction, deleteAction } from '@/api/manage'
import moment from 'moment'
import * as echarts from 'echarts'
import { getAction, postAction, deleteAction } from '@/api/manage'
import moment from 'moment'
import * as echarts from 'echarts'
export default {
export default {
name: 'TaskPlanList',
data() {
return {
@@ -103,7 +192,9 @@
getTime: [],
timeList: [],
timeData: [],
handlingTime: ''
handlingTime: '',
queryParam: {},
toggleSearchStatus: false
}
},
created() {
@@ -180,7 +271,8 @@
getTimeline() {
let query = {
startTime: this.startTime || this.getNewDate('before', 6),
endTime: this.endTime || this.getNewDate('after', 5)
endTime: this.endTime || this.getNewDate('after', 5),
...this.queryParam
}
this.loadingMain = true
getAction(this.url.timeline, query).then((res) => {
@@ -191,12 +283,19 @@
}
})
},
projectInfoClick(item) {
let newUrl = this.$router.resolve({
path: '/ProjectDetails',
query: item
})
window.open(newUrl.href, '_blank')
},
openChange(val) {
this.open = val
},
okChange() {
this.open = false
this.getTimeline()
// this.getTimeline()
},
hodeChange() {
this.getTime = []
@@ -212,7 +311,8 @@
getTimelineList(time) {
let query = {
startTime: this.startTime || this.getNewDate('before', 6),
endTime: this.endTime || this.getNewDate('after', 5)
endTime: this.endTime || this.getNewDate('after', 5),
...this.queryParam
}
getAction(this.url.timelineList, query).then((res) => {
if (res.success) {
@@ -312,20 +412,44 @@
this.loadingMain = false
}, 500)
},
searchQuery() {
this.getTimeline()
},
searchReset() {
this.getTime = []
this.startTime = undefined
this.endTime = undefined
this.queryParam = {}
this.getTimeline()
}
}
}
}
</script>
<style>
.ant-calendar-footer-btn .ant-calendar-footer-extra{
.ant-calendar-footer-btn .ant-calendar-footer-extra {
float: right;
}
}
.overlayClassName .ant-tooltip-inner {
color: #fff !important;
background-color: rgba(0, 0, 0, 0.75) !important;
}
.overlayClassName .ant-tooltip-arrow::before {
background-color: rgba(0, 0, 0, 0.75) !important;
}
.overlayClassName {
max-width: 500px !important;
}
</style>
<style lang="less" scoped>
@import '~@assets/less/common.less';
.doc-detail {
@import '~@assets/less/common.less';
.doc-detail {
background: #fff;
height: 100%;
@@ -351,16 +475,16 @@
line-height: 68px;
}
}
}
}
.box-title-text {
.box-title-text {
line-height: 1.4;
display: flex;
align-items: center;
margin-bottom: 10px;
}
}
.title-text {
.title-text {
width: 70px;
color: #000F16;
display: inline-block;
@@ -372,41 +496,42 @@
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
.box-input {
.box-input {
display: inline-block;
width: 70%;
width: calc(100% - 70px);
height: 38px;
margin-top: 2px;
}
}
.box-top-text {
.box-top-text {
font-size: 16px;
font-weight: 500;
color: #000F16;
display: inline-block;
}
}
.box-top-content {
.box-top-content {
width: 100%;
height: calc(100vh - 160px);
height: calc(100vh - 200px);
margin-bottom: 20px;
padding: 0 50px 10px 20px;
box-sizing: border-box;
overflow: auto;
}
}
.box-button {
.box-button {
height: 38px;
}
display: inline-block;
}
#main {
#main {
width: 100%;
height: 100%;
}
}
.axis-tip {
.axis-tip {
display: none;
position: absolute;
padding: 5px 5px;
@@ -416,9 +541,9 @@
background: #ffffff;
box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.2);
border-radius: 4px;
}
}
.box-top-text-right {
.box-top-text-right {
display: inline-block;
float: right;
height: 38px;
@@ -426,16 +551,26 @@
margin-top: -4px;
margin-right: 20px;
margin-bottom: 10px;
}
}
.box-top-content-left {
.box-top-text-left {
display: inline-block;
float: left;
height: 38px;
width: 100%;
margin-top: -4px;
margin-left: 20px;
margin-bottom: 10px;
}
.box-top-content-left {
width: 140px;
float: left;
padding-top: 68px;
margin-right: 20px;
}
}
.box-top-content-left-text {
.box-top-content-left-text {
color: #191E29;
font-weight: bold;
font-size: 12px;
@@ -445,14 +580,14 @@
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
}
.box-top-content-right {
.box-top-content-right {
width: calc(100% - 160px);
float: left;
}
}
.box-top-content-right-top {
.box-top-content-right-top {
display: flex;
flex-direction: row;
justify-content: space-between;
@@ -462,9 +597,9 @@
z-index: 100;
padding-top: 25px;
padding-left: 160px;
}
}
.box-top-content-right-top-text {
.box-top-content-right-top-text {
border-left: 1px #EAEAEC solid;
border-top: 1px #EAEAEC solid;
border-bottom: 1px #EAEAEC solid;
@@ -476,18 +611,18 @@
line-height: 36px;
letter-spacing: 0px;
text-align: center;
}
}
.box-top-content-right-top-text:last-child {
.box-top-content-right-top-text:last-child {
border-right: 1px #EAEAEC solid;
}
}
.box-top-content-right-bottom {
.box-top-content-right-bottom {
position: relative;
padding-top: 60px;
}
}
.process-content {
.process-content {
position: relative;
height: 84px;
@@ -554,18 +689,18 @@
position: absolute;
top: 16px;
}
}
}
.box-top-content-right-xian {
.box-top-content-right-xian {
width: 2px;
height: 100%;
border: 1px #21c9cc dashed;
position: absolute;
top: -36px;
z-index: 999;
}
}
.box-top-content-right-text {
.box-top-content-right-text {
position: absolute;
top: -60px;
color: #21c9cc;
@@ -573,5 +708,9 @@
font-size: 14px;
width: 100px;
z-index: 101;
}
}
::v-deep .ant-row {
margin-right: 0 !important;
}
</style>
@@ -6,7 +6,7 @@
<a-col :md="6" :sm="8">
<div class="box-title-text">
<div class="title-text" :title="$t('entryName')">
<span>{{$t('entryName')}}</span>
<span>{{ $t('entryName') }}</span>
</div>
<j-input class="box-input" :placeholder="$t('PleaseEnter')+$t('entryName')"
v-model="queryParam.projectName"></j-input>
@@ -15,37 +15,38 @@
<a-col :md="6" :sm="8">
<div class="box-title-text">
<div class="title-text" :title="$t('targetMarket')">
<span>{{$t('targetMarket')}}</span>
<span>{{ $t('targetMarket') }}</span>
</div>
<j-dict-select-tag class="box-input" v-model="queryParam.targetMarket"
:placeholder="$t('PleaseSelect')+$t('targetMarket')"
:type="'select'"
:triggerChange="false" :dictCode="'region'"/>
:triggerChange="false" :dictCode="'region'" />
</div>
</a-col>
<a-col :md="6" :sm="8">
<div class="box-title-text">
<div class="title-text" :title="$t('brand')">
<span>{{$t('brand')}}</span>
<span>{{ $t('brand') }}</span>
</div>
<j-dict-select-tag class="box-input" v-model="queryParam.brand"
:placeholder="$t('PleaseSelect')+$t('brand')"
:type="'select'"
:triggerChange="false" :dictCode="'brand'"/>
:triggerChange="false" :dictCode="'brand'" />
</div>
</a-col>
<span style="float: right;overflow: hidden;" class="table-page-search-submitButtons">
<a-col :md="6" :sm="24">
<a-button class="box-button" type="primary" @click="searchQuery">{{$t('query')}}</a-button>
<a-button class="box-button" style="margin-left: 8px" @click="searchReset">{{$t('reset')}}</a-button>
<a-button class="box-button" type="primary" @click="searchQuery">{{ $t('query') }}</a-button>
<a-button class="box-button" style="margin-left: 8px"
@click="searchReset">{{ $t('reset') }}</a-button>
</a-col>
</span>
</a-row>
</a-form>
</div>
<div class="box-top">
<span class="box-top-text">{{$t('regulatoryCertificationTaskPlan')}}</span>
<span class="box-top-text fullScreenView" @click="TaskPlanListClick">{{$t('fullScreenView')}}</span>
<span class="box-top-text">{{ $t('regulatoryCertificationTaskPlan') }}</span>
<span class="box-top-text fullScreenView" @click="TaskPlanListClick">{{ $t('fullScreenView') }}</span>
<span style="float: right" class="box-top-text-right">
<a-range-picker
:placeholder="[this.$t('startMonth'), this.$t('endMonth')]"
@@ -59,7 +60,7 @@
>
<div slot="renderExtraFooter" style="width: 100%;display: block">
<div style="text-align: right;width: 100%;">
<a-button type="primary" @click="okChange">{{$t('determine')}}</a-button>
<a-button type="primary" @click="okChange">{{ $t('determine') }}</a-button>
</div>
</div>
</a-range-picker>
@@ -68,13 +69,21 @@
<!-- <div id="main"></div>-->
<!-- <div class="axis-tip"></div>-->
<div class="box-top-content-right-top">
<div class="box-top-content-right-top-text" v-for="(item,index) in timeList" :key="index">{{item}}</div>
<div class="box-top-content-right-top-text" v-for="(item,index) in timeList" :key="index">{{ item }}</div>
</div>
<div style="overflow:visible;">
<div class="box-top-content-left">
<div class="box-top-content-left-text" :title="item.projectName"
<div class="box-top-content-left-text"
v-for="(item,index) in timeData" :key="index">
{{item.projectName}}
<a-tooltip overlayClassName="overlayClassName" placement="topLeft">
<template slot="title">
<div>{{ item.projectName }}</div>
<div>
{{$t('explain')}}:{{item.projectInfo.explanation}}
</div>
</template>
<span @click="projectInfoClick(item.projectInfo)" style="cursor: pointer">{{ item.projectName }}</span>
</a-tooltip>
</div>
</div>
<div class="box-top-content-right">
@@ -83,12 +92,12 @@
<div class="process-content-right-xian"></div>
<div class="process-content-content" :style="val.left"
v-for="(val,indexOne) in item.data[0]" :key="indexOne">
<div class="process-content-right-top" v-if="indexOne % 2 == 0" :title="val.name">{{val.name}}</div>
<div class="process-content-right-button" v-if="indexOne % 2 == 1" :title="val.name">{{val.name}}
<div class="process-content-right-top" v-if="indexOne % 2 == 0" :title="val.name">{{ val.name }}</div>
<div class="process-content-right-button" v-if="indexOne % 2 == 1" :title="val.name">{{ val.name }}
</div>
<a-tooltip placement="topLeft" overlayClassName="tooltipColor">
<template slot="title">
<span>{{val.time.slice(0,11)}}</span>
<span>{{ val.time.slice(0, 11) }}</span>
</template>
<img v-if="val.status == 1" src="../../../assets/done.svg" class="process-content-left"
alt="">
@@ -104,17 +113,17 @@
</div>
<div class="box-top-content-right-xian"></div>
<div class="box-top-content-right-text">
{{handlingTime}}
{{ handlingTime }}
</div>
</div>
</div>
</div>
<JLoading :loading="loadingMain">{{this.$t('dataLoading')}}</JLoading>
<JLoading :loading="loadingMain">{{ this.$t('dataLoading') }}</JLoading>
</div>
</div>
<div class="box-bottom">
<span class="box-top-text">{{$t('projectStatusAndProgress')}}</span>
<span class="box-top-text fullScreenView" @click="projectNameClick">{{$t('fullScreenView')}}</span>
<span class="box-top-text">{{ $t('projectStatusAndProgress') }}</span>
<span class="box-top-text fullScreenView" @click="projectNameClick">{{ $t('fullScreenView') }}</span>
<div>
<a-table
ref="table"
@@ -127,32 +136,38 @@
:columns="columns"
>
<span slot="projectStatusTitle">
<span>{{this.$t('CurrentStatusOfTheProject')}}</span><br/>
<span>{{'('+$t('red')+'/'+$t('yellow')+'/'+$t('green')+'/'+$t('blue')+')'}}</span>
<span>{{ this.$t('CurrentStatusOfTheProject') }}</span><br />
<span>{{ '(' + $t('red') + '/' + $t('yellow') + '/' + $t('green') + '/' + $t('blue') + ')' }}</span>
</span>
<span slot="CertificationProgressTitle">
<span>{{this.$t('CertificationProgress')}}</span><br/>
<span>{{'('+$t('notInvolved')+'/'+$t('toBeStarted')+'/'+$t('inProgress')+'/'+$t('experimentFailed')+'/'+$t('experimentPassed')+')'}}</span>
<span>{{ this.$t('CertificationProgress') }}</span><br />
<span>{{ '(' + $t('notInvolved') + '/' + $t('toBeStarted') + '/' + $t('inProgress') + '/' + $t('experimentFailed') + '/' + $t('experimentPassed') + ')'
}}</span>
</span>
<span slot="listConfirmationStatusTitle">
<span>{{this.$t('listConfirmation')}}</span><br/>
<span>{{'('+$t('notLaunch')+'/'+$t('toBeConfirmed')+'/'+$t('accept')+'/'+$t('refuse')+')'}}</span>
<span>{{ this.$t('listConfirmation') }}</span><br />
<span>{{ '(' + $t('notLaunch') + '/' + $t('toBeConfirmed') + '/' + $t('accept') + '/' + $t('refuse') + ')'
}}</span>
</span>
<span slot="taskAffirmStatusTitle">
<span>{{this.$t('taskAffirm')}}</span><br/>
<span>{{'('+$t('notLaunch')+'/'+$t('toBeConfirmed')+'/'+$t('accept')+'/'+$t('refuse')+')'}}</span>
<span>{{ this.$t('taskAffirm') }}</span><br />
<span>{{ '(' + $t('notLaunch') + '/' + $t('toBeConfirmed') + '/' + $t('accept') + '/' + $t('refuse') + ')'
}}</span>
</span>
<span slot="designComplianceReviewTitle">
<span>{{this.$t('designComplianceReview')}}</span><br/>
<span>{{'('+$t('toBeConfirmed')+'/'+$t('accord')+'/'+$t('nonConformity')+'/'+$t('Tracked')+'/'+$t('notInvolved')+'/'+$t('taskTermination')+')'}}</span>
<span>{{ this.$t('designComplianceReview') }}</span><br />
<span>{{ '(' + $t('toBeConfirmed') + '/' + $t('accord') + '/' + $t('nonConformity') + '/' + $t('Tracked') + '/' + $t('notInvolved') + '/' + $t('taskTermination') + ')'
}}</span>
</span>
<span slot="preHomeConfirmationTitle">
<span>{{this.$t('preHomeConfirmation')}}</span><br/>
<span>{{'('+$t('toBeConfirmed')+'/'+$t('accord')+'/'+$t('nonConformity')+'/'+$t('Tracked')+'/'+$t('notInvolved')+'/'+$t('taskTermination')+')'}}</span>
<span>{{ this.$t('preHomeConfirmation') }}</span><br />
<span>{{ '(' + $t('toBeConfirmed') + '/' + $t('accord') + '/' + $t('nonConformity') + '/' + $t('Tracked') + '/' + $t('notInvolved') + '/' + $t('taskTermination') + ')'
}}</span>
</span>
<span slot="verificationComplianceReviewTitle">
<span>{{this.$t('verificationComplianceReview')}}</span><br/>
<span>{{'('+$t('toBeConfirmed')+'/'+$t('accord')+'/'+$t('nonConformity')+'/'+$t('Tracked')+'/'+$t('notInvolved')+'/'+$t('taskTermination')+')'}}</span>
<span>{{ this.$t('verificationComplianceReview') }}</span><br />
<span>{{ '(' + $t('toBeConfirmed') + '/' + $t('accord') + '/' + $t('nonConformity') + '/' + $t('Tracked') + '/' + $t('notInvolved') + '/' + $t('taskTermination') + ')'
}}</span>
</span>
</a-table>
</div>
@@ -161,14 +176,14 @@
</template>
<script>
import { getAction, postAction, deleteAction, downloadFile } from '@/api/manage'
import * as echarts from 'echarts'
import moment from 'moment'
import { ResizeHeader, ResizeColumnProvide } from '@/mixins/header'
import { getAction, postAction, deleteAction, downloadFile } from '@/api/manage'
import * as echarts from 'echarts'
import moment from 'moment'
import { ResizeHeader, ResizeColumnProvide } from '@/mixins/header'
export default {
export default {
name: 'index',
mixins:[ResizeHeader, ResizeColumnProvide],
mixins: [ResizeHeader, ResizeColumnProvide],
data() {
return {
queryParam: {},
@@ -458,6 +473,7 @@
})
this.timeData = timeData
console.log(this.timeData)
this.timeData = [...this.timeData]
this.loadingMain = false
}, 500)
@@ -495,30 +511,48 @@
path: '/projectStatusAndProgress'
})
window.open(newUrl.href, '_blank')
},
projectInfoClick(item){
let newUrl = this.$router.resolve({
path: '/ProjectDetails',
query: item
})
window.open(newUrl.href, '_blank')
},
}
}
}
}
</script>
<style>
.box-top-text-right .ant-calendar-picker-input {
.box-top-text-right .ant-calendar-picker-input {
height: 38px;
width: 300px;
}
.ant-calendar-footer-btn .ant-calendar-footer-extra{
}
.ant-calendar-footer-btn .ant-calendar-footer-extra {
float: right;
}
}
.overlayClassName .ant-tooltip-inner {
color: #fff!important;
background-color: rgba(0, 0, 0, 0.75) !important;
}
.overlayClassName .ant-tooltip-arrow::before{
background-color: rgba(0, 0, 0, 0.75) !important;
}
.overlayClassName{
max-width: 500px!important;
}
</style>
<style scoped lang="less">
@import'~@assets/less/common.less';
@import '~@assets/less/common.less';
.box-title-text {
.box-title-text {
line-height: 1.4;
display: flex;
align-items: center;
margin-bottom: 10px;
}
}
.title-text {
.title-text {
width: 70px;
color: #000F16;
display: inline-block;
@@ -530,42 +564,42 @@
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
.box-input {
.box-input {
display: inline-block;
width: 70%;
height: 38px;
margin-top: 2px;
}
}
.box-top-text {
.box-top-text {
font-size: 16px;
font-weight: 500;
color: #000F16;
margin-bottom: 20px;
display: inline-block;
}
}
.box-top-content {
.box-top-content {
width: 100%;
height: 500px;
margin-bottom: 20px;
padding: 0 58px 20px 10px;
box-sizing: border-box;
overflow: auto;
}
}
.box-button {
.box-button {
height: 38px;
}
}
#main {
#main {
width: 100%;
height: 100%;
}
}
.axis-tip {
.axis-tip {
display: none;
position: absolute;
padding: 5px 5px;
@@ -575,30 +609,30 @@
background: #ffffff;
box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.2);
border-radius: 4px;
}
}
.box-top-text-right {
.box-top-text-right {
display: inline-block;
float: right;
height: 38px;
width: 300px;
margin-top: -4px;
}
}
.fullScreenView {
.fullScreenView {
margin-left: 16px;
color: #21c9cc;
cursor: pointer;
}
}
.box-top-content-left {
.box-top-content-left {
width: 140px;
float: left;
padding-top: 57px;
margin-right: 20px;
}
}
.box-top-content-left-text {
.box-top-content-left-text {
color: #191E29;
font-weight: bold;
font-size: 12px;
@@ -608,14 +642,14 @@
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
}
.box-top-content-right {
.box-top-content-right {
width: calc(100% - 160px);
float: left;
}
}
.box-top-content-right-top {
.box-top-content-right-top {
display: flex;
flex-direction: row;
justify-content: space-between;
@@ -625,9 +659,9 @@
z-index: 100;
padding-top: 20px;
padding-left: 160px;
}
}
.box-top-content-right-top-text {
.box-top-content-right-top-text {
border-left: 1px #EAEAEC solid;
border-top: 1px #EAEAEC solid;
border-bottom: 1px #EAEAEC solid;
@@ -640,18 +674,18 @@
line-height: 36px;
letter-spacing: 0px;
text-align: center;
}
}
.box-top-content-right-top-text:last-child {
.box-top-content-right-top-text:last-child {
border-right: 1px #EAEAEC solid;
}
}
.box-top-content-right-bottom {
.box-top-content-right-bottom {
position: relative;
padding-top: 50px;
}
}
.process-content {
.process-content {
position: relative;
height: 84px;
@@ -718,18 +752,18 @@
position: absolute;
top: 16px;
}
}
}
.box-top-content-right-xian {
.box-top-content-right-xian {
width: 2px;
height: 100%;
border: 1px #21c9cc dashed;
position: absolute;
top: -36px;
z-index: 999;
}
}
.box-top-content-right-text {
.box-top-content-right-text {
position: absolute;
top: -60px;
color: #21c9cc;
@@ -737,13 +771,14 @@
font-size: 14px;
width: 100px;
z-index: 101;
}
}
/deep/.ant-table-column-title{
font-weight: bold!important;
}
/deep/ .ant-table-column-title {
font-weight: bold !important;
}
::v-deep .ant-table-placeholder{
::v-deep .ant-table-placeholder {
margin-top: 8px !important;
}
}
</style>
@@ -65,7 +65,7 @@
dataIndex: 'projectName',
scopedSlots: { customRender: 'RelatedItems' },
ellipsis: true,
width: 170
width: 130
},
{
title: this.$t('standardInformation'),
@@ -73,7 +73,7 @@
dataIndex: 'standardInfo',
scopedSlots: { customRender: 'standardInformation' },
ellipsis: true,
width: 170
width: 330
},
{
title: this.$t('taskType'),
@@ -87,14 +87,14 @@
align: 'left',
dataIndex: 'taskDefinitionKeyName',
ellipsis: true,
width: 170
width: 150
},
{
title: this.$t('Sponsor'),
align: 'left',
dataIndex: 'createBy',
ellipsis: true,
width: 170
width: 130
},
// {
// title: this.$t('LastProcessor'),
@@ -115,7 +115,7 @@
align: 'left',
dataIndex: 'endTime',
ellipsis: true,
width: 170
width: 150
},
// {
// title: this.$t('taskStatus'),
@@ -78,7 +78,7 @@
dataIndex: 'projectName',
ellipsis: true,
scopedSlots: { customRender: 'RelatedItems' },
width: 170
width: 110
},
{
title: this.$t('standardInformation'),
@@ -86,7 +86,7 @@
dataIndex: 'standardInfo',
ellipsis: true,
scopedSlots: { customRender: 'standardInformation' },
width: 170
width: 260
},
{
title: this.$t('taskType'),
@@ -114,14 +114,14 @@
align: 'left',
dataIndex: 'createBy',
ellipsis: true,
width: 170
width: 100
},
{
title: this.$t('TaskCutOffTime'),
align: 'left',
dataIndex: 'endTime',
ellipsis: true,
width: 170,
width: 110,
scopedSlots: { customRender: 'endTime' }
},
// {
@@ -136,7 +136,7 @@
title: this.$t('operation'),
align: 'left',
fixed: 'right',
width: 120,
width: 80,
scopedSlots: { customRender: 'operation' }
}
],
@@ -71,7 +71,7 @@
dataIndex: 'projectName',
ellipsis: true,
scopedSlots: { customRender: 'RelatedItems' },
width: 170
width: 130
},
{
title: this.$t('standardInformation'),
@@ -79,7 +79,7 @@
dataIndex: 'standardInfo',
ellipsis: true,
scopedSlots: { customRender: 'standardInformation' },
width: 170
width: 330
},
{
title: this.$t('taskType'),
@@ -93,14 +93,14 @@
align: 'left',
dataIndex: 'taskDefinitionKeyName',
ellipsis: true,
width: 170
width: 130
},
{
title: this.$t('Sponsor'),
align: 'left',
dataIndex: 'createBy',
ellipsis: true,
width: 170
width: 130
},
// {
// title: this.$t('CurrentProcessor'),
@@ -114,7 +114,7 @@
align: 'left',
dataIndex: 'endTime',
ellipsis: true,
width: 170
width: 150
},
// {
// title: this.$t('taskStatus'),
@@ -60,42 +60,42 @@
dataIndex: 'standardInfo',
scopedSlots: { customRender: 'standardInformation' },
ellipsis: true,
width: 170
width: 330
},
{
title: this.$t('taskType'),
align: 'left',
dataIndex: 'flowTypeShow',
ellipsis: true,
width: 170
width: 130
},
{
title: this.$t('LastProcessor'),
align: 'left',
dataIndex: 'lastAssigneeName',
ellipsis: true,
width: 170
width: 130
},
{
title: this.$t('CurrentProcessor'),
align: 'left',
dataIndex: 'assigneeName',
ellipsis: true,
width: 170
width: 130
},
{
title: this.$t('TaskCutOffTime'),
align: 'left',
dataIndex: 'endTime',
ellipsis: true,
width: 170
width: 150
},
{
title: this.$t('taskStatus'),
align: 'left',
dataIndex: 'statusShow',
ellipsis: true,
width: 170
width: 130
},
{
title: this.$t('operation'),
@@ -58,28 +58,28 @@
dataIndex: 'standardInfo',
scopedSlots: { customRender: 'standardInformation' },
ellipsis: true,
width: 170
width: 330
},
{
title: this.$t('taskType'),
align: 'left',
dataIndex: 'flowTypeShow',
ellipsis: true,
width: 170
width: 130
},
{
title: this.$t('Sponsor'),
align: 'left',
dataIndex: 'createBy',
ellipsis: true,
width: 170
width: 130
},
{
title: this.$t('TaskCutOffTime'),
align: 'left',
dataIndex: 'endTime',
ellipsis: true,
width: 170,
width: 150,
scopedSlots: { customRender: 'endTime' }
},
{
@@ -87,7 +87,7 @@
align: 'left',
dataIndex: 'statusShow',
ellipsis: true,
width: 170
width: 130
},
{
title: this.$t('operation'),
@@ -57,42 +57,42 @@
dataIndex: 'standardInfo',
ellipsis: true,
scopedSlots: { customRender: 'standardInformation' },
width: 170
width: 330
},
{
title: this.$t('taskType'),
align: 'left',
dataIndex: 'flowTypeShow',
ellipsis: true,
width: 170
width: 130
},
{
title: this.$t('Sponsor'),
align: 'left',
dataIndex: 'createBy',
ellipsis: true,
width: 170
width: 130
},
{
title: this.$t('CurrentProcessor'),
align: 'left',
dataIndex: 'assigneeName',
ellipsis: true,
width: 170
width: 130
},
{
title: this.$t('TaskCutOffTime'),
align: 'left',
dataIndex: 'endTime',
ellipsis: true,
width: 170
width: 150
},
{
title: this.$t('taskStatus'),
align: 'left',
dataIndex: 'statusShow',
ellipsis: true,
width: 170
width: 130
},
{
title: this.$t('operation'),