@ -1,5 +1,6 @@
package cn.axzo.nanopart.visa.server.service.impl ;
import cn.axzo.apollo.api.res.ConstructionAreaInfo ;
import cn.axzo.apollo.workspace.api.workspace.res.GetDetailRes ;
import cn.axzo.apollo.workspace.api.workspace.res.ProjectBriefResp ;
import cn.axzo.apollo.workspace.api.workspace.res.ProjectDetailRes ;
@ -7,6 +8,7 @@ import cn.axzo.basics.common.constant.enums.OrganizationalNodeTypeEnum;
import cn.axzo.basics.common.util.AssertUtil ;
import cn.axzo.basics.common.util.NumberUtil ;
import cn.axzo.basics.profiles.dto.basic.PersonProfileDto ;
import cn.axzo.basics.report.api.ReportServiceSDK ;
import cn.axzo.basics.report.api.sheet.SheetWrapper ;
import cn.axzo.foundation.page.PageResp ;
import cn.axzo.framework.domain.ServiceException ;
@ -17,9 +19,14 @@ import cn.axzo.im.center.api.vo.req.GroupDismissRequest;
import cn.axzo.im.center.api.vo.resp.GroupCreateResponse ;
import cn.axzo.im.center.common.enums.AppTypeEnum ;
import cn.axzo.im.center.common.enums.GroupType ;
import cn.axzo.maokai.api.vo.request.CooperateShipQueryReq ;
import cn.axzo.maokai.api.vo.request.OrgNodeUserBriefInfoListReq ;
import cn.axzo.maokai.api.vo.response.CooperateShipResp ;
import cn.axzo.maokai.api.vo.response.OrgNodeUserBriefInfoResp ;
import cn.axzo.maokai.api.vo.response.OrganizationalUnitVO ;
import cn.axzo.maokai.common.enums.SaasCooperateShipCooperateTypeEnum ;
import cn.axzo.msg.center.service.dto.PeerPerson ;
import cn.axzo.msg.center.service.pending.request.CardSendRequest ;
import cn.axzo.nanopart.visa.api.enums.VisaBillTypeEnum ;
import cn.axzo.nanopart.visa.api.enums.VisaChangeFieldEnum ;
import cn.axzo.nanopart.visa.api.enums.VisaConfirmBizTypeEnum ;
@ -41,6 +48,7 @@ import cn.axzo.nanopart.visa.api.request.VisaInitiatorListReq;
import cn.axzo.nanopart.visa.api.response.VisaChangeInitiatorResp ;
import cn.axzo.nanopart.visa.api.response.VisaChangePageSearchResp ;
import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse ;
import cn.axzo.nanopart.visa.server.config.RefreshableConfiguration ;
import cn.axzo.nanopart.visa.server.domain.ChangeRecord ;
import cn.axzo.nanopart.visa.server.domain.ChangeRecordBill ;
import cn.axzo.nanopart.visa.server.domain.ChangeRecordConfirm ;
@ -49,12 +57,14 @@ import cn.axzo.nanopart.visa.server.domain.ChangeRecordRelation;
import cn.axzo.nanopart.visa.server.dto.VisaAddLogContext ;
import cn.axzo.nanopart.visa.server.dto.VisaBillDto ;
import cn.axzo.nanopart.visa.server.dto.VisaConfirmDto ;
import cn.axzo.nanopart.visa.server.dto.VisaExportDto ;
import cn.axzo.nanopart.visa.server.dto.VisaLogParam ;
import cn.axzo.nanopart.visa.server.mapper.ChangeRecordDao ;
import cn.axzo.nanopart.visa.server.rpc.ApolloConstructionAreaGateway ;
import cn.axzo.nanopart.visa.server.rpc.DrawingMajorGateway ;
import cn.axzo.nanopart.visa.server.rpc.MsgCenterGateway ;
import cn.axzo.nanopart.visa.server.rpc.OrganizationalUnitGateway ;
import cn.axzo.nanopart.visa.server.rpc.VisaCooperateShipGateway ;
import cn.axzo.nanopart.visa.server.rpc.VisaOrganizationalNodeUserGateway ;
import cn.axzo.nanopart.visa.server.rpc.VisaProfileGateway ;
import cn.axzo.nanopart.visa.server.rpc.VisaProjectApiGateway ;
@ -70,6 +80,7 @@ import cn.axzo.nanopart.visa.server.utils.Constants;
import cn.axzo.orggateway.api.nodeuser.dto.OrgNodeUserDTO ;
import cn.axzo.orggateway.api.nodeuser.req.ListOrgNodeUserReq ;
import cn.axzo.orgmanax.dto.nodeuser.req.ListNodeUserReq ;
import cn.axzo.thor.client.model.DrawingMajorResp ;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum ;
import cn.axzo.workflow.common.model.dto.UploadFieldDTO ;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO ;
@ -80,6 +91,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil ;
import cn.hutool.core.lang.Pair ;
import com.alibaba.fastjson.JSON ;
import com.alibaba.fastjson.JSONArray ;
import com.alibaba.fastjson.JSONObject ;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper ;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page ;
@ -91,14 +103,14 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils ;
import org.apache.commons.collections.MapUtils ;
import org.apache.groovy.util.Maps ;
import org.springframework.beans.factory.annotation.Value ;
import org.springframework.cloud.context.config.annotation.RefreshScope ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.stereotype.Service ;
import org.springframework.transaction.annotation.Transactional ;
import org.springframework.util.StringUtils ;
import javax.annotation.Resource ;
import java.math.BigDecimal ;
import java.util.Arrays ;
import java.util.Collections ;
import java.util.Date ;
import java.util.HashMap ;
@ -126,6 +138,7 @@ import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_TOPIC;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_INITIATOR_WORKSPACE_ID ;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_VISA_ID ;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_VISA_TYPE ;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.MSG_CENTER_APP_CODE ;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_PENDING_TOPIC ;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_VAR_VISA_TYPE_KEY ;
@ -136,7 +149,6 @@ import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_VAR_VISA_
* /
@Slf4j
@Service
@RefreshScope
public class ChangeRecordServiceImpl extends ServiceImpl < ChangeRecordDao , ChangeRecord > implements ChangeRecordService {
@Resource
@ -161,24 +173,14 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
@Resource
private VisaOrganizationalNodeUserGateway nodeUserGateway ;
/ / @Resource
/ / private ReportServiceSDK reportServiceSDK ;
@Resource
private ReportServiceSDK reportServiceSDK ;
@Resource
private WorkflowGateway workflowGateway ;
@Resource
private MsgCenterGateway msgCenterGateway ;
/ * *
* 相关单位确认人人数限制
* /
@Value ( " ${visa.verifyPersonLimit: 8} " )
private Integer verifyPersonLimit ;
/ * *
* 关联变更单个数限制
* /
@Value ( " ${visa.verifyVisaLimit: 5} " )
private Integer verifyVisaLimit ;
/ * *
* 最大变化金额
* /
@ -204,6 +206,14 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
@Resource
private VisaOrganizationalNodeUserGateway visaOrganizationalNodeUserGateway ;
@Resource
private RefreshableConfiguration refreshableConfiguration ;
@Resource
private VisaCooperateShipGateway visaCooperateShipGateway ;
@Autowired
private ChangeRecordService changeRecordService ;
/ * *
* 状态变更
* /
@ -463,6 +473,19 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
@Override
@Transactional ( rollbackFor = Exception . class )
public Long tempCreateVisaChangeRecord ( VisaChangeTempCreateReq req ) {
AssertUtil . isTrue ( NumberUtil . isPositiveNumber ( req . getRelationWorkspaceId ( ) ) , " 关联项目不能为空 " ) ;
AssertUtil . isTrue ( NumberUtil . isPositiveNumber ( req . getOperatorOuId ( ) ) & & NumberUtil . isPositiveNumber ( req . getOperatorPersonId ( ) ) ,
" 操作人信息不能为空 " ) ;
if ( NumberUtil . isNotPositiveNumber ( req . getOperatorOuType ( ) ) ) {
CooperateShipQueryReq shipQueryReq = CooperateShipQueryReq . builder ( )
. personId ( req . getOperatorPersonId ( ) )
. workspaceId ( req . getRelationWorkspaceId ( ) )
. ouId ( req . getOperatorOuId ( ) )
. build ( ) ;
List < CooperateShipResp > shipRespList = visaCooperateShipGateway . genericQuery ( shipQueryReq ) ;
AssertUtil . notEmpty ( shipRespList , " 操作人所在单位信息不能为空 " ) ;
req . setOperatorOuType ( shipRespList . get ( 0 ) . getCooperateType ( ) ) ;
}
ChangeRecord changeRecord ;
List < VisaConfirmDto > confirmPerson = Lists . newArrayList ( ) ;
VisaAddLogContext oldContext = null ;
@ -507,9 +530,9 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
/*保存附加关联信息*/
/ / 相关单位与人员
if ( CollectionUtils . isNotEmpty ( req . getRelationUnitAndPersonList ( ) ) ) {
confirmPerson = req . getRelationUnitAndPersonList ( ) . stream ( )
confirmPerson . addAll ( req . getRelationUnitAndPersonList ( ) . stream ( )
. map ( p - > buildConfirmVisaConfirmDto ( p , changeRecord , req . getOperatorPersonId ( ) ) )
. collect ( Collectors . toList ( ) ) ;
. collect ( Collectors . toList ( ) ) ) ;
}
changeRecordConfirmService . addConfirm ( confirmPerson ) ;
/ / 保存发生内容及说明
@ -660,7 +683,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
processDto . setTenantId ( String . valueOf ( req . getRelationWorkspaceId ( ) ) ) ;
Map < String , Object > formVariables = new HashMap < > ( ) ;
/ / 传递表单数据
/ / 传递表单数据 TODO 传递给流程的表单项数据 , 还需要调整内容
formVariables . put ( FORM_FIELD_NO , req . getNo ( ) ) ;
formVariables . put ( FORM_FIELD_HAPPEN_TIME , req . getHappenTime ( ) ) ;
formVariables . put ( FORM_FIELD_TOPIC , req . getTopic ( ) ) ;
@ -799,6 +822,10 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
public void export ( VisaChangeExportReq req ) {
VisaChangePageSearchReq filter = req . getFilter ( ) ;
List < VisaChangeFieldEnum > fields = req . getFields ( ) ;
/ / 默认导出全部字段
if ( CollectionUtils . isEmpty ( fields ) ) {
fields = Arrays . asList ( VisaChangeFieldEnum . values ( ) ) ;
}
/ / Set < Long > permissionVisaIdSet = this . fetchPermissionVisaIdSet ( filter ) ;
List < ChangeRecord > changeRecordList = Lists . newArrayList ( ) ;
@ -808,20 +835,59 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
/ / }
/*获取数据*/
changeRecordList = getFilter ( filter , Sets . newHashSet ( ) ) . list ( ) ;
changeRecordList = getFilter ( filter , Sets . newHashSet ( ) ) . list ( ) ;
AssertUtil . notEmpty ( changeRecordList , " 没有数据需要导出 " ) ;
AssertUtil . isTrue ( CollUtil . isNotEmpty ( changeRecordList ) , " " ) ;
/*数据转换*/
/ / 所属工程
Map < Long , String > projectInfoMapById ;
Map < Long , OrgNodeUserBriefInfoResp > initiatorMap ;
if ( fields . contains ( VisaChangeFieldEnum . RELATION_PROJECT ) ) {
List < Long > projectIdList = changeRecordList . stream ( ) . map ( ChangeRecord : : getRelationProject ) . collect ( Collectors . toList ( ) ) ;
projectInfoMapById = getProjectInfoMapById ( projectIdList ) ;
} else {
projectInfoMapById = Collections . emptyMap ( ) ;
}
/ / 发起人
if ( fields . contains ( VisaChangeFieldEnum . CREATE_BY ) ) {
List < Long > initiatorPersonIdList = changeRecordList . stream ( ) . map ( ChangeRecord : : getCreateBy ) . distinct ( ) . collect ( Collectors . toList ( ) ) ;
/ / Map < personId , OrgNodeUserBriefInfoResp >
initiatorMap = getPersonBriefInfoMap ( changeRecordList . get ( 0 ) . getRelationWorkspaceId ( ) , initiatorPersonIdList ) ;
} else {
initiatorMap = Collections . emptyMap ( ) ;
}
List < Object > data = changeRecordList . stream ( )
. map ( item - > VisaExportDto . builder ( )
. no ( item . getNo ( ) )
. type ( item . getType ( ) . getDesc ( ) )
. status ( item . getStatus ( ) . getDesc ( ) )
. topic ( item . getTopic ( ) )
. relationProject ( CollUtil . isNotEmpty ( projectInfoMapById ) ? projectInfoMapById . getOrDefault ( item . getRelationProject ( ) , " " ) : " " )
. happenTime ( item . getHappenTime ( ) )
. amountChange ( item . getAmountChange ( ) )
. approvalCompleteTime ( Objects . equals ( VisaStatusEnum . COMPLETED , item . getStatus ( ) ) ? item . getApprovalCompleteTime ( ) : null )
. initiator ( CollUtil . isNotEmpty ( initiatorMap ) ? initiatorMap . getOrDefault ( item . getCreateBy ( ) , OrgNodeUserBriefInfoResp . builder ( ) . build ( ) ) . getRealName ( ) : " " )
. build ( ) )
. collect ( Collectors . toList ( ) ) ;
/*导出文excel并上传至云*/
String scene = " visa " ;
String fileName = String . format ( " 变更签证单%s " , DateUtil . format ( new Date ( ) , " yyyyMMddHHmmss " ) ) ;
SheetWrapper sheetWrapper = new SheetWrapper ( ) ;
sheetWrapper . setTitle ( " 变更签证单 " ) ;
/ / sheetWrapper
/ / reportServiceSDK . asyncUploadReportPsw ( scene , fileName , null , false , ) ;
String sheetName = " 变更签证表 " ;
String headerName = " 变更签证单 " ;
SheetWrapper sheetWrapper = SheetWrapper . builder ( )
. title ( headerName )
. sheetName ( sheetName )
. includeColumnFieldNames ( fields . stream ( )
. map ( VisaChangeFieldEnum : : getDesc )
. collect ( Collectors . toList ( ) ) )
. sourceData ( data )
. build ( ) ;
reportServiceSDK . asyncUploadReportPsw ( scene , fileName , null , false , sheetWrapper ) ;
}
private LambdaQueryChainWrapper < ChangeRecord > getFilter ( VisaChangePageSearchReq filter , Set < Long > permissionVisaIdSet ) {
private LambdaQueryChainWrapper < ChangeRecord > getFilter ( VisaChangePageSearchReq filter , Set < Long > permissionVisaIdSet ) {
LambdaQueryChainWrapper < ChangeRecord > queryChainWrapper = lambdaQuery ( )
/ / . in ( ChangeRecord : : getId , permissionVisaIdSet )
@ -908,10 +974,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
}
/*获取工程信息*/
List < Long > projectIdList = records . stream ( ) . map ( ChangeRecord : : getRelationProject ) . distinct ( ) . collect ( Collectors . toList ( ) ) ;
List < ProjectBriefResp > projectBriefByIds = visaProjectApiGateway . getProjectBriefByIds ( projectIdList ) ;
AssertUtil . notEmpty ( projectBriefByIds , " 工程信息获取失败 " ) ;
/ / Map < projectId , name >
Map < Long , String > projectIdNameMap = projectBriefByIds . stream ( ) . collect ( Collectors . toMap ( ProjectBriefResp : : getId , ProjectBriefResp : : getName ) ) ;
Map < Long , String > projectIdNameMap = getProjectInfoMapById ( projectIdList ) ;
/*获取变更单发起人*/
List < Long > visaIdList = records . stream ( ) . map ( ChangeRecord : : getId ) . distinct ( ) . collect ( Collectors . toList ( ) ) ;
@ -921,7 +984,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
/*获取发起人岗位*/
List < Long > initiatorPersonIdList = visaIdInitiatorMap . values ( ) . stream ( ) . map ( ChangeRecordConfirm : : getPersonId ) . distinct ( ) . collect ( Collectors . toList ( ) ) ;
/ / Map < i d, OrgNodeUserBriefInfoResp >
/ / Map < personI d, OrgNodeUserBriefInfoResp >
Map < Long , OrgNodeUserBriefInfoResp > initiatorMap = getPersonBriefInfoMap ( records . get ( 0 ) . getRelationWorkspaceId ( ) , initiatorPersonIdList ) ;
AssertUtil . isTrue ( CollUtil . isNotEmpty ( initiatorMap ) , " 发起人信息获取失败 " ) ;
@ -956,6 +1019,15 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
. collect ( Collectors . toList ( ) ) ;
}
private Map < Long , String > getProjectInfoMapById ( List < Long > projectIdList ) {
List < ProjectBriefResp > projectBriefByIds = visaProjectApiGateway . getProjectBriefByIds ( projectIdList ) ;
if ( CollectionUtils . isEmpty ( projectBriefByIds ) ) {
return Collections . emptyMap ( ) ;
}
/ / Map < projectId , name >
return projectBriefByIds . stream ( ) . collect ( Collectors . toMap ( ProjectBriefResp : : getId , ProjectBriefResp : : getName ) ) ;
}
private Map < Long , ChangeRecordConfirm > getInitiatorMapByVisaId ( List < Long > visaIdList ) {
VisaConfirmDto visaConfirmDto = VisaConfirmDto . builder ( )
. bizType ( VisaConfirmBizTypeEnum . CREATE )
@ -970,17 +1042,17 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
private static void validSearchCondition ( VisaChangePageSearchReq req ) {
if ( CollectionUtils . isNotEmpty ( req . getAmountChange ( ) ) ) {
AssertUtil . notNull ( req . getAmountChange ( ) . size ( ) < 2 , " 请填写金额范围 " ) ;
AssertUtil . isFalse ( req . getAmountChange ( ) . size ( ) < 2 , " 请填写金额范围 " ) ;
/ / 最大最小值的符号必须相同
AssertUtil . isTrue ( Objects . equals ( req . getAmountChange ( ) . get ( 0 ) . signum ( ) , req . getAmountChange ( ) . get ( 1 ) . signum ( ) ) , " 请输入合法的变更金额范围 " ) ;
AssertUtil . isTrue ( req . getAmountChange ( ) . get ( 0 ) . compareTo ( req . getAmountChange ( ) . get ( 1 ) ) < 0 , " 最大金额不能小于最小金额 " ) ;
}
if ( CollectionUtils . isNotEmpty ( req . getHappenTime ( ) ) ) {
AssertUtil . notNull ( req . getHappenTime ( ) . size ( ) < 2 , " 请填写提出时间范围 " ) ;
AssertUtil . isFalse ( req . getHappenTime ( ) . size ( ) < 2 , " 请填写提出时间范围 " ) ;
AssertUtil . isTrue ( req . getHappenTime ( ) . get ( 0 ) . compareTo ( req . getHappenTime ( ) . get ( 1 ) ) < 0 , " 提出结束时间不能小于开始时间 " ) ;
}
if ( CollectionUtils . isNotEmpty ( req . getApproveCompletedDate ( ) ) ) {
AssertUtil . notNull ( req . getApproveCompletedDate ( ) . size ( ) < 2 , " 请填写审批完成范围 " ) ;
AssertUtil . isFalse ( req . getApproveCompletedDate ( ) . size ( ) < 2 , " 请填写审批完成范围 " ) ;
AssertUtil . isTrue ( req . getApproveCompletedDate ( ) . get ( 0 ) . compareTo ( req . getApproveCompletedDate ( ) . get ( 1 ) ) < 0 , " 审批完成结束时间不能小于开始时间 " ) ;
}
}
@ -1051,7 +1123,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
List < OrgNodeUserBriefInfoResp > nodeUserBriefInfoResps = nodeUserGateway . listOrgNodeUsers ( infoListReq ) ;
AssertUtil . notEmpty ( nodeUserBriefInfoResps , " 所有单位确认人均已退场 " ) ;
cooperateTypeMap . forEach ( ( k , v ) - > {
AssertUtil . isTrue ( v . size ( ) < = verifyPersonLimit , String . format ( k . getDesc ( ) + " 确认人,最多支持%d个 " , verifyPersonLimit ) ) ;
AssertUtil . isTrue ( v . size ( ) < = refreshableConfiguration. getVerifyPersonLimit ( ) , String . format ( k . getDesc ( ) + " 确认人,最多支持%d个 " , refreshableConfiguration. getVerifyPersonLimit ( ) ) ) ;
boolean noExit = v . stream ( ) . map ( VisaChangeTempCreateReq . RelationUnitAndPerson : : getPersonId )
. anyMatch ( p - > nodeUserBriefInfoResps . stream ( ) . anyMatch ( u - > Objects . equals ( u . getPersonId ( ) , p ) ) ) ;
AssertUtil . isTrue ( noExit , String . format ( k . getDesc ( ) + " 确认人,存在已退场人员,请重新选择 " ) ) ;
@ -1065,18 +1137,21 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
if ( Objects . equals ( VisaRelationFieldEnum . TASK_ORDER . name ( ) , key ) ) {
/*任务单*/
/ / 关联单据数量限制
AssertUtil . isTrue ( value . size ( ) < = verifyVisaLimit , String . format ( " 最多可关联%d个变更单, 请重新选择 " , verifyVisaLimit ) ) ;
AssertUtil . isTrue ( value . size ( ) < = refreshableConfiguration . getVerifyVisaLimit ( ) ,
String . format ( " 最多可关联%d个变更单, 请重新选择 " , refreshableConfiguration . getVerifyVisaLimit ( ) ) ) ;
validBillIfRelated ( VisaBillTypeEnum . TASK , value , req . getType ( ) ) ;
} else if ( Objects . equals ( VisaRelationFieldEnum . RECTIFICATION_ORDER . name ( ) , key ) ) {
/*整改单*/
/ / 关联单据数量限制
AssertUtil . isTrue ( value . size ( ) < = verifyVisaLimit , String . format ( " 最多可关联%d个变更单, 请重新选择 " , verifyVisaLimit ) ) ;
AssertUtil . isTrue ( value . size ( ) < = refreshableConfiguration . getVerifyVisaLimit ( ) ,
String . format ( " 最多可关联%d个变更单, 请重新选择 " , refreshableConfiguration . getVerifyVisaLimit ( ) ) ) ;
validBillIfRelated ( VisaBillTypeEnum . RECTIFY , value , req . getType ( ) ) ;
} else if ( Objects . equals ( VisaRelationFieldEnum . VISA_ORDER . name ( ) , key ) ) {
/*变更单*/
AssertUtil . isTrue ( VisaTypeEnum . TECHNOLOGY_APPROVED . equals ( req . getType ( ) ) | | VisaTypeEnum . PROJECT_VISA . equals ( req . getType ( ) ) , " 变更单关联单据仅支持技术核定/工程签证 " ) ;
/ / 关联单据数量限制
AssertUtil . isTrue ( value . size ( ) < = verifyVisaLimit , String . format ( " 最多可关联%d个变更单, 请重新选择 " , verifyVisaLimit ) ) ;
AssertUtil . isTrue ( value . size ( ) < = refreshableConfiguration . getVerifyVisaLimit ( ) ,
String . format ( " 最多可关联%d个变更单, 请重新选择 " , refreshableConfiguration . getVerifyVisaLimit ( ) ) ) ;
/ / 关联单据合法性 , 是否存在 , 状态是否合法
List < ChangeRecord > relationVisa = listByIds ( value ) ;
AssertUtil . notEmpty ( relationVisa , " 关联的单据不存在 " ) ;
@ -1108,9 +1183,58 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
} ) ) ;
}
private List < VisaDetailByIdResponse . RelationAreaDetail > buildArea ( JSONArray relationArea ) {
if ( CollectionUtils . isEmpty ( relationArea ) ) {
return Lists . newArrayList ( ) ;
}
List < VisaDetailByIdResponse . RelationArea > relationAreaList = relationArea . toJavaList ( VisaDetailByIdResponse . RelationArea . class ) ;
if ( CollectionUtils . isEmpty ( relationAreaList ) ) {
return Lists . newArrayList ( ) ;
}
List < Long > areaIds = relationAreaList . stream ( )
. filter ( item - > Objects . nonNull ( item . getId ( ) ) )
. map ( VisaDetailByIdResponse . RelationArea : : getId ) . collect ( Collectors . toList ( ) ) ;
if ( CollectionUtils . isEmpty ( areaIds ) ) {
return Lists . newArrayList ( ) ;
}
List < ConstructionAreaInfo > list = apolloConstructionAreaGateway . getAllConstructionAreaByIds ( areaIds ) ;
if ( CollectionUtils . isEmpty ( list ) ) {
return Lists . newArrayList ( ) ;
}
return list . stream ( ) . map ( item - > VisaDetailByIdResponse . RelationAreaDetail . builder ( )
. id ( item . getId ( ) )
. name ( item . getName ( ) ) . build ( ) )
. collect ( Collectors . toList ( ) ) ;
}
/ * *
* 构建专业集合
* /
private List < VisaDetailByIdResponse . RelationProfessionalDetail > buildProfession ( Long projectId , JSONArray relationProfessional ) {
if ( Objects . isNull ( projectId ) | | CollectionUtils . isEmpty ( relationProfessional ) ) {
return Lists . newArrayList ( ) ;
}
List < VisaDetailByIdResponse . RelationProfessional > professionalList = relationProfessional . toJavaList ( VisaDetailByIdResponse . RelationProfessional . class ) ;
if ( CollectionUtils . isEmpty ( professionalList ) ) {
return Lists . newArrayList ( ) ;
}
Set < String > majorCodes = professionalList . stream ( )
. filter ( item - > StringUtils . hasText ( item . getCode ( ) ) )
. map ( VisaDetailByIdResponse . RelationProfessional : : getCode ) . collect ( Collectors . toSet ( ) ) ;
if ( CollectionUtils . isEmpty ( majorCodes ) ) {
return Lists . newArrayList ( ) ;
}
List < DrawingMajorResp > majorRespList = drawingMajorGateway . list ( projectId , majorCodes , true ) ;
if ( CollectionUtils . isEmpty ( majorCodes ) ) {
return Lists . newArrayList ( ) ;
}
return majorRespList . stream ( )
. map ( item - > VisaDetailByIdResponse . RelationProfessionalDetail . builder ( ) . id ( item . getId ( ) ) . code ( item . getCode ( ) ) . name ( item . getName ( ) ) . build ( ) )
. collect ( Collectors . toList ( ) ) ;
}
/ * *
* 通过变更签证Id获取Entity
@ -1157,6 +1281,33 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
. build ( ) ) ;
workflowGateway . processInstanceAbort ( abort ) ;
}
/ / 取消已关联整改单 、 任务单 、 变更单
changeRecordBillService . deleteByVisaId ( record . getId ( ) ) ;
/ / 取消关联的图纸
deleteRelateDrawAnnotation ( record . getId ( ) ) ;
}
/ * *
* 取消变更签证单关联的图纸
*
* @param visaId 变更签证Id
* /
private boolean deleteRelateDrawAnnotation ( Long visaId ) {
List < ChangeRecordRelation > contentDescription = changeRecordRelationService . findByVisaAndVarName ( visaId , VisaRelationFieldEnum . CONTENT_DESCRIPTION . name ( ) ) ;
if ( CollectionUtils . isNotEmpty ( contentDescription ) ) {
List < ChangeRecordRelation > annotation = contentDescription . stream ( )
. filter ( item - > {
try {
VisaChangeTempCreateReq . ChangeContextAndDescription parseDescription = JSONObject . parseObject ( item . getContent ( ) , VisaChangeTempCreateReq . ChangeContextAndDescription . class ) ;
return Objects . nonNull ( parseDescription ) & & Objects . equals ( parseDescription . getType ( ) , 2 ) ;
} catch ( Exception e ) {
throw new ServiceException ( " 发生内容说明解析失败 " ) ;
}
} )
. collect ( Collectors . toList ( ) ) ;
return changeRecordRelationService . deleteByIds ( annotation . stream ( ) . map ( ChangeRecordRelation : : getId ) . collect ( Collectors . toList ( ) ) ) ;
}
return true ;
}
private void validOperationPermission ( Long visaId , Long personId , Long ouId , Long workspaceId ) {
@ -1204,6 +1355,8 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
@Override
public void reDecision ( ChangeRecordButtonOperationReq req ) {
ChangeRecord visa = changeRecordService . getById ( req . getVisaId ( ) ) ;
AssertUtil . notNull ( visa , " 未找到变洽签单据 " ) ;
validOperationPermission ( req . getVisaId ( ) , req . getOperatorPersonId ( ) , req . getOperatorOuId ( ) , req . getOperatorWorkspaceId ( ) ) ;
ImGroupOperationClearReq build = new ImGroupOperationClearReq ( ) ;
@ -1211,6 +1364,38 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
build . setImGroupId ( req . getImGroupId ( ) ) ;
build . setClearAll ( true ) ;
changeRecordRelationService . clearImOperationParticipate ( build ) ;
/ / 重新发送卡片
sendCardToImGroup ( req , visa ) ;
}
private void sendCardToImGroup ( ChangeRecordButtonOperationReq req , ChangeRecord visa ) {
CardSendRequest cardRequest = new CardSendRequest ( ) ;
cardRequest . setAppCode ( MSG_CENTER_APP_CODE ) ;
cardRequest . setTemplateCode ( refreshableConfiguration . getImGroupCardTemplateCode ( ) ) ;
cardRequest . setBizCode ( IM_GROUP_BIZ_INFO_VISA_ID + " : " + visa . getId ( ) ) ;
cardRequest . setSender ( PeerPerson . create ( req . getOperatorPersonId ( ) , req . getOperatorOuId ( ) , req . getOperatorWorkspaceId ( ) ) ) ;
cardRequest . setImSenderAccountAppType ( AppTypeEnum . CMP ) ;
cardRequest . setImReceiveAccounts ( Sets . newHashSet ( String . valueOf ( visa . getImGroupId ( ) ) ) ) ;
OrganizationalUnitVO unitInfo = organizationalUnitGateway . getUnitInfo ( req . getOperatorOuId ( ) ) ;
PersonProfileDto profile = visaProfileGateway . getProfile ( req . getOperatorPersonId ( ) ) ;
String amountDesc = " 不变 " ;
if ( visa . getAmountChange ( ) . compareTo ( BigDecimal . ZERO ) > 0 ) {
amountDesc = " 增加 " + visa . getAmountChange ( ) . toPlainString ( ) + " 元 " ;
} else if ( visa . getAmountChange ( ) . compareTo ( BigDecimal . ZERO ) < 0 ) {
amountDesc = " 减少 " + visa . getAmountChange ( ) . toPlainString ( ) + " 元 " ;
}
cardRequest . setBizParam ( new JSONObject ( Maps . of (
" topic " , visa . getTopic ( ) ,
" reason " , visa . getReason ( ) ,
" initiatorName " , profile . getRealName ( ) ,
" initiatorUnitName " , unitInfo . getName ( ) ,
" visaType " , visa . getType ( ) . getDesc ( ) ,
" amountChange " , amountDesc
) ) ) ;
msgCenterGateway . sendCardToCroup ( cardRequest ) ;
}
@Override