From eefd084d2154989a8afdf78e81d030a4bd861354 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=E4=BA=AE?= Date: Mon, 29 Dec 2025 18:06:08 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BA=BA=E5=91=98=E5=85=A5=E5=9C=BA=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E5=8A=A0=E4=B8=80=E4=B8=AA=E7=BA=A2=E7=BB=BF=E7=81=AF?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A1=86=EF=BC=8C=E5=88=97=E8=A1=A8=E5=8A=A0?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E7=BA=A2=E7=BB=BF=E7=81=AF=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=202.=E5=81=9A=E4=B8=80=E4=B8=AA=E5=8F=AF=E4=BB=A5=E7=9C=8B?= =?UTF-8?q?=E4=BA=BA=E8=84=B8=E7=9A=84=E9=A1=B5=E9=9D=A2=EF=BC=8C=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=E5=92=8C=E4=B8=8B=E5=8F=91=E5=8A=9F=E8=83=BD=EF=BC=88?= =?UTF-8?q?=E5=8A=A0=E6=9D=83=E9=99=90=EF=BC=89=203.=E5=85=A5=E5=9C=BA?= =?UTF-8?q?=E5=B7=A5=E7=A7=8D=E5=8F=AF=E4=BB=A5=E4=BF=AE=E6=94=B9=204.?= =?UTF-8?q?=E4=B8=8A=E6=B5=B7=E5=A4=9A=E5=B7=A5=E7=A8=8B=E5=85=A5=E5=9C=BA?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bonus/bmw/controller/KqCmdController.java | 8 ++++++++ .../bmw/controller/PmSubComController.java | 19 ++++++++++++++++++- .../com/bonus/bmw/domain/dto/PmWorkerDto.java | 7 +++++-- .../bonus/bmw/domain/po/PmMainProject.java | 10 ++++++++++ .../java/com/bonus/bmw/domain/po/PmOrg.java | 10 ++++++++++ .../com/bonus/bmw/domain/po/PmProject.java | 12 ++++++++++++ .../com/bonus/bmw/domain/po/PmSubCompany.java | 11 +++++++++++ .../com/bonus/bmw/domain/vo/KqCmdBean.java | 2 ++ .../com/bonus/bmw/mapper/PmSubComMapper.java | 2 ++ .../com/bonus/bmw/mapper/PmWorkerMapper.java | 6 ++++++ .../bonus/bmw/service/PmSubComService.java | 8 ++++++++ .../bmw/service/impl/PmOrgServiceImpl.java | 2 +- .../bmw/service/impl/PmSubComServiceImpl.java | 5 +++++ .../bmw/service/impl/PmWorkerServiceImpl.java | 13 +++++++++++++ .../service/impl/TbProConfigServiceImpl.java | 3 +-- .../resources/mapper/bmw/KqCmdTaskMapper.xml | 14 +++++++++++--- .../mapper/bmw/PmMainProjectMapper.xml | 12 ++++++++---- .../main/resources/mapper/bmw/PmOrgMapper.xml | 16 ++++++++++------ .../resources/mapper/bmw/PmProjectMapper.xml | 9 +++++++-- .../resources/mapper/bmw/PmSubComMapper.xml | 17 ++++++++++++++++- .../resources/mapper/bmw/PmWorkerMapper.xml | 12 +++++++++++- 21 files changed, 175 insertions(+), 23 deletions(-) diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/controller/KqCmdController.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/controller/KqCmdController.java index 2dac6a0..78ebe44 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/controller/KqCmdController.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/controller/KqCmdController.java @@ -14,6 +14,9 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; +import java.util.Map; + +import static com.bonus.bmw.utils.OwnPermissionUtil.dealWithPermission; /** * 考勤机操作控制层 @@ -40,6 +43,11 @@ public class KqCmdController extends BaseController { @SysLog(title = "工程考勤机树", businessType = OperaType.QUERY, logType = 0, module = "工程考勤机树", details = "工程考勤机树") public AjaxResult getProKqjTree(KqCmdBean o) { try { + Map map = dealWithPermission(); + if(!map.isEmpty()){ + // 3. 将 map 中的值复制到 o 对象中 + org.apache.commons.beanutils.BeanUtils.populate(o, map); + } return service.getProKqjTree(o); } catch (Exception e) { logger.error(e.toString(), e); diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/controller/PmSubComController.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/controller/PmSubComController.java index d9d6850..cf9bd88 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/controller/PmSubComController.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/controller/PmSubComController.java @@ -1,5 +1,6 @@ package com.bonus.bmw.controller; +import com.bonus.bmw.domain.po.BmBasicDataHisVo; import com.bonus.bmw.domain.po.PmSubCompany; import com.bonus.bmw.service.PmSubComService; import com.bonus.common.core.web.controller.BaseController; @@ -11,7 +12,6 @@ import com.bonus.common.security.annotation.InnerAuth; import com.bonus.common.security.annotation.RequiresPermissions; import com.bonus.common.security.annotation.RequiresPermissionsOrInnerAuth; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.beanutils.BeanUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -118,4 +118,21 @@ public class PmSubComController extends BaseController { return getDataTableError(new ArrayList<>()); } + /** + * 分公司/项目部/总工程/工程 历史修改记录 + */ + @RequiresPermissionsOrInnerAuth(innerAuth = @InnerAuth, requiresPermissions = @RequiresPermissions("sub:company:list")) + @GetMapping("/getHisList") + @SysLog(title = "分公司管理", businessType = OperaType.QUERY, logType = 0, module = "分公司管理->分公司列表") + public TableDataInfo getHisList(BmBasicDataHisVo bean) { + try { + startPage(); + List list = pmSubComService.getHisList(bean); + return getDataTable(list); + } catch (Exception e) { + log.error(e.toString(), e); + } + return getDataTableError(new ArrayList<>()); + } + } diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/dto/PmWorkerDto.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/dto/PmWorkerDto.java index f4aeca7..211a679 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/dto/PmWorkerDto.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/dto/PmWorkerDto.java @@ -2,8 +2,6 @@ package com.bonus.bmw.domain.dto; import lombok.Data; -import java.util.Date; - /** * 人员基础信息表 */ @@ -95,4 +93,9 @@ public class PmWorkerDto { */ private String photoIds; + /** + * 0 默认 1 黄灯 2 绿灯 3 失信人员 + */ + private String lightStatus; + } diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/po/PmMainProject.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/po/PmMainProject.java index 97237ec..f3d0b76 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/po/PmMainProject.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/po/PmMainProject.java @@ -80,4 +80,14 @@ public class PmMainProject { */ private String orgId; + /** + *开始时间 + */ + private String startDate; + + /** + *结束时间 + */ + private String endDate; + } diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/po/PmOrg.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/po/PmOrg.java index 8332402..007eca9 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/po/PmOrg.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/po/PmOrg.java @@ -68,4 +68,14 @@ public class PmOrg { *关键字搜索 */ private String keyWord; + + /** + *开始时间 + */ + private String startDate; + + /** + *结束时间 + */ + private String endDate; } diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/po/PmProject.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/po/PmProject.java index a9728bc..3a15a28 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/po/PmProject.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/po/PmProject.java @@ -119,4 +119,16 @@ public class PmProject { * 是否有效 */ private Integer isActive; + + + /** + *开始时间 + */ + private String startDate; + + /** + *结束时间 + */ + private String endDate; + } diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/po/PmSubCompany.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/po/PmSubCompany.java index edc72bf..2d665bc 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/po/PmSubCompany.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/po/PmSubCompany.java @@ -72,4 +72,15 @@ public class PmSubCompany { * 项目部列表 */ private List pmOrgList; + + /** + *开始时间 + */ + private String startDate; + + /** + *结束时间 + */ + private String endDate; + } diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/vo/KqCmdBean.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/vo/KqCmdBean.java index e73fda2..f3652ca 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/vo/KqCmdBean.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/vo/KqCmdBean.java @@ -140,6 +140,8 @@ public class KqCmdBean { private String workerName; private String phone; + private Integer subComId; + /** * 是否在库 */ diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/mapper/PmSubComMapper.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/mapper/PmSubComMapper.java index 3fbbac6..f9badeb 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/mapper/PmSubComMapper.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/mapper/PmSubComMapper.java @@ -45,4 +45,6 @@ public interface PmSubComMapper { * @param bmBasicDataHisVo */ void insertOldSubComName(BmBasicDataHisVo bmBasicDataHisVo); + + List getHisList(BmBasicDataHisVo bean); } diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/mapper/PmWorkerMapper.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/mapper/PmWorkerMapper.java index 17f80ea..f37ee8a 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/mapper/PmWorkerMapper.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/mapper/PmWorkerMapper.java @@ -164,4 +164,10 @@ public interface PmWorkerMapper { Integer getTeamIdByTeamName(@Param("teamName") String teamName, @Param("subId") Integer subId); Integer getPostIdByPostName(String postName); + + /** + * 更新人员岗位 + * @param record + */ + void updateWorkerPost(PmWorker record); } diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/PmSubComService.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/PmSubComService.java index 82fa550..2ff616e 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/PmSubComService.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/PmSubComService.java @@ -1,5 +1,6 @@ package com.bonus.bmw.service; +import com.bonus.bmw.domain.po.BmBasicDataHisVo; import com.bonus.bmw.domain.po.PmSubCompany; import java.util.List; @@ -22,4 +23,11 @@ public interface PmSubComService { int delSubCompany(PmSubCompany pmSubCompany); List selectSubCompanyListAll(PmSubCompany pmSubCompany); + + /** + * 获取历史记录 + * @param bean + * @return + */ + List getHisList(BmBasicDataHisVo bean); } diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/PmOrgServiceImpl.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/PmOrgServiceImpl.java index a15dcad..3d84cbd 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/PmOrgServiceImpl.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/PmOrgServiceImpl.java @@ -64,7 +64,7 @@ public class PmOrgServiceImpl implements PmOrgService { PmOrg oldOrgName = pmOrgMapper.getPmOrgByOrgId(pmOrg.getId()); if (!oldOrgName.getOrgName().equals(pmOrg.getOrgName())){ BmBasicDataHisVo bmBasicDataHisVo = new BmBasicDataHisVo(); - bmBasicDataHisVo.setOrgId(pmOrg.getOrgId()); + bmBasicDataHisVo.setOrgId(pmOrg.getId()); bmBasicDataHisVo.setType(3); bmBasicDataHisVo.setOldName(oldOrgName.getOrgName()); bmBasicDataHisVo.setName(pmOrg.getOrgName()); diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/PmSubComServiceImpl.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/PmSubComServiceImpl.java index e10b623..dd7cf81 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/PmSubComServiceImpl.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/PmSubComServiceImpl.java @@ -106,4 +106,9 @@ public class PmSubComServiceImpl implements PmSubComService { } return pmSubCompanyList; } + + @Override + public List getHisList(BmBasicDataHisVo bean) { + return pmSubComMapper.getHisList(bean); + } } diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/PmWorkerServiceImpl.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/PmWorkerServiceImpl.java index 04ba052..7ed65da 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/PmWorkerServiceImpl.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/PmWorkerServiceImpl.java @@ -52,6 +52,9 @@ public class PmWorkerServiceImpl implements PmWorkerService{ @Resource private AppRecognitionService appRecognitionService; + @Autowired + private TbProConfigService configService; + @Autowired private FileUploadUtils fileUploadUtils; @@ -229,6 +232,12 @@ public class PmWorkerServiceImpl implements PmWorkerService{ //人员数据 PmWorker worker = mapper.selectByIdNumber(idNumber); if(worker != null){ + //20251229 人员多入场不再依赖与是否上海工程而是根据配置,使用接口查询 + TbProConfigVo config = new TbProConfigVo(); + config.setProId(String.valueOf(worker.getProId())); + AjaxResult configByProId = configService.getConfigByProId(config); + Map map = (Map) configByProId.get("data"); + worker.setIsShanghai(map.get("dgc")); worker.setFiles(fileUploadUtils.getFileList("", worker.getId().toString(), Constants.FILE_UPLOAD_WORKER, "")); //查询工资卡 数据 BmWorkerWageCard wageCard = new BmWorkerWageCard(); @@ -453,6 +462,10 @@ public class PmWorkerServiceImpl implements PmWorkerService{ } if(record.getEinStatus() == 1){ //已经入过场了 + //是否修改工种 + if(record.getPostId() != null && record.getPostId() > 0){ + mapper.updateWorkerPost(record); + } addWorkerWageCardDataAndContract(record,fileMsg); }else { //重新入场 再入场,清除最新标识 diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/TbProConfigServiceImpl.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/TbProConfigServiceImpl.java index e680396..4a02117 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/TbProConfigServiceImpl.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/TbProConfigServiceImpl.java @@ -6,7 +6,6 @@ import com.bonus.bmw.service.TbProConfigService; import com.bonus.common.core.utils.StringUtils; import com.bonus.common.core.web.domain.AjaxResult; import lombok.extern.slf4j.Slf4j; -import org.checkerframework.checker.units.qual.A; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -153,7 +152,7 @@ public class TbProConfigServiceImpl implements TbProConfigService { */ @Override public AjaxResult getConfigByProId(TbProConfigVo params) { - Map map=new HashMap(); + Map map=new HashMap<>(); try{ List list=mapper.getConfigByProId(params); if(list!=null&& !list.isEmpty()){ diff --git a/bonus-modules/bonus-bmw/src/main/resources/mapper/bmw/KqCmdTaskMapper.xml b/bonus-modules/bonus-bmw/src/main/resources/mapper/bmw/KqCmdTaskMapper.xml index cbb77f9..3bcdc95 100644 --- a/bonus-modules/bonus-bmw/src/main/resources/mapper/bmw/KqCmdTaskMapper.xml +++ b/bonus-modules/bonus-bmw/src/main/resources/mapper/bmw/KqCmdTaskMapper.xml @@ -82,14 +82,22 @@ pad.device_code, ps.id as sub_id, ps.sub_name, - pst.id as team_id - ,pst.team_name, - pad.on_line onLine + pst.id as team_id, + pst.team_name, + pad.on_line onLine FROM pm_att_device pad INNER JOIN pm_project pp ON pad.pro_id = pp.id LEFT JOIN pm_sub ps ON ps.id = pad.sub_id LEFT JOIN pm_sub_team pst ON pst.id = pad.team_id + + + AND (pp.sub_com_id = #{subComId} or pp.sub_com_id is null) + + + AND pp.Id = #{proId} + + order by pad.on_line desc - select pmp.id,pmp.main_pro_name,pmp.vol_level,pmp.create_user,pmp.update_user,pmp.create_time, + select pmp.id,pmp.main_pro_name,pmp.vol_level,pmp.create_user,pmp.update_user, + if(bbdh.create_time is null,pmp.create_time,bbdh.create_time) as createTime, pmp.update_time,pmp.pro_status,pmp.sub_com_id,psc.sub_company_name as subComName from pm_main_project pmp left join pm_sub_company psc on pmp.sub_com_id = psc.id + left join bm_basic_data_his bbdh on bbdh.id = pmp.id and bbdh.type = 4 where pmp.is_active='1' and pmp.main_pro_name LIKE CONCAT('%', #{mainProName}, '%') @@ -49,6 +51,9 @@ or pmp.vol_level like concat('%', #{keyWord}, '%') ) + + and DATE_FORMAT(if(bbdh.create_time is null,pmp.create_time,bbdh.create_time), '%Y-%m-%d') between #{startDate} and #{endDate} + order by pmp.create_time desc - - insert into bm_basic_data_his (id, type, old_name, name) - values (#{id}, #{type}, #{oldName}, #{name}) + insert into bm_basic_data_his (id, type, old_name, name, update_user) + values (#{id}, #{type}, #{oldName}, #{name}, #{updateUser}) - insert into bm_basic_data_his (org_id,type,old_name,name) - values (#{orgId},#{type},#{oldName},#{name}) + insert into bm_basic_data_his (org_id,type,old_name,name,update_user) + values (#{orgId},#{type},#{oldName},#{name},#{updateUser}) - insert into bm_basic_data_his (id, type, old_name, name) - values (#{id}, #{type}, #{oldName}, #{name}) + insert into bm_basic_data_his (id, type, old_name, name, update_user) + values (#{id}, #{type}, #{oldName}, #{name}, #{updateUser}) diff --git a/bonus-modules/bonus-bmw/src/main/resources/mapper/bmw/PmSubComMapper.xml b/bonus-modules/bonus-bmw/src/main/resources/mapper/bmw/PmSubComMapper.xml index db218ef..db7554b 100644 --- a/bonus-modules/bonus-bmw/src/main/resources/mapper/bmw/PmSubComMapper.xml +++ b/bonus-modules/bonus-bmw/src/main/resources/mapper/bmw/PmSubComMapper.xml @@ -35,10 +35,11 @@ psc.is_enable as isEnable, psc.create_user as createUser, psc.update_user as updateUser, - psc.create_time as createTime, + if(bbdh.create_time is null,psc.create_time,bbdh.create_time) as createTime, psc.update_time as updateTime from pm_sub_company psc left join pm_company pc on psc.com_id = pc.id + left join bm_basic_data_his bbdh on psc.id = bbdh.id and bbdh.type = 2 where psc.is_active = '1' and psc.sub_company_name LIKE CONCAT('%', #{subCompanyName}, '%') @@ -48,6 +49,9 @@ and psc.id = #{subComId} + + + and DATE_FORMAT(if(bbdh.create_time is null,psc.create_time,bbdh.create_time), '%Y-%m-%d') between #{startDate} and #{endDate} order by psc.create_time desc @@ -93,4 +97,15 @@ insert into bm_basic_data_his (id, type, old_name, name, update_user) values (#{id}, #{type}, #{oldName}, #{name}, #{updateUser}) + + diff --git a/bonus-modules/bonus-bmw/src/main/resources/mapper/bmw/PmWorkerMapper.xml b/bonus-modules/bonus-bmw/src/main/resources/mapper/bmw/PmWorkerMapper.xml index 59c3af8..06cc1eb 100644 --- a/bonus-modules/bonus-bmw/src/main/resources/mapper/bmw/PmWorkerMapper.xml +++ b/bonus-modules/bonus-bmw/src/main/resources/mapper/bmw/PmWorkerMapper.xml @@ -24,6 +24,7 @@ + select id from pm_post_type where post_name = #{postName} + + + update bm_worker_ein_msg set post_id = #{postId},post_name = #{postName} where worker_id = #{id}; + update bm_worker_ein_pro_record set post_id = #{postId},post_name = #{postName} where worker_id = #{id}; +