package com.panzhihua.service_community.service.impl; import static java.util.Objects.isNull; import static java.util.Objects.nonNull; import static org.apache.commons.lang3.StringUtils.isNotBlank; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import javax.annotation.Resource; import javax.validation.constraints.NotNull; import com.panzhihua.common.exceptions.ServiceException; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.panzhihua.common.model.dtos.community.rentingHouses.NearbyDTO; import com.panzhihua.common.model.dtos.community.rentingHouses.PageRentingHouseRegisterDTO; import com.panzhihua.common.model.dtos.community.rentingHouses.ReleaseOrCancelHouseDTO; import com.panzhihua.common.model.dtos.community.rentingHouses.RentingHouseRegisterDTO; import com.panzhihua.common.model.vos.R; import com.panzhihua.common.model.vos.community.rentingHouses.RentingHouseRegisterVO; import com.panzhihua.common.utlis.Snowflake; import com.panzhihua.service_community.dao.ComActVillageDAO; import com.panzhihua.service_community.dao.RentingHourseContractConfigDao; import com.panzhihua.service_community.dao.RentingHourseRegisterDao; import com.panzhihua.service_community.entity.RentingHourseContractConfig; import com.panzhihua.service_community.entity.RentingHourseFile; import com.panzhihua.service_community.entity.RentingHourseRegister; import com.panzhihua.service_community.model.dos.ComMngVillageDO; import com.panzhihua.service_community.service.RentingHourseFileService; import com.panzhihua.service_community.service.RentingHourseRegisterService; import com.panzhihua.service_community.util.NearbyUtil; import com.panzhihua.service_community.util.WxMaConfiguration; import com.spatial4j.core.shape.Rectangle; import cn.binarywang.wx.miniapp.api.WxMaQrcodeService; import cn.hutool.core.codec.Base64; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.error.WxErrorException; /** * 房屋租售-租赁房屋登记(RentingHourseRegister)表服务实现类 * * @author makejava * @since 2021-11-23 10:49:08 */ @Slf4j @Service public class RentingHourseRegisterServiceImpl extends ServiceImpl implements RentingHourseRegisterService { @Resource private ComActVillageDAO comActVillageDAO; @Resource private RentingHourseFileService rentingHourseFileService; @Resource private RentingHourseContractConfigDao rentingHourseContractConfigDao; @Resource private WxMaConfiguration wxMaConfiguration; @Value("${rentinghouse.min-app.jump-page}") private String minAppJumpPage; /** * 新增房源信息 * @param registerDTO * @return */ @Override @Transactional(rollbackFor = Exception.class) public R registerRentingHouse(RentingHouseRegisterDTO registerDTO) { checkDepositMoney(registerDTO); Long communityId = registerDTO.getCommunityId(); Long userId = registerDTO.getUserId(); RentingHourseRegister houseRegister = new RentingHourseRegister(); BeanUtils.copyProperties(registerDTO, houseRegister); Date nowDate = new Date(); houseRegister.setId(Snowflake.getId()); houseRegister.setAuthStatus(RentingHourseRegister.AuthStatus.wrz); houseRegister.setStatus(RentingHourseRegister.Status.dfb); houseRegister.setDetailStatus(RentingHourseRegister.DetailStatus.drz); houseRegister.setInfoStatus(2); houseRegister.setCreateAt(nowDate); houseRegister.setUpdateAt(nowDate); try { WxMaQrcodeService qrCodeService = wxMaConfiguration.getMaService(registerDTO.getAreaCode()).getQrcodeService(); byte[] bytes = qrCodeService.createWxaCodeUnlimitBytes("id=" + houseRegister.getId() + "&type=6", minAppJumpPage, 30, true, null, false); String authCode = String.format("data:image/png;base64,%s", Base64.encode(bytes)); houseRegister.setAuthCode(authCode); } catch (WxErrorException e) { log.error("生成房源认证码失败【{}】", e.getMessage()); return R.fail("生成房源认证码失败,请稍后重试"); } //街道id //小区id List villageList = comActVillageDAO.selectList(new QueryWrapper().lambda() .eq(ComMngVillageDO::getCommunityId, communityId) .eq(ComMngVillageDO::getAlley, registerDTO.getAlley()) .eq(ComMngVillageDO::getHouseNum, registerDTO.getHouseNum())); Long streetId = 0L; Long villageId = 0L; if (!villageList.isEmpty()) { ComMngVillageDO village = villageList.stream().sorted(Comparator.comparing(ComMngVillageDO::getCreateAt).reversed()).findFirst().get(); streetId = village.getStreetId(); villageId = village.getVillageId(); houseRegister.setStreetId(streetId); houseRegister.setVillageId(villageId); } //房屋编号 streetId + communityId + villageId + timestamp String code = "" + streetId + communityId + villageId + nowDate.toInstant().getEpochSecond(); houseRegister.setCode(code); int result = this.baseMapper.insert(houseRegister); if (result > 0) { //图片存储 Long registerId = houseRegister.getId(); List files = new ArrayList<>(); List housePictures = registerDTO.getHousePictures(); if (!housePictures.isEmpty()) { housePictures.forEach(e -> { if (StringUtils.isNotBlank(e)) { RentingHourseFile file = new RentingHourseFile(); file.setId(Snowflake.getId()); file.setClassification(RentingHourseFile.Classification.fytp); file.setRefId(registerId); file.setType(RentingHourseFile.Type.picture); file.setUrl(e); file.setCreateBy(userId); file.setCreateAt(nowDate); files.add(file); } }); } List propertyPictures = registerDTO.getPropertyPictures(); if (!propertyPictures.isEmpty()) { propertyPictures.forEach(e -> { if (StringUtils.isNotBlank(e)) { RentingHourseFile file = new RentingHourseFile(); file.setId(Snowflake.getId()); file.setClassification(RentingHourseFile.Classification.cqtp); file.setRefId(registerId); file.setType(RentingHourseFile.Type.picture); file.setUrl(e); file.setCreateBy(userId); file.setCreateAt(nowDate); files.add(file); } }); } List credentialsPictures = registerDTO.getCredentialsPictures(); if (!credentialsPictures.isEmpty()) { credentialsPictures.forEach(e -> { if (StringUtils.isNotBlank(e)) { RentingHourseFile file = new RentingHourseFile(); file.setId(Snowflake.getId()); file.setClassification(RentingHourseFile.Classification.zjzq); file.setRefId(registerId); file.setType(RentingHourseFile.Type.picture); file.setUrl(e); file.setCreateBy(userId); file.setCreateAt(nowDate); files.add(file); } }); } rentingHourseFileService.saveBatch(files); return R.ok(); } return R.fail("新增房源失败"); } private void checkDepositMoney(RentingHouseRegisterDTO registerDTO) { BigDecimal dingMoney = registerDTO.getDingMoney(); BigDecimal monthlyRentMoney = registerDTO.getMonthlyRentMoney(); if (nonNull(dingMoney) && nonNull(monthlyRentMoney) && dingMoney.compareTo(monthlyRentMoney) == 1) { throw new ServiceException("500", "定金不能超过月租金"); } } /** * 编辑房源信息 * @param registerDTO * @return */ @Override @Transactional(rollbackFor = Exception.class) public R updateRentingHouse(RentingHouseRegisterDTO registerDTO) { checkDepositMoney(registerDTO); Long id = registerDTO.getId(); Long userId = registerDTO.getUserId(); RentingHourseRegister houseRegister = this.baseMapper.selectById(id); if (isNull(houseRegister)) { return R.fail("房源不存在"); } if (houseRegister.getStatus().intValue() == RentingHourseRegister.Status.czz || houseRegister.getStatus().intValue() == RentingHourseRegister.Status.ytz) { return R.fail("出租中、结算中不可进行编辑操作"); } if (houseRegister.getStatus().intValue() == RentingHourseRegister.Status.dcz) { return R.fail("编辑房源请先取消发布"); } Date nowDate = new Date(); BeanUtils.copyProperties(registerDTO, houseRegister); houseRegister.setUpdateAt(nowDate); String alley = registerDTO.getAlley(); String houseNum = registerDTO.getHouseNum(); boolean isChange = isNotBlank(alley) && isNotBlank(houseNum) && (!houseRegister.getAlley().equals(alley) || !houseRegister.getHouseNum().equals(houseNum)); if (isChange) { List villageList = comActVillageDAO.selectList(new QueryWrapper().lambda() .eq(ComMngVillageDO::getCommunityId, registerDTO.getCommunityId()) .eq(ComMngVillageDO::getAlley, alley) .eq(ComMngVillageDO::getHouseNum, houseNum)); if (!villageList.isEmpty()) { ComMngVillageDO village = villageList.stream().sorted(Comparator.comparing(ComMngVillageDO::getCreateAt).reversed()).findFirst().get(); houseRegister.setStreetId(village.getStreetId()); houseRegister.setVillageId(village.getVillageId()); } } int result = this.baseMapper.updateById(houseRegister); if (result > 0) { List files = new ArrayList<>(); List housePictures = registerDTO.getHousePictures(); if (nonNull(housePictures) && !housePictures.isEmpty()) { rentingHourseFileService.remove(new QueryWrapper().lambda() .eq(RentingHourseFile::getRefId, id) .eq(RentingHourseFile::getClassification, RentingHourseFile.Classification.fytp) .eq(RentingHourseFile::getType, RentingHourseFile.Type.picture)); housePictures.forEach(e -> { if (StringUtils.isNotBlank(e)) { RentingHourseFile file = new RentingHourseFile(); file.setId(Snowflake.getId()); file.setClassification(RentingHourseFile.Classification.fytp); file.setRefId(id); file.setType(RentingHourseFile.Type.picture); file.setUrl(e); file.setCreateBy(userId); file.setCreateAt(nowDate); files.add(file); } }); } List propertyPictures = registerDTO.getPropertyPictures(); if (nonNull(propertyPictures) && !propertyPictures.isEmpty()) { rentingHourseFileService.remove(new QueryWrapper().lambda() .eq(RentingHourseFile::getRefId, id) .eq(RentingHourseFile::getClassification, RentingHourseFile.Classification.cqtp) .eq(RentingHourseFile::getType, RentingHourseFile.Type.picture)); propertyPictures.forEach(e -> { if (StringUtils.isNotBlank(e)) { RentingHourseFile file = new RentingHourseFile(); file.setId(Snowflake.getId()); file.setClassification(RentingHourseFile.Classification.cqtp); file.setRefId(id); file.setType(RentingHourseFile.Type.picture); file.setUrl(e); file.setCreateBy(userId); file.setCreateAt(nowDate); files.add(file); } }); } List credentialsPictures = registerDTO.getCredentialsPictures(); if (nonNull(credentialsPictures) && !credentialsPictures.isEmpty()) { rentingHourseFileService.remove(new QueryWrapper().lambda() .eq(RentingHourseFile::getRefId, id) .eq(RentingHourseFile::getClassification, RentingHourseFile.Classification.zjzq) .eq(RentingHourseFile::getType, RentingHourseFile.Type.picture)); credentialsPictures.forEach(e -> { if (StringUtils.isNotBlank(e)) { RentingHourseFile file = new RentingHourseFile(); file.setId(Snowflake.getId()); file.setClassification(RentingHourseFile.Classification.zjzq); file.setRefId(id); file.setType(RentingHourseFile.Type.picture); file.setUrl(e); file.setCreateBy(userId); file.setCreateAt(nowDate); files.add(file); } }); } rentingHourseFileService.saveBatch(files); return R.ok(); } return R.fail("修改失败"); } /** * 分页获取房源信息 * @param pageRegisterDTO * @return */ @Override public R pageRentingHouse(PageRentingHouseRegisterDTO pageRegisterDTO) { Page page = new Page<>(); page.setCurrent(pageRegisterDTO.getPageNum()); page.setSize(pageRegisterDTO.getPageSize()); return R.ok(this.baseMapper.pageRentingHouse(page, pageRegisterDTO)); } /** * 发布/取消发布 房源信 * @param releaseOrCancelHouseDTO * @return */ @Override public R releaseOrCancelHouse(ReleaseOrCancelHouseDTO releaseOrCancelHouseDTO) { RentingHourseRegister houseRegister = this.baseMapper.selectById(releaseOrCancelHouseDTO.getRegisterId()); if (isNull(houseRegister)) { return R.fail("房源不存在"); } Integer type = releaseOrCancelHouseDTO.getType(); Integer status = houseRegister.getStatus(); Integer authStatus = houseRegister.getAuthStatus(); if (type.intValue() == 1) { //发布 if (authStatus.intValue() == RentingHourseRegister.AuthStatus.wrz) { return R.fail("房源还未认证"); } if (status.intValue() != RentingHourseRegister.Status.dfb) { return R.fail("已发布,请勿重复操作"); } houseRegister.setStatus(RentingHourseRegister.Status.dcz); houseRegister.setDetailStatus(RentingHourseRegister.DetailStatus.dcz); } else { if (status.intValue() != RentingHourseRegister.Status.dcz) { return R.fail("暂不可取消发布"); } //取消发布 houseRegister.setStatus(RentingHourseRegister.Status.dfb); if (authStatus.intValue() == RentingHourseRegister.AuthStatus.yrz) { houseRegister.setDetailStatus(RentingHourseRegister.DetailStatus.dfb); } else { houseRegister.setDetailStatus(RentingHourseRegister.DetailStatus.drz); } } houseRegister.setUpdateAt(new Date()); int result = this.baseMapper.updateById(houseRegister); if (result > 0) { return R.ok(); } return R.fail("失败,请重试"); } /** * 删除房源信息 * @param registerId * @return */ @Override public R deleteRentingHouse(Long registerId) { RentingHourseRegister houseRegister = this.baseMapper.selectById(registerId); if (isNull(houseRegister)) { return R.fail("房源不存在"); } Integer status = houseRegister.getStatus(); if (status.intValue() != RentingHourseRegister.Status.dfb) { return R.fail("已发布房源不支持删除"); } rentingHourseFileService.remove(new QueryWrapper().lambda() .eq(RentingHourseFile::getRefId, registerId)); int result = this.baseMapper.deleteById(registerId); if (result > 0) { return R.ok(); } return R.fail("删除失败,请重试"); } /** * 获取详情-房源信息 * @param registerId * @return */ @Override public R getRentingHouse(Long registerId) { RentingHourseRegister houseRegister = this.baseMapper.selectById(registerId); if (isNull(houseRegister)) { return R.fail("房源不存在"); } RentingHouseRegisterVO registerVO = new RentingHouseRegisterVO(); BeanUtils.copyProperties(houseRegister, registerVO); List files = rentingHourseFileService.list(new QueryWrapper().lambda() .eq(RentingHourseFile::getRefId, registerId) .eq(RentingHourseFile::getType, RentingHourseFile.Type.picture)); if (!files.isEmpty()) { Map> fileGroupMap = files.stream() .collect(Collectors.groupingBy(RentingHourseFile::getClassification)); for (Map.Entry> entry : fileGroupMap.entrySet()) { List urls = entry.getValue().stream().map(RentingHourseFile::getUrl).collect(Collectors.toList()); switch (entry.getKey()) { case RentingHourseFile.Classification.fytp: registerVO.setHousePictures(urls); registerVO.setUrl(urls.get(0)); break; case RentingHourseFile.Classification.cqtp: registerVO.setPropertyPictures(urls); break; case RentingHourseFile.Classification.zjzq: registerVO.setCredentialsPictures(urls); default: break; } } } RentingHourseContractConfig contractConfig = rentingHourseContractConfigDao .selectOne(new QueryWrapper() .lambda().eq(RentingHourseContractConfig::getName, "房屋委托代理合同")); if (nonNull(contractConfig)) { registerVO.setHouseAgencyContract(contractConfig.getValue()); } return R.ok(registerVO); } @Override public R nearby(NearbyDTO nearbyDTO) { Rectangle rectangle =new NearbyUtil().getRectangle(nearbyDTO.getDistance(), Double.parseDouble(nearbyDTO.getLongitude()), Double.parseDouble(nearbyDTO.getLatitude())); return R.ok(this.baseMapper.nearby(rectangle.getMinX(),rectangle.getMaxX(), rectangle.getMinY(),rectangle.getMaxY(), nearbyDTO)); } @Override public R pageRentingHouseApplet(PageRentingHouseRegisterDTO pageRegisterDTO) { Page page = new Page<>(); page.setCurrent(pageRegisterDTO.getPageNum()); page.setSize(pageRegisterDTO.getPageSize()); return R.ok(this.baseMapper.pageRentingHouseApplet(page, pageRegisterDTO)); } @Override public void updateAllHouseUnionAppCode(String areaCode) { List list = this.baseMapper.selectList(null); if (!list.isEmpty()) { list.stream().forEach(houseRegister -> { try { WxMaQrcodeService qrCodeService = wxMaConfiguration.getMaService(areaCode).getQrcodeService(); byte[] bytes = qrCodeService.createWxaCodeUnlimitBytes("id=" + houseRegister.getId() + "&type=6", minAppJumpPage, 30, true, null, false); String authCode = String.format("data:image/png;base64,%s", Base64.encode(bytes)); houseRegister.setAuthCode(authCode); } catch (WxErrorException e) { log.error("生成房源认证码失败【{}】", e.getMessage()); } }); this.updateBatchById(list); } } }