From a12eeeeaa00c070b482a88f3f5af245939eaabcb Mon Sep 17 00:00:00 2001 From: dxc Date: Thu, 11 Mar 2021 18:22:36 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E8=A7=A3=E5=86=B3seata=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E6=96=B9=E6=B3=95=E4=B8=8D=E5=A5=BD=E4=BD=BF=E7=9A=84?= =?UTF-8?q?bug=202=E3=80=81=E6=8F=90=E4=BE=9B=E8=AF=A2=E4=BB=B7=E5=8D=95?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E9=A1=B9=E7=9B=AE=E6=8E=A5=E5=8F=A3=203?= =?UTF-8?q?=E3=80=81=E5=A4=84=E7=90=86=E5=A7=94=E6=89=98=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=B9=82=E7=AD=89=E6=80=A7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/common/ProjectCommonUtil.java | 5 + .../controller/ProjectEntrustController.java | 2 + .../service/ISeataEntrustService.java | 28 ++++ .../impl/ISeatatEntrustServiceImpl.java | 140 ++++++++++++++++++ .../ProjectEntrustInquiryServiceImpl.java | 112 +------------- .../impl/ProjectEntrustServiceImpl.java | 1 + .../controller/ProjectRecordController.java | 16 ++ .../projectrecord/entity/ProjectRecordVO.java | 2 + .../service/IProjectRecordService.java | 2 + .../impl/ProjectRecordServiceImpl.java | 20 ++- 10 files changed, 217 insertions(+), 111 deletions(-) create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/service/ISeataEntrustService.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/service/impl/ISeatatEntrustServiceImpl.java diff --git a/src/main/java/com/chinaunicom/mall/ebtp/project/common/ProjectCommonUtil.java b/src/main/java/com/chinaunicom/mall/ebtp/project/common/ProjectCommonUtil.java index 336e828..61b6220 100644 --- a/src/main/java/com/chinaunicom/mall/ebtp/project/common/ProjectCommonUtil.java +++ b/src/main/java/com/chinaunicom/mall/ebtp/project/common/ProjectCommonUtil.java @@ -523,6 +523,11 @@ public class ProjectCommonUtil { */ public static final int MODULE_TYPE_2 = 2; + /** + * 供应商类型 0邀请 1 拒绝 + */ + public static final String SUPPLIER_TYPE_0 = "0"; + public static Map PROCUREMENT_MODE_MAP = new HashMap(){{ String[] biddingArray = {PROCUREMENT_MODE_1,PROCUREMENT_MODE_2}; String[] recruitArray = {PROCUREMENT_MODE_4}; diff --git a/src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/controller/ProjectEntrustController.java b/src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/controller/ProjectEntrustController.java index fe7a9dc..e6c0632 100644 --- a/src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/controller/ProjectEntrustController.java +++ b/src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/controller/ProjectEntrustController.java @@ -4,6 +4,7 @@ package com.chinaunicom.mall.ebtp.project.projectentrust.controller; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.common.idempotent.annotation.Idempotent; import com.chinaunicom.mall.ebtp.project.baseoperlog.aop.OperLog; import com.chinaunicom.mall.ebtp.project.projectentrust.entity.ProjectEntrust; import com.chinaunicom.mall.ebtp.project.projectentrust.entity.ProjectEntrustVO; @@ -198,6 +199,7 @@ public class ProjectEntrustController{ * @param ebpProjectId 实施项目ID * @return 返回结果 */ + @Idempotent(expireTime = 10) @ApiOperation("委托项目信息出始化") @PostMapping("/initProjectEntrust") public BaseResponse initProjectEntrust(@ApiParam(value = "实施项目编码", required = true) @RequestParam(name = "ebpProjectId") Long ebpProjectId) { diff --git a/src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/service/ISeataEntrustService.java b/src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/service/ISeataEntrustService.java new file mode 100644 index 0000000..68e84d8 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/service/ISeataEntrustService.java @@ -0,0 +1,28 @@ +package com.chinaunicom.mall.ebtp.project.projectentrust.service; + +import com.chinaunicom.mall.ebtp.common.base.service.IBaseService; +import com.chinaunicom.mall.ebtp.project.projectentrust.entity.ProjectEntrust; +import com.chinaunicom.mall.ebtp.project.projectentrust.entity.ProjectEntrustVO; +import com.chinaunicom.mall.ebtp.project.projectentrust.entity.inquiryentity.InquiryNoticeVO; + +/** + * seata对应委托初始化接口 + * @author daixc + * @date 2021/03/10 + */ +public interface ISeataEntrustService extends IBaseService { + + + /** + * 初始化接口 + * @param projectEntrustVO 询价实体 + */ + void initProcess(ProjectEntrustVO projectEntrustVO); + + /** + * 推迟询价单信息 + * @param inquiryNoticeVO 询价实体 + * @return 返回结果 + */ + boolean putOffInquiry(InquiryNoticeVO inquiryNoticeVO); +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/service/impl/ISeatatEntrustServiceImpl.java b/src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/service/impl/ISeatatEntrustServiceImpl.java new file mode 100644 index 0000000..0c1f83a --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/service/impl/ISeatatEntrustServiceImpl.java @@ -0,0 +1,140 @@ +package com.chinaunicom.mall.ebtp.project.projectentrust.service.impl; + +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.common.base.service.impl.BaseServiceImpl; +import com.chinaunicom.mall.ebtp.common.util.JsonUtils; +import com.chinaunicom.mall.ebtp.project.common.ProjectExceptionEnum; +import com.chinaunicom.mall.ebtp.project.feign.EbtpMallBidApi; +import com.chinaunicom.mall.ebtp.project.feign.EbtpMallProcessApi; +import com.chinaunicom.mall.ebtp.project.feign.EbtpRespsApi; +import com.chinaunicom.mall.ebtp.project.feign.entity.DocumentXjVO; +import com.chinaunicom.mall.ebtp.project.feign.entity.TdocVO; +import com.chinaunicom.mall.ebtp.project.projectentrust.dao.ProjectEntrustMapper; +import com.chinaunicom.mall.ebtp.project.projectentrust.entity.ProjectEntrust; +import com.chinaunicom.mall.ebtp.project.projectentrust.entity.ProjectEntrustVO; +import com.chinaunicom.mall.ebtp.project.projectentrust.entity.inquiryentity.InquiryNoticeVO; +import com.chinaunicom.mall.ebtp.project.projectentrust.entity.inquiryentity.InquiryVO; +import com.chinaunicom.mall.ebtp.project.projectentrust.service.ISeataEntrustService; +import com.chinaunicom.mall.ebtp.project.projectrecord.entity.ProjectRecordVO; +import com.chinaunicom.mall.ebtp.project.projectrecord.service.IProjectRecordService; +import com.chinaunicom.mall.ebtp.project.projectsection.entity.ProjectSection; +import com.chinaunicom.mall.ebtp.project.projectsection.service.IProjectSectionService; +import io.seata.core.context.RootContext; +import io.seata.spring.annotation.GlobalTransactional; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; + +/** + * seata对应委托初始化接口实现类 + * @author daixc + * @date 2021/03/10 + */ +@Service +@Slf4j +public class ISeatatEntrustServiceImpl extends BaseServiceImpl implements ISeataEntrustService { + + @Resource + private IProjectSectionService projectSectionService; + + @Resource + private IProjectRecordService projectRecordService; + + @Resource + private EbtpRespsApi ebtpRespsApi; + + @Resource + private EbtpMallProcessApi processApi; + + @Resource + private EbtpMallBidApi bidApi; + + + @Override + @GlobalTransactional + public void initProcess(ProjectEntrustVO projectEntrustVO){ + + log.info("询价初始化发起事务 xid:" + RootContext.getXID()); + + //初始化流程 + ProjectRecordVO recordVO = new ProjectRecordVO(); + recordVO.setEbpProjectId(projectEntrustVO.getProcurementPlanId()); + recordVO = projectRecordService.getList(recordVO).get(0); + + Map sectionMaps = projectSectionService.getFlowList(recordVO.getId()); + InquiryVO inquiryVO = projectEntrustVO.getProjectEntrustExpand().getInquiry(); + projectRecordService.initialize(recordVO.getId(), false, sectionMaps); + log.info("初始化询价项目 项目ID:"+ recordVO.getId()+ " 流程标识:"+ JsonUtils.objectToJson(sectionMaps)+" 询价评审开始时间"+inquiryVO.getReviewStartTime()); + projectRecordService.inquiryInitialize(recordVO.getId(), sectionMaps,inquiryVO.getReviewStartTime()); + + //标段ID + String sectionId = ""; + for(String key : sectionMaps.keySet()){ + sectionId = key; + } + //初始化招标文件 + DocumentXjVO xjVO = new DocumentXjVO(); + xjVO.setTpId(recordVO.getId()); + xjVO.setBsId(sectionId); + xjVO.setList(inquiryVO.getAttachmentList()); + BaseResponse response = bidApi.insertTp(xjVO); + if(!response.isSuccess()){ + ProjectExceptionEnum.FRAME_EXCEPTION_PROJECT_ENTRUST_NOT_FIND.customValidName(response.getMessage(),!response.isSuccess()); + } + //初始化应答文件 + TdocVO tdocVO = new TdocVO(); + tdocVO.setList(inquiryVO.getResponseFormatList()); + tdocVO.setSectionId(sectionId); + tdocVO.setTpId(recordVO.getId()); + tdocVO.setProjectName(recordVO.getProjectName()); + tdocVO.setCreateDate(recordVO.getCreateDate()); + tdocVO.setSectionName(recordVO.getProjectName()+ "包件"); + tdocVO.setEndDate(inquiryVO.getEndTime()); + response = ebtpRespsApi.initInquiryResponseFormat(tdocVO); + if(!response.isSuccess()){ + ProjectExceptionEnum.FRAME_EXCEPTION_PROJECT_ENTRUST_NOT_FIND.customValidName(response.getMessage(),!response.isSuccess()); + } + } + + /** + * 推迟询价单信息 + * @param inquiryNoticeVO 询价实体 + * @return 返回结果 + */ + @Override + @GlobalTransactional + public boolean putOffInquiry(InquiryNoticeVO inquiryNoticeVO){ + log.info("推迟询价单发起事务 xid:" + RootContext.getXID()); + boolean result = false; + ProjectSection section = projectSectionService.selectByPlanId(inquiryNoticeVO.getInquiryId()); + ProjectExceptionEnum.FRAME_EXCEPTION_PROJECT_SECTION_NOT_FIND.customValid(null == section); + //修改报价截至时间 + if(null != inquiryNoticeVO.getEndTime()){ + TdocVO tdocVO = new TdocVO(); + tdocVO.setSectionId(section.getId()); + tdocVO.setEndDate(inquiryNoticeVO.getEndTime()); + BaseResponse response = ebtpRespsApi.updateTdocEndDateBySectionId(tdocVO); + if(!response.isSuccess()){ + ProjectExceptionEnum.FRAME_EXCEPTION_PROJECT_SECTION_NOT_FIND.customValidName(response.getMessage(),!response.isSuccess()); + } + result = response.getData(); + } + + //修改评审室开始时间 + if(null != inquiryNoticeVO.getReviewStartTime()){ + Map updateProcessMap = new HashMap<>(16); + updateProcessMap.put(section.getId(),inquiryNoticeVO.getReviewStartTime()); + BaseResponse response = processApi.updateOpenTime(updateProcessMap); + if(!response.isSuccess()){ + ProjectExceptionEnum.FRAME_EXCEPTION_PROJECT_SECTION_NOT_FIND.customValidName(response.getMessage(),!response.isSuccess()); + } + result = response.getData(); + } + + return result; + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/service/impl/ProjectEntrustInquiryServiceImpl.java b/src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/service/impl/ProjectEntrustInquiryServiceImpl.java index 696e0e6..4d40763 100644 --- a/src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/service/impl/ProjectEntrustInquiryServiceImpl.java +++ b/src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/service/impl/ProjectEntrustInquiryServiceImpl.java @@ -2,19 +2,11 @@ package com.chinaunicom.mall.ebtp.project.projectentrust.service.impl; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; import com.chinaunicom.mall.ebtp.common.base.service.impl.BaseServiceImpl; -import com.chinaunicom.mall.ebtp.common.util.JsonUtils; import com.chinaunicom.mall.ebtp.common.util.PropertyUtils; -import com.chinaunicom.mall.ebtp.project.common.EbpProjectCommonUtil; import com.chinaunicom.mall.ebtp.project.common.InquiryCommonUtil; import com.chinaunicom.mall.ebtp.project.common.ProjectCommonUtil; import com.chinaunicom.mall.ebtp.project.common.ProjectExceptionEnum; -import com.chinaunicom.mall.ebtp.project.feign.EbtpMallBidApi; -import com.chinaunicom.mall.ebtp.project.feign.EbtpMallProcessApi; -import com.chinaunicom.mall.ebtp.project.feign.EbtpRespsApi; -import com.chinaunicom.mall.ebtp.project.feign.entity.DocumentXjVO; -import com.chinaunicom.mall.ebtp.project.feign.entity.TdocVO; import com.chinaunicom.mall.ebtp.project.projectentrust.dao.ProjectEntrustMapper; import com.chinaunicom.mall.ebtp.project.projectentrust.entity.ProjectEntrust; import com.chinaunicom.mall.ebtp.project.projectentrust.entity.ProjectEntrustExpand; @@ -25,21 +17,15 @@ import com.chinaunicom.mall.ebtp.project.projectentrust.entity.inquiryentity.Inq import com.chinaunicom.mall.ebtp.project.projectentrust.service.IProjectEntrustExpandService; import com.chinaunicom.mall.ebtp.project.projectentrust.service.IProjectEntrustInquiryService; import com.chinaunicom.mall.ebtp.project.projectentrust.service.IProjectEntrustService; +import com.chinaunicom.mall.ebtp.project.projectentrust.service.ISeataEntrustService; import com.chinaunicom.mall.ebtp.project.projectexception.service.IProjectExceptionService; -import com.chinaunicom.mall.ebtp.project.projectrecord.entity.ProjectRecordVO; import com.chinaunicom.mall.ebtp.project.projectrecord.service.IProjectRecordService; -import com.chinaunicom.mall.ebtp.project.projectsection.entity.ProjectSection; -import com.chinaunicom.mall.ebtp.project.projectsection.service.IProjectSectionService; -import io.seata.spring.annotation.GlobalTransactional; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.Map; /** * 项目询价serviceImpl @@ -59,23 +45,11 @@ public class ProjectEntrustInquiryServiceImpl extends BaseServiceImpl response = ebtpRespsApi.updateTdocEndDateBySectionId(tdocVO); - if(!response.isSuccess()){ - ProjectExceptionEnum.FRAME_EXCEPTION_PROJECT_SECTION_NOT_FIND.customValidName(response.getMessage(),!response.isSuccess()); - } - result = response.getData(); - } - - //修改评审室开始时间 - if(null != inquiryNoticeVO.getReviewStartTime()){ - Map updateProcessMap = new HashMap<>(16); - updateProcessMap.put(section.getId(),inquiryNoticeVO.getReviewStartTime()); - BaseResponse response = processApi.updateOpenTime(updateProcessMap); - if(!response.isSuccess()){ - ProjectExceptionEnum.FRAME_EXCEPTION_PROJECT_SECTION_NOT_FIND.customValidName(response.getMessage(),!response.isSuccess()); - } - result = response.getData(); - } - - return result; - } /** * 询价返回告知结果进行初始化项目以及询价文件和投标应答格式文件信息 @@ -189,53 +128,12 @@ public class ProjectEntrustInquiryServiceImpl extends BaseServiceImpl sectionMaps = projectSectionService.getFlowList(recordVO.getId()); - InquiryVO inquiryVO = projectEntrustVO.getProjectEntrustExpand().getInquiry(); - projectRecordService.initialize(recordVO.getId(), false, sectionMaps); - log.info("初始化询价项目 项目ID:"+ recordVO.getId()+ " 流程标识:"+ JsonUtils.objectToJson(sectionMaps)+" 询价评审开始时间"+inquiryVO.getReviewStartTime()); - projectRecordService.inquiryInitialize(recordVO.getId(), sectionMaps,inquiryVO.getReviewStartTime()); - - //标段ID - String sectionId = ""; - for(String key : sectionMaps.keySet()){ - sectionId = key; - } - //初始化招标文件 - DocumentXjVO xjVO = new DocumentXjVO(); - xjVO.setTpId(recordVO.getId()); - xjVO.setBsId(sectionId); - xjVO.setList(inquiryVO.getAttachmentList()); - BaseResponse response = bidApi.insertTp(xjVO); - if(!response.isSuccess()){ - ProjectExceptionEnum.FRAME_EXCEPTION_PROJECT_ENTRUST_NOT_FIND.customValidName(response.getMessage(),!response.isSuccess()); - } - //初始化应答文件 - TdocVO tdocVO = new TdocVO(); - tdocVO.setList(inquiryVO.getResponseFormatList()); - tdocVO.setSectionId(sectionId); - tdocVO.setTpId(recordVO.getId()); - tdocVO.setProjectName(recordVO.getProjectName()); - tdocVO.setCreateDate(recordVO.getCreateDate()); - tdocVO.setSectionName(recordVO.getProjectName()+ "包件"); - tdocVO.setEndDate(inquiryVO.getEndTime()); - response = ebtpRespsApi.initInquiryResponseFormat(tdocVO); - if(!response.isSuccess()){ - ProjectExceptionEnum.FRAME_EXCEPTION_PROJECT_ENTRUST_NOT_FIND.customValidName(response.getMessage(),!response.isSuccess()); - } - } /** * 初始化委托单信息 diff --git a/src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/service/impl/ProjectEntrustServiceImpl.java b/src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/service/impl/ProjectEntrustServiceImpl.java index 7c0e357..5dbd8c0 100644 --- a/src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/service/impl/ProjectEntrustServiceImpl.java +++ b/src/main/java/com/chinaunicom/mall/ebtp/project/projectentrust/service/impl/ProjectEntrustServiceImpl.java @@ -317,6 +317,7 @@ public class ProjectEntrustServiceImpl extends BaseServiceImpl getByInquiryId(@ApiParam(value = "主键id", required = true) @PathVariable String inquiryId){ + + ProjectRecord projectRecord = projectRecordService.getByInquiryId(inquiryId); + + return BaseResponse.success(BeanUtil.toBean(projectRecord,ProjectRecordVO.class)); + } + } diff --git a/src/main/java/com/chinaunicom/mall/ebtp/project/projectrecord/entity/ProjectRecordVO.java b/src/main/java/com/chinaunicom/mall/ebtp/project/projectrecord/entity/ProjectRecordVO.java index 92289c0..c6c7137 100644 --- a/src/main/java/com/chinaunicom/mall/ebtp/project/projectrecord/entity/ProjectRecordVO.java +++ b/src/main/java/com/chinaunicom/mall/ebtp/project/projectrecord/entity/ProjectRecordVO.java @@ -69,4 +69,6 @@ public class ProjectRecordVO extends ProjectRecord implements Serializable { @ApiModelProperty(value = "首页查询时间") private String selectDate; + @ApiModelProperty(value = "不等于的状态字段") + private Integer neStatus; } diff --git a/src/main/java/com/chinaunicom/mall/ebtp/project/projectrecord/service/IProjectRecordService.java b/src/main/java/com/chinaunicom/mall/ebtp/project/projectrecord/service/IProjectRecordService.java index 00b551a..6e375b0 100644 --- a/src/main/java/com/chinaunicom/mall/ebtp/project/projectrecord/service/IProjectRecordService.java +++ b/src/main/java/com/chinaunicom/mall/ebtp/project/projectrecord/service/IProjectRecordService.java @@ -134,4 +134,6 @@ public interface IProjectRecordService extends IBaseService{ * @param reviewStartTime 评审开始时间 */ void inquiryInitialize(String id, Map sectionMaps, LocalDateTime reviewStartTime); + + ProjectRecord getByInquiryId(String inquiryId); } diff --git a/src/main/java/com/chinaunicom/mall/ebtp/project/projectrecord/service/impl/ProjectRecordServiceImpl.java b/src/main/java/com/chinaunicom/mall/ebtp/project/projectrecord/service/impl/ProjectRecordServiceImpl.java index 684d3ca..754cb73 100644 --- a/src/main/java/com/chinaunicom/mall/ebtp/project/projectrecord/service/impl/ProjectRecordServiceImpl.java +++ b/src/main/java/com/chinaunicom/mall/ebtp/project/projectrecord/service/impl/ProjectRecordServiceImpl.java @@ -46,9 +46,11 @@ import com.chinaunicom.mall.ebtp.project.sectionmaterial.service.ISectionMateria import com.chinaunicom.mall.ebtp.project.sectionsupplier.entity.SectionSupplier; import com.chinaunicom.mall.ebtp.project.sectionsupplier.entity.SectionSupplierVO; import com.chinaunicom.mall.ebtp.project.sectionsupplier.service.ISectionSupplierService; +import io.seata.core.context.RootContext; import io.seata.spring.annotation.GlobalTransactional; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; +import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -139,12 +141,12 @@ public class ProjectRecordServiceImpl extends BaseServiceImpl 0){ - query.in("id",projectRecordVO.getSelectIds()); + if(null != projectRecordVO.getNeStatus()){ + query.ne("status", projectRecordVO.getNeStatus()); } - if(StringUtils.isNotBlank(projectRecordVO.getEbpProjectId())){ - query.eq("ebp_project_id", projectRecordVO.getEbpProjectId()); + if(null != projectRecordVO.getSelectIds() && projectRecordVO.getSelectIds().size() > 0){ + query.in("id",projectRecordVO.getSelectIds()); } if(StringUtils.isNotBlank(projectRecordVO.getEbpProjectId())){ @@ -213,6 +215,7 @@ public class ProjectRecordServiceImpl extends BaseServiceImpl