合并分支 'fix_2nd_20230315' 到 'master'

Fix 2nd 20230315

查看合并请求 laws-nio/laws-weilai!296
This commit is contained in:
高嵩
2023-03-19 22:15:18 +08:00
21 changed files with 1421 additions and 1162 deletions
@@ -83,6 +83,20 @@ public class BussDocumentLibraryEO implements Serializable {
@ApiModelProperty(value = "对应标准") @ApiModelProperty(value = "对应标准")
private java.lang.String correspondingStandard; 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) @TableField(exist = false)
private java.lang.String cut; private java.lang.String cut;
@@ -534,8 +534,7 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
fieldList = fieldList.stream() fieldList = fieldList.stream()
.filter(e -> !"serial_number".equals(e.getDbFieldName()) .filter(e -> !"serial_number".equals(e.getDbFieldName())
&& !"title".equals(e.getDbFieldName()) && !"title".equals(e.getDbFieldName())
&& !"title_en".equals(e.getDbFieldName()) && !"title_en".equals(e.getDbFieldName()))
&& !"state".equals(e.getDbFieldName()))
.collect(Collectors.toList()); .collect(Collectors.toList());
if (fieldList.size() != 0) { if (fieldList.size() != 0) {
@@ -1727,6 +1726,9 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
String key = entry.getKey(); String key = entry.getKey();
Object value = entry.getValue(); Object value = entry.getValue();
if(key.equals("replace_standard_id")){
continue;
}
//es全文新增数据(数据转换) //es全文新增数据(数据转换)
esFullText(cut, fieldList, categoryList, dictItemList, mapList, sbCn,sbEn, entry); esFullText(cut, fieldList, categoryList, dictItemList, mapList, sbCn,sbEn, entry);
@@ -1930,6 +1932,26 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
String insertField = mustFields + fieldsBuilder.toString(); String insertField = mustFields + fieldsBuilder.toString();
String insertValue = mustValues + valuesBuilder.toString(); String insertValue = mustValues + valuesBuilder.toString();
bussDocumentLibraryEOMapper.insertInfo(insertField, insertValue); 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")); String replaceStandard = StringUtils.valueOf(map.get("replace_standard"));
if (StringUtils.isNotBlank(replaceStandard)) { if (StringUtils.isNotBlank(replaceStandard)) {
@@ -2623,6 +2645,28 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
//删除文档库数据 //删除文档库数据
bussDocumentLibraryEOMapper.deleteById((String) map.get("id")); bussDocumentLibraryEOMapper.deleteById((String) map.get("id"));
bussDocumentLibraryEOMapper.insertInfo(insertField, insertValue); 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", "文档库");
map.put("module_type_flag", ModuleTypeFlagEnum.DOCUMENT_LIBRARY.getValue()); map.put("module_type_flag", ModuleTypeFlagEnum.DOCUMENT_LIBRARY.getValue());
map.put("create_time", new Date()); map.put("create_time", new Date());
@@ -2776,13 +2820,13 @@ public class BussDocumentLibraryEOServiceImpl extends ServiceImpl<BussDocumentLi
//适用车型 //适用车型
StringBuilder msgContentSbCarType = new StringBuilder("Vehicle Type of the " + category + " " + serialNumber + " " + titleEn); StringBuilder msgContentSbCarType = new StringBuilder("Vehicle Type of the " + category + " " + serialNumber + " " + titleEn);
StringBuilder msgContentInfoSbCarType = new StringBuilder("Vehicle Type of the " + category + " " + href); StringBuilder msgContentInfoSbCarType = new StringBuilder("Vehicle Type of the " + category + " " + href);
StringBuilder msgContentSbCarTypeCn = new StringBuilder(categoryCn + " " + serialNumber + " " + title+" 的适用车型改为"); StringBuilder msgContentSbCarTypeCn = new StringBuilder(serialNumber + " " + title+" 的适用车型改为");
StringBuilder msgContentInfoSbCarTypeCn = new StringBuilder(categoryCn + " " + hrefCn+" 的适用车型改为"); StringBuilder msgContentInfoSbCarTypeCn = new StringBuilder(hrefCn+" 的适用车型改为");
//状态 //状态
StringBuilder msgContentSbStatus = new StringBuilder("The Status of the " + category + " " + serialNumber + " " + titleEn); StringBuilder msgContentSbStatus = new StringBuilder("The Status of the " + category + " " + serialNumber + " " + titleEn);
StringBuilder msgContentInfoSbStatus = new StringBuilder("The Status of the " + category + " " + href); StringBuilder msgContentInfoSbStatus = new StringBuilder("The Status of the " + category + " " + href);
StringBuilder msgContentSbStatusCn = new StringBuilder(categoryCn + " " + serialNumber + " " + title+" 的状态改为"); StringBuilder msgContentSbStatusCn = new StringBuilder(serialNumber + " " + title+" 的状态改为");
StringBuilder msgContentInfoSbStatusCn = new StringBuilder(categoryCn + " " + hrefCn+" 的状态改为"); StringBuilder msgContentInfoSbStatusCn = new StringBuilder(hrefCn+" 的状态改为");
List<String> fileIdLIstTemp = new ArrayList<>(); List<String> fileIdLIstTemp = new ArrayList<>();
@@ -2315,7 +2315,8 @@ public class DummyInventoryInfoEOServiceImpl extends ServiceImpl<DummyInventoryI
excelName = baseList.get(0).getName() + " Virtual list.xlsx"; excelName = baseList.get(0).getName() + " Virtual list.xlsx";
} }
//excel //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 exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF); exportParams.setType(ExcelType.XSSF);
if(CutEnum.CN.getValue().equals(dummyInventoryInfoEO.getCut())){ if(CutEnum.CN.getValue().equals(dummyInventoryInfoEO.getCut())){
@@ -147,12 +147,27 @@ public class ProjectLibraryBase implements Comparable<ProjectLibraryBase> {
@Override @Override
public int compareTo(ProjectLibraryBase o) { public int compareTo(ProjectLibraryBase o) {
return Integer.valueOf(this.projectVersion)-Integer.valueOf(o.projectVersion);//升序 if (!this.getProjectName().equals(o.getProjectName())) {
// return o.id-this.id;//降序 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(){ public String getShowName() {
return projectName+yearName+targetMarket+projectVersion; return projectName + " " + yearName + "-" + targetMarket + "-" + projectVersion;
} }
@Override @Override
@@ -117,7 +117,6 @@ public class ProjectStatusBoardServiceImpl implements IProjectStatusBoardService
} }
} }
List<ProjectLibraryBase> projectLibraryBaseLinkedList = new LinkedList<>(); List<ProjectLibraryBase> projectLibraryBaseLinkedList = new LinkedList<>();
for (ProjectLibraryBase libraryBase : projectLibraryBaseList) { for (ProjectLibraryBase libraryBase : projectLibraryBaseList) {
if(StringUtils.isBlank(libraryBase.getParentId())){ if(StringUtils.isBlank(libraryBase.getParentId())){
@@ -131,13 +130,13 @@ public class ProjectStatusBoardServiceImpl implements IProjectStatusBoardService
projectLibraryBaseLinkedList.addAll(projectLibraryBaseListTemp); projectLibraryBaseLinkedList.addAll(projectLibraryBaseListTemp);
} }
} }
projectLibraryBaseList.sort(Comparator.comparing(ProjectLibraryBase::getShowName)); Collections.sort(projectLibraryBaseList);
List<SysDictItem> dictItemList = sysDictItemServiceImpl.selectItemsByDictCode("region"); List<SysDictItem> dictItemList = sysDictItemServiceImpl.selectItemsByDictCode("region");
for (ProjectLibraryBase libraryBase : projectLibraryBaseList) { for (ProjectLibraryBase libraryBase : projectLibraryBaseList) {
targetMarket(projectLibraryBase, dictItemList, libraryBase); targetMarket(projectLibraryBase, dictItemList, libraryBase);
Map<String,Object> mapList = new HashMap<>(); Map<String,Object> mapList = new HashMap<>();
List<List<TimeNodeVO>> collect = new ArrayList<>(); List<List<TimeNodeVO>> collect;
if(ObjectUtils.isNotEmpty(startTime) && ObjectUtils.isNotEmpty(endTime)){ if(ObjectUtils.isNotEmpty(startTime) && ObjectUtils.isNotEmpty(endTime)){
collect = listNew.stream().filter(e -> libraryBase.getId().equals(e.get(0).getProjectId())).collect(Collectors.toList()); collect = listNew.stream().filter(e -> libraryBase.getId().equals(e.get(0).getProjectId())).collect(Collectors.toList());
}else{ }else{
@@ -147,8 +146,9 @@ public class ProjectStatusBoardServiceImpl implements IProjectStatusBoardService
if(collect.size() != 0){ if(collect.size() != 0){
index ++; index ++;
mapList.put("index",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("data",collect);
mapList.put("projectInfo",libraryBase);
result.add(mapList); result.add(mapList);
} }
} }
@@ -215,9 +215,7 @@ public class ProjectStatusBoardServiceImpl implements IProjectStatusBoardService
lambdaQueryWrapper.in(ProjectTaskInventoryEO::getProjectLawsInventoryId,projectLawsInventoryEOIdAll); lambdaQueryWrapper.in(ProjectTaskInventoryEO::getProjectLawsInventoryId,projectLawsInventoryEOIdAll);
projectTaskInventoryEOList = projectTaskInventoryEOService.list(lambdaQueryWrapper); projectTaskInventoryEOList = projectTaskInventoryEOService.list(lambdaQueryWrapper);
} }
Collections.sort(projectLibraryBaseList);
projectLibraryBaseList.sort(Comparator.comparing(ProjectLibraryBase::getShowName));
for (ProjectLibraryBase libraryBase : projectLibraryBaseList) { for (ProjectLibraryBase libraryBase : projectLibraryBaseList) {
//处理目标市场 //处理目标市场
targetMarket(projectLibraryBase, dictItemList, libraryBase); targetMarket(projectLibraryBase, dictItemList, libraryBase);
@@ -234,7 +232,7 @@ public class ProjectStatusBoardServiceImpl implements IProjectStatusBoardService
projectVersion = "00"; projectVersion = "00";
} }
Map<String,Object> map = new HashMap<>(); 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());//目标市场 map.put("targetMarket",libraryBase.getTargetMarket());//目标市场
//1. 项目当前状态--projectState(蓝/红/黄/绿)-->studio视角下的数据 //1. 项目当前状态--projectState(蓝/红/黄/绿)-->studio视角下的数据
+3 -2
View File
@@ -1240,9 +1240,9 @@ module.exports = {
dre: 'Dre', dre: 'Dre',
applicableInstructionsMarketList: 'Applicable instructions of market list', applicableInstructionsMarketList: 'Applicable instructions of market list',
pleaseSelectTheDataCompared: 'Please select the data to be compared', pleaseSelectTheDataCompared: 'Please select the data to be compared',
problemLabel: 'Topic Tag', problemLabel: 'classification',
personCharge: 'Person in charge', personCharge: 'Person in charge',
addLabel: 'Add Tag', addLabel: 'New Classification',
editLabel: 'Edit Label', editLabel: 'Edit Label',
applicableMarket: 'Applicable Market', applicableMarket: 'Applicable Market',
templateMaintenance: 'Template Maintenance', templateMaintenance: 'Template Maintenance',
@@ -1384,4 +1384,5 @@ module.exports = {
beforedatein:'In... Before date (inclusive)', beforedatein:'In... Before date (inclusive)',
inRecentMonthsin6:'Within 6 months (implemented)', inRecentMonthsin6:'Within 6 months (implemented)',
batchUpdateDeadline:'Batch update deadline', batchUpdateDeadline:'Batch update deadline',
timeInterval:'Time Interval',
} }
+3 -2
View File
@@ -1342,9 +1342,9 @@ module.exports = {
dre: '填写人', dre: '填写人',
applicableInstructionsMarketList: '市场清单适用说明', applicableInstructionsMarketList: '市场清单适用说明',
pleaseSelectTheDataCompared: '请选择需要对比的数据', pleaseSelectTheDataCompared: '请选择需要对比的数据',
problemLabel: '问题标签', problemLabel: '分类',
personCharge: '负责人', personCharge: '负责人',
addLabel: '新增标签', addLabel: '新增分类',
editLabel: '编辑标签', editLabel: '编辑标签',
applicableMarket: '适用市场', applicableMarket: '适用市场',
templateMaintenance: '模板维护', templateMaintenance: '模板维护',
@@ -1485,4 +1485,5 @@ module.exports = {
beforedatein:'在...日期之前(包含)', beforedatein:'在...日期之前(包含)',
inRecentMonthsin6:'近6个月内(已实施)', inRecentMonthsin6:'近6个月内(已实施)',
batchUpdateDeadline:'批量更新截止时间', batchUpdateDeadline:'批量更新截止时间',
timeInterval:'时间区间',
} }
@@ -83,6 +83,7 @@
visible: false, visible: false,
confirmLoading: false, confirmLoading: false,
selectedRowKeys: [], selectedRowKeys: [],
selectedRowList: [],
content: [], content: [],
loading: false, loading: false,
queryParam: {}, queryParam: {},
@@ -149,16 +150,17 @@
this.visible = false this.visible = false
}, },
handleSubmit() { handleSubmit() {
let content = [] let serial_number = []
// let replace_standard_id = [] let replace_standard_id = []
if (this.selectedRowKeys && this.selectedRowKeys.length > 0) { if (this.selectedRowKeys && this.selectedRowKeys.length > 0) {
let content = JSON.parse(JSON.stringify(this.selectedRowKeys)) // let content = JSON.parse(JSON.stringify(this.selectedRowList))
// this.content.forEach(res => { this.selectedRowList.forEach(res => {
// content.push(res.serial_number) serial_number.push(res.serial_number)
// replace_standard_id.push(res.id) replace_standard_id.push(res.id)
// }) })
this.$emit('input', content.join(',')) this.$emit('input', serial_number.join(','))
// this.$emit('change', this.query.db_field_name, replace_standard_id.join(',')) console.log(replace_standard_id)
this.$emit('change', this.query.db_field_name, replace_standard_id.join(','))
// this.$emit('changecontent', this.content) // this.$emit('changecontent', this.content)
this.visible = false this.visible = false
} else { } else {
@@ -168,9 +170,11 @@
indexclick(event) { indexclick(event) {
this.$emit('input', event.target.value) this.$emit('input', event.target.value)
}, },
onSelectChange(value) { onSelectChange(value,row) {
console.log(value) console.log(value)
console.log(row)
this.selectedRowKeys = value this.selectedRowKeys = value
this.selectedRowList = row
// this.content = [] // this.content = []
// value.forEach(val => { // value.forEach(val => {
// this.dataList.forEach((res) => { // this.dataList.forEach((res) => {
@@ -169,6 +169,7 @@
<Standardselection :query="item" <Standardselection :query="item"
:disabled="disabled" :disabled="disabled"
:standard="formInline" :standard="formInline"
@change="StandardselectionChange"
v-model="formInline[item.db_field_name]"/> v-model="formInline[item.db_field_name]"/>
</a-form-model-item> </a-form-model-item>
</div> </div>
@@ -494,10 +495,11 @@
this.type = 'add' this.type = 'add'
this.getForm() this.getForm()
}, },
// StandardselectionChange(value, id) { StandardselectionChange(value, id) {
// this.formInline[value + '_id'] = id console.log(id)
// this.formInline = { ...this.formInline } this.formInline[value + '_id'] = id
// }, this.formInline = { ...this.formInline }
},
PersonnelSelectionChange(value, id) { PersonnelSelectionChange(value, id) {
this.formInline[value + '_id'] = id this.formInline[value + '_id'] = id
this.formInline = { ...this.formInline } this.formInline = { ...this.formInline }
@@ -31,17 +31,17 @@
v-model="queryParam.title"></a-input> v-model="queryParam.title"></a-input>
</div> </div>
</a-col> </a-col>
<a-col :md="12" :sm="8"> <!-- <a-col :md="12" :sm="8">-->
<div class="box-title-text"> <!-- <div class="box-title-text">-->
<div class="title-text" :title="$t('status')"> <!-- <div class="title-text" :title="$t('status')">-->
<span>{{$t('status')}}</span> <!-- <span>{{$t('status')}}</span>-->
</div> <!-- </div>-->
<j-dict-select-tag class="box-input" v-model="queryParam.state" <!-- <j-dict-select-tag class="box-input" v-model="queryParam.state"-->
:placeholder="$t('PleaseSelect')+$t('status')" <!-- :placeholder="$t('PleaseSelect')+$t('status')"-->
:type="'select'" <!-- :type="'select'"-->
:triggerChange="false" :dictCode="'state'"/> <!-- :triggerChange="false" :dictCode="'state'"/>-->
</div> <!-- </div>-->
</a-col> <!-- </a-col>-->
</template> </template>
<span style="float: right;overflow: hidden;" class="table-page-search-submitButtons"> <span style="float: right;overflow: hidden;" class="table-page-search-submitButtons">
<a-col :md="12" :sm="24"> <a-col :md="12" :sm="24">
@@ -931,24 +931,24 @@
key: 3, key: 3,
moduleFlag:this.$route.query.title == '虚拟清单详情' ? '虚拟清单详情' : '维护清单', moduleFlag:this.$route.query.title == '虚拟清单详情' ? '虚拟清单详情' : '维护清单',
}, },
{ // {
sort: '', // sort: '',
name: this.$t('listConfirmationStatus'), // name: this.$t('listConfirmationStatus'),
headFieldCn:'清单确认状态', // headFieldCn:'清单确认状态',
headFieldEn:'List Confirmation Status', // headFieldEn:'List Confirmation Status',
field: 'inventoryAffirmStatusName', // field: 'inventoryAffirmStatusName',
key: 4, // key: 4,
moduleFlag:this.$route.query.title == '虚拟清单详情' ? '虚拟清单详情' : '维护清单', // moduleFlag:this.$route.query.title == '虚拟清单详情' ? '虚拟清单详情' : '维护清单',
}, // },
{ // {
sort: '', // sort: '',
name: this.$t('taskAffirmStatus'), // name: this.$t('taskAffirmStatus'),
headFieldCn:'任务确认状态', // headFieldCn:'任务确认状态',
headFieldEn:'Task Confirmation Status', // headFieldEn:'Task Confirmation Status',
field: 'taskAffirmStatusName', // field: 'taskAffirmStatusName',
key: 5, // key: 5,
moduleFlag:this.$route.query.title == '虚拟清单详情' ? '虚拟清单详情' : '维护清单', // moduleFlag:this.$route.query.title == '虚拟清单详情' ? '虚拟清单详情' : '维护清单',
}, // },
{ {
sort: '', sort: '',
name: this.$t('zoneOfApplication'), name: this.$t('zoneOfApplication'),
+8 -3
View File
@@ -143,10 +143,10 @@
:columns="columns" :columns="columns"
> >
<span slot="projectName" slot-scope="text,record" :title="text"> <span slot="projectName" slot-scope="text,record" :title="text">
{{ text && text.length > 20 ? text.slice(0, 18) + '...' : text }} {{ text }}
</span> </span>
<span slot="fileName" slot-scope="text,record" :title="text"> <span slot="fileName" slot-scope="text,record" :title="text">
{{ text && text.length > 15 ? text.slice(0, 14) + '...' : text }} {{ text }}
</span> </span>
<span slot="operation" slot-scope="text,record"> <span slot="operation" slot-scope="text,record">
@@ -382,6 +382,7 @@
{ {
title: this.$t('fileName'), title: this.$t('fileName'),
align: 'left', align: 'left',
ellipsis: true,
dataIndex: 'fileName', dataIndex: 'fileName',
scopedSlots: { customRender: 'fileName' }, scopedSlots: { customRender: 'fileName' },
width: 200 width: 200
@@ -389,6 +390,7 @@
{ {
title: this.$t('fileDeclaration'), title: this.$t('fileDeclaration'),
align: 'left', align: 'left',
ellipsis: true,
dataIndex: 'fileDescription', dataIndex: 'fileDescription',
scopedSlots: { customRender: 'projectName' }, scopedSlots: { customRender: 'projectName' },
width: 300 width: 300
@@ -396,6 +398,7 @@
{ {
title: this.$t('uploadedBy'), title: this.$t('uploadedBy'),
align: 'left', align: 'left',
ellipsis: true,
dataIndex: 'createBy', dataIndex: 'createBy',
width: 150 width: 150
}, },
@@ -407,6 +410,7 @@
{ {
title: this.$t('uploadTime'), title: this.$t('uploadTime'),
align: 'left', align: 'left',
ellipsis: true,
dataIndex: 'createTime', dataIndex: 'createTime',
width: 250 width: 250
}, },
@@ -414,6 +418,7 @@
title: this.$t('operation'), title: this.$t('operation'),
align: 'left', align: 'left',
fixed: 'right', fixed: 'right',
ellipsis: true,
width: 250, width: 250,
scopedSlots: { customRender: 'operation' } scopedSlots: { customRender: 'operation' }
} }
@@ -1123,7 +1128,7 @@
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
@import '~@assets/less/common.less'; @import'~@assets/less/common.less';
::v-deep .ant-table-row:first-child { ::v-deep .ant-table-row:first-child {
background: #fff !important; background: #fff !important;
@@ -76,8 +76,8 @@
<span class="title-text-text" :title="$t('projectVersion')">{{$t('projectVersion')}}</span> <span class="title-text-text" :title="$t('projectVersion')">{{$t('projectVersion')}}</span>
</div> </div>
<a-form-model-item class="itemModel" prop="projectVersion"> <a-form-model-item class="itemModel" prop="projectVersion">
<a-input class="box-input" <a-input class="box-input" oninput="javascript:this.value=this.value.replace(/[^\d]$/g,'')"
:disabled="true" :maxLength="2"
v-model="formInline.projectVersion" v-model="formInline.projectVersion"
:placeholder="$t('PleaseEnter')+$t('projectVersion')"/> :placeholder="$t('PleaseEnter')+$t('projectVersion')"/>
</a-form-model-item> </a-form-model-item>
@@ -3,16 +3,55 @@
<div class="Virtual-detail-header" style="position: fixed;top: 0"> <div class="Virtual-detail-header" style="position: fixed;top: 0">
<div class="Virtual-detail-title"> <div class="Virtual-detail-title">
<span> <span>
{{this.$t('regulatoryCertificationTaskPlan')}} {{ this.$t('regulatoryCertificationTaskPlan') }}
</span> </span>
</div> </div>
</div> </div>
<div style="padding: 87px 0 0 0;background: #ffffff;height:100%"> <div style="padding: 87px 0 0 0;background: #ffffff;height:100%">
<div class="detail-content" style="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 <a-range-picker
:placeholder="[this.$t('startMonth'), this.$t('endMonth')]" :placeholder="[this.$t('startMonth'), this.$t('endMonth')]"
format="YYYY-MM" format="YYYY-MM"
class="box-input"
v-model="getTime" v-model="getTime"
:mode="mode2" :mode="mode2"
:open="open" :open="open"
@@ -22,22 +61,71 @@
> >
<div slot="renderExtraFooter" style="width: 100%;display: block"> <div slot="renderExtraFooter" style="width: 100%;display: block">
<div style="text-align: right;width: 100%"> <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>
</div> </div>
</a-range-picker> </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> </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 class="box-top-content" style="position: relative">
<!-- <div id="main"></div>--> <!-- <div id="main"></div>-->
<!-- <div class="axis-tip"></div>--> <!-- <div class="axis-tip"></div>-->
<div class="box-top-content-right-top"> <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>
<div style="overflow:visible;"> <div style="overflow:visible;">
<div class="box-top-content-left"> <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"> 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> </div>
<div class="box-top-content-right"> <div class="box-top-content-right">
@@ -47,12 +135,13 @@
<div class="process-content-content" :style="val.left" <div class="process-content-content" :style="val.left"
v-for="(val,indexOne) in item.data[0]" :key="indexOne"> 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-top" v-if="indexOne % 2 == 0" :title="val.name">{{ val.name }}
<div class="process-content-right-button" v-if="indexOne % 2 == 1" :title="val.name">{{val.name}} </div>
<div class="process-content-right-button" v-if="indexOne % 2 == 1" :title="val.name">{{ val.name }}
</div> </div>
<a-tooltip placement="topLeft" overlayClassName="tooltipColor"> <a-tooltip placement="topLeft" overlayClassName="tooltipColor">
<template slot="title"> <template slot="title">
<span>{{val.time.slice(0,11)}}</span> <span>{{ val.time.slice(0, 11) }}</span>
</template> </template>
<img v-if="val.status == 1" src="../../../../assets/done.svg" class="process-content-left" alt=""> <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" <img v-else-if="val.status == 2" src="../../../../assets/open.svg"
@@ -67,13 +156,13 @@
</div> </div>
<div class="box-top-content-right-xian"></div> <div class="box-top-content-right-xian"></div>
<div class="box-top-content-right-text"> <div class="box-top-content-right-text">
{{handlingTime}} {{ handlingTime }}
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<JLoading :loading="loadingMain">{{this.$t('dataLoading')}}</JLoading> <JLoading :loading="loadingMain">{{ this.$t('dataLoading') }}</JLoading>
</div> </div>
</div> </div>
</div> </div>
@@ -81,11 +170,11 @@
</template> </template>
<script> <script>
import { getAction, postAction, deleteAction } from '@/api/manage' import { getAction, postAction, deleteAction } from '@/api/manage'
import moment from 'moment' import moment from 'moment'
import * as echarts from 'echarts' import * as echarts from 'echarts'
export default { export default {
name: 'TaskPlanList', name: 'TaskPlanList',
data() { data() {
return { return {
@@ -103,7 +192,9 @@
getTime: [], getTime: [],
timeList: [], timeList: [],
timeData: [], timeData: [],
handlingTime: '' handlingTime: '',
queryParam: {},
toggleSearchStatus: false
} }
}, },
created() { created() {
@@ -180,7 +271,8 @@
getTimeline() { getTimeline() {
let query = { let query = {
startTime: this.startTime || this.getNewDate('before', 6), 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 this.loadingMain = true
getAction(this.url.timeline, query).then((res) => { 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) { openChange(val) {
this.open = val this.open = val
}, },
okChange() { okChange() {
this.open = false this.open = false
this.getTimeline() // this.getTimeline()
}, },
hodeChange() { hodeChange() {
this.getTime = [] this.getTime = []
@@ -212,7 +311,8 @@
getTimelineList(time) { getTimelineList(time) {
let query = { let query = {
startTime: this.startTime || this.getNewDate('before', 6), 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) => { getAction(this.url.timelineList, query).then((res) => {
if (res.success) { if (res.success) {
@@ -312,20 +412,44 @@
this.loadingMain = false this.loadingMain = false
}, 500) }, 500)
},
searchQuery() {
this.getTimeline()
},
searchReset() {
this.getTime = []
this.startTime = undefined
this.endTime = undefined
this.queryParam = {}
this.getTimeline()
} }
} }
} }
</script> </script>
<style> <style>
.ant-calendar-footer-btn .ant-calendar-footer-extra{ .ant-calendar-footer-btn .ant-calendar-footer-extra {
float: right; 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>
<style lang="less" scoped> <style lang="less" scoped>
@import '~@assets/less/common.less'; @import '~@assets/less/common.less';
.doc-detail {
.doc-detail {
background: #fff; background: #fff;
height: 100%; height: 100%;
@@ -351,16 +475,16 @@
line-height: 68px; line-height: 68px;
} }
} }
} }
.box-title-text { .box-title-text {
line-height: 1.4; line-height: 1.4;
display: flex; display: flex;
align-items: center; align-items: center;
margin-bottom: 10px; margin-bottom: 10px;
} }
.title-text { .title-text {
width: 70px; width: 70px;
color: #000F16; color: #000F16;
display: inline-block; display: inline-block;
@@ -372,41 +496,42 @@
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
} }
.box-input { .box-input {
display: inline-block; display: inline-block;
width: 70%; width: calc(100% - 70px);
height: 38px; height: 38px;
margin-top: 2px; margin-top: 2px;
} }
.box-top-text { .box-top-text {
font-size: 16px; font-size: 16px;
font-weight: 500; font-weight: 500;
color: #000F16; color: #000F16;
display: inline-block; display: inline-block;
} }
.box-top-content { .box-top-content {
width: 100%; width: 100%;
height: calc(100vh - 160px); height: calc(100vh - 200px);
margin-bottom: 20px; margin-bottom: 20px;
padding: 0 50px 10px 20px; padding: 0 50px 10px 20px;
box-sizing: border-box; box-sizing: border-box;
overflow: auto; overflow: auto;
} }
.box-button { .box-button {
height: 38px; height: 38px;
} display: inline-block;
}
#main { #main {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
.axis-tip { .axis-tip {
display: none; display: none;
position: absolute; position: absolute;
padding: 5px 5px; padding: 5px 5px;
@@ -416,9 +541,9 @@
background: #ffffff; background: #ffffff;
box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.2); box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.2);
border-radius: 4px; border-radius: 4px;
} }
.box-top-text-right { .box-top-text-right {
display: inline-block; display: inline-block;
float: right; float: right;
height: 38px; height: 38px;
@@ -426,16 +551,26 @@
margin-top: -4px; margin-top: -4px;
margin-right: 20px; margin-right: 20px;
margin-bottom: 10px; 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; width: 140px;
float: left; float: left;
padding-top: 68px; padding-top: 68px;
margin-right: 20px; margin-right: 20px;
} }
.box-top-content-left-text { .box-top-content-left-text {
color: #191E29; color: #191E29;
font-weight: bold; font-weight: bold;
font-size: 12px; font-size: 12px;
@@ -445,14 +580,14 @@
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
} }
.box-top-content-right { .box-top-content-right {
width: calc(100% - 160px); width: calc(100% - 160px);
float: left; float: left;
} }
.box-top-content-right-top { .box-top-content-right-top {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-between;
@@ -462,9 +597,9 @@
z-index: 100; z-index: 100;
padding-top: 25px; padding-top: 25px;
padding-left: 160px; padding-left: 160px;
} }
.box-top-content-right-top-text { .box-top-content-right-top-text {
border-left: 1px #EAEAEC solid; border-left: 1px #EAEAEC solid;
border-top: 1px #EAEAEC solid; border-top: 1px #EAEAEC solid;
border-bottom: 1px #EAEAEC solid; border-bottom: 1px #EAEAEC solid;
@@ -476,18 +611,18 @@
line-height: 36px; line-height: 36px;
letter-spacing: 0px; letter-spacing: 0px;
text-align: center; text-align: center;
} }
.box-top-content-right-top-text:last-child { .box-top-content-right-top-text:last-child {
border-right: 1px #EAEAEC solid; border-right: 1px #EAEAEC solid;
} }
.box-top-content-right-bottom { .box-top-content-right-bottom {
position: relative; position: relative;
padding-top: 60px; padding-top: 60px;
} }
.process-content { .process-content {
position: relative; position: relative;
height: 84px; height: 84px;
@@ -554,18 +689,18 @@
position: absolute; position: absolute;
top: 16px; top: 16px;
} }
} }
.box-top-content-right-xian { .box-top-content-right-xian {
width: 2px; width: 2px;
height: 100%; height: 100%;
border: 1px #21c9cc dashed; border: 1px #21c9cc dashed;
position: absolute; position: absolute;
top: -36px; top: -36px;
z-index: 999; z-index: 999;
} }
.box-top-content-right-text { .box-top-content-right-text {
position: absolute; position: absolute;
top: -60px; top: -60px;
color: #21c9cc; color: #21c9cc;
@@ -573,5 +708,9 @@
font-size: 14px; font-size: 14px;
width: 100px; width: 100px;
z-index: 101; z-index: 101;
} }
::v-deep .ant-row {
margin-right: 0 !important;
}
</style> </style>
@@ -6,7 +6,7 @@
<a-col :md="6" :sm="8"> <a-col :md="6" :sm="8">
<div class="box-title-text"> <div class="box-title-text">
<div class="title-text" :title="$t('entryName')"> <div class="title-text" :title="$t('entryName')">
<span>{{$t('entryName')}}</span> <span>{{ $t('entryName') }}</span>
</div> </div>
<j-input class="box-input" :placeholder="$t('PleaseEnter')+$t('entryName')" <j-input class="box-input" :placeholder="$t('PleaseEnter')+$t('entryName')"
v-model="queryParam.projectName"></j-input> v-model="queryParam.projectName"></j-input>
@@ -15,37 +15,38 @@
<a-col :md="6" :sm="8"> <a-col :md="6" :sm="8">
<div class="box-title-text"> <div class="box-title-text">
<div class="title-text" :title="$t('targetMarket')"> <div class="title-text" :title="$t('targetMarket')">
<span>{{$t('targetMarket')}}</span> <span>{{ $t('targetMarket') }}</span>
</div> </div>
<j-dict-select-tag class="box-input" v-model="queryParam.targetMarket" <j-dict-select-tag class="box-input" v-model="queryParam.targetMarket"
:placeholder="$t('PleaseSelect')+$t('targetMarket')" :placeholder="$t('PleaseSelect')+$t('targetMarket')"
:type="'select'" :type="'select'"
:triggerChange="false" :dictCode="'region'"/> :triggerChange="false" :dictCode="'region'" />
</div> </div>
</a-col> </a-col>
<a-col :md="6" :sm="8"> <a-col :md="6" :sm="8">
<div class="box-title-text"> <div class="box-title-text">
<div class="title-text" :title="$t('brand')"> <div class="title-text" :title="$t('brand')">
<span>{{$t('brand')}}</span> <span>{{ $t('brand') }}</span>
</div> </div>
<j-dict-select-tag class="box-input" v-model="queryParam.brand" <j-dict-select-tag class="box-input" v-model="queryParam.brand"
:placeholder="$t('PleaseSelect')+$t('brand')" :placeholder="$t('PleaseSelect')+$t('brand')"
:type="'select'" :type="'select'"
:triggerChange="false" :dictCode="'brand'"/> :triggerChange="false" :dictCode="'brand'" />
</div> </div>
</a-col> </a-col>
<span style="float: right;overflow: hidden;" class="table-page-search-submitButtons"> <span style="float: right;overflow: hidden;" class="table-page-search-submitButtons">
<a-col :md="6" :sm="24"> <a-col :md="6" :sm="24">
<a-button class="box-button" type="primary" @click="searchQuery">{{$t('query')}}</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-button class="box-button" style="margin-left: 8px"
@click="searchReset">{{ $t('reset') }}</a-button>
</a-col> </a-col>
</span> </span>
</a-row> </a-row>
</a-form> </a-form>
</div> </div>
<div class="box-top"> <div class="box-top">
<span class="box-top-text">{{$t('regulatoryCertificationTaskPlan')}}</span> <span class="box-top-text">{{ $t('regulatoryCertificationTaskPlan') }}</span>
<span class="box-top-text fullScreenView" @click="TaskPlanListClick">{{$t('fullScreenView')}}</span> <span class="box-top-text fullScreenView" @click="TaskPlanListClick">{{ $t('fullScreenView') }}</span>
<span style="float: right" class="box-top-text-right"> <span style="float: right" class="box-top-text-right">
<a-range-picker <a-range-picker
:placeholder="[this.$t('startMonth'), this.$t('endMonth')]" :placeholder="[this.$t('startMonth'), this.$t('endMonth')]"
@@ -59,7 +60,7 @@
> >
<div slot="renderExtraFooter" style="width: 100%;display: block"> <div slot="renderExtraFooter" style="width: 100%;display: block">
<div style="text-align: right;width: 100%;"> <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>
</div> </div>
</a-range-picker> </a-range-picker>
@@ -68,13 +69,21 @@
<!-- <div id="main"></div>--> <!-- <div id="main"></div>-->
<!-- <div class="axis-tip"></div>--> <!-- <div class="axis-tip"></div>-->
<div class="box-top-content-right-top"> <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>
<div style="overflow:visible;"> <div style="overflow:visible;">
<div class="box-top-content-left"> <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"> 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> </div>
<div class="box-top-content-right"> <div class="box-top-content-right">
@@ -83,12 +92,12 @@
<div class="process-content-right-xian"></div> <div class="process-content-right-xian"></div>
<div class="process-content-content" :style="val.left" <div class="process-content-content" :style="val.left"
v-for="(val,indexOne) in item.data[0]" :key="indexOne"> 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-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-button" v-if="indexOne % 2 == 1" :title="val.name">{{ val.name }}
</div> </div>
<a-tooltip placement="topLeft" overlayClassName="tooltipColor"> <a-tooltip placement="topLeft" overlayClassName="tooltipColor">
<template slot="title"> <template slot="title">
<span>{{val.time.slice(0,11)}}</span> <span>{{ val.time.slice(0, 11) }}</span>
</template> </template>
<img v-if="val.status == 1" src="../../../assets/done.svg" class="process-content-left" <img v-if="val.status == 1" src="../../../assets/done.svg" class="process-content-left"
alt=""> alt="">
@@ -104,17 +113,17 @@
</div> </div>
<div class="box-top-content-right-xian"></div> <div class="box-top-content-right-xian"></div>
<div class="box-top-content-right-text"> <div class="box-top-content-right-text">
{{handlingTime}} {{ handlingTime }}
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<JLoading :loading="loadingMain">{{this.$t('dataLoading')}}</JLoading> <JLoading :loading="loadingMain">{{ this.$t('dataLoading') }}</JLoading>
</div> </div>
</div> </div>
<div class="box-bottom"> <div class="box-bottom">
<span class="box-top-text">{{$t('projectStatusAndProgress')}}</span> <span class="box-top-text">{{ $t('projectStatusAndProgress') }}</span>
<span class="box-top-text fullScreenView" @click="projectNameClick">{{$t('fullScreenView')}}</span> <span class="box-top-text fullScreenView" @click="projectNameClick">{{ $t('fullScreenView') }}</span>
<div> <div>
<a-table <a-table
ref="table" ref="table"
@@ -127,32 +136,38 @@
:columns="columns" :columns="columns"
> >
<span slot="projectStatusTitle"> <span slot="projectStatusTitle">
<span>{{this.$t('CurrentStatusOfTheProject')}}</span><br/> <span>{{ this.$t('CurrentStatusOfTheProject') }}</span><br />
<span>{{'('+$t('red')+'/'+$t('yellow')+'/'+$t('green')+'/'+$t('blue')+')'}}</span> <span>{{ '(' + $t('red') + '/' + $t('yellow') + '/' + $t('green') + '/' + $t('blue') + ')' }}</span>
</span> </span>
<span slot="CertificationProgressTitle"> <span slot="CertificationProgressTitle">
<span>{{this.$t('CertificationProgress')}}</span><br/> <span>{{ this.$t('CertificationProgress') }}</span><br />
<span>{{'('+$t('notInvolved')+'/'+$t('toBeStarted')+'/'+$t('inProgress')+'/'+$t('experimentFailed')+'/'+$t('experimentPassed')+')'}}</span> <span>{{ '(' + $t('notInvolved') + '/' + $t('toBeStarted') + '/' + $t('inProgress') + '/' + $t('experimentFailed') + '/' + $t('experimentPassed') + ')'
}}</span>
</span> </span>
<span slot="listConfirmationStatusTitle"> <span slot="listConfirmationStatusTitle">
<span>{{this.$t('listConfirmation')}}</span><br/> <span>{{ this.$t('listConfirmation') }}</span><br />
<span>{{'('+$t('notLaunch')+'/'+$t('toBeConfirmed')+'/'+$t('accept')+'/'+$t('refuse')+')'}}</span> <span>{{ '(' + $t('notLaunch') + '/' + $t('toBeConfirmed') + '/' + $t('accept') + '/' + $t('refuse') + ')'
}}</span>
</span> </span>
<span slot="taskAffirmStatusTitle"> <span slot="taskAffirmStatusTitle">
<span>{{this.$t('taskAffirm')}}</span><br/> <span>{{ this.$t('taskAffirm') }}</span><br />
<span>{{'('+$t('notLaunch')+'/'+$t('toBeConfirmed')+'/'+$t('accept')+'/'+$t('refuse')+')'}}</span> <span>{{ '(' + $t('notLaunch') + '/' + $t('toBeConfirmed') + '/' + $t('accept') + '/' + $t('refuse') + ')'
}}</span>
</span> </span>
<span slot="designComplianceReviewTitle"> <span slot="designComplianceReviewTitle">
<span>{{this.$t('designComplianceReview')}}</span><br/> <span>{{ this.$t('designComplianceReview') }}</span><br />
<span>{{'('+$t('toBeConfirmed')+'/'+$t('accord')+'/'+$t('nonConformity')+'/'+$t('Tracked')+'/'+$t('notInvolved')+'/'+$t('taskTermination')+')'}}</span> <span>{{ '(' + $t('toBeConfirmed') + '/' + $t('accord') + '/' + $t('nonConformity') + '/' + $t('Tracked') + '/' + $t('notInvolved') + '/' + $t('taskTermination') + ')'
}}</span>
</span> </span>
<span slot="preHomeConfirmationTitle"> <span slot="preHomeConfirmationTitle">
<span>{{this.$t('preHomeConfirmation')}}</span><br/> <span>{{ this.$t('preHomeConfirmation') }}</span><br />
<span>{{'('+$t('toBeConfirmed')+'/'+$t('accord')+'/'+$t('nonConformity')+'/'+$t('Tracked')+'/'+$t('notInvolved')+'/'+$t('taskTermination')+')'}}</span> <span>{{ '(' + $t('toBeConfirmed') + '/' + $t('accord') + '/' + $t('nonConformity') + '/' + $t('Tracked') + '/' + $t('notInvolved') + '/' + $t('taskTermination') + ')'
}}</span>
</span> </span>
<span slot="verificationComplianceReviewTitle"> <span slot="verificationComplianceReviewTitle">
<span>{{this.$t('verificationComplianceReview')}}</span><br/> <span>{{ this.$t('verificationComplianceReview') }}</span><br />
<span>{{'('+$t('toBeConfirmed')+'/'+$t('accord')+'/'+$t('nonConformity')+'/'+$t('Tracked')+'/'+$t('notInvolved')+'/'+$t('taskTermination')+')'}}</span> <span>{{ '(' + $t('toBeConfirmed') + '/' + $t('accord') + '/' + $t('nonConformity') + '/' + $t('Tracked') + '/' + $t('notInvolved') + '/' + $t('taskTermination') + ')'
}}</span>
</span> </span>
</a-table> </a-table>
</div> </div>
@@ -161,14 +176,14 @@
</template> </template>
<script> <script>
import { getAction, postAction, deleteAction, downloadFile } from '@/api/manage' import { getAction, postAction, deleteAction, downloadFile } from '@/api/manage'
import * as echarts from 'echarts' import * as echarts from 'echarts'
import moment from 'moment' import moment from 'moment'
import { ResizeHeader, ResizeColumnProvide } from '@/mixins/header' import { ResizeHeader, ResizeColumnProvide } from '@/mixins/header'
export default { export default {
name: 'index', name: 'index',
mixins:[ResizeHeader, ResizeColumnProvide], mixins: [ResizeHeader, ResizeColumnProvide],
data() { data() {
return { return {
queryParam: {}, queryParam: {},
@@ -458,6 +473,7 @@
}) })
this.timeData = timeData this.timeData = timeData
console.log(this.timeData)
this.timeData = [...this.timeData] this.timeData = [...this.timeData]
this.loadingMain = false this.loadingMain = false
}, 500) }, 500)
@@ -495,30 +511,48 @@
path: '/projectStatusAndProgress' path: '/projectStatusAndProgress'
}) })
window.open(newUrl.href, '_blank') window.open(newUrl.href, '_blank')
},
projectInfoClick(item){
let newUrl = this.$router.resolve({
path: '/ProjectDetails',
query: item
})
window.open(newUrl.href, '_blank')
},
} }
} }
}
</script> </script>
<style> <style>
.box-top-text-right .ant-calendar-picker-input { .box-top-text-right .ant-calendar-picker-input {
height: 38px; height: 38px;
width: 300px; width: 300px;
} }
.ant-calendar-footer-btn .ant-calendar-footer-extra{
.ant-calendar-footer-btn .ant-calendar-footer-extra {
float: right; 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>
<style scoped lang="less"> <style scoped lang="less">
@import'~@assets/less/common.less'; @import '~@assets/less/common.less';
.box-title-text { .box-title-text {
line-height: 1.4; line-height: 1.4;
display: flex; display: flex;
align-items: center; align-items: center;
margin-bottom: 10px; margin-bottom: 10px;
} }
.title-text { .title-text {
width: 70px; width: 70px;
color: #000F16; color: #000F16;
display: inline-block; display: inline-block;
@@ -530,42 +564,42 @@
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
} }
.box-input { .box-input {
display: inline-block; display: inline-block;
width: 70%; width: 70%;
height: 38px; height: 38px;
margin-top: 2px; margin-top: 2px;
} }
.box-top-text { .box-top-text {
font-size: 16px; font-size: 16px;
font-weight: 500; font-weight: 500;
color: #000F16; color: #000F16;
margin-bottom: 20px; margin-bottom: 20px;
display: inline-block; display: inline-block;
} }
.box-top-content { .box-top-content {
width: 100%; width: 100%;
height: 500px; height: 500px;
margin-bottom: 20px; margin-bottom: 20px;
padding: 0 58px 20px 10px; padding: 0 58px 20px 10px;
box-sizing: border-box; box-sizing: border-box;
overflow: auto; overflow: auto;
} }
.box-button { .box-button {
height: 38px; height: 38px;
} }
#main { #main {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
.axis-tip { .axis-tip {
display: none; display: none;
position: absolute; position: absolute;
padding: 5px 5px; padding: 5px 5px;
@@ -575,30 +609,30 @@
background: #ffffff; background: #ffffff;
box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.2); box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.2);
border-radius: 4px; border-radius: 4px;
} }
.box-top-text-right { .box-top-text-right {
display: inline-block; display: inline-block;
float: right; float: right;
height: 38px; height: 38px;
width: 300px; width: 300px;
margin-top: -4px; margin-top: -4px;
} }
.fullScreenView { .fullScreenView {
margin-left: 16px; margin-left: 16px;
color: #21c9cc; color: #21c9cc;
cursor: pointer; cursor: pointer;
} }
.box-top-content-left { .box-top-content-left {
width: 140px; width: 140px;
float: left; float: left;
padding-top: 57px; padding-top: 57px;
margin-right: 20px; margin-right: 20px;
} }
.box-top-content-left-text { .box-top-content-left-text {
color: #191E29; color: #191E29;
font-weight: bold; font-weight: bold;
font-size: 12px; font-size: 12px;
@@ -608,14 +642,14 @@
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
} }
.box-top-content-right { .box-top-content-right {
width: calc(100% - 160px); width: calc(100% - 160px);
float: left; float: left;
} }
.box-top-content-right-top { .box-top-content-right-top {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-between;
@@ -625,9 +659,9 @@
z-index: 100; z-index: 100;
padding-top: 20px; padding-top: 20px;
padding-left: 160px; padding-left: 160px;
} }
.box-top-content-right-top-text { .box-top-content-right-top-text {
border-left: 1px #EAEAEC solid; border-left: 1px #EAEAEC solid;
border-top: 1px #EAEAEC solid; border-top: 1px #EAEAEC solid;
border-bottom: 1px #EAEAEC solid; border-bottom: 1px #EAEAEC solid;
@@ -640,18 +674,18 @@
line-height: 36px; line-height: 36px;
letter-spacing: 0px; letter-spacing: 0px;
text-align: center; text-align: center;
} }
.box-top-content-right-top-text:last-child { .box-top-content-right-top-text:last-child {
border-right: 1px #EAEAEC solid; border-right: 1px #EAEAEC solid;
} }
.box-top-content-right-bottom { .box-top-content-right-bottom {
position: relative; position: relative;
padding-top: 50px; padding-top: 50px;
} }
.process-content { .process-content {
position: relative; position: relative;
height: 84px; height: 84px;
@@ -718,18 +752,18 @@
position: absolute; position: absolute;
top: 16px; top: 16px;
} }
} }
.box-top-content-right-xian { .box-top-content-right-xian {
width: 2px; width: 2px;
height: 100%; height: 100%;
border: 1px #21c9cc dashed; border: 1px #21c9cc dashed;
position: absolute; position: absolute;
top: -36px; top: -36px;
z-index: 999; z-index: 999;
} }
.box-top-content-right-text { .box-top-content-right-text {
position: absolute; position: absolute;
top: -60px; top: -60px;
color: #21c9cc; color: #21c9cc;
@@ -737,13 +771,14 @@
font-size: 14px; font-size: 14px;
width: 100px; width: 100px;
z-index: 101; z-index: 101;
} }
/deep/.ant-table-column-title{ /deep/ .ant-table-column-title {
font-weight: bold!important; font-weight: bold !important;
} }
::v-deep .ant-table-placeholder{ ::v-deep .ant-table-placeholder {
margin-top: 8px !important; margin-top: 8px !important;
} }
</style> </style>
@@ -61,7 +61,7 @@
dataIndex: 'projectName', dataIndex: 'projectName',
scopedSlots: { customRender: 'RelatedItems' }, scopedSlots: { customRender: 'RelatedItems' },
ellipsis: true, ellipsis: true,
width: 170 width: 130
}, },
{ {
title: this.$t('standardInformation'), title: this.$t('standardInformation'),
@@ -69,7 +69,7 @@
dataIndex: 'standardInfo', dataIndex: 'standardInfo',
scopedSlots: { customRender: 'standardInformation' }, scopedSlots: { customRender: 'standardInformation' },
ellipsis: true, ellipsis: true,
width: 170 width: 330
}, },
{ {
title: this.$t('taskType'), title: this.$t('taskType'),
@@ -83,28 +83,28 @@
align: 'left', align: 'left',
dataIndex: 'lastAssigneeName', dataIndex: 'lastAssigneeName',
ellipsis: true, ellipsis: true,
width: 170 width: 150
}, },
{ {
title: this.$t('CurrentProcessor'), title: this.$t('CurrentProcessor'),
align: 'left', align: 'left',
dataIndex: 'assigneeName', dataIndex: 'assigneeName',
ellipsis: true, ellipsis: true,
width: 170 width: 130
}, },
{ {
title: this.$t('TaskCutOffTime'), title: this.$t('TaskCutOffTime'),
align: 'left', align: 'left',
dataIndex: 'endTime', dataIndex: 'endTime',
ellipsis: true, ellipsis: true,
width: 170 width: 150
}, },
{ {
title: this.$t('taskStatus'), title: this.$t('taskStatus'),
align: 'left', align: 'left',
dataIndex: 'statusShow', dataIndex: 'statusShow',
ellipsis: true, ellipsis: true,
width: 170 width: 130
}, },
{ {
title: this.$t('operation'), title: this.$t('operation'),
@@ -62,7 +62,7 @@
dataIndex: 'projectName', dataIndex: 'projectName',
ellipsis: true, ellipsis: true,
scopedSlots: { customRender: 'RelatedItems' }, scopedSlots: { customRender: 'RelatedItems' },
width: 170 width: 110
}, },
{ {
title: this.$t('standardInformation'), title: this.$t('standardInformation'),
@@ -70,28 +70,28 @@
dataIndex: 'standardInfo', dataIndex: 'standardInfo',
ellipsis: true, ellipsis: true,
scopedSlots: { customRender: 'standardInformation' }, scopedSlots: { customRender: 'standardInformation' },
width: 170 width: 260
}, },
{ {
title: this.$t('taskType'), title: this.$t('taskType'),
align: 'left', align: 'left',
dataIndex: 'flowTypeShow', dataIndex: 'flowTypeShow',
ellipsis: true, ellipsis: true,
width: 170 width: 120
}, },
{ {
title: this.$t('Sponsor'), title: this.$t('Sponsor'),
align: 'left', align: 'left',
dataIndex: 'createBy', dataIndex: 'createBy',
ellipsis: true, ellipsis: true,
width: 170 width: 100
}, },
{ {
title: this.$t('TaskCutOffTime'), title: this.$t('TaskCutOffTime'),
align: 'left', align: 'left',
dataIndex: 'endTime', dataIndex: 'endTime',
ellipsis: true, ellipsis: true,
width: 170, width: 110,
scopedSlots: { customRender: 'endTime' } scopedSlots: { customRender: 'endTime' }
}, },
{ {
@@ -99,13 +99,13 @@
align: 'left', align: 'left',
dataIndex: 'statusShow', dataIndex: 'statusShow',
ellipsis: true, ellipsis: true,
width: 170 width: 80
}, },
{ {
title: this.$t('operation'), title: this.$t('operation'),
align: 'left', align: 'left',
fixed: 'right', fixed: 'right',
width: 120, width: 80,
scopedSlots: { customRender: 'operation' } scopedSlots: { customRender: 'operation' }
} }
], ],
@@ -67,7 +67,7 @@
dataIndex: 'projectName', dataIndex: 'projectName',
ellipsis: true, ellipsis: true,
scopedSlots: { customRender: 'RelatedItems' }, scopedSlots: { customRender: 'RelatedItems' },
width: 170 width: 130
}, },
{ {
title: this.$t('standardInformation'), title: this.$t('standardInformation'),
@@ -75,7 +75,7 @@
dataIndex: 'standardInfo', dataIndex: 'standardInfo',
ellipsis: true, ellipsis: true,
scopedSlots: { customRender: 'standardInformation' }, scopedSlots: { customRender: 'standardInformation' },
width: 170 width: 330
}, },
{ {
title: this.$t('taskType'), title: this.$t('taskType'),
@@ -89,28 +89,28 @@
align: 'left', align: 'left',
dataIndex: 'createBy', dataIndex: 'createBy',
ellipsis: true, ellipsis: true,
width: 170 width: 130
}, },
{ {
title: this.$t('CurrentProcessor'), title: this.$t('CurrentProcessor'),
align: 'left', align: 'left',
dataIndex: 'assigneeName', dataIndex: 'assigneeName',
ellipsis: true, ellipsis: true,
width: 170 width: 130
}, },
{ {
title: this.$t('TaskCutOffTime'), title: this.$t('TaskCutOffTime'),
align: 'left', align: 'left',
dataIndex: 'endTime', dataIndex: 'endTime',
ellipsis: true, ellipsis: true,
width: 170 width: 150
}, },
{ {
title: this.$t('taskStatus'), title: this.$t('taskStatus'),
align: 'left', align: 'left',
dataIndex: 'statusShow', dataIndex: 'statusShow',
ellipsis: true, ellipsis: true,
width: 170 width: 130
}, },
{ {
title: this.$t('operation'), title: this.$t('operation'),
@@ -60,42 +60,42 @@
dataIndex: 'standardInfo', dataIndex: 'standardInfo',
scopedSlots: { customRender: 'standardInformation' }, scopedSlots: { customRender: 'standardInformation' },
ellipsis: true, ellipsis: true,
width: 170 width: 330
}, },
{ {
title: this.$t('taskType'), title: this.$t('taskType'),
align: 'left', align: 'left',
dataIndex: 'flowTypeShow', dataIndex: 'flowTypeShow',
ellipsis: true, ellipsis: true,
width: 170 width: 130
}, },
{ {
title: this.$t('LastProcessor'), title: this.$t('LastProcessor'),
align: 'left', align: 'left',
dataIndex: 'lastAssigneeName', dataIndex: 'lastAssigneeName',
ellipsis: true, ellipsis: true,
width: 170 width: 130
}, },
{ {
title: this.$t('CurrentProcessor'), title: this.$t('CurrentProcessor'),
align: 'left', align: 'left',
dataIndex: 'assigneeName', dataIndex: 'assigneeName',
ellipsis: true, ellipsis: true,
width: 170 width: 130
}, },
{ {
title: this.$t('TaskCutOffTime'), title: this.$t('TaskCutOffTime'),
align: 'left', align: 'left',
dataIndex: 'endTime', dataIndex: 'endTime',
ellipsis: true, ellipsis: true,
width: 170 width: 150
}, },
{ {
title: this.$t('taskStatus'), title: this.$t('taskStatus'),
align: 'left', align: 'left',
dataIndex: 'statusShow', dataIndex: 'statusShow',
ellipsis: true, ellipsis: true,
width: 170 width: 130
}, },
{ {
title: this.$t('operation'), title: this.$t('operation'),
@@ -58,28 +58,28 @@
dataIndex: 'standardInfo', dataIndex: 'standardInfo',
scopedSlots: { customRender: 'standardInformation' }, scopedSlots: { customRender: 'standardInformation' },
ellipsis: true, ellipsis: true,
width: 170 width: 330
}, },
{ {
title: this.$t('taskType'), title: this.$t('taskType'),
align: 'left', align: 'left',
dataIndex: 'flowTypeShow', dataIndex: 'flowTypeShow',
ellipsis: true, ellipsis: true,
width: 170 width: 130
}, },
{ {
title: this.$t('Sponsor'), title: this.$t('Sponsor'),
align: 'left', align: 'left',
dataIndex: 'createBy', dataIndex: 'createBy',
ellipsis: true, ellipsis: true,
width: 170 width: 130
}, },
{ {
title: this.$t('TaskCutOffTime'), title: this.$t('TaskCutOffTime'),
align: 'left', align: 'left',
dataIndex: 'endTime', dataIndex: 'endTime',
ellipsis: true, ellipsis: true,
width: 170, width: 150,
scopedSlots: { customRender: 'endTime' } scopedSlots: { customRender: 'endTime' }
}, },
{ {
@@ -87,7 +87,7 @@
align: 'left', align: 'left',
dataIndex: 'statusShow', dataIndex: 'statusShow',
ellipsis: true, ellipsis: true,
width: 170 width: 130
}, },
{ {
title: this.$t('operation'), title: this.$t('operation'),
@@ -57,42 +57,42 @@
dataIndex: 'standardInfo', dataIndex: 'standardInfo',
ellipsis: true, ellipsis: true,
scopedSlots: { customRender: 'standardInformation' }, scopedSlots: { customRender: 'standardInformation' },
width: 170 width: 330
}, },
{ {
title: this.$t('taskType'), title: this.$t('taskType'),
align: 'left', align: 'left',
dataIndex: 'flowTypeShow', dataIndex: 'flowTypeShow',
ellipsis: true, ellipsis: true,
width: 170 width: 130
}, },
{ {
title: this.$t('Sponsor'), title: this.$t('Sponsor'),
align: 'left', align: 'left',
dataIndex: 'createBy', dataIndex: 'createBy',
ellipsis: true, ellipsis: true,
width: 170 width: 130
}, },
{ {
title: this.$t('CurrentProcessor'), title: this.$t('CurrentProcessor'),
align: 'left', align: 'left',
dataIndex: 'assigneeName', dataIndex: 'assigneeName',
ellipsis: true, ellipsis: true,
width: 170 width: 130
}, },
{ {
title: this.$t('TaskCutOffTime'), title: this.$t('TaskCutOffTime'),
align: 'left', align: 'left',
dataIndex: 'endTime', dataIndex: 'endTime',
ellipsis: true, ellipsis: true,
width: 170 width: 150
}, },
{ {
title: this.$t('taskStatus'), title: this.$t('taskStatus'),
align: 'left', align: 'left',
dataIndex: 'statusShow', dataIndex: 'statusShow',
ellipsis: true, ellipsis: true,
width: 170 width: 130
}, },
{ {
title: this.$t('operation'), title: this.$t('operation'),