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<RentingHourseRegisterDao, RentingHourseRegister> 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<ComMngVillageDO> villageList = comActVillageDAO.selectList(new QueryWrapper<ComMngVillageDO>().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<RentingHourseFile> files = new ArrayList<>();
|
List<String> 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<String> 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<String> 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<ComMngVillageDO> villageList = comActVillageDAO.selectList(new QueryWrapper<ComMngVillageDO>().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<RentingHourseFile> files = new ArrayList<>();
|
List<String> housePictures = registerDTO.getHousePictures();
|
if (nonNull(housePictures) && !housePictures.isEmpty()) {
|
rentingHourseFileService.remove(new QueryWrapper<RentingHourseFile>().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<String> propertyPictures = registerDTO.getPropertyPictures();
|
if (nonNull(propertyPictures) && !propertyPictures.isEmpty()) {
|
rentingHourseFileService.remove(new QueryWrapper<RentingHourseFile>().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<String> credentialsPictures = registerDTO.getCredentialsPictures();
|
if (nonNull(credentialsPictures) && !credentialsPictures.isEmpty()) {
|
rentingHourseFileService.remove(new QueryWrapper<RentingHourseFile>().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<RentingHourseFile>().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<RentingHourseFile> files = rentingHourseFileService.list(new QueryWrapper<RentingHourseFile>().lambda()
|
.eq(RentingHourseFile::getRefId, registerId)
|
.eq(RentingHourseFile::getType, RentingHourseFile.Type.picture));
|
if (!files.isEmpty()) {
|
Map<Integer, List<RentingHourseFile>> fileGroupMap = files.stream()
|
.collect(Collectors.groupingBy(RentingHourseFile::getClassification));
|
for (Map.Entry<Integer, List<RentingHourseFile>> entry : fileGroupMap.entrySet()) {
|
List<String> 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<RentingHourseContractConfig>()
|
.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<RentingHourseRegister> 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);
|
}
|
}
|
}
|