springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/api/LoginApi.java
@@ -82,28 +82,47 @@ log.info("loginRequest参数【{}】", JSONObject.toJSONString(loginRequest)); String openid = sessionInfo.getOpenid(); String sessionKey = sessionInfo.getSessionKey(); // 解密用户信息 WxMaUserInfo wxUserInfo = maService.getUserService().getUserInfo(sessionKey, loginRequest.getEncryptedData(), loginRequest.getIv()); log.info("wxUserInfo信息【{}】", JSONObject.toJSONString(wxUserInfo)); if (null == wxUserInfo) { return R.fail("获取用户信息失败"); String unionid = sessionInfo.getUnionid(); if (ObjectUtils.isEmpty(unionid)) { unionid = "无"; } String unionId = wxUserInfo.getUnionId(); if (ObjectUtils.isEmpty(unionId)) { unionId = "无"; } userService.addOrUpdate(openid, sessionKey, unionId); userService.addOrUpdate(openid, sessionKey, unionid); return tokenService.loginApplets(openid); } @ApiOperation(value = "H5登录", response = LoginReturnVO.class) @PostMapping("loginH5") public R loginH5(@RequestBody LoginRequest loginRequest) { String unionId = loginRequest.getUnionId(); if (StringUtils.isBlank(unionId)) { return R.fail("缺少基本信息参数"); String code = loginRequest.getCode(); if (ObjectUtils.isEmpty(code)) { return R.fail("缺少登录参数"); } log.info(code); WxMaService maService = wxMaConfiguration.getMaH5Service(); WxMaJscode2SessionResult sessionInfo = null; try { sessionInfo = maService.getUserService().getSessionInfo(code); } catch (Exception e) { log.error("微信登录失败【{}】", e.getMessage()); if (code.equals("22")) { sessionInfo = new WxMaJscode2SessionResult(); sessionInfo.setOpenid("88888888"); sessionInfo.setSessionKey("9999999"); } else { return R.fail("微信登录失败"); } } log.info("微信登录成功【{}】", JSONObject.toJSONString(sessionInfo)); log.info("loginRequest参数【{}】", JSONObject.toJSONString(loginRequest)); // 解密用户信息 // WxMaUserInfo wxUserInfo = maService.getUserService().getUserInfo(sessionInfo.getSessionKey(), // loginRequest.getEncryptedData(), loginRequest.getIv()); // log.info("wxUserInfo信息【{}】", JSONObject.toJSONString(wxUserInfo)); // if (null == wxUserInfo) { // return R.fail("获取用户信息失败"); // } // String unionId = wxUserInfo.getUnionId(); String unionId = sessionInfo.getUnionid(); //通过unionId去匹配user R r1 = userService.getUserInfoByUnionId(unionId); if (R.isOk(r1)) { springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/api/RentingHousesApi.java
@@ -150,6 +150,7 @@ registerDTO.setId(registerId); registerDTO.setAuthStatus(2); registerDTO.setDetailStatus(2); registerDTO.setHourseOwnerUserId(getUserId()); return communityService.updateRentingHouse(registerDTO); } return R.fail(); @@ -161,6 +162,10 @@ @ApiOperation(value = "附近的房源",response =RentingHouseRegisterVO.class) @PostMapping("/nearby") public R nearby(@RequestBody NearbyDTO nearbyDTO){ LoginUserInfoVO loginUserInfoSureNoLogin = getLoginUserInfoSureNoLogin(); if (Objects.nonNull(loginUserInfoSureNoLogin)) { nearbyDTO.setCommunityId(loginUserInfoSureNoLogin.getCommunityId()); } return communityService.nearby(nearbyDTO); } springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/config/WxH5Properties.java
New file @@ -0,0 +1,58 @@ package com.panzhihua.applets.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import lombok.Data; /** * @program: springcloud_k8s_panzhihuazhihuishequ * @description: 微信配置 * @author: huang.hongfa weixin hhf9596 qq 959656820 * @create: 2020-11-23 14:52 **/ @Data @Component @ConfigurationProperties(prefix = "wx.h5") public class WxH5Properties { /** * 设置微信小程序的appid */ private String appid; /** * 设置微信小程序的Secret */ private String secret; /** * 设置微信小程序消息服务器配置的token */ private String token; /** * 设置微信小程序消息服务器配置的EncodingAESKey */ private String aesKey; /** * 消息格式,XML或者JSON */ private String msgDataFormat; /** * 商户号 */ private String mchId; /** * 微信支付密钥 */ private String payKey; /** * 微信支付回调地址 */ private String notifyUrl; } springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/config/WxMaConfiguration.java
@@ -22,6 +22,9 @@ @Resource private WxMaProperties properties; @Resource private WxH5Properties wxH5Properties; public WxMaService getMaService() { WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl(); config.setAppid(properties.getAppid()); @@ -31,4 +34,14 @@ wxMaService.setWxMaConfig(config); return wxMaService; } public WxMaService getMaH5Service() { WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl(); config.setAppid(wxH5Properties.getAppid()); config.setSecret(wxH5Properties.getSecret()); config.setMsgDataFormat(wxH5Properties.getMsgDataFormat()); WxMaService wxMaService = new WxMaServiceImpl(); wxMaService.setWxMaConfig(config); return wxMaService; } } springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/model/vos/LoginRequest.java
@@ -33,7 +33,4 @@ @ApiModelProperty(name = "userInfo", value = "用户基本信息") WxMaUserInfo userInfo; @ApiModelProperty(name = "unionId", value = "用户平台唯一标识") String unionId; } springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/community/rentingHouses/NearbyDTO.java
@@ -18,4 +18,6 @@ private Integer distance; @ApiModelProperty("关键字") private String keyword; @ApiModelProperty("社区id") private Long communityId; } springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/community/rentingHouses/RentingHouseRegisterDTO.java
@@ -166,4 +166,7 @@ @ApiModelProperty(value = "1、待认证2、待发布3、待出租4、保留中 5出租中6、已超时7、已到期)", hidden = true) private Integer detailStatus; @ApiModelProperty(value = "房东的用户ID,用户表记录了房东的详细信息", hidden = true) private Long hourseOwnerUserId; } springcloud_k8s_panzhihuazhihuishequ/community_backstage/src/main/java/com/panzhihua/community_backstage/api/RentingHousesApi.java
@@ -3,6 +3,7 @@ import javax.annotation.Resource; import javax.validation.Valid; import com.panzhihua.common.model.vos.community.rentingHouses.RentingHousesConfigVO; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -91,6 +92,14 @@ return communityService.getRentingHouse(registerId); } @ApiOperation(value = "获取房屋租赁配置",response = RentingHousesConfigVO.class) @GetMapping("/getConfig") @ApiImplicitParam(name = "type", value = "配置类型(1.房屋租赁合同 2.租赁合同变更协议 3.定金协议 4.房屋委托代理合同" + "5.平台须知 6.房源标签)", required = true) public R getRentingHouseConfig(@RequestParam("type") Integer type) { return communityService.getRentingHouseConfig(type); } @ApiOperation(value = "方便开发阶段手动调用批量更新小程序码") @GetMapping("/updateAllHouseUnionAppCode") public R updateAllHouseUnionAppCode() { springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/dao/RentingHourseRegisterDao.java
@@ -35,9 +35,11 @@ * @param minY * @param maxY * @param keyword * @param communityId * @return */ List<RentingHouseRegisterVO> nearby(@Param("minX") Double minX,@Param("maxX") Double maxX,@Param("minY")Double minY,@Param("maxY")Double maxY,@Param("keyword")String keyword); List<RentingHouseRegisterVO> nearby(@Param("minX") Double minX, @Param("maxX") Double maxX, @Param("minY") Double minY, @Param("maxY") Double maxY, @Param("keyword") String keyword, @Param("communityId") Long communityId); /** * 分页获取房源信息 springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/RentingHourseRegisterServiceImpl.java
@@ -4,6 +4,7 @@ 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; @@ -12,8 +13,12 @@ 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; @@ -37,7 +42,6 @@ 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.QRCodeUtil; import com.panzhihua.service_community.util.WxMaConfiguration; import com.spatial4j.core.shape.Rectangle; @@ -56,8 +60,6 @@ @Service public class RentingHourseRegisterServiceImpl extends ServiceImpl<RentingHourseRegisterDao, RentingHourseRegister> implements RentingHourseRegisterService { private static final String HOUSE_DETAIL_PAGE = "packageB/pages/house/houseDetails/houseDetails"; @Resource private ComActVillageDAO comActVillageDAO; @Resource @@ -67,6 +69,9 @@ @Resource private WxMaConfiguration wxMaConfiguration; @Value("${rentinghouse.min-app.jump-page}") private String minAppJumpPage; /** * 新增房源信息 * @param registerDTO @@ -75,6 +80,7 @@ @Override @Transactional(rollbackFor = Exception.class) public R registerRentingHouse(RentingHouseRegisterDTO registerDTO) { checkDepositMoney(registerDTO); Long communityId = registerDTO.getCommunityId(); Long userId = registerDTO.getUserId(); RentingHourseRegister houseRegister = new RentingHourseRegister(); @@ -90,7 +96,7 @@ try { WxMaQrcodeService qrCodeService = wxMaConfiguration.getMaService().getQrcodeService(); byte[] bytes = qrCodeService.createWxaCodeUnlimitBytes("id=" + houseRegister.getId() + "&type=6", HOUSE_DETAIL_PAGE, 30, true, null, false); minAppJumpPage, 30, true, null, false); String authCode = String.format("data:image/png;base64,%s", Base64.encode(bytes)); houseRegister.setAuthCode(authCode); } catch (WxErrorException e) { @@ -123,49 +129,63 @@ List<String> housePictures = registerDTO.getHousePictures(); if (!housePictures.isEmpty()) { housePictures.forEach(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); 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 -> { 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); 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 -> { 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); 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", "定金不能超过月租金"); } } /** @@ -176,6 +196,7 @@ @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); @@ -217,15 +238,17 @@ .eq(RentingHourseFile::getClassification, RentingHourseFile.Classification.fytp) .eq(RentingHourseFile::getType, RentingHourseFile.Type.picture)); housePictures.forEach(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); 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(); @@ -235,15 +258,17 @@ .eq(RentingHourseFile::getClassification, RentingHourseFile.Classification.cqtp) .eq(RentingHourseFile::getType, RentingHourseFile.Type.picture)); propertyPictures.forEach(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); 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(); @@ -253,15 +278,17 @@ .eq(RentingHourseFile::getClassification, RentingHourseFile.Classification.zjzq) .eq(RentingHourseFile::getType, RentingHourseFile.Type.picture)); credentialsPictures.forEach(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); 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); @@ -319,6 +346,7 @@ houseRegister.setDetailStatus(RentingHourseRegister.DetailStatus.drz); } } houseRegister.setUpdateAt(new Date()); int result = this.baseMapper.updateById(houseRegister); if (result > 0) { return R.ok(); @@ -341,6 +369,8 @@ 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(); @@ -396,7 +426,8 @@ @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.getKeyword())); return R.ok(this.baseMapper.nearby(rectangle.getMinX(),rectangle.getMaxX(), rectangle.getMinY(),rectangle.getMaxY(),nearbyDTO.getKeyword(), nearbyDTO.getCommunityId())); } @Override @@ -415,7 +446,7 @@ try { WxMaQrcodeService qrCodeService = wxMaConfiguration.getMaService().getQrcodeService(); byte[] bytes = qrCodeService.createWxaCodeUnlimitBytes("id=" + houseRegister.getId() + "&type=6", HOUSE_DETAIL_PAGE, 30, true, null, false); minAppJumpPage, 30, true, null, false); String authCode = String.format("data:image/png;base64,%s", Base64.encode(bytes)); houseRegister.setAuthCode(authCode); } catch (WxErrorException e) { springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/resources/mapper/RentingHourseRegisterMapper.xml
@@ -82,7 +82,7 @@ AND t1.construct_area >= #{pageRegisterDTO.minArea} </if> <if test="pageRegisterDTO.maxArea != null"> AND t1.construct_area <= #{pageRegisterDTO.minArea} AND t1.construct_area <= #{pageRegisterDTO.maxArea} </if> <if test="pageRegisterDTO.minRentMoney != null"> AND t1.monthly_rent_money >= #{pageRegisterDTO.minRentMoney} @@ -101,8 +101,10 @@ <select id="nearby" resultType="com.panzhihua.common.model.vos.community.rentingHouses.RentingHouseRegisterVO"> select t.id,title, brn, construct_area, floor, orientation, decoration, label, address, monthly_rent_money, `status`, detail_status, auth_status,t1.url from renting_hourse_register t left join renting_hourse_file t1 on t.id = t1.ref_id WHERE 1=1 and t.status=2 and t.detail_status=3 `status`, detail_status, auth_status,t1.url from renting_hourse_register t LEFT JOIN (SELECT * FROM renting_hourse_file WHERE classification = 1 AND `type` = 1) t1 ON t.id = t1.ref_id WHERE t.community_id = #{communityId} and t.status=2 and t.detail_status=3 <if test="keyword !=null and keyword!=''"> AND ( village_name LIKE CONCAT('%', #{keyword}, '%') @@ -110,17 +112,23 @@ ) </if> and (longitude BETWEEN ${minX} AND ${maxX}) and (latitude BETWEEN ${minY} AND ${maxY}) and t1.type = 1 group by t.id and (latitude BETWEEN ${minY} AND ${maxY}) group by t.id </select> <select id="pageRentingHouseApplet" resultType="com.panzhihua.common.model.vos.community.rentingHouses.RentingHouseRegisterVO"> SELECT t.id, t.title, t.brn, t.construct_area, t.floor, t.orientation, t.decoration, t.label, t.address, t.monthly_rent_money, t.`status`, t.detail_status, t.auth_status,t1.url, t2.phone AS tenantTelephone <if test="pageRegisterDTO.longitude !=null and pageRegisterDTO.longitude !=''">,(POWER(MOD(ABS(longitude - #{pageRegisterDTO.longitude}),360),2) + POWER(ABS(latitude - #{latitude}),2)) AS distance</if> FROM renting_hourse_register t left join renting_hourse_file t1 on t.id = t1.ref_id t.`status`, t.detail_status, t.auth_status,t1.url, t2.phone AS tenantTelephone, t.see_hourse_telephone, t.update_at <if test="pageRegisterDTO.longitude !=null and pageRegisterDTO.longitude !=''"> ,(POWER(MOD(ABS(longitude - #{pageRegisterDTO.longitude}),360),2) + POWER(ABS(latitude - #{pageRegisterDTO.latitude}),2)) AS distance </if> FROM renting_hourse_register t LEFT JOIN (SELECT * FROM renting_hourse_file WHERE classification = 1 AND `type` = 1) t1 ON t.id = t1.ref_id LEFT JOIN sys_user t2 ON t.tenant_user_id = t2.user_id WHERE t.community_id = #{pageRegisterDTO.communityId} <if test="pageRegisterDTO.status == null and pageRegisterDTO.isMy == null"> AND t.`status` = 2 </if> <if test="pageRegisterDTO.status != null"> AND t.`status` = #{pageRegisterDTO.status} </if> @@ -148,7 +156,7 @@ AND t.construct_area >= #{pageRegisterDTO.minArea} </if> <if test="pageRegisterDTO.maxArea != null"> AND t.construct_area <= #{pageRegisterDTO.minArea} AND t.construct_area <= #{pageRegisterDTO.maxArea} </if> <if test="pageRegisterDTO.minRentMoney != null"> AND t.monthly_rent_money >= #{pageRegisterDTO.minRentMoney} @@ -163,18 +171,23 @@ ) </if> group by t.id <if test="pageRegisterDTO.sort !=null and pageRegisterDTO.longitude !=null"> <if test="pageRegisterDTO.sort==1"> order by distance asc </if> <if test="pageRegisterDTO.sort==2"> order by distance desc <if test="pageRegisterDTO.sort ==null"> order by update_at desc </if> <if test="pageRegisterDTO.sort !=null"> <if test="pageRegisterDTO.longitude !=null"> <if test="pageRegisterDTO.sort==1"> order by distance asc </if> <if test="pageRegisterDTO.sort==2"> order by distance desc </if> </if> <if test="pageRegisterDTO.sort==3"> order by monthly_rent_money asc order by monthly_rent_money DESC </if> <if test="pageRegisterDTO.sort==4"> order by monthly_rent_money desc order by monthly_rent_money ASC </if> </if> </select>