Merge remote-tracking branch 'origin/fix_bug_first_stage' into fix_bug_first_stage

This commit is contained in:
wangzhijiang
2022-07-05 14:23:40 +08:00
17 changed files with 951 additions and 99 deletions
@@ -2,6 +2,7 @@ package com.jero.modules.project.controller;
import com.jero.common.api.vo.Result;
import com.jero.common.aspect.annotation.AutoLog;
import com.jero.common.constant.enums.CutEnum;
import com.jero.common.system.base.controller.JeroController;
import com.jero.modules.project.entity.ProjectRelatedPersonnel;
import com.jero.modules.project.service.IProjectRelatedPersonnelService;
@@ -13,7 +14,15 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
@@ -46,7 +55,11 @@ public class ProjectRelatedPersonnelController extends JeroController<ProjectRel
@RequiresPermissions("projectRelatedPersonnel:page")
@PostMapping(value = "/page")
public Result<?> queryPageList(@RequestBody Map<String,Object> map) {
List<ProjectRelatedPersonnel> pageList= projectRelatedPersonnelService.queryPageList((String) map.get("projectId"));
List<ProjectRelatedPersonnel> pageList= projectRelatedPersonnelService.queryPageList((String) map.get("projectId"),
(String) map.get("dutyTerritory"),
(String) map.get("lawEngineer"),
(String) map.get("engineeringInterfacePerson"),
(String) map.get("certificationEngineer"));
return Result.OK((String)map.get("cut"),pageList);
}
/**
@@ -205,4 +218,31 @@ public class ProjectRelatedPersonnelController extends JeroController<ProjectRel
List<ProjectRelatedPersonnel> certificationEngineerList = projectRelatedPersonnelService.queryCertificationEngineer(projectId);
return Result.OK(certificationEngineerList);
}
/**
* 批量设置
* @param projectRelatedPersonnel
* @return
*/
@AutoLog(value = "批量设置")
@ApiOperation(value="批量设置", notes="批量设置")
@PostMapping(value = "/setBatch")
public Result<?> setBatch(@RequestBody ProjectRelatedPersonnel projectRelatedPersonnel) {
String cut = projectRelatedPersonnel.getCut();
try {
projectRelatedPersonnelService.setBatch(projectRelatedPersonnel);
} catch (Exception e) {
if(CutEnum.CN.getValue().equals(cut)){
return Result.error("批量设置失败!");
}else{
return Result.error("Batch set success");
}
}
if(CutEnum.CN.getValue().equals(cut)){
return Result.OK("批量设置成功");
}else{
return Result.OK("Batch set success");
}
}
}
@@ -90,4 +90,8 @@ public class ProjectRelatedPersonnel implements Serializable {
/**中英切换标志*/
@TableField(exist = false)
private String cut;
}
//批量设置传参ids
@TableField(exist = false)
private String ids;
}
@@ -14,7 +14,12 @@ import java.util.List;
*/
public interface ProjectRelatedPersonnelMapper extends BaseMapper<ProjectRelatedPersonnel> {
List<ProjectRelatedPersonnel> queryPageList(@Param("projectId") String projectId,String dictCode);
List<ProjectRelatedPersonnel> queryPageList(@Param("projectId") String projectId,
String dictCode,
@Param("dutyTerritory") String dutyTerritory,
@Param("lawEngineer") String lawEngineer,
@Param("engineeringInterfacePerson") String engineeringInterfacePerson,
@Param("certificationEngineer") String certificationEngineer);
List<ProjectRelatedPersonnel> queryById(@Param("id")String id);
}
@@ -42,6 +42,18 @@
<if test="projectId != null and projectId != ''">
prp.project_id=#{projectId}
</if>
<if test="dutyTerritory != null and dutyTerritory != ''">
AND prp.duty_territory=#{dutyTerritory}
</if>
<if test="lawEngineer != null and lawEngineer != ''">
AND prp.law_engineer like concat(concat('%',#{lawEngineer}),'%')
</if>
<if test="engineeringInterfacePerson != null and engineeringInterfacePerson != ''">
AND prp.engineering_interface_person like concat(concat('%',#{engineeringInterfacePerson}),'%')
</if>
<if test="certificationEngineer != null and certificationEngineer != ''">
AND prp.certification_engineer like concat(concat('%',#{certificationEngineer}),'%')
</if>
AND sd.dict_code = #{dictCode}
</where>
ORDER BY sdi.item_text ASC
@@ -57,4 +69,4 @@
</where>
order by prp.create_time desc
</select>
</mapper>
</mapper>
@@ -67,7 +67,7 @@ public interface IProjectRelatedPersonnelService extends IService<ProjectRelated
*/
List<ProjectRelatedPersonnel> queryList();
List<ProjectRelatedPersonnel> queryPageList(String projectId);
List<ProjectRelatedPersonnel> queryPageList(String projectId,String dutyTerritory,String lawEngineer,String engineeringInterfacePerson,String certificationEngineer);
Map<String,Object> queryPersonByProjectId(String projectId, String dutyTerritory);
@@ -88,4 +88,6 @@ public interface IProjectRelatedPersonnelService extends IService<ProjectRelated
ProjectRelatedPersonnel queryByProjectIdAndDutyTerritory(String projectId, String dutyTerritory);
List<ProjectRelatedPersonnel> queryCertificationEngineer(String projectId);
void setBatch(ProjectRelatedPersonnel projectRelatedPersonnel);
}
@@ -6400,7 +6400,7 @@ public class ProjectLawsInventoryEOServiceImpl extends ServiceImpl<ProjectLawsIn
}
}
//相关人员名单中取法规工程师
List<ProjectRelatedPersonnel> projectRelatedPersonnels = projectRelatedPersonnelService.queryPageList(projectLibraryId);
List<ProjectRelatedPersonnel> projectRelatedPersonnels = projectRelatedPersonnelService.queryPageList(projectLibraryId,null,null,null,null);
List<String> lawEngineerNameList = new ArrayList<>();
if(projectRelatedPersonnels.size() != 0){
for (ProjectRelatedPersonnel projectRelatedPersonnel : projectRelatedPersonnels) {
@@ -34,7 +34,14 @@ import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -48,7 +55,14 @@ import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;
import java.util.stream.Collectors;
/**
@@ -183,26 +197,45 @@ public class ProjectRelatedPersonnelServiceImpl extends ServiceImpl<ProjectRelat
* @return
*/
@Override
public List<ProjectRelatedPersonnel> queryPageList(String projectId) {
public List<ProjectRelatedPersonnel> queryPageList(String projectId,
String dutyTerritoryTemp,
String lawEngineer,
String engineeringInterfacePerson,
String certificationEngineer) {
//查询数据
List<ProjectRelatedPersonnel> result = projectRelatedPersonnelMapper.queryPageList(projectId,DictCodeEnum.DUTY_TERRITORY.getValue());
List<ProjectRelatedPersonnel> result = projectRelatedPersonnelMapper.queryPageList(projectId,
DictCodeEnum.DUTY_TERRITORY.getValue(),
dutyTerritoryTemp,
lawEngineer,
engineeringInterfacePerson,
certificationEngineer);
//查询数据里的责任领域
List<String> dutyTerritory = result.stream().map(e -> e.getDutyTerritory()).collect(Collectors.toList());
//查标签内容里的责任领域数据
List<String> sysDictItemValueList = sysDictItemMapper.selectItemValueByDictCode(DictCodeEnum.DUTY_TERRITORY.getValue());
//没有数据->新增所有责任领域,查询
if(result.size() != sysDictItemValueList.size()){
if(StringUtils.isBlank(dutyTerritoryTemp)
&& StringUtils.isBlank(lawEngineer)
&& StringUtils.isBlank(engineeringInterfacePerson)
&& StringUtils.isBlank(certificationEngineer)){
if(result.size() != sysDictItemValueList.size()){
//更新相关人员表里的责任领域数据
if (CollectionUtils.isNotEmpty(sysDictItemValueList)) {
for (String sysDictItemValue : sysDictItemValueList) {
if(!dutyTerritory.contains(sysDictItemValue)) {
setDutyTerritoryValue(sysDictItemValue, projectId);
//更新相关人员表里的责任领域数据
if (CollectionUtils.isNotEmpty(sysDictItemValueList)) {
for (String sysDictItemValue : sysDictItemValueList) {
if(!dutyTerritory.contains(sysDictItemValue)) {
setDutyTerritoryValue(sysDictItemValue, projectId);
}
}
}
//重新查询列表
result = projectRelatedPersonnelMapper.queryPageList(projectId,
DictCodeEnum.DUTY_TERRITORY.getValue(),
dutyTerritoryTemp,
lawEngineer,
engineeringInterfacePerson,
certificationEngineer);
}
//重新查询列表
result = projectRelatedPersonnelMapper.queryPageList(projectId,DictCodeEnum.DUTY_TERRITORY.getValue());
}
disposeData(result);
return result;
@@ -456,7 +489,7 @@ public class ProjectRelatedPersonnelServiceImpl extends ServiceImpl<ProjectRelat
records = queryById(id);
}
}else{
records=queryPageList(projectId);
records=queryPageList(projectId,null,null,null,null);
}
//id无值,传全部
disposeDutyTerritory(records,cut);
@@ -1180,4 +1213,25 @@ public class ProjectRelatedPersonnelServiceImpl extends ServiceImpl<ProjectRelat
}
@Override
public void setBatch(ProjectRelatedPersonnel projectRelatedPersonnel) {
List<ProjectRelatedPersonnel> projectRelatedPersonnelList = new ArrayList<>();
for (String id : projectRelatedPersonnel.getIds().split(",")) {
ProjectRelatedPersonnel projectRelatedPersonnelTemp = new ProjectRelatedPersonnel();
projectRelatedPersonnelTemp.setId(id);
projectRelatedPersonnelTemp.setUpdateTime(new Date());
if(org.apache.commons.lang3.StringUtils.isNotBlank(projectRelatedPersonnel.getLawEngineer())){
projectRelatedPersonnelTemp.setLawEngineer(projectRelatedPersonnel.getLawEngineer());
}
if(org.apache.commons.lang3.StringUtils.isNotBlank(projectRelatedPersonnel.getEngineeringInterfacePerson())){
projectRelatedPersonnelTemp.setEngineeringInterfacePerson(projectRelatedPersonnel.getEngineeringInterfacePerson());
}
if(org.apache.commons.lang3.StringUtils.isNotBlank(projectRelatedPersonnel.getCertificationEngineer())){
projectRelatedPersonnelTemp.setCertificationEngineer(projectRelatedPersonnel.getCertificationEngineer());
}
projectRelatedPersonnelList.add(projectRelatedPersonnelTemp);
}
this.updateBatchById(projectRelatedPersonnelList);
}
}
+1
View File
@@ -1072,4 +1072,5 @@ module.exports = {
theProjectContactEmpty:'The project contact person of cannot be empty',
pleaseSelectinitiatedOrRejected:'Please select the data whose list confirmation status is not initiated or rejected',
TheEngineerAndCertification:'The regulatory engineer and Certification Engineer of cannot be empty',
theResponsiblePersonAndDeadlineClank:'The responsible person and deadline of cannot be blank',
}
+2 -1
View File
@@ -693,7 +693,7 @@ module.exports = {
confirmOverrule: '确认驳回',
The: '第',
submitted: '条数据已提交不能重复提交',
incorrectsubmitted: '条数据状态有误只能提交状态为待确认的数据',
incorrectsubmitted: '状态有误只能提交状态为待确认的数据',
basicInformationOfParameters: '项目基本信息',
regulatoryCertificationTaskPlan: '法规/认证任务计划',
bringInRelevantPersonnel: '带入相关人员',
@@ -1076,4 +1076,5 @@ module.exports = {
newNiONumber: 'NIO编号',
English:'英文',
requiredParametersEmpty:'必填参数不能为空',
theResponsiblePersonAndDeadlineClank:'的责任人截止时间不能为空',
}
@@ -0,0 +1,302 @@
<template>
<div>
<div class="box-title-text" v-if="!isInput">
<a-input class="box-input" :value="value" @input="indexclick($event)"
:disabled="true"
:title="value"
:placeholder="$t('PleaseSelect')+query.db_field_txt"/>
<a-button type="primary" class="button-box" @click="standardClick">
{{this.$t('PersonnelSelection')}}
</a-button>
<a-button type="primary" v-if='isDelete' class="button-box" @click="standardDelete">
{{this.$t('delete')}}
</a-button>
</div>
<div class="box-title-text" v-if="isInput">
<a-input :class="{'box-input':!isClass}" :value="value"
readonly
@click.native="standardClick"
:placeholder="$t('PleaseSelect')+query.db_field_txt"/>
</div>
<a-drawer
:title="$t('PersonnelSelection')"
:maskClosable="false"
:width="600"
placement="right"
:closable="true"
@close="handleCancel"
:visible="visible"
style="height: 100%;overflow: auto;padding-bottom: 53px;">
<a-input-search style="margin-bottom: 8px" :placeholder="$t('NodeQuickLookup')"
v-model="searchModel" @search="onSearch"/>
<div class="drawer-content">
<a-tree
style="margin-bottom: 60px;height: 600px"
v-if="treeVisible"
checkable
checkStrictly
:loading="loading"
:tree-data="gData"
@check="onCheck"
@expand="onExpand"
v-model:checkedKeys="defaultCheckedKeys"
:defaultExpandedKeys="defaultExpandedKeys"
>
</a-tree>
</div>
<div class="drawer-bootom-button">
<a-button @click="handleCancel" type="danger" style="margin-right: 16px">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary">{{$t('submit')}}</a-button>
</div>
</a-drawer>
</div>
</template>
<script>
import { getAction, postAction } from '@/api/manage'
export default {
name: 'index',
props: ['query', 'value', 'personneQuery', 'isSingleChoice', 'isInput', 'isClass','isDelete','distributionEngineerList'],
data() {
return {
loading: true,
gData: [],
autoExpandParent: true,
expandedKeys: [],
visible: false,
treeVisible: false,
confirmLoading: false,
departId: '',
selectedKey: [],
userIds: [],
searchModel: '',
defaultExpandedKeys: [],
defaultCheckedKeys: [],
content: []
}
},
mounted() {
},
methods: {
standardClick() {
this.treeVisible = false
this.departId = ''
this.searchModel = ''
this.userIds = []
this.userName = []
this.queryDepartUserTreeList()
this.visible = true
},
standardDelete(){
this.$emit('input', null)
this.$forceUpdate()
this.$emit('deleteData',this.query.db_field_name)
},
// onSelect(selectedKeys, info) {
// console.log(selectedKeys)
// this.selectedKey = selectedKeys
// },
onCheck(checkedKeys, info) {
console.log(checkedKeys)
this.userIds = checkedKeys.checked
this.userName = []
if (info.checkedNodes && info.checkedNodes.length > 0) {
info.checkedNodes.forEach(res => {
if (res.data.props.dataRef.key) {
this.content.push({
id: res.data.props.dataRef.key,
title: res.data.props.dataRef.title
})
} else {
this.content.push({
id: res.data.props.id,
title: res.data.props.title
})
}
})
}
if (this.content && this.content.length > 0) {
for (let i = 0; i < this.content.length; i++) {
for (let j = i + 1; j < this.content.length; j++) {
if (this.content[i].id == this.content[j].id) {
this.content.splice(j, 1)
j--
}
}
}
this.userIds.forEach(res => {
this.content.forEach(val => {
if (res == val.id) {
this.userName.push(val.title)
}
})
})
}
},
handleCancel() {
this.visible = false
this.treeVisible = false
},
handleSubmit() {
// if (this.userIds && this.userIds.length > 0) {
if (this.isSingleChoice) {
if (this.userIds.length > 1) {
this.$message.warning(this.$t('onlyOnePersonCanBeSelected'))
return
}
}
let userIds = JSON.parse(JSON.stringify(this.userIds))
let userName = JSON.parse(JSON.stringify(this.userName))
function noRepeat1(arr) {
for (var i = 0; i < arr.length - 1; i++) {
for (var j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) {
arr.splice(j, 1);
j--;
}
}
}
return arr;
}
if (this.distributionEngineerList && this.distributionEngineerList.length > 0){
this.distributionEngineerList.forEach(res=>{
userIds.shift(res.userId)
userName.shift(res.name)
})
}
userIds = noRepeat1(userIds)
userName = noRepeat1(userName)
this.$emit('input', userName.join(','))
this.$emit('change', this.query.db_field_name, userIds.join(','),this.query.subscript)
this.visible = false
this.treeVisible = false
// } else {
// this.$message.warning(this.$t('pleaseSelectPersonFirst'))
// }
},
indexclick(event) {
this.$emit('input', event.target.value)
this.departId = ''
this.searchModel = ''
this.userIds = []
this.userName = []
this.defaultCheckedKeys = []
},
onSearch(e) {
this.gData = []
this.departId = ''
this.visibleTree = false
if (e) {
this.getUserAndDepart()
} else {
this.queryDepartUserTreeList()
}
},
getUserAndDepart() {
getAction('sys/user/getUserAndDepart', { name: this.searchModel }).then((res) => {
if (res){
this.gData = res.filter(ele => ele.flag === 'DEPART');
} else {
this.gData = []
}
this.visibleTree = true
})
},
onExpand(selectedKeys, val) {
if (this.searchModel == '' || !this.searchModel) {
if (val.expanded) {
if (this.departId == val.node.value) {
} else {
this.departId = val.node.value
this.queryDepartUserTreeList()
}
}
}
},
queryDepartUserTreeList() {
let gData = JSON.parse(JSON.stringify(this.gData))
if (gData && gData.length > 0) {
gData = JSON.stringify(gData)
} else {
gData = ''
}
this.confirmLoading = true
postAction('sys/user/queryDepartUserTreeList', {
departId: this.departId,
json: gData,
flag: '1'
}).then((res) => {
this.confirmLoading = false
if (res.success) {
this.gData = res.result
this.defaultExpandedKeys = [this.departId]
if (this.userName && this.userName.length == 0) {
if (this.personneQuery[this.query.db_field_name + 'Name']) {
this.userName = this.personneQuery[this.query.db_field_name + 'Name'].split(',')
} else if (this.personneQuery[this.query.db_field_name]) {
this.userName = this.personneQuery[this.query.db_field_name].split(',')
} else {
this.userName = []
}
}
if (this.userIds && this.userIds.length == 0) {
if (this.personneQuery[this.query.db_field_name + '_id']) {
this.userIds = this.personneQuery[this.query.db_field_name + '_id'].split(',')
} else if (this.personneQuery[this.query.db_field_name]) {
this.userIds = this.personneQuery[this.query.db_field_name].split(',')
} else {
this.userIds = []
}
}
this.defaultCheckedKeys = this.userIds
this.treeVisible = true
} else {
this.gData = []
}
})
}
}
}
</script>
<style scoped>
.box-title-text {
line-height: 1.4;
display: flex;
}
.box-input {
display: inline-block;
height: 38px;
width: 100%;
}
.button-box {
margin-left: 10px;
height: 38px;
line-height: 38px;
}
.drawer-bootom-button {
position: absolute;
bottom: 0;
width: 100%;
z-index: 100;
border-top: 1px solid #e8e8e8;
padding: 10px 16px;
text-align: right;
left: 0;
background: #fff;
border-radius: 0 0 2px 2px;
}
.drawer-content {
height: calc(100% - 60px);
overflow: auto;
}
</style>
@@ -99,6 +99,7 @@
<PersonnelSelection
:query="{db_field_name:'userId',db_field_txt:$t('engineer')}"
:personneQuery="formInline"
:distributionEngineerList="distributionEngineerList"
@change="PersonnelSelectionChange"
v-model="formInline.userName"/>
</a-form-model-item>
@@ -307,7 +308,7 @@
</template>
<script>
import PersonnelSelection from '@/components/PersonnelSelection/index'
import PersonnelSelection from './PersonnelSelection/index'
import { getAction, postAction, putAction, deleteAction } from '@/api/manage'
import uploadFile from '@/components/uploadFile/file'
import viewFileModel from '@/components/viewFileModel/index'
@@ -508,16 +509,17 @@
msgType: msgType,
distributionEngineerList: this.distributionEngineerList
}
this.confirmLoading = true
postAction(this.url.DetailEOAdd, query).then((res) => {
if (res.success) {
this.confirmLoading = false
this.getList()
this.visible = false
this.$message.success(this.$t('OperationSuccessful'))
} else {
this.confirmLoading = false
this.$message.warning(res.message)
}
if (res.success) {
this.confirmLoading = false
this.getList()
this.visible = false
this.$message.success(this.$t('OperationSuccessful'))
} else {
this.confirmLoading = false
this.$message.warning(res.message)
}
})
},
feedbackData(url, Action) {
@@ -679,6 +681,13 @@
})
})
}
for (let i = 0; i < this.dataSourceTable.length; i++) {
for (let j = 0; j < this.distributionEngineerList.length; j++) {
if (this.dataSourceTable[i].userId == this.distributionEngineerList[j].userId) {
this.distributionEngineerList[j].isSend = '1'
}
}
}
this.formInline = { ...this.formInline }
},
deleteText(num) {
@@ -55,8 +55,8 @@
>
<div slot="standardInformation" slot-scope="text,result" class="box-left">
<div class="content">
<a class="box-content-a">{{result.serialNumber}}</a><br/>
<a>{{result.title}}</a>
<a class="box-content-a" :title="result.serialNumber">{{result.serialNumber}}</a>
<a class="box-content-buttom" :title="result.title">{{result.title}}</a>
</div>
</div>
<div slot="areaOfResponsibility" slot-scope="text,result" class="box-left">
@@ -512,10 +512,20 @@
}
.box-content-a {
margin-bottom: 8px;
display: inline-block;
text-align: left;
margin-bottom: 8px;
font-weight: 400;
display: -webkit-box;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
/*! autoprefixer: on;*/
text-justify: inter-ideograph;
word-break: break-all
}
.box-content-index {
@@ -597,7 +607,18 @@
.box-content-cou {
cursor: pointer;
}
.box-content-buttom{
width: 100%;
overflow: hidden;
display: -webkit-box;
text-overflow: ellipsis;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
/*! autoprefixer: on;*/
text-justify: inter-ideograph;
word-break: break-all
}
</style>
<style>
.box-input .ant-select-selection {
@@ -901,7 +901,9 @@
]
},
detailedSuccessList: [],
detailedWarningList: []
detailedWarningList: [],
rowKeysSuccessList:[],
rowKeysWarningList:[],
}
},
@@ -1623,53 +1625,100 @@
}
}
}
this.rowKeysSuccessList = []
this.rowKeysWarningList = []
for (let i = 0; i < dataSource.length; i++) {
if (dataSource[i].inventoryAffirmStatus == 'List to confirm') {
if (dataSource[i].roleCode == 1 && dataSource[i].regulationOwnerSubmitStatus) {
isTrue = false
this.$message.warning(this.$t('The') + (i + 1) + this.$t('submitted'))
return
this.rowKeysWarningList.push( < div > { dataSource[i].serialNumber + this.$t('submitted') } < /div>)
continue
// isTrue = false
// this.$message.warning(dataSource[i].serialNumber + this.$t('submitted'))
// return
} else if (dataSource[i].roleCode == 2 && dataSource[i].homologationEngineerSubmitStatus) {
isTrue = false
this.$message.warning(this.$t('The') + (i + 1) + this.$t('submitted'))
return
this.rowKeysWarningList.push( < div > { dataSource[i].serialNumber + this.$t('submitted') } < /div>)
continue
// isTrue = false
// this.$message.warning(dataSource[i].serialNumber + this.$t('submitted'))
// return
} else if (dataSource[i].roleCode == 4 && (dataSource[i].homologationEngineerSubmitStatus && dataSource[i].regulationOwnerSubmitStatus)) {
isTrue = false
this.$message.warning(this.$t('The') + (i + 1) + this.$t('submitted'))
return
this.rowKeysWarningList.push( < div > { dataSource[i].serialNumber + this.$t('submitted') } < /div>)
continue
// isTrue = false
// this.$message.warning(dataSource[i].serialNumber + this.$t('submitted'))
// return
}
if((dataSource[i].designInitiatorId == dataSource[i].regulationOwnerId
&& dataSource[i].designInitiatorId == this.userInfo().id) ||
(dataSource[i].designInitiatorId == dataSource[i].homologationEngineerId
&& dataSource[i].designInitiatorId == this.userInfo().id)){
if(!dataSource[i].designDutyId || !dataSource[i].designDueDate){
this.rowKeysWarningList.push( < div > { dataSource[i].serialNumber+this.$t('confirmationOfDesignConformity') + this.$t('theResponsiblePersonAndDeadlineClank') } < /div>)
continue
}
}
if((dataSource[i].prehomoInitiatorId == dataSource[i].regulationOwnerId
&& dataSource[i].prehomoInitiatorId == this.userInfo().id) ||
(dataSource[i].prehomoInitiatorId == dataSource[i].homologationEngineerId
&& dataSource[i].prehomoInitiatorId == this.userInfo().id)){
if(!dataSource[i].prehomoDutyId || !dataSource[i].prehomoDueDate){
this.rowKeysWarningList.push( < div > { dataSource[i].serialNumber+this.$t('PrehomoConfirmation') + this.$t('theResponsiblePersonAndDeadlineClank') } < /div>)
continue
}
}
if((dataSource[i].verifyInitiatorId == dataSource[i].regulationOwnerId
&& dataSource[i].verifyInitiatorId == this.userInfo().id) ||
(dataSource[i].verifyInitiatorId == dataSource[i].homologationEngineerId
&& dataSource[i].verifyInitiatorId == this.userInfo().id)){
if(!dataSource[i].verifyDutyId || !dataSource[i].verifyDueDate){
this.rowKeysWarningList.push( < div > { dataSource[i].serialNumber+this.$t('verificationAndConformityconfirmation') + this.$t('theResponsiblePersonAndDeadlineClank') } < /div>)
continue
}
}
this.rowKeysSuccessList.push(dataSource[i])
} else {
isTrue = false
this.$message.warning(this.$t('The') + (i + 1) + this.$t('incorrectsubmitted'))
return
this.rowKeysWarningList.push( < div > { dataSource[i].serialNumber + this.$t('incorrectsubmitted') } < /div>)
// isTrue = false
// this.$message.warning(dataSource[i].serialNumber+ this.$t('incorrectsubmitted'))
// return
}
}
if (isTrue) {
callBack()
if (this.rowKeysSuccessList && this.rowKeysSuccessList.length > 0) {
callBack && callBack()
}else{
let that = this
this.$warning({
content: (
< div >
{ that.rowKeysWarningList }
< /div>
)
})
}
},
updateStatusBatch(num, selectedRowKeys) {
let _this = this
let lawsInventoryList = []
for (let i = 0; i < this.dataSource.length; i++) {
for (let j = 0; j < selectedRowKeys.length; j++) {
if (this.dataSource[i].id == selectedRowKeys[j]) {
for (let i = 0; i < this.rowKeysSuccessList.length; i++) {
let roleCode
if (this.dataSource[i].regulationOwnerId == this.userInfo().id &&
this.dataSource[i].homologationEngineerId == this.userInfo().id) {
if (this.rowKeysSuccessList[i].regulationOwnerId == this.userInfo().id &&
this.rowKeysSuccessList[i].homologationEngineerId == this.userInfo().id) {
roleCode = 4
} else if (this.dataSource[i].regulationOwnerId == this.userInfo().id) {
} else if (this.rowKeysSuccessList[i].regulationOwnerId == this.userInfo().id) {
roleCode = 1
} else if (this.dataSource[i].homologationEngineerId == this.userInfo().id) {
} else if (this.rowKeysSuccessList[i].homologationEngineerId == this.userInfo().id) {
roleCode = 2
}
lawsInventoryList.push({
id: this.dataSource[i].id,
id: this.rowKeysSuccessList[i].id,
roleCode: roleCode
})
}
}
}
let query = {
operatorType: 1,
@@ -1688,6 +1737,18 @@
_this.$message.warning(_this.$t('operationFailed'))
_this.confirmLoading = false
}
if(this.rowKeysWarningList && this.rowKeysWarningList.length > 0){
let that = this
this.$warning({
content: (
< div >
{ that.rowKeysWarningList }
< /div>
)
})
}
this.rowKeysWarningList = []
this.rowKeysSuccessList = []
})
},
@@ -8,6 +8,71 @@
@ok="visible = false"
@cancel="visible = false"
>
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row :gutter="24">
<a-col :md="12" :sm="8">
<div class="box-title-text-search">
<div class="title-text-search" :title="$t('areaOfResponsibility')">
<span>{{$t('areaOfResponsibility')}}</span>
</div>
<j-dict-select-tag class="box-input-search" v-model="queryParam.dutyTerritory"
:placeholder="$t('PleaseSelect')+$t('areaOfResponsibility')"
:type="'select'"
:triggerChange="false" :dictCode="'duty_territory'"/>
</div>
</a-col>
<a-col :md="12" :sm="8">
<div class="box-title-text-search">
<div class="title-text-search" :title="$t('engineeringInterfacePerson')">
<span>{{$t('engineeringInterfacePerson')}}</span>
</div>
<PersonnelSelection class="box-input-search"
:query="{db_field_name:'engineeringInterfacePerson',db_field_txt:$t('engineeringInterfacePerson')}"
:isInput="true"
:personneQuery="queryParam"
@change="PersonnelSelectionChange"
v-model="queryParam.engineeringInterfacePersonName"/>
</div>
</a-col>
<a-col :md="12" :sm="8">
<div class="box-title-text-search">
<div class="title-text-search" :title="$t('regulatoryEngineer')">
<span>{{$t('regulatoryEngineer')}}</span>
</div>
<PersonnelSelection class="box-input-search"
:query="{db_field_name:'lawEngineer',db_field_txt:$t('regulatoryEngineer')}"
:isInput="true"
:personneQuery="queryParam"
@change="PersonnelSelectionChange"
v-model="queryParam.lawEngineerName"/>
</div>
</a-col>
<a-col :md="12" :sm="8">
<div class="box-title-text-search">
<div class="title-text-search" :title="$t('certifiedEngineer')">
<span>{{$t('certifiedEngineer')}}</span>
</div>
<a-select class="box-input-search"
v-model="queryParam.certificationEngineer"
:placeholder="$t('PleaseSelect')+$t('certifiedEngineer')">
<a-select-option v-for="(item, key) in dictOptionsValue"
:key="item.certificationEngineer"
:value="item.certificationEngineer">
<span class="itemOption" :title=" item.certificationEngineerName ">
{{ item.certificationEngineerName }}
</span>
</a-select-option>
</a-select>
</div>
</a-col>
<span style="float: right;overflow: hidden;margin-right: 11px;margin-bottom: 20px"
class="table-page-search-submitButtons">
<a-button class="box-button-search" type="primary" @click="searchQuery">{{$t('query')}}</a-button>
<a-button class="box-button-search" style="margin-left: 8px"
@click="searchReset">{{$t('reset')}}</a-button>
</span>
</a-row>
</a-form>
<div class="table-operator">
<div @click="handleModule" v-has="'projectRelatedPersonnel:exportTemplate'" class="operator-text">
<a-icon type="download"/>
@@ -23,12 +88,21 @@
<ImportFile :url="url" :projectId="$route.query.id" :isTrue="true" :accept="'.xls'"
@getList="getPersonnelList"/>
</div>
<div class="operator-text"
@click="batSettingClick"
v-has="'projectRelatedPersonnel:setting'"
v-if="this.$route.query.studioEngineer == this.userInfo().id">
<a-icon type="setting"/>
{{$t('batSetting')}}
</div>
</div>
<!-- rowKey="id"
:row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }"-->
<a-table
class="table"
:columns="columns"
rowKey="id"
:row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }"
:pagination="false"
:scroll="{x:800,y: 400}"
:data-source="dataSource"
@@ -84,10 +158,10 @@
<a-col :span="24">
<div class="box-title-text">
<div class="title-text">
<!-- <span class="Required">*</span>-->
<!-- <span class="Required">*</span>-->
<span class="title-text-text" :title="$t('regulatoryEngineer')">{{$t('regulatoryEngineer')}}</span>
</div>
<!-- :prop="'lawEngineerName'"-->
<!-- :prop="'lawEngineerName'"-->
<a-form-model-item class="itemModel">
<PersonnelSelection
:query="{db_field_name:'lawEngineer',db_field_txt:$t('regulatoryEngineer')}"
@@ -104,10 +178,10 @@
<a-col :span="24">
<div class="box-title-text">
<div class="title-text">
<!-- <span class="Required">*</span>-->
<!-- <span class="Required">*</span>-->
<span class="title-text-text" :title="$t('engineeringInterfacePerson')">{{$t('engineeringInterfacePerson')}}</span>
</div>
<!-- :prop="'engineeringInterfacePersonName'"-->
<!-- :prop="'engineeringInterfacePersonName'"-->
<a-form-model-item class="itemModel">
<PersonnelSelection
:query="{db_field_name:'engineeringInterfacePerson',db_field_txt:$t('engineeringInterfacePerson')}"
@@ -124,10 +198,10 @@
<a-col :span="24">
<div class="box-title-text">
<div class="title-text">
<!-- <span class="Required">*</span>-->
<!-- <span class="Required">*</span>-->
<span class="title-text-text" :title="$t('certifiedEngineer')">{{$t('certifiedEngineer')}}</span>
</div>
<!-- :prop="'certificationEngineer'"-->
<!-- :prop="'certificationEngineer'"-->
<a-form-model-item class="itemModel">
<a-select allowClear
v-model="formInline.certificationEngineer"
@@ -162,12 +236,14 @@
</a-form-model>
</a-spin>
</a-modal>
<personBatting ref="personBattingRef" @personBattingTable="personBattingTable"/>
</div>
</template>
<script>
import PersonnelSelection from '@/components/PersonnelSelection/index'
import personBatting from './personBatting'
import { getAction, postAction, downloadFile, putAction } from '@/api/manage'
import ImportFile from '@/components/ImportFile/index'
import { mapGetters } from 'vuex'
@@ -176,11 +252,13 @@
name: 'listOfRelevantPersonnel',
components: {
PersonnelSelection,
ImportFile
ImportFile,
personBatting
},
data() {
return {
visible: false,
queryParam: {},
columnsAll: [
{
title: this.$t('areaOfResponsibility'),
@@ -321,12 +399,25 @@
}
})
},
deleteData(name){
personBattingTable() {
this.selectedRowKeys = []
this.getList()
},
batSettingClick() {
if (this.selectedRowKeys && this.selectedRowKeys.length > 0) {
let selectedRowKeys = JSON.parse(JSON.stringify(this.selectedRowKeys))
this.$refs.personBattingRef.getData(selectedRowKeys.join(','))
} else {
this.$message.warning(this.$t('selectLeastOne'))
}
},
deleteData(name) {
this.formInline[name] = ''
this.formInline = {...this.formInline}
this.formInline = { ...this.formInline }
},
getData() {
this.visible = true
this.queryParam = {}
this.getList()
this.queryCertificationEngineer()
},
@@ -336,7 +427,7 @@
editOk() {
this.$refs.ruleForm.validate(valid => {
if (valid) {
if (!this.formInline.certificationEngineer){
if (!this.formInline.certificationEngineer) {
this.formInline.certificationEngineer = ''
}
this.confirmLoading = true
@@ -362,8 +453,13 @@
})
},
PersonnelSelectionChange(value, id) {
this.formInline[value] = id
this.formInline = { ...this.formInline }
if (this.editVisible) {
this.formInline[value] = id
this.formInline = { ...this.formInline }
} else {
this.queryParam[value] = id
this.queryParam = { ...this.queryParam }
}
},
// pageOnChange(page, pageSize) {
// this.pageNo = page
@@ -377,9 +473,17 @@
onSelectChange(value) {
this.selectedRowKeys = value
},
searchQuery() {
this.getList()
},
searchReset() {
this.queryParam = {}
this.getList()
},
getList() {
let query = {
projectId: this.$route.query.id
projectId: this.$route.query.id,
...this.queryParam
}
this.loading = true
postAction(this.url.page, query).then((res) => {
@@ -409,7 +513,20 @@
}
}
</script>
<style>
.box-input-search .ant-select-selection--single {
height: 38px;
}
.box-input-search .ant-select-selection--multiple {
height: 38px;
}
.box-input-search .ant-select-selection__rendered {
line-height: 38px;
height: 38px;
}
</style>
<style scoped>
@import '~@assets/less/common.less';
@@ -472,4 +589,37 @@
text-overflow: ellipsis;
-o-text-overflow: ellipsis;
}
.box-title-text-search {
line-height: 1.4;
display: flex;
align-items: center;
margin-bottom: 10px;
}
.title-text-search {
width: 90px;
color: #000F16;
display: inline-block;
font-weight: 500;
font-size: 14px;
margin-right: 16px;
margin-top: 3px;
text-align: right;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.box-input-search {
display: inline-block;
width: calc(100% - 100px);
height: 38px;
margin-top: 2px;
}
.box-button-search {
height: 38px;
/*margin-top: 2px;*/
}
</style>
@@ -0,0 +1,180 @@
<template>
<a-modal
:title="$t('batSetting')"
:width="600"
:visible="visible"
:maskClosable="false"
:confirm-loading="confirmLoading"
@ok="editOk"
@cancel="visible = false"
>
<a-spin :spinning="confirmLoading">
<a-form-model :model="formInline" class="formAdd" :rules="rules" ref="ruleForm">
<a-row :gutter="24">
<a-col :span="24">
<div class="box-title-text">
<div class="title-text">
<span class="title-text-text" :title="$t('regulatoryEngineer')">{{$t('regulatoryEngineer')}}</span>
</div>
<a-form-model-item class="itemModel">
<PersonnelSelection
:query="{db_field_name:'lawEngineer',db_field_txt:$t('regulatoryEngineer')}"
:personneQuery="formInline"
@change="PersonnelSelectionChange"
v-model="formInline.lawEngineerName"/>
</a-form-model-item>
</div>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :span="24">
<div class="box-title-text">
<div class="title-text">
<span class="title-text-text" :title="$t('engineeringInterfacePerson')">{{$t('engineeringInterfacePerson')}}</span>
</div>
<a-form-model-item class="itemModel">
<PersonnelSelection
:query="{db_field_name:'engineeringInterfacePerson',db_field_txt:$t('engineeringInterfacePerson')}"
:personneQuery="formInline"
@change="PersonnelSelectionChange"
v-model="formInline.engineeringInterfacePersonName"/>
</a-form-model-item>
</div>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :span="24">
<div class="box-title-text">
<div class="title-text">
<span class="title-text-text" :title="$t('certifiedEngineer')">{{$t('certifiedEngineer')}}</span>
</div>
<a-form-model-item class="itemModel">
<a-select allowClear
class="box-input"
v-model="formInline.certificationEngineer"
:placeholder="$t('certifiedEngineer')+$t('areaOfResponsibility')">
<a-select-option v-for="(item, key) in dictOptionsValue"
:key="item.certificationEngineer"
:value="item.certificationEngineer">
<span class="itemOption" :title=" item.certificationEngineerName ">
{{ item.certificationEngineerName }}
</span>
</a-select-option>
</a-select>
</a-form-model-item>
</div>
</a-col>
</a-row>
</a-form-model>
</a-spin>
</a-modal>
</template>
<script>
import PersonnelSelection from '@/components/PersonnelSelection/index'
import { getAction, postAction, downloadFile, putAction } from '@/api/manage'
export default {
name: 'personBatting',
components: {
PersonnelSelection
},
data() {
return {
confirmLoading: false,
formInline: {},
visible: false,
rules: {},
ids: '',
dictOptionsValue: [],
url: {
queryCertificationEngineer: '/project/projectRelatedPersonnel/queryCertificationEngineer'
}
}
},
mounted() {
},
methods: {
getData(ids) {
this.visible = true
this.ids = ids
this.formInline = {}
this.queryCertificationEngineer()
},
queryCertificationEngineer() {
getAction(this.url.queryCertificationEngineer, { projectId: this.$route.query.id }).then((res) => {
if (res.success) {
this.dictOptionsValue = res.result
} else {
this.dictOptionsValue = []
}
})
},
PersonnelSelectionChange(value, id) {
this.formInline[value] = id
this.formInline = { ...this.formInline }
},
editOk() {
let query = {
...this.formInline,
ids: this.ids
}
this.confirmLoading = true
postAction('/project/projectRelatedPersonnel/setBatch', query).then((res) => {
if (res.success) {
this.$message.success(this.$t('OperationSuccessful'))
this.visible = false
this.confirmLoading = false
this.$emit('personBattingTable')
} else {
this.$message.warning(this.$t('operationFailed'))
this.confirmLoading = false
}
})
}
}
}
</script>
<style scoped>
.box-title-text {
line-height: 1.4;
display: flex;
/*align-items: center;*/
}
.title-text {
width: 114px;
text-align: right;
display: inline-block;
font-weight: 500;
font-size: 14px;
margin-right: 16px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
height: 42px;
line-height: 48px;
}
.box-input {
display: inline-block;
height: 38px;
width: 100%;
}
.itemModel {
width: calc(100% - 130px);
display: inline-block;
margin-top: 2px;
}
.Required {
color: red;
margin-right: 4px;
}
.title-text-text {
margin-top: 9px;
}
</style>
@@ -46,7 +46,8 @@
<div class="process-content-content" :style="val.left"
v-for="(val,indexOne) in item.data[0]" :key="indexOne">
<div class="process-content-right-top" :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>
<a-tooltip placement="topLeft">
<template slot="title">
<span>{{val.time.slice(0,11)}}</span>
@@ -496,23 +497,27 @@
.process-content-right-top {
font-size: 12px;
color: #040B29;
width: 50px;
width: 70px;
background: #fff;
display: inline-block;
overflow: hidden;
position: absolute;
top: -14px;
top: -12px;
left: 50%;
transform: translate(-50%, -50%);
}
.process-content-right-button{
font-size: 12px;
color: #040B29;
width: 70px;
background: #fff;
display: inline-block;
overflow: hidden;
position: absolute;
top: 12px;
left: 50%;
line-height: 1.2;
display: -webkit-box;
text-overflow: ellipsis;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
/*! autoprefixer: on;*/
text-justify: inter-ideograph;
word-break: break-all;
transform: translate(-50%, -50%);
}
.process-content-right-button {
width: 70px;
font-size: 12px;
@@ -71,7 +71,8 @@
<div class="process-content-right-xian"></div>
<div class="process-content-content" :style="val.left"
v-for="(val,indexOne) in item.data[0]" :key="indexOne">
<div class="process-content-right-top" :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>
<a-tooltip placement="topLeft">
<template slot="title">
<span>{{val.time.slice(0,11)}}</span>
@@ -647,23 +648,27 @@
.process-content-right-top {
font-size: 12px;
color: #040B29;
width: 50px;
width: 70px;
background: #fff;
display: inline-block;
overflow: hidden;
position: absolute;
top: -14px;
top: -12px;
left: 50%;
line-height: 1.2;
display: -webkit-box;
text-overflow: ellipsis;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
/*! autoprefixer: on;*/
text-justify: inter-ideograph;
word-break: break-all;
transform: translate(-50%, -50%);
}
.process-content-right-button{
font-size: 12px;
color: #040B29;
width: 70px;
background: #fff;
display: inline-block;
overflow: hidden;
position: absolute;
top: 12px;
left: 50%;
transform: translate(-50%, -50%);
}
.process-content-right-button {
width: 70px;
font-size: 12px;