|
@@ -0,0 +1,377 @@
|
|
|
+package com.lantone.report.facade;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.google.common.collect.Lists;
|
|
|
+import com.lantone.common.dto.report.BasDeptInfoDTO;
|
|
|
+import com.lantone.common.dto.report.BehospitalInfoAgeDTO;
|
|
|
+import com.lantone.common.dto.report.CheckJobDTO;
|
|
|
+import com.lantone.common.dto.report.CheckWorkDTO;
|
|
|
+import com.lantone.common.enums.CheckJobTypeEnum;
|
|
|
+import com.lantone.common.enums.CheckerRoleEnum;
|
|
|
+import com.lantone.common.enums.IsDeleteEnum;
|
|
|
+import com.lantone.common.exception.ApiException;
|
|
|
+import com.lantone.common.util.DateUtil;
|
|
|
+import com.lantone.common.util.ListUtil;
|
|
|
+import com.lantone.common.util.StringUtil;
|
|
|
+import com.lantone.common.util.SysUserUtils;
|
|
|
+import com.lantone.common.vo.report.CheckJobPageVO;
|
|
|
+import com.lantone.common.vo.report.CheckWorkPageVO;
|
|
|
+import com.lantone.common.vo.report.MedCheckWorkAddVO;
|
|
|
+import com.lantone.common.vo.report.SysUserBaseVO;
|
|
|
+import com.lantone.dblayermbg.entity.report.UserRole;
|
|
|
+import com.lantone.dblayermbg.entity.report.CheckInfo;
|
|
|
+import com.lantone.dblayermbg.entity.report.DeptInfo;
|
|
|
+import com.lantone.dblayermbg.entity.report.Role;
|
|
|
+import com.lantone.dblayermbg.entity.report.User;
|
|
|
+import com.lantone.dblayermbg.entity.report.UserDept;
|
|
|
+import com.lantone.dblayermbg.facade.report.RoleFacade;
|
|
|
+import com.lantone.dblayermbg.facade.report.DeptInfoFacade;
|
|
|
+import com.lantone.dblayermbg.facade.report.UserDeptFacade;
|
|
|
+import com.lantone.dblayermbg.facade.report.UserFacade;
|
|
|
+import com.lantone.dblayermbg.facade.report.BehospitalInfoFacade;
|
|
|
+import com.lantone.dblayermbg.facade.report.CheckInfoFacade;
|
|
|
+import com.lantone.dblayermbg.facade.report.UserRoleFacade;
|
|
|
+import com.lantone.dblayermbg.service.impl.report.CheckInfoServiceImpl;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Set;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+
|
|
|
+@Component
|
|
|
+public class QcCheckFacade {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private BehospitalInfoFacade behospitalInfoFacade;
|
|
|
+ @Autowired
|
|
|
+ private CheckInfoFacade medCheckInfoFacade;
|
|
|
+ @Autowired
|
|
|
+ private UserFacade sysUserFacade;
|
|
|
+ @Autowired
|
|
|
+ private CheckInfoServiceImpl checkInfoServiceImpl;
|
|
|
+ @Autowired
|
|
|
+ private RoleFacade roleFacade;
|
|
|
+ @Autowired
|
|
|
+ private DeptInfoFacade deptInfoFacade;
|
|
|
+ @Autowired
|
|
|
+ private UserDeptFacade sysUserDeptFacade;
|
|
|
+ @Autowired
|
|
|
+ private UserRoleFacade userRoleFacade;
|
|
|
+ /**
|
|
|
+ * 分页
|
|
|
+ *
|
|
|
+ * @param checkWorkPageVO
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public IPage<CheckWorkDTO> pageFac(CheckWorkPageVO checkWorkPageVO) {
|
|
|
+ checkWorkPageSet(checkWorkPageVO);
|
|
|
+ IPage<CheckWorkDTO> res = medCheckInfoFacade.getBaseMapper().getCheckWorkPage(checkWorkPageVO);
|
|
|
+ if (res == null || ListUtil.isEmpty(res.getRecords())) {
|
|
|
+ return res;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<String> behospitalCodes = res.getRecords().stream().map(CheckWorkDTO::getBehospitalCode).collect(Collectors.toList());
|
|
|
+ Map<String, BehospitalInfoAgeDTO> ageMap = behospitalInfoFacade.getBehospitalInfoAge(checkWorkPageVO.getHospitalId(), behospitalCodes).stream().collect(Collectors.toMap(i -> i.getBehospitalCode(), i -> i));
|
|
|
+ res.getRecords().forEach(i -> {
|
|
|
+ i.setAge(ageMap.get(i.getBehospitalCode()) == null ? "" : ageMap.get(i.getBehospitalCode()).getAge());
|
|
|
+ });
|
|
|
+
|
|
|
+ //更新delFlag
|
|
|
+ Long principleId = Long.valueOf(SysUserUtils.getCurrentPrincipleId());
|
|
|
+ res.getRecords().stream().forEach(checkWorkDTO -> {
|
|
|
+ if (principleId.equals(checkWorkDTO.getJobCreator())) {
|
|
|
+ checkWorkDTO.setDelFlag(true);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return res;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void checkWorkPageSet(CheckWorkPageVO checkWorkPageVO) {
|
|
|
+ //入参验证
|
|
|
+ //出院时间
|
|
|
+ if (null != checkWorkPageVO && null != checkWorkPageVO.getStartDate()) {
|
|
|
+ checkWorkPageVO.setStartDate(DateUtil.getFirstTimeOfDay(checkWorkPageVO.getStartDate()));
|
|
|
+ }
|
|
|
+ if (null != checkWorkPageVO && null != checkWorkPageVO.getEndDate()) {
|
|
|
+ checkWorkPageVO.setEndDate(DateUtil.getFirstTimeOfDay(DateUtil.addDay(checkWorkPageVO.getEndDate(), 1)));
|
|
|
+ }
|
|
|
+ if (null != checkWorkPageVO && null != checkWorkPageVO.getStartDate() && null != checkWorkPageVO.getEndDate()) {
|
|
|
+ if (DateUtil.after(checkWorkPageVO.getStartDate(), checkWorkPageVO.getEndDate())) {
|
|
|
+ throw new ApiException( "出院时间的开始时间必须小于结束时间!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //住院天数
|
|
|
+ if (null != checkWorkPageVO && null != checkWorkPageVO.getSmallDay() && null != checkWorkPageVO.getBigDay()) {
|
|
|
+ if (checkWorkPageVO.getSmallDay() > checkWorkPageVO.getBigDay()) {
|
|
|
+ throw new ApiException( "住院天数区间有误!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ checkWorkPageVO.setHospitalId(SysUserUtils.getCurrentHospitalId());
|
|
|
+
|
|
|
+ if (StringUtil.isNotBlank(checkWorkPageVO.getJobType()) && (CheckJobTypeEnum.DEPT_SUPERVISOR.getKey() + "").equals(checkWorkPageVO.getJobType())) {
|
|
|
+ SysUserBaseVO sysUserBaseVO = new SysUserBaseVO();
|
|
|
+ sysUserBaseVO.setUserId(SysUserUtils.getCurrentPrincipleId());
|
|
|
+ List<String> deptIds = Lists.newArrayList();
|
|
|
+ List<BasDeptInfoDTO> selDepts = sysUserFacade.getUserDepts(sysUserBaseVO).getSelDepts();
|
|
|
+ if (ListUtil.isNotEmpty(selDepts)) {
|
|
|
+ deptIds = selDepts.stream().map(i -> i.getDeptId()).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+ if (ListUtil.isNotEmpty(checkWorkPageVO.getDepartment())) {
|
|
|
+ deptIds.retainAll(checkWorkPageVO.getDepartment());
|
|
|
+ }
|
|
|
+ if (ListUtil.isEmpty(deptIds)) {
|
|
|
+ deptIds.add("999999999999");
|
|
|
+ }
|
|
|
+ checkWorkPageVO.setDepartment(deptIds);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @Author songxl
|
|
|
+ * @Description 批量操作核查任务(增加和删除)
|
|
|
+ * @Date 2021/5/11
|
|
|
+ * @Param [medCheckWorkVO]
|
|
|
+ * @Return java.lang.Boolean
|
|
|
+ * @MethodName addCheck
|
|
|
+ */
|
|
|
+ public Boolean addCheckWork(MedCheckWorkAddVO medCheckWorkVO) {
|
|
|
+
|
|
|
+ boolean flag = false;
|
|
|
+ Date now = DateUtil.now();
|
|
|
+ //获取核查任务类型(0-科室任务 1-院级 2-质控科)
|
|
|
+ Integer workType = medCheckWorkVO.getJobType();
|
|
|
+ //获取操作类型(0-取消,1-添加)
|
|
|
+ Integer checkStatus = medCheckWorkVO.getCheckStatus();
|
|
|
+ Long hospitalId = SysUserUtils.getCurrentHospitalId();
|
|
|
+ Long principleId = SysUserUtils.getCurrentPrincipleId();
|
|
|
+ User user = sysUserFacade.getOne(new QueryWrapper<User>()
|
|
|
+ .eq("is_deleted", IsDeleteEnum.N.getKey())
|
|
|
+ .eq("id", principleId)
|
|
|
+ .eq("status", 1));
|
|
|
+ String principleName = user.getLinkman();
|
|
|
+ //取消核查任务【操作类型(0-取消,1-添加)】
|
|
|
+ if (checkStatus != null && checkStatus == 0) {
|
|
|
+ //判断核查任务是否生成
|
|
|
+ QueryWrapper<CheckInfo> medicalRecordQe = new QueryWrapper<>();
|
|
|
+ medicalRecordQe.eq("hospital_id", hospitalId);
|
|
|
+ medicalRecordQe.eq("is_deleted", IsDeleteEnum.N.getKey());
|
|
|
+ if (medCheckWorkVO.getBehospitalCodeList().size() > 0) {
|
|
|
+ medicalRecordQe.in("behospital_code", medCheckWorkVO.getBehospitalCodeList());
|
|
|
+ }
|
|
|
+ List<CheckInfo> list = medCheckInfoFacade.list(medicalRecordQe);
|
|
|
+ if (ListUtil.isEmpty(list)) {
|
|
|
+ throw new ApiException( "存在未生成核查任务!");
|
|
|
+ }
|
|
|
+
|
|
|
+ //创建用户集合
|
|
|
+ Set<Long> creaters = list.stream().map(CheckInfo::getJobCreator).collect(Collectors.toSet());
|
|
|
+ if (creaters != null) {
|
|
|
+ //移除当前用户如果还有其他用户
|
|
|
+ creaters.remove(principleId);
|
|
|
+ if (creaters.size() > 0) {
|
|
|
+ throw new ApiException("无法取消他人生成任务!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ int i = medCheckInfoFacade.getBaseMapper().deleteBatchCodes(medCheckWorkVO.getBehospitalCodeList());
|
|
|
+ if (i != 0) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ } else if (checkStatus != null && checkStatus == 1) {
|
|
|
+ //生成核查任务
|
|
|
+ CheckInfo data = medCheckInfoFacade.getOne(new QueryWrapper<CheckInfo>()
|
|
|
+ .eq("is_deleted", IsDeleteEnum.N.getKey())
|
|
|
+ .eq("hospital_id", hospitalId)
|
|
|
+ .in("behospital_code", medCheckWorkVO.getBehospitalCodeList())
|
|
|
+ );
|
|
|
+ //任务是否存在
|
|
|
+ if (data != null) {
|
|
|
+ throw new ApiException( "核查任务已存在!");
|
|
|
+ }
|
|
|
+
|
|
|
+ //该病历没有核查的时候, 就添加核查记录
|
|
|
+ List<CheckInfo> medCheckInfoList = new ArrayList<>();
|
|
|
+ for (String behospitalCode : medCheckWorkVO.getBehospitalCodeList()) {
|
|
|
+ CheckInfo medCheckInfo = new CheckInfo();
|
|
|
+ medCheckInfo.setIsDeleted(IsDeleteEnum.N.getKey());
|
|
|
+ medCheckInfo.setGmtCreate(now);
|
|
|
+ medCheckInfo.setBehospitalCode(behospitalCode);
|
|
|
+ medCheckInfo.setHospitalId(hospitalId);
|
|
|
+ medCheckInfo.setCheckType(medCheckWorkVO.getCheckType());
|
|
|
+ medCheckInfo.setJobCreator(principleId);
|
|
|
+ medCheckInfo.setJobCreatorName(principleName);
|
|
|
+ medCheckInfo.setJobCreateTime(now);
|
|
|
+ medCheckInfo.setJobType(medCheckWorkVO.getJobType());
|
|
|
+ medCheckInfoList.add(medCheckInfo);
|
|
|
+ }
|
|
|
+ flag = checkInfoServiceImpl.saveBatch(medCheckInfoList);
|
|
|
+ }
|
|
|
+ return flag;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @Author songxl
|
|
|
+ * @Description 获取操作用户的核查科室以及人员
|
|
|
+ * @Date 2021/5/14
|
|
|
+ * @Param []
|
|
|
+ * @Return java.util.Map<java.lang.String, java.util.List < com.diagbot.dto.CheckDeptDTO>>
|
|
|
+ * @MethodName getCheckUserMap
|
|
|
+ */
|
|
|
+ public IPage<CheckJobDTO> getUserCheckList(CheckJobPageVO checkJobVO) {
|
|
|
+ //校验
|
|
|
+ userCheckPageSet(checkJobVO);
|
|
|
+ //质控管理员要判断该角色是否是质控科
|
|
|
+ //1.获取质控科id
|
|
|
+ //获取人员id 和 该人员的医院id
|
|
|
+ Long hospitalId = SysUserUtils.getCurrentHospitalId();
|
|
|
+ Long principleId = SysUserUtils.getCurrentPrincipleId();
|
|
|
+ //获取核查监管相关角色id
|
|
|
+ List<Long> checkRoleIds = roleFacade.list(new QueryWrapper<Role>()
|
|
|
+ .eq("is_deleted", IsDeleteEnum.N.getKey())
|
|
|
+ .like("name", "监管人员")
|
|
|
+ ).stream().map(Role::getId).collect(Collectors.toList());
|
|
|
+ //查询该角色的所有角色id
|
|
|
+ List<Long> roleIds = userRoleFacade.list(new QueryWrapper<UserRole>()
|
|
|
+ .eq("is_deleted", IsDeleteEnum.N.getKey())
|
|
|
+ .eq("user_id", principleId)
|
|
|
+ ).stream().distinct().map(UserRole::getRoleId).collect(Collectors.toList());
|
|
|
+ List<Long> searchRoleIds = new ArrayList<>();
|
|
|
+ //当前用户是监管人员或者是超级管理员
|
|
|
+ if (roleIds.contains(-1L)) {
|
|
|
+ searchRoleIds.addAll(checkRoleIds);
|
|
|
+ } else {
|
|
|
+ searchRoleIds.addAll(containsRole(checkRoleIds, roleIds));
|
|
|
+ }
|
|
|
+ if (searchRoleIds.isEmpty()) {
|
|
|
+ throw new ApiException("该用户不是核查监管人员!");
|
|
|
+ }
|
|
|
+ //质控科监管人员
|
|
|
+ if (searchRoleIds.contains(CheckerRoleEnum.QUAT_SUPERVISOR.getKey() * 1l)
|
|
|
+ && (CheckJobTypeEnum.QUAT_SUPERVISOR.getKey() + "").equals(checkJobVO.getJobType())) {
|
|
|
+ //用户是不是质管科人员校验
|
|
|
+ DeptInfo deptInfo = deptInfoFacade.getOne(new QueryWrapper<DeptInfo>()
|
|
|
+ .eq("is_deleted", IsDeleteEnum.N.getKey())
|
|
|
+ .eq("hospital_id", hospitalId)
|
|
|
+ .eq("station", "质管"));
|
|
|
+ if (deptInfo == null || deptInfo.getDeptId() == null) {
|
|
|
+ throw new ApiException( "科室质管科不存在,请联系管理员!");
|
|
|
+ }
|
|
|
+ //2.获取监管人员所在科室集合
|
|
|
+ List<String> deptIds = sysUserDeptFacade.list(new QueryWrapper<UserDept>()
|
|
|
+ .eq("is_deleted", IsDeleteEnum.N.getKey())
|
|
|
+ .eq("hospital_id", hospitalId)
|
|
|
+ .eq("user_id", principleId)
|
|
|
+ ).stream().map(UserDept::getDeptId).collect(Collectors.toList());
|
|
|
+ //3.判断这个人是否在质控科
|
|
|
+// if(deptIds.contains(zkkDeptId))
|
|
|
+// {
|
|
|
+//
|
|
|
+// }
|
|
|
+ //质控科任务分配列表是任务类型是质控科的任务与科室无关
|
|
|
+ return medCheckInfoFacade.getBaseMapper().getCheckList(checkJobVO);
|
|
|
+ }
|
|
|
+ //临床科室监管人员 或 院级监管人员
|
|
|
+ else if (searchRoleIds.contains(CheckerRoleEnum.DEPT_SUPERVISOR.getKey() * 1l)
|
|
|
+ || searchRoleIds.contains(CheckerRoleEnum.HOSP_SUPERVISOR.getKey() * 1l)) {
|
|
|
+ //查询没有指定科室
|
|
|
+ if (checkJobVO.getDeptList() == null || checkJobVO.getDeptList().isEmpty()) {
|
|
|
+ //科室获取待分配任务所在科室集合
|
|
|
+ if (CheckJobTypeEnum.DEPT_SUPERVISOR.getKey() == Integer.parseInt(checkJobVO.getJobType())) {
|
|
|
+ List<String> deptIds = sysUserDeptFacade.list(new QueryWrapper<UserDept>()
|
|
|
+ .eq("is_deleted", IsDeleteEnum.N.getKey())
|
|
|
+ .eq("hospital_id", hospitalId)
|
|
|
+ .eq("user_id", principleId)
|
|
|
+ ).stream().map(UserDept::getDeptId).collect(Collectors.toList());
|
|
|
+
|
|
|
+ if (deptIds != null && !deptIds.isEmpty()) {
|
|
|
+ checkJobVO.setDeptList(deptIds);
|
|
|
+ return medCheckInfoFacade.getBaseMapper().getCheckList(checkJobVO);
|
|
|
+ } else {
|
|
|
+ return new CheckJobPageVO();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //院区获取
|
|
|
+ if (CheckJobTypeEnum.HOSP_SUPERVISOR.getKey() == Integer.parseInt(checkJobVO.getJobType())) {
|
|
|
+// //获取管理员所在科室
|
|
|
+// List<String> deptIds = sysUserDeptFacade.list(new QueryWrapper<SysUserDept>()
|
|
|
+// .eq("is_deleted", IsDeleteEnum.N.getKey())
|
|
|
+// .eq("hospital_id",hospitalId)
|
|
|
+// .eq("user_id",principleId)
|
|
|
+// ).stream().map(SysUserDept::getDeptId).collect(Collectors.toList());
|
|
|
+// //获取所有院区核查人员所在科室
|
|
|
+// CheckUserVO checkUserVOS = new CheckUserVO();
|
|
|
+// checkUserVOS.setRoleIds(Lists.newArrayList(CheckerRoleEnum.HOSP_GENERAL.getKey()*1l));
|
|
|
+// checkUserVOS.setDeptStations(Lists.newArrayList("住院"));
|
|
|
+// checkUserVOS.setHospitalId(hospitalId);
|
|
|
+// List<CheckUserDTO> checkUserDTOS = baseMapper.getCheckUser(checkUserVOS);
|
|
|
+// Set<String> hospGeneralDeptIds= checkUserDTOS.stream()
|
|
|
+// .map(CheckUserDTO::getDeptId).collect(Collectors.toSet());
|
|
|
+// //去除管理员所在科室
|
|
|
+// if(hospGeneralDeptIds!=null&&!hospGeneralDeptIds.isEmpty()&&deptIds!=null){
|
|
|
+// hospGeneralDeptIds.removeAll(deptIds);
|
|
|
+// checkJobVO.setDeptList(new ArrayList<>(hospGeneralDeptIds));
|
|
|
+// }
|
|
|
+ return medCheckInfoFacade.getBaseMapper().getCheckList(checkJobVO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return medCheckInfoFacade.getBaseMapper().getCheckList(checkJobVO);
|
|
|
+ } else {
|
|
|
+ throw new ApiException("该用户的角色和任务类型不对应!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * @Author songxl
|
|
|
+ * @Description list求交集
|
|
|
+ * @Date 2021/5/14
|
|
|
+ * @Param [checkRoleIds, roleIds]
|
|
|
+ * @Return java.util.List<java.lang.Long>
|
|
|
+ * @MethodName containsRole
|
|
|
+ */
|
|
|
+ private List<Long> containsRole(List<Long> checkRoleIds, List<Long> roleIds) {
|
|
|
+
|
|
|
+ List<Long> searchRoleIds = new ArrayList<>();
|
|
|
+ for (Long id : roleIds) {
|
|
|
+ if (checkRoleIds.contains(id)) {
|
|
|
+ searchRoleIds.add(id);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return searchRoleIds;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @Author songxl
|
|
|
+ * @Description 待分配列表页面校验
|
|
|
+ * @Date 2021/5/18
|
|
|
+ * @Param [checkJobVO]
|
|
|
+ * @Return void
|
|
|
+ * @MethodName userCheckPageSet
|
|
|
+ */
|
|
|
+ private void userCheckPageSet(CheckJobPageVO checkJobVO) {
|
|
|
+ if (StringUtil.isBlank(checkJobVO.getStartTime()) && StringUtil.isBlank(checkJobVO.getEndTime())
|
|
|
+ && StringUtil.isBlank(checkJobVO.getBehosDateStart()) && StringUtil.isBlank(checkJobVO.getBehosDateEnd())) {
|
|
|
+ throw new ApiException( "没有时间区间!");
|
|
|
+ }
|
|
|
+ if (StringUtil.isBlank(checkJobVO.getJobType())) {
|
|
|
+ throw new ApiException( "没有任务类型!");
|
|
|
+ }
|
|
|
+ if (StringUtil.isNotBlank(checkJobVO.getBehosDateStart()) && StringUtil.isNotBlank(checkJobVO.getBehosDateEnd())) {
|
|
|
+ if (DateUtil.after(DateUtil.parseDate(checkJobVO.getBehosDateStart()),
|
|
|
+ DateUtil.parseDate(checkJobVO.getBehosDateEnd()))) {
|
|
|
+ throw new ApiException( "出院时间的开始时间必须小于结束时间!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (StringUtil.isNotBlank(checkJobVO.getStartTime()) && StringUtil.isNotBlank(checkJobVO.getEndTime())) {
|
|
|
+ if (DateUtil.after(DateUtil.parseDate(checkJobVO.getStartTime()),
|
|
|
+ DateUtil.parseDate(checkJobVO.getEndTime()))) {
|
|
|
+ throw new ApiException("任务生成的开始时间必须小于结束时间!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|