合并分支 'fix_20230508' 到 'master'

Fix 20230508

查看合并请求 laws-nio/laws-weilai!324
This commit is contained in:
高嵩
2023-05-15 09:01:54 +08:00
18 changed files with 611 additions and 267 deletions
@@ -106,4 +106,8 @@ public class ProjectRelatedPersonnel implements Serializable {
//批量设置传参ids
@TableField(exist = false)
private String ids;
// 一级责任领域(统计节点)
@TableField(exist = false)
private String firstLevelDutyTerritory;
}
@@ -28,8 +28,10 @@ import com.jero.modules.system.entity.SysUser;
import com.jero.modules.system.mapper.SysDictItemMapper;
import com.jero.modules.system.mapper.SysDictMapper;
import com.jero.modules.system.mapper.SysUserMapper;
import com.jero.modules.system.service.ISysDictItemService;
import com.jero.modules.system.service.ISysDictService;
import com.jero.modules.system.service.ISysUserService;
import com.jero.modules.system.service.impl.SysDictItemServiceImpl;
import com.jero.modules.system.util.StringUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.IOUtils;
@@ -108,6 +110,9 @@ public class ProjectRelatedPersonnelServiceImpl extends ServiceImpl<ProjectRelat
@Autowired
private ProjectLibraryBaseMapper projectLibraryBaseMapper;
@Autowired
private ISysDictItemService sysDictItemService;
/**
* 保存
*
@@ -334,6 +339,9 @@ public class ProjectRelatedPersonnelServiceImpl extends ServiceImpl<ProjectRelat
}
public void disposeData(List<ProjectRelatedPersonnel> records) {
List<SysDictItem> sysDictItems = this.sysDictItemService.selectItemsAll();
Map<String, List<SysDictItem>> firstLevelDutyTerritoryMap = this.sysDictItemService.getFirstLevelSysDictItemByDictCode(DictCodeEnum.DUTY_TERRITORY.getValue(),sysDictItems);
for (ProjectRelatedPersonnel projectRelatedPersonnel:records) {
//法规工程师
List<SysUser> lawEngineerUsers = new ArrayList<>();
@@ -459,6 +467,28 @@ public class ProjectRelatedPersonnelServiceImpl extends ServiceImpl<ProjectRelat
projectRelatedPersonnel.setEngineerAttSetName(AttSetName.substring(0,AttSetName.toString().length()-1));
}
}
String dutyTerritory = projectRelatedPersonnel.getDutyTerritory();
for (Map.Entry<String, List<SysDictItem>> firstLevelMap : firstLevelDutyTerritoryMap.entrySet()) {
String firstLevel = firstLevelMap.getKey();
List<SysDictItem> dutyTerritoryList = firstLevelMap.getValue();
if(StringUtils.isEmpty(firstLevel) && CollectionUtils.isEmpty(dutyTerritoryList)){
continue;
}
List<SysDictItem> dutyTerritoryListTemp = dutyTerritoryList.stream().filter(sysDictItem -> {
boolean flag = false;
if (StringUtils.equals(sysDictItem.getItemValue(), dutyTerritory)) {
flag = true;
}
return flag;
}).collect(Collectors.toList());
if(CollectionUtils.isNotEmpty(dutyTerritoryListTemp)){
projectRelatedPersonnel.setFirstLevelDutyTerritory(firstLevel);
break;
}
}
}
}
+3
View File
@@ -1831,4 +1831,7 @@ module.exports = {
proportionWithInTheAreaOfResponsibility:'Proportion within the area of responsibility',
contentsearch:'Content Search',
masterProject:'Master Project',
deliveryTime:'Delivery Time',
expectedDeliveryTime:'Expected Delivery Time',
changeAuthor:'Change Author',
}
+3
View File
@@ -1932,4 +1932,7 @@ module.exports = {
proportionWithInTheAreaOfResponsibility:'责任领域内占比',
contentsearch:'内容搜索',
masterProject:'主项目',
deliveryTime:'交付时间',
expectedDeliveryTime:'预计交付时间',
changeAuthor:'更改作者',
}
@@ -12,9 +12,9 @@
<div style="padding-top: 68px;background: #fff">
<div class="detail-content" style="padding: 30px">
<div class="search-detail-wrap">
<a-form layout="inline" style="width: 1200px;margin: 0 auto" @keyup.enter.native="onSearch">
<a-form layout="inline" @keyup.enter.native="onSearch">
<a-row :gutter="24">
<a-col :span="10">
<a-col :span="6">
<div class="box-title-text">
<div class="title-text" :title="$t('searchContent')">
<span>{{$t('searchContent')}}</span>
@@ -23,7 +23,7 @@
v-model="queryParam.searchStr"></a-input>
</div>
</a-col>
<a-col :span="10">
<a-col :span="6">
<div class="box-title-text">
<div class="title-text" :title="$t('releaseStatus')">
<span>{{$t('releaseStatus')}}</span>
@@ -40,10 +40,29 @@
</a-select>
</div>
</a-col>
<a-col :span="6">
<div class="box-title-text">
<div class="title-text" :title="$t('displayPermission')">
<span>{{$t('displayPermission')}}</span>
</div>
<a-select :placeholder="$t('PleaseSelect')+$t('displayPermission')"
v-model="queryParam.showPermissions">
<a-select-option v-for="(item, key) in projectNameList"
:key="key"
:value="item.value">
<span class="selectText" :title=" item.name ">
{{ item.name}}
</span>
</a-select-option>
</a-select>
</div>
</a-col>
<div style="text-align: right">
<a-button class="box-button" @click="ResetSearch">{{$t('reset')}}
</a-button>
<a-button class="box-button" style="margin-left: 8px" type="primary" @click="onSearch">{{$t('query')}}</a-button>
<a-button class="box-button" style="margin-left: 8px" type="primary" @click="onSearch">
{{$t('query')}}
</a-button>
</div>
</a-row>
</a-form>
@@ -55,7 +74,7 @@
<!-- <a-checkbox :value="item.id" class="checkbox-left"></a-checkbox>-->
<div class="text-text-right">
<div class="text-header" @click="titleClick(item)">
<a-tooltip placement="topLeft" :mouseEnterDelay="0.5">
<a-tooltip placement="topLeft" overlayClassName="header-top" :mouseEnterDelay="0.5">
<template slot="title">
<span v-html="item.title"></span>
</template>
@@ -75,6 +94,8 @@
{{item.createBy}}
</div>
<div class="text-text-right-text">
<a style="margin-right: 10px" @click="changeAuthorClick(item)"
v-if="administrators">{{$t('changeAuthor')}}</a>
<a style="margin-right: 10px" @click="edit(item)"
v-if="userInfoQuery.username == item.createBy || administrators">{{$t('edit')}}</a>
<a @click="deleteData(item)"
@@ -103,15 +124,21 @@
</div>
<JLoading :loading="loading">{{$t('dataLoading')}}</JLoading>
</div>
<SelectedBy ref="SelectedByRef" :isSingleChoice="true"
:title="$t('changeAuthor')" @SelectedByForm="SelectedByForm"></SelectedBy>
</div>
</template>
<script>
import { getAction, postAction, putAction, deleteAction } from '@/api/manage'
import SelectedBy from '@/components/SelectedBy/index'
import { mapGetters } from 'vuex'
export default {
name: 'problemKnowledgeBaseRelease',
components: {
SelectedBy
},
data() {
return {
checkboxText: [],
@@ -129,14 +156,26 @@
value: 'Have released'
}
],
projectNameList: [
{
value: 'Open',
name: this.$t('OpenOne')
},
{
value: 'Privacy',
name: this.$t('Privacy')
}
],
loading: false,
administrators: false,
downLoadFileUrl: window._CONFIG['domianPreviewURL'] + '/sys/common/download',
pageNo: 1,
userInfoQuery: {},
formInline: {},
url: {
getInfoList: '/problemKnowledgeBase/problemKnowledgeBaseEO/page',
deleteBatch: '/problemKnowledgeBase/problemKnowledgeBaseEO/deleteBatch'
deleteBatch: '/problemKnowledgeBase/problemKnowledgeBaseEO/deleteBatch',
edit: '/problemKnowledgeBase/problemKnowledgeBaseEO/edit'
}
}
},
@@ -155,6 +194,28 @@
},
methods: {
...mapGetters(['userInfo']),
changeAuthorClick(item) {
this.formInline = item
this.$refs.SelectedByRef.getPush()
},
//转办接口
SelectedByForm(userIds, name) {
let query = {
createBy: name,
id: this.formInline.id
}
putAction(this.url.edit, query).then((res) => {
if (res.success) {
this.$message.success(this.$t('OperationSuccessful'))
this.$refs.SelectedByRef.visible = false
this.$refs.SelectedByRef.submitLoading = false
this.getList()
} else {
this.$refs.SelectedByRef.submitLoading = false
this.$message.warning(this.$t('operationFailed'))
}
})
},
pageOnChange(page, pageSize) {
this.pageNo = page
this.getList()
@@ -252,7 +313,7 @@
</script>
<style scoped lang="less">
@import'~@assets/less/common.less';
@import '~@assets/less/common.less';
.doc-detail {
background: #fff;
@@ -328,7 +389,7 @@
.text-text-right {
padding: 19px 19px;
width: calc(100% - 540px);
width: calc(100% - 570px);
box-sizing: border-box;
/*margin-left: 38px;*/
}
@@ -338,7 +399,7 @@
height: 100%;
text-align: center;
position: absolute;
right: 300px;
right: 330px;
top: 50%;
transform: translate-Y(-50%);
}
@@ -348,7 +409,7 @@
height: 100%;
text-align: center;
position: absolute;
right: 420px;
right: 450px;
top: 50%;
transform: translate-Y(-50%);
}
@@ -358,13 +419,13 @@
height: 100%;
text-align: center;
position: absolute;
right: 180px;
right: 210px;
top: 50%;
transform: translate-Y(-50%);
}
.text-text-right-text {
width: 180px;
width: 210px;
height: 100%;
text-align: center;
position: absolute;
@@ -473,4 +534,9 @@
.box-button {
height: 38px;
}
</style>
<style>
.header-top .ant-tooltip-inner{
color: #333!important;
}
</style>
@@ -1,7 +1,7 @@
<template>
<div class="monthlyReportRegulations-box">
<div class="header-text">
<div class="header-text-left">{{this.$t('monthlyReportRegulations')}}</div>
<div class="header-text-left">{{this.$t('problemKnowledgeBase')}}</div>
<div class="header-text-right" @click="moreClick">
More
<img src="../../../assets/gengduo.png" alt="">
@@ -846,11 +846,11 @@
}
.text-field-right {
width: calc(66.6% - 130px);
width: calc(100% - 130px);
display: inline-block;
font-size: 14px;
text-overflow: ellipsis;
white-space: nowrap;
white-space: pre-wrap;
word-break: break-word;
overflow: hidden;
float: left;
@@ -26,6 +26,7 @@
</div>
<div class="dic-list-table">
<list-table v-if="dictVal=='list'&&dataFlag" :tableData="tableData" @editDict="editDict"
:record="record"
@deleteDict="deleteDict" :total="total" :queryParams="queryParams" @selected="selectedKeys"
@ok="ok"></list-table>
<tree-table v-if="dictVal=='tree'&&dataFlag" :tabletreeData="tabletreeData" :record="record"
@@ -1,30 +1,30 @@
<template>
<div class="list-table">
<a-table :data-source="tableData" :scroll="{x: 900}"
:columns="columns" rowKey="id"
:components="drag(columns,'columns')"
:row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }"
:pagination="false"
class="tag-con-table">
<div class="list-table">
<a-table :data-source="tableData" :scroll="{x: 900}"
:columns="columns" rowKey="id"
:components="drag(columns,'columns')"
:row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }"
:pagination="false"
class="tag-con-table">
<template slot="action" slot-scope="text, record">
<a class="action-edit" href="javascript:;" @click="actionEdit(record)" v-has="'bqnrzdpzxlbj'">{{$t('edit')}}</a>
<a class="action-delete" href="javascript:;" @click="onDelete(record)" v-has="'dictItem:logicDelete'">{{$t('delete')}}</a>
</template>
</a-table>
<div class="page" v-if="tableData.length > 0">
<a-pagination
:show-total="total => $t('total')+` ${total} `+$t('strip')"
show-quick-jumper
show-size-changer
:current="queryParams.pageNo"
:page-size.sync="queryParams.pageSize"
:total="total"
@change="onChangePage"
@showSizeChange="SizeChange"
/>
</div>
<template slot="action" slot-scope="text, record">
<a class="action-edit" href="javascript:;" @click="actionEdit(record)" v-has="'bqnrzdpzxlbj'">{{$t('edit')}}</a>
<a class="action-delete" href="javascript:;" @click="onDelete(record)" v-has="'dictItem:logicDelete'">{{$t('delete')}}</a>
</template>
</a-table>
<div class="page" v-if="tableData.length > 0">
<a-pagination
:show-total="total => $t('total')+` ${total} `+$t('strip')"
show-quick-jumper
show-size-changer
:current="queryParams.pageNo"
:page-size.sync="queryParams.pageSize"
:total="total"
@change="onChangePage"
@showSizeChange="SizeChange"
/>
</div>
</div>
</template>
<script>
@@ -32,115 +32,140 @@
export default {
name: 'listTable',
props:{
tableData:Array,
total:Number,
queryParams: Object
props: {
tableData: Array,
total: Number,
queryParams: Object,
record: Object
},
mixins:[ResizeHeader, ResizeColumnProvide],
data(){
return{
mixins: [ResizeHeader, ResizeColumnProvide],
data() {
return {
// tableData:[],
selectedRowKeys:[],
selectedRowKeys: [],
// total:0,
// queryParams:{
// pageNo:1,
// pageSize:10
// }, //搜索条件
columns: [
columnsAll: [
{
title: this.$t('name'),
dataIndex: 'itemText',
key: 'itemText',
align: "left",
align: 'left',
ellipsis: true,
width: 100,
width: 100
},
{
title: this.$t('enName'),
align: "left",
align: 'left',
width: 100,
ellipsis: true,
dataIndex: 'enName',
dataIndex: 'enName'
},
{
title: this.$t('statisticalNodes'),
align: 'left',
dataIndex: 'statNode',
ellipsis: true,
width: 100
},
{
title: this.$t('describe'),
align: "left",
align: 'left',
width: 100,
ellipsis: true,
dataIndex: 'description',
dataIndex: 'description'
},
{
title: this.$t('operation'),
dataIndex: 'action',
scopedSlots: {customRender: 'action'},
align: "left",
scopedSlots: { customRender: 'action' },
align: 'left',
width: 170
}
],
dataFlag:false
dataFlag: false
}
},
mounted() {
// this.loadData()
console.log(this.record)
},
methods:{
//获取列表数据
loadData(){
this.dataFlag=false
let params={
...this.queryParams,
dictId:this.record.id
computed: {
columns() {
let columnsAll = JSON.parse(JSON.stringify(this.columnsAll))
if (this.record.id != '1513417672023441409') {
for (let i = 0; i < columnsAll.length; i++) {
if (columnsAll[i].dataIndex == 'statNode') {
columnsAll.splice(i, 1)
i--
}
}
}
getAction(`sys/dictItem/page`,params).then(res=>{
if(res.success){
this.tableData=[...res.result.records]
this.dataFlag=true
return columnsAll
}
},
methods: {
//获取列表数据
loadData() {
this.dataFlag = false
let params = {
...this.queryParams,
dictId: this.record.id
}
getAction(`sys/dictItem/page`, params).then(res => {
if (res.success) {
this.tableData = [...res.result.records]
this.dataFlag = true
}
})
},
//编辑
actionEdit(val){
this.$emit('editDict',val,true)
actionEdit(val) {
this.$emit('editDict', val, true)
},
//删除
onDelete(val){
this.$emit('deleteDict',val.id,true)
onDelete(val) {
this.$emit('deleteDict', val.id, true)
},
onSelectChange(selectedRowKeys) {
this.selectedRowKeys = selectedRowKeys;
this.$emit('selected',this.selectedRowKeys)
this.selectedRowKeys = selectedRowKeys
this.$emit('selected', this.selectedRowKeys)
},
//点击页数
onChangePage(page,pageSize){
onChangePage(page, pageSize) {
this.queryParams.pageNo = page
this.$emit('ok',this.queryParams)
this.$emit('ok', this.queryParams)
// this.loadData()
},
//一页显示条数
SizeChange(page,pageSize){
SizeChange(page, pageSize) {
this.queryParams.pageSize = pageSize
this.queryParams.pageNo=1
this.$emit('ok',this.queryParams)
this.queryParams.pageNo = 1
this.$emit('ok', this.queryParams)
// this.loadData()
},
}
}
}
</script>
<style lang="less" scoped>
.list-table{
.tag-con-table{
.action-edit{
.list-table {
.tag-con-table {
.action-edit {
margin-right: 5px;
}
.action-delete{
color:red;
.action-delete {
color: red;
}
}
.page{
.page {
margin-top: 20px;
text-align: right;
}
@@ -270,6 +270,9 @@
this.textColor(this.$t('projectDetails'))
this.textTitle = this.$t('projectDetails')
} else if (this.$route.query.type == '102') {
if (this.$route.query.dutyTerritoryName){
this.areaOfResponsibilityList = this.$route.query
}
this.textColor(this.$t('listOfRegulations'))
this.textTitle = this.$t('listOfRegulations')
} else if (this.$route.query.type == '103') {
@@ -285,6 +288,9 @@
this.textColor(this.$t('TaskParameterCollection'))
this.textTitle = this.$t('TaskParameterCollection')
} else if (this.$route.query.type == '106') {
if (this.$route.query.dutyTerritoryName){
this.areaOfResponsibility = this.$route.query
}
this.textColor(this.$t('certificationList'))
this.textTitle = this.$t('certificationList')
}
@@ -310,7 +310,7 @@
myChart.on('click', (params) => {
console.log(params)
let query = {
title: params.seriesName,
title: params.seriesName+'-'+params.name,
projectLibraryId: this.$route.query.id
}
if (params.seriesName === this.$t('certificationTaskConfirmation')) {
@@ -1,6 +1,6 @@
<template>
<a-drawer
:title="$t('Add')"
:title="$t('add')"
:maskClosable="false"
:width="1000"
placement="right"
@@ -295,6 +295,13 @@
visible: false,
queryParam: {},
columnsAll: [
{
title: this.$t('statisticalNodes'),
align: 'left',
dataIndex: 'firstLevelDutyTerritory',
ellipsis: true,
width: 100
},
{
title: this.$t('areaOfResponsibility'),
align: 'left',
@@ -150,21 +150,21 @@
let query = {}
if (params.seriesName == this.$t('regulatoryTaskConfirmation')) {
query = {
title: params.seriesName,
title: params.seriesName+'-'+params.name,
projectLibraryId: this.$route.query.id,
operatorType: 'queryFGTaskToConfirmStatistics',
status: params.data.status
}
} else if (params.seriesName == this.$t('designCompliance')) {
query = {
title: params.seriesName,
title: params.seriesName+'-'+params.name,
projectLibraryId: this.$route.query.id,
operatorType: 'queryDesignStatistics',
status: params.data.status
}
} else if (params.seriesName == this.$t('verifyCompliance')) {
query = {
title: params.seriesName,
title: params.seriesName+'-'+params.name,
projectLibraryId: this.$route.query.id,
operatorType: 'queryVerifyStatistics',
status: params.data.status
@@ -0,0 +1,175 @@
<template>
<a-modal
:title="title"
:width="800"
:visible="visible"
:confirm-loading="confirmLoading"
:maskClosable="false"
@cancel="visible = false"
>
<template slot="footer">
<a-button key="back" @click="visible = false">
{{$t('cancel')}}
</a-button>
</template>
<!-- <div style="text-align: right;margin-bottom: 10px">-->
<!-- <div @click="handleExport" class="operator-text">-->
<!-- <a-icon type="export" :rotate="-90"/>-->
<!-- {{$t('export')}}-->
<!-- </div>-->
<!-- </div>-->
<a-table
ref="table"
:components="drag(columns,'columns')"
:loading="loading"
:pagination="false"
:scroll="{x: '100%',y:400}"
:data-source="dataSource"
@change="tableOnChange"
:columns="columns"
>
<!-- -->
<a slot="areaOfResponsibility" @click="areaOfResponsibilityClick(result)" slot-scope="text,result">
{{text}}
</a>
</a-table>
</a-modal>
</template>
<script>
import { getAction, postAction, downloadFile } from '@/api/manage'
import moment from 'moment'
import { ResizeHeader, ResizeColumnProvide } from '@/mixins/header'
export default {
name: 'responsibilityList',
mixins: [ResizeHeader, ResizeColumnProvide],
data() {
return {
visible: false,
title: '',
confirmLoading: false,
loading: false,
dataSource: [],
queryParam: {},
projectInfo: {},
url: {
groupByTerritoryXls: '/project/projectLibraryBase/exportProjectDetailsStatisticsGroupByTerritoryXls',
GroupByTerritory: '/project/projectLibraryBase/getProjectDetailsStatisticsGroupByTerritory'
},
columns: [
{
title: this.$t('areaOfResponsibility'),
dataIndex: 'dutyTerritoryName',
align: 'left',
width: 150,
ellipsis: true,
sorter: true,
scopedSlots: { customRender: 'areaOfResponsibility' }
},
{
title: this.$t('Quantity'),
dataIndex: 'amount',
align: 'left',
ellipsis: true,
width: 150,
sorter: true
},
{
title: this.$t('proportionWithInTheAreaOfResponsibility'),
dataIndex: 'percentage',
align: 'left',
ellipsis: true,
width: 240,
sorter: true
}
]
}
},
mounted() {
},
methods: {
getData(data, projectInfo) {
this.visible = true
this.projectInfo = projectInfo
this.title = data.title
this.queryParam = data
this.getList()
},
tableOnChange(pagination, filters, sorter) {
this.orderBy = sorter.order == 'ascend' ? '1' : '2'
if (sorter.columnKey == 'attestationRank_dictText') {
this.orderByField = 'attestationRank'
} else if (sorter.columnKey == 'dutyTerritory_dictText') {
this.orderByField = 'dutyTerritory'
} else if (sorter.columnKey == 'designDeliverableTypeName') {
this.orderByField = 'designDeliverableType'
} else if (sorter.columnKey == 'verifyDeliverableTypeName') {
this.orderByField = 'verifyDeliverableType'
} else if (sorter.columnKey == 'designDutyIdName') {
this.orderByField = 'designDutyId'
} else if (sorter.columnKey == 'verifyDutyIdName') {
this.orderByField = 'verifyDutyId'
} else if (sorter.columnKey == 'verifyFlowStatusName') {
this.orderByField = 'verifyFlowStatus'
} else if (sorter.columnKey == 'designFlowStatusName') {
this.orderByField = 'designFlowStatus'
} else {
this.orderByField = sorter.columnKey
}
this.getList()
},
getList() {
this.loading = true
let query = {
...this.queryParam,
orderBy: this.orderBy,
orderByField: this.orderByField
}
getAction(this.url.GroupByTerritory, query).then((res) => {
if (res.success) {
this.loading = false
this.dataSource = res.result.dataList || []
} else {
this.loading = false
this.dataSource = []
}
})
},
handleExport() {
downloadFile(this.url.groupByTerritoryXls, this.title + '.xls', this.queryParam)
},
handleCancel() {
this.visible = false
},
areaOfResponsibilityClick(item) {
let type = ''
if (this.queryParam.operatorType == 'queryFGTaskToConfirmStatistics' ||
this.queryParam.operatorType == 'queryDesignStatistics' ||
this.queryParam.operatorType == 'queryVerifyStatistics') {
type = '102'
} else {
type = '106'
}
let query = {
id: this.projectInfo.id,
projectName: this.projectInfo.projectName,
projectNameId: this.projectInfo.projectNameId,
targetMarket: this.projectInfo.targetMarket,
studioEngineer: this.projectInfo.studioEngineer,
type: type,
dutyTerritoryName: item.dutyTerritoryName
}
let newUrl = this.$router.resolve({
path: '/ProjectDetails',
query: query
})
window.open(newUrl.href, '_blank')
}
}
}
</script>
<style scoped>
</style>
@@ -1,108 +1,116 @@
<template>
<a-drawer
:title="title"
:maskClosable="false"
:width="1000"
placement="right"
:closable="true"
@close="handleCancel"
:visible="visible"
style="height: 100%;overflow: auto;padding-bottom: 53px;">
<a-spin :spinning="confirmLoading">
<div class="box-content" v-if="visible">
<div class="box-content-top"
v-if="projectQuery.name == this.$t('listPublishing') || projectQuery.name == this.$t('responsibilityConfirmation')">
<div class="total-text">
<span>{{$t('totalTable')+' : '+mainTopNum}}</span>
<div>
<a-drawer
:title="title"
:maskClosable="false"
:width="1000"
placement="right"
:closable="true"
@close="handleCancel"
:visible="visible"
style="height: 100%;overflow: auto;padding-bottom: 53px;">
<a-spin :spinning="confirmLoading">
<div class="box-content" v-if="visible">
<div class="box-content-top"
v-if="projectQuery.name == this.$t('listPublishing') || projectQuery.name == this.$t('responsibilityConfirmation')">
<div class="total-text">
<span>{{$t('totalTable')+' : '+mainTopNum}}</span>
</div>
<div id="main-top"></div>
</div>
<div id="main-top"></div>
</div>
<div class="box-content-top" v-if="projectQuery.name == this.$t('designVerification')">
<div class="total-text">
<span>{{$t('totalTable')+' : '+mainLeftNum}}</span>
<div class="box-content-top" v-if="projectQuery.name == this.$t('designVerification')">
<div class="total-text">
<span>{{$t('totalTable')+' : '+mainLeftNum}}</span>
</div>
<div id="main-left"></div>
</div>
<div id="main-left"></div>
</div>
<div class="box-content-top" v-if="projectQuery.name == this.$t('verificationAndVerification')">
<div class="total-text">
<span>{{$t('totalTable')+' : '+mainRightNum}}</span>
<div class="box-content-top" v-if="projectQuery.name == this.$t('verificationAndVerification')">
<div class="total-text">
<span>{{$t('totalTable')+' : '+mainRightNum}}</span>
</div>
<div id="main-right"></div>
</div>
<div id="main-right"></div>
</div>
<div class="box-content-top"
v-if="projectQuery.name == this.$t('listPublishing') || projectQuery.name == this.$t('responsibilityConfirmation')">
<div class="total-text">
<span>{{$t('totalTable')+' : '+mainTopNumOne}}</span>
<div class="box-content-top"
v-if="projectQuery.name == this.$t('listPublishing') || projectQuery.name == this.$t('responsibilityConfirmation')">
<div class="total-text">
<span>{{$t('totalTable')+' : '+mainTopNumOne}}</span>
</div>
<div id="main-top-one"></div>
</div>
<div id="main-top-one"></div>
</div>
<div class="box-content-top"
v-if="projectQuery.name == this.$t('getStarted') || projectQuery.name == this.$t('certificationStartOne')">
<div class="total-text">
<span>{{$t('totalTable')+' : '+mainLeftNumOne}}</span>
<div class="box-content-top"
v-if="projectQuery.name == this.$t('getStarted') || projectQuery.name == this.$t('certificationStartOne')">
<div class="total-text">
<span>{{$t('totalTable')+' : '+mainLeftNumOne}}</span>
</div>
<div id="main-right-one"></div>
</div>
<div id="main-right-one"></div>
</div>
<div class="box-content-top"
v-if="projectQuery.name == this.$t('certificationEnd') || projectQuery.name == this.$t('certificationSubmission')">
<div class="total-text-text" :class="{'total-text-text-cntop':long == 'zh-cn' ? true:false,
<div class="box-content-top"
v-if="projectQuery.name == this.$t('certificationEnd') || projectQuery.name == this.$t('certificationSubmission')">
<div class="total-text-text" :class="{'total-text-text-cntop':long == 'zh-cn' ? true:false,
'total-text-text-entop':long == 'zh-cn' ? false:true}">
<span>{{$t('totalTable')+' : '+mainBottomNum}}</span>
<span>{{$t('totalTable')+' : '+mainBottomNum}}</span>
</div>
<div class="box-content-text">
<div class="box-content-text-text" @click="boxContentClick(0)">
{{$t('whole')}}
</div>
<div class="box-content-text-text" @click="boxContentClick(1)">
{{$t('completeVehicle')}}
</div>
<div class="box-content-text-text" @click="boxContentClick(2)">
{{$t('components')}}
</div>
</div>
<div id="main-bottom"></div>
</div>
<div class="box-content-text">
<div class="box-content-text-text" @click="boxContentClick(0)">
{{$t('whole')}}
</div>
<div class="box-content-text-text" @click="boxContentClick(1)">
{{$t('completeVehicle')}}
</div>
<div class="box-content-text-text" @click="boxContentClick(2)">
{{$t('components')}}
</div>
</div>
<div id="main-bottom"></div>
</div>
<div class="table-page-search-wrapper"
v-if="this.projectQuery.name == this.$t('getStarted') || this.projectQuery.name == this.$t('certificationStartOne')">
<a-form layout="inline">
<a-row :gutter="24">
<a-col :md="12" :sm="10">
<div class="box-title-text">
<div class="title-text" :title="$t('Statisticalmodels')">
<span>{{ $t('Statisticalmodels') }}</span>
<div class="table-page-search-wrapper"
v-if="this.projectQuery.name == this.$t('getStarted') || this.projectQuery.name == this.$t('certificationStartOne')">
<a-form layout="inline">
<a-row :gutter="24">
<a-col :md="12" :sm="10">
<div class="box-title-text">
<div class="title-text" :title="$t('Statisticalmodels')">
<span>{{ $t('Statisticalmodels') }}</span>
</div>
<a-radio-group class="box-input"
v-model="queryParam.value" @change="onChange">
<a-radio :value="1">
{{$t('Thepercentage')}}
</a-radio>
<a-radio :value="2">
{{$t('Quantity')}}
</a-radio>
</a-radio-group>
</div>
<a-radio-group class="box-input"
v-model="queryParam.value" @change="onChange">
<a-radio :value="1">
{{$t('Thepercentage')}}
</a-radio>
<a-radio :value="2">
{{$t('Quantity')}}
</a-radio>
</a-radio-group>
</div>
</a-col>
</a-row>
</a-form>
</div>
<div class="box-content-top-one"
v-if="this.projectQuery.name == this.$t('getStarted') || this.projectQuery.name == this.$t('certificationStartOne')">
<div id="main-left-parameter"></div>
</a-col>
</a-row>
</a-form>
</div>
<div class="box-content-top-one"
v-if="this.projectQuery.name == this.$t('getStarted') || this.projectQuery.name == this.$t('certificationStartOne')">
<div id="main-left-parameter"></div>
</div>
</div>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
</div>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
</div>
</a-drawer>
</a-drawer>
<responsibilityList ref="responsibilityListRef"/>
</div>
</template>
<script>
import * as echarts from 'echarts'
import { getAction, postAction, deleteAction, downloadFile } from '@/api/manage'
import responsibilityList from './responsibilityList'
export default {
name: 'statistics',
components: {
responsibilityList
},
data() {
return {
visible: false,
@@ -138,6 +146,7 @@
submitquantity: [],
syncReportpercentage: [],
syncReportquantity: [],
projectInfo:{},
long: localStorage.getItem('language') || 'zh-cn',
certificationProgressMap: {},
url: {
@@ -150,8 +159,9 @@
handleCancel() {
this.visible = false
},
getData(val) {
getData(val,projectInfo) {
this.visible = true
this.projectInfo = projectInfo
this.title = val.name
this.projectQuery = val
this.getEchart()
@@ -201,7 +211,7 @@
},
getEcharts(chart, title, color, data) {
var myChart = echarts.init(document.getElementById(chart))
let myChart = echarts.init(document.getElementById(chart))
myChart.setOption({
title: {
text: title
@@ -245,31 +255,59 @@
}
]
})
myChart.off('click') // 重点代码
myChart.on('click', (params) => {
let query = {}
if (params.seriesName == this.$t('regulatoryTaskConfirmation')) {
query = {
title: params.seriesName,
projectLibraryId: this.$route.query.id,
title: params.seriesName + '-' + params.name,
projectLibraryId: this.projectQuery.projectId,
operatorType: 'queryFGTaskToConfirmStatistics',
status: params.data.status
}
} else if (params.seriesName == this.$t('designCompliance')) {
query = {
title: params.seriesName,
projectLibraryId: this.$route.query.id,
title: params.seriesName + '-' + params.name,
projectLibraryId: this.projectQuery.projectId,
operatorType: 'queryDesignStatistics',
status: params.data.status
}
} else if (params.seriesName == this.$t('verifyCompliance')) {
query = {
title: params.seriesName,
projectLibraryId: this.$route.query.id,
title: params.seriesName + '-' + params.name,
projectLibraryId: this.projectQuery.projectId,
operatorType: 'queryVerifyStatistics',
status: params.data.status
}
} else if (params.seriesName === this.$t('certificationTaskConfirmation')) {
query = {
title: params.seriesName + '-' + params.name,
projectLibraryId: this.projectQuery.projectId,
operatorType: 'queryRZTaskToConfirmStatistics',
status: params.data.status
}
} else if (params.seriesName === this.$t('preHomoFlow')) {
query = {
title: params.seriesName + '-' + params.name,
projectLibraryId: this.projectQuery.projectId,
operatorType: 'queryPrehomoStatistics',
status: params.data.status
}
} else if (params.seriesName === this.$t('CertificationProgress')) {
query = {
title: params.seriesName + '-' + params.name,
projectLibraryId: this.projectQuery.projectId,
status: params.data.status
}
if (this.num == '0') {
query.operatorType = 'queryCertificationProgressStatisticsAll'
} else if (this.num == '1') {
query.operatorType = 'queryCertificationProgressStatisticsCar'
} else if (this.num == '2') {
query.operatorType = 'queryCertificationProgressStatisticsPart'
}
}
this.$refs.responsibilityListRef.getData(query)
this.$refs.responsibilityListRef.getData(query,this.projectInfo)
})
},
@@ -500,7 +538,7 @@
this.mainLeftNumOne += res.taskAffirmStatusCount
})
}
this.getEchartsOne('main-right-one', this.$t('preHomoFlow'), color, data)
this.getEcharts('main-right-one', this.$t('preHomoFlow'), color, data)
},
mainBottomEcharts(dataSource) {
@@ -569,79 +607,7 @@
this.mainBottomNum += res.certificationProgressCount
})
}
this.getEchartsOne('main-bottom', this.$t('CertificationProgress'), color, data)
},
getEchartsOne(chart, title, color, data) {
var myChart = echarts.init(document.getElementById(chart))
myChart.setOption({
title: {
text: title
},
tooltip: {
trigger: 'item',
textStyle: {
fontWeight: 'normal',
fontSize: 14,
color: '#040B29',
fontFamily: 'BlueSkyNoto'
},
formatter: function(parms) {
let str = parms.marker + ' ' + parms.data.name + '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' + parms.data.value + ' (' + parms.percent + '%)'
return str
}
},
legend: {
itemWidth: 12,
itemHeight: 12,
bottom: '0',
left: 'center',
itemGap: 30,
icon: 'circle'
},
series: [
{
name: title,
type: 'pie',
radius: ['40%', '54%'],
avoidLabelOverlap: false,
label: {
show: false,
position: 'center'
},
labelLine: {
show: false
},
color: color,
data: data
}
]
})
myChart.off('click') // 重点代码
myChart.on('click', (params) => {
console.log(params)
let query = {
title: params.seriesName,
projectLibraryId: this.$route.query.id
}
if (params.seriesName === this.$t('certificationTaskConfirmation')) {
query.operatorType = 'queryRZTaskToConfirmStatistics'
query.status = params.data.status
} else if (params.seriesName === this.$t('preHomoFlow')) {
query.operatorType = 'queryPrehomoStatistics'
query.status = params.data.status
} else if (params.seriesName === this.$t('CertificationProgress')) {
if (this.num == '0') {
query.operatorType = 'queryCertificationProgressStatisticsAll'
} else if (this.num == '1') {
query.operatorType = 'queryCertificationProgressStatisticsCar'
} else if (this.num == '2') {
query.operatorType = 'queryCertificationProgressStatisticsPart'
}
query.status = params.data.status
}
this.$refs.responsibilityListRef.getData(query)
})
this.getEcharts('main-bottom', this.$t('CertificationProgress'), color, data)
},
boxContentClick(num) {
@@ -1034,6 +1000,7 @@
.total-text-text-entop {
right: 290px;
}
.box-title-text {
line-height: 1.4;
display: flex;
@@ -92,6 +92,9 @@
<div style="overflow:visible;">
<div class="box-top-content-left">
<div class="box-top-content-left-text"
:class="{'box-top-content-left-text-projectStatus':
item.projectInfo.projectStatus == '4786d0f0d230454e99a9fce15579eabf' ||
item.projectInfo.projectStatus == 'f737d063de754f2ab1bf51cd4118d04a'?true:false}"
v-for="(item,index) in timeData" :key="index">
<a-tooltip overlayClassName="overlayClassName" placement="topLeft">
<template slot="title">
@@ -135,19 +138,23 @@
v-if="!val.g"
v-for="(val,indexTwo) in item.data[0]">
<!-- <div class="process-content-right-top" v-if="indexOne % 2 == 0" :title="val.name">{{ val.name }}</div>-->
<div @click="statusClick(val)" class="process-content-right-button" :title="val.name">{{ val.name }}
<div @click="statusClick(val,item.projectInfo)" class="process-content-right-button"
:title="val.name">{{ val.name }}
</div>
<a-tooltip placement="topLeft" overlayClassName="tooltipColor">
<template slot="title">
<span>{{ val.time.slice(0, 11) }}</span>
</template>
<img @click="statusClick(val)" v-if="val.status == 1" src="../../../assets/huiBottom.png"
<img @click="statusClick(val,item.projectInfo)" v-if="val.status == 1"
src="../../../assets/huiBottom.png"
class="process-content-left"
alt="">
<img @click="statusClick(val)" v-else-if="val.status == 2" src="../../../assets/kongBottom.png"
<img @click="statusClick(val,item.projectInfo)" v-else-if="val.status == 2"
src="../../../assets/kongBottom.png"
class="process-content-left"
alt="">
<img @click="statusClick(val)" v-else-if="val.status == 3" src="../../../assets/shiBottom.png"
<img @click="statusClick(val,item.projectInfo)" v-else-if="val.status == 3"
src="../../../assets/shiBottom.png"
class="process-content-left"
alt="">
</a-tooltip>
@@ -601,8 +608,8 @@
downloadFile('/project/ProjectStatusBoardController/exportXls',
this.$t('GRPSystemProjectProgressStatistics') + '.xls', query, this.Deselect)
},
statusClick(val) {
this.$refs.statisticsRef.getData(val)
statusClick(val, projectInfo) {
this.$refs.statisticsRef.getData(val, projectInfo)
},
boxContentClick(num) {
let boxContentTextColor = document.getElementsByClassName('box-header-text-color')
@@ -1024,4 +1031,7 @@
margin-left: 0;
}
}
.box-top-content-left-text-projectStatus{
color: #9C9FAC;
}
</style>
@@ -2,7 +2,8 @@
<div class="box">
<div class="box-text">
<div class="header-text">
{{query.TaskKey == 'zrrqr' || query.TaskKey == 'dezrrqr' || query.TaskKey == 'zrrtjjfw' || query.TaskKey == 'dezrrtjjfw'
{{query.TaskKey == 'zrrqr' || query.TaskKey == 'dezrrqr' || query.TaskKey == 'zrrtjjfw' || query.TaskKey ==
'dezrrtjjfw'
? $t('personLiableConfirm'):$t('sponsorReview')}}
</div>
</div>
@@ -58,6 +59,26 @@
</a-form-model-item>
</a-col>
</a-row>
<a-row :gutter="24" v-if="isDeliveryTime">
<a-col :span="24">
<div class="box-title-text">
<div class="title-text">
<span class="Required">*</span>
<span class="title-text-text" :title="$t('expectedDeliveryTime')">{{$t('expectedDeliveryTime')}}</span>
</div>
</div>
<a-form-model-item class="itemModel" :prop="'deliveryTime'">
<a-date-picker class="box-input"
:placeholder="$t('PleaseSelect')+$t('expectedDeliveryTime')"
@change="dateChange({db_field_name:'deliveryTime'})"
format="YYYY-MM-DD"
:getCalendarContainer="(trigger) => trigger.parentNode"
v-model="formInline.deliveryTime"
style="width: 100%"/>
</a-form-model-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :span="24">
<div class="box-title-text">
@@ -105,6 +126,7 @@
import { getAction, postAction, putAction, deleteAction } from '@/api/manage'
import uploadFile from '@/components/uploadFile/file'
import SelectedBy from '@/components/SelectedBy/index'
import moment from 'moment'
export default {
name: 'reviewedByThePersonInCharge',
@@ -117,6 +139,7 @@
return {
formInline: {},
isPersonnel: false,
isDeliveryTime: false,
reviewResult: {
'launch': this.$t('Launch'),
'Compliance': this.$t('accord'),
@@ -135,6 +158,13 @@
trigger: 'change'
}
],
deliveryTime: [
{
required: true,
message: this.$t('expectedDeliveryTime') + this.$t('cannotEmpty'),
trigger: 'change'
}
],
approvalOpinion: [
{
required: true,
@@ -188,6 +218,11 @@
submit(callBack) {
this.$refs.ruleForm.validate(valid => {
if (valid) {
if (this.formInline.disposeResult == 'To be tracked') {
if (this.query.TaskKey == 'zrrtjjfw' || this.query.TaskKey == 'dezrrtjjfw') {
this.formInline.approvalOpinion = this.formInline.approvalOpinion + ';' + this.$t('expectedDeliveryTime') + ':' + this.formInline.deliveryTime
}
}
callBack(this.formInline)
}
})
@@ -202,10 +237,18 @@
} else {
this.$refs.SelectedByRef.visible = false
this.isPersonnel = false
this.isDeliveryTime = false
this.formInline.secondChargePersonUserId = ''
this.formInline.dezrrSubmitUserName = ''
this.formInline.dezrrSubmitUserId = ''
}
if (value.target.value == 'To be tracked') {
this.isDeliveryTime = true
} else {
this.isDeliveryTime = false
this.formInline.deliveryTime = ''
}
this.formInline = { ...this.formInline }
},
//转办接口
SelectedByForm(userIds, name) {
@@ -248,6 +291,10 @@
this.$nextTick(() => {
this.$refs.ruleForm.validateField([this.uploadName])
})
},
dateChange(item) {
this.formInline[item.db_field_name] = this.formInline[item.db_field_name] ? moment(this.formInline[item.db_field_name]).format('YYYY-MM-DD') : ''
this.formInline = { ...this.formInline }
}
}
}