Просмотр исходного кода

Merge tag 'refs/tags/jenkins-back-end-1092' into release

develop
release_toaliyun_real
Stormeye Wu 7 лет назад
Родитель
Сommit
94442e10a9
15 измененных файлов: 179 добавлений и 43 удалений
  1. +1
    -0
      mallinkAdmin/src/main/java/com/iformall/config/ShiroConfig.java
  2. +4
    -0
      mallinkAdmin/src/main/java/com/iformall/config/WebConfig.java
  3. +3
    -0
      mallinkAdmin/src/main/java/com/iformall/controller/HomeController.java
  4. +65
    -8
      mallinkAdmin/src/main/java/com/iformall/controller/WechatLoginController.java
  5. +20
    -2
      mallinkAdmin/src/main/java/com/iformall/interceptor/RequestInterceptor.java
  6. +20
    -2
      mallinkBApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java
  7. +20
    -2
      mallinkCApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java
  8. +14
    -11
      mallinkMQConsumer/src/main/java/com/iformall/mq/MqBaseConsumer.java
  9. +1
    -1
      mallinkMQConsumer/src/main/resources/application-dev.yml
  10. +1
    -1
      mallinkMQConsumer/src/main/resources/application-prod.yml
  11. +1
    -2
      mallinkMQConsumer/src/main/resources/application-test.yml
  12. +19
    -8
      mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java
  13. +1
    -0
      mallinkService/src/main/java/com/iformall/service/impl/WxBillAllServiceImpl.java
  14. +1
    -1
      mallinkService/src/main/java/com/iformall/service/impl/WxBillPropertyServiceImpl.java
  15. +8
    -5
      mallinkService/src/main/resources/mapper/WxBillAllMapper.xml

+ 1
- 0
mallinkAdmin/src/main/java/com/iformall/config/ShiroConfig.java Просмотреть файл

@@ -101,6 +101,7 @@ public class ShiroConfig {
filterChainDefinitionMap.put("/bHidLogin/**", "anon");
filterChainDefinitionMap.put("/sendLoginPhoneCode/**", "anon");
filterChainDefinitionMap.put("/doLoginByPhone/**", "anon");
filterChainDefinitionMap.put("/wechat/login", "anon"); // 微信第三方登录callback
filterChainDefinitionMap.put("/wechat/callback", "anon"); // 微信第三方登录callback
filterChainDefinitionMap.put("/wechat/weChatUserLogin", "anon"); // 微信第三方登录绑定
// callback


+ 4
- 0
mallinkAdmin/src/main/java/com/iformall/config/WebConfig.java Просмотреть файл

@@ -55,9 +55,13 @@ public class WebConfig implements WebMvcConfigurer {
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
final CorsConfiguration corsConfiguration = new CorsConfiguration();
// 允许cookies跨域
corsConfiguration.setAllowCredentials(true);
// 允许向该服务器提交请求的URI, *表示全部允许
corsConfiguration.addAllowedOrigin("*");
// 允许访问的头信息,*表示全部
corsConfiguration.addAllowedHeader("*");
// 允许提交请求的方法, *表示全部允许
corsConfiguration.addAllowedMethod("*");
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(urlBasedCorsConfigurationSource);


+ 3
- 0
mallinkAdmin/src/main/java/com/iformall/controller/HomeController.java Просмотреть файл

@@ -167,6 +167,7 @@ public class HomeController extends BaseController {
try {
String cookieName = URLEncoder.encode(info.getUsername(), "utf-8");
Cookie unameCookie = new Cookie("uname", cookieName);
unameCookie.setPath("/");
unameCookie.setMaxAge(3600);
response.addCookie(unameCookie);
} catch (Exception e) {
@@ -237,6 +238,7 @@ public class HomeController extends BaseController {
}
String cookieName = URLEncoder.encode(info.getUsername(), "utf-8");
Cookie unameCookie = new Cookie("uname", cookieName);
unameCookie.setPath("/");
unameCookie.setMaxAge(3600);
response.addCookie(unameCookie);

@@ -329,6 +331,7 @@ public class HomeController extends BaseController {

String cookieName = URLEncoder.encode(info.getUsername(), "utf-8");
Cookie unameCookie = new Cookie("uname", cookieName);
unameCookie.setPath("/");
unameCookie.setMaxAge(3600);
response.addCookie(unameCookie);



+ 65
- 8
mallinkAdmin/src/main/java/com/iformall/controller/WechatLoginController.java Просмотреть файл

@@ -29,14 +29,21 @@ import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import redis.clients.jedis.Protocol;
import redis.clients.util.SafeEncoder;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
@@ -71,22 +78,56 @@ public class WechatLoginController extends BaseController {
String userRole;
}

@ApiOperation(value = "微信登录")
@GetMapping("login")
public void login(HttpServletRequest request, HttpServletResponse response) {
log.debug("[" + getIpAddr() + "] MallUserInfoController::login");
String host = request.getHeader("host");
log.debug("Host: " + host);
host = getHost(host);
String wechatUrl = wxMpService.buildQrConnectUrl("https://"+host+"/api/wechat/callback", "snsapi_login", "111");
try {
response.sendRedirect(wechatUrl);
} catch (IOException e) {
log.error(e.getMessage());
}
}

private String getHost(String host) {
if(host.contains("iformall.com")) {
if(host.contains("admintest")) {
host = "admin.malls.iformall.com";
} else {
host = "admintest.malls.iformall.com";
}

} else if(host.contains("youlane.cn")) {
host = "mall.youlane.cn";
} else {
host = "admin.malls.iformall.com";
}
return host;
}

@ApiOperation(value = "微信网页登录回调", notes = "请配置此callback到网页redirect_uri")
@GetMapping("callback")
@ResponseBody
public void getAccessToken(String code, String state, HttpServletRequest request, HttpServletResponse response) {
log.debug("[" + getIpAddr() + "] WechatLoginController::getAccessToken");
String host = request.getHeader("host");
log.debug("host: " + host);
log.debug("code: " + code);
host = getHost(host);
try {
WxMpOAuth2AccessToken accessToken = wxMpService.oauth2getAccessToken(code);
log.debug("accessToken: " + accessToken.getAccessToken() + ", openId: " + accessToken.getOpenId() + ", unionId: " + accessToken.getUnionId());
log.info("accessToken: " + accessToken.getAccessToken() + ", openId: " + accessToken.getOpenId() + ", unionId: " + accessToken.getUnionId());

accessToken = wxMpService.oauth2refreshAccessToken(accessToken.getRefreshToken());
log.info("accessToken: " + accessToken.getAccessToken() + ", openId: " + accessToken.getOpenId() + ", unionId: " + accessToken.getUnionId());

// 获取 用户信息
WxMpUser mpUser = wxMpService.oauth2getUserInfo(accessToken, null);
if(mpUser != null) {
log.debug(mpUser.toString());
log.info(mpUser.toString());
}

// check user openid 是否是已授权用户
@@ -130,6 +171,7 @@ public class WechatLoginController extends BaseController {
try {
String cookieName = URLEncoder.encode(info.getUsername(), "utf-8");
Cookie unameCookie = new Cookie("uname", cookieName);
unameCookie.setPath("/");
unameCookie.setMaxAge(3600);
response.addCookie(unameCookie);
} catch (Exception e) {
@@ -139,12 +181,14 @@ public class WechatLoginController extends BaseController {
}
Object codeObj = ret.get("code");
if(codeObj == null) {
log.info("用户登录成功,切换主页");
try {
response.sendRedirect("https://" + host + "/#/layout");
response.sendRedirect("https://"+host+"/#/layout");
} catch (Exception e) {
log.error(e.getMessage());
}
} else {
log.info("用户登录失败-3,返回登录");
try {
String errCode = URLEncoder.encode(JSON.toJSONString(ret), "utf-8");
response.sendRedirect("https://" + host + "/#/login?errcode=" + errCode);
@@ -153,6 +197,7 @@ public class WechatLoginController extends BaseController {
}
}
} else {
log.info("用户登录失败-2,返回登录");
try {
String errCode = URLEncoder.encode(JSON.toJSONString(ret), "utf-8");
response.sendRedirect("https://" + host + "/#/login?errcode="+errCode);
@@ -162,10 +207,20 @@ public class WechatLoginController extends BaseController {
}
} else {
// 跳转登录选择页面
String key = TOTP.generateWechatOpen(accessToken.getOpenId());
if (openRedisTemplate.opsForValue().setIfAbsent(WECHAT_PREV + key, accessToken.getOpenId())){
openRedisTemplate.expire(key, 30, TimeUnit.SECONDS);
}
String key = WECHAT_PREV + TOTP.generateWechatOpen(accessToken.getOpenId());
Boolean isAbsent = openRedisTemplate.<Boolean>execute(new RedisCallback<Boolean>() {
@Override
public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
RedisSerializer valueSerializer = openRedisTemplate.getValueSerializer();
RedisSerializer keySerializer = openRedisTemplate.getKeySerializer();
Object obj = connection.execute("set", keySerializer.serialize(key),
valueSerializer.serialize(key),
SafeEncoder.encode("NX"),
SafeEncoder.encode("EX"),
Protocol.toByteArray(60)); // 60s 过期时间
return obj != null;
}
});
List<DisplayUserInfo> users = new ArrayList<DisplayUserInfo>();
for(MallUserInfoVo user: userList) {
DisplayUserInfo disUser = new DisplayUserInfo();
@@ -184,6 +239,7 @@ public class WechatLoginController extends BaseController {
}
}
} else {
log.info("用户登录失败-1,返回登录");
// 跳转登录页面
Map<String, Object> ret = new HashMap<>();
ret.put("code", ErrorCode.WECHAT_LOGIN_NOT_BIND.getCode());
@@ -242,6 +298,7 @@ public class WechatLoginController extends BaseController {
// 登录cookie
String cookieName = URLEncoder.encode(info.getUsername(), "utf-8");
Cookie unameCookie = new Cookie("uname", cookieName);
unameCookie.setPath("/");
unameCookie.setMaxAge(3600);
response.addCookie(unameCookie);



+ 20
- 2
mallinkAdmin/src/main/java/com/iformall/interceptor/RequestInterceptor.java Просмотреть файл

@@ -7,10 +7,16 @@ import com.iformall.utils.IPUtil;
import com.iformall.utils.UrlCheck;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import redis.clients.jedis.Protocol;
import redis.clients.util.SafeEncoder;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
@@ -78,8 +84,20 @@ public class RequestInterceptor extends HandlerInterceptorAdapter {
sb.append(resultBody);

String key = "request-" + HashUtil.md5(sb.toString());
if (redisTemplate.opsForValue().setIfAbsent(key, key)) {
redisTemplate.expire(key, 3, TimeUnit.SECONDS);
Boolean isAbsent = redisTemplate.<Boolean>execute(new RedisCallback<Boolean>() {
@Override
public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
RedisSerializer valueSerializer = redisTemplate.getValueSerializer();
RedisSerializer keySerializer = redisTemplate.getKeySerializer();
Object obj = connection.execute("set", keySerializer.serialize(key),
valueSerializer.serialize(key),
SafeEncoder.encode("NX"),
SafeEncoder.encode("EX"),
Protocol.toByteArray(3)); // 3s
return obj != null;
}
});
if (isAbsent) {
logger.info(key + ": 第一次提交");
return true;
}


+ 20
- 2
mallinkBApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java Просмотреть файл

@@ -4,10 +4,16 @@ import com.iformall.utils.HashUtil;
import com.iformall.utils.IPUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import redis.clients.jedis.Protocol;
import redis.clients.util.SafeEncoder;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
@@ -70,8 +76,20 @@ public class RequestInterceptor extends HandlerInterceptorAdapter {
sb.append(resultBody);

String key = "request-" + HashUtil.md5(sb.toString());
if (redisTemplate.opsForValue().setIfAbsent(key, key)) {
redisTemplate.expire(key, 3, TimeUnit.SECONDS);
Boolean isAbsent = redisTemplate.<Boolean>execute(new RedisCallback<Boolean>() {
@Override
public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
RedisSerializer valueSerializer = redisTemplate.getValueSerializer();
RedisSerializer keySerializer = redisTemplate.getKeySerializer();
Object obj = connection.execute("set", keySerializer.serialize(key),
valueSerializer.serialize(key),
SafeEncoder.encode("NX"),
SafeEncoder.encode("EX"),
Protocol.toByteArray(3)); // 3s
return obj != null;
}
});
if (isAbsent) {
logger.info(key + ": 第一次提交");
return true;
}


+ 20
- 2
mallinkCApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java Просмотреть файл

@@ -4,10 +4,16 @@ import com.iformall.utils.HashUtil;
import com.iformall.utils.IPUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import redis.clients.jedis.Protocol;
import redis.clients.util.SafeEncoder;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
@@ -72,8 +78,20 @@ public class RequestInterceptor extends HandlerInterceptorAdapter {
sb.append(resultBody);

String key = "request-" + HashUtil.md5(sb.toString());
if (redisTemplate.opsForValue().setIfAbsent(key, key)) {
redisTemplate.expire(key, 3, TimeUnit.SECONDS);
Boolean isAbsent = redisTemplate.<Boolean>execute(new RedisCallback<Boolean>() {
@Override
public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
RedisSerializer valueSerializer = redisTemplate.getValueSerializer();
RedisSerializer keySerializer = redisTemplate.getKeySerializer();
Object obj = connection.execute("set", keySerializer.serialize(key),
valueSerializer.serialize(key),
SafeEncoder.encode("NX"),
SafeEncoder.encode("EX"),
Protocol.toByteArray(3)); // 3s
return obj != null;
}
});
if (isAbsent) {
logger.info(key + ": 第一次提交");
logger.debug("preHandle start 2");
return true;


+ 14
- 11
mallinkMQConsumer/src/main/java/com/iformall/mq/MqBaseConsumer.java Просмотреть файл

@@ -56,17 +56,20 @@ public class MqBaseConsumer {
baseMsg.setMsgStatus(EnumMsgRecordStatus.CONSUME_SUCC.getCode());
wxMsgRecordMapper.update(baseMsg);
}catch (Exception e){
//todo:测试下
if(null != baseMsg){
if(baseMsg.getDelayTimeLevel() < 3){
baseMsg.setDelayTimeLevel(3); //10s后重试
mqBaseProducer.sendMessage(baseMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode());
}else{
baseMsg.setStatusMessage(e.getMessage());
baseMsg.setMsgStatus(EnumMsgRecordStatus.CONSUME_FAIL.getCode());
wxMsgRecordMapper.update(baseMsg);
}
}
log.error("consum received error: {}", e);
baseMsg.setStatusMessage(e.getMessage());
baseMsg.setMsgStatus(EnumMsgRecordStatus.CONSUME_FAIL.getCode());
wxMsgRecordMapper.update(baseMsg);
// if(null != baseMsg){
// if(baseMsg.getDelayTimeLevel() < 3){
// baseMsg.setDelayTimeLevel(3); //10s后重试
// mqBaseProducer.sendMessage(baseMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode());
// }else{
// baseMsg.setStatusMessage(e.getMessage());
// baseMsg.setMsgStatus(EnumMsgRecordStatus.CONSUME_FAIL.getCode());
// wxMsgRecordMapper.update(baseMsg);
// }
// }
}

}


+ 1
- 1
mallinkMQConsumer/src/main/resources/application-dev.yml Просмотреть файл

@@ -86,4 +86,4 @@ logging:
level:
tk.mybatis: debug
com.iformall.mapper: debug
path: ./logs/s
path: ./logs/m

+ 1
- 1
mallinkMQConsumer/src/main/resources/application-prod.yml Просмотреть файл

@@ -72,4 +72,4 @@ logging:
level:
tk.mybatis: debug
com.iformall: debug
path: ./logs/s
path: ./logs/m

+ 1
- 2
mallinkMQConsumer/src/main/resources/application-test.yml Просмотреть файл

@@ -1,7 +1,6 @@
spring:
profiles:
include: rabbitMQ
spring:
# JDBC
datasource:
url: jdbc:mysql://formalldb.cfqyqflkdlit.rds.cn-northwest-1.amazonaws.com.cn:3306/mallinkTest?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false&useAffectedRows=true
@@ -71,4 +70,4 @@ logging:
level:
tk.mybatis: debug
com.iformall: debug
path: ./logs/s
path: ./logs/m

+ 19
- 8
mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java Просмотреть файл

@@ -2,7 +2,6 @@ package com.iformall.schedule;

import com.iformall.domain.po.WxAppinfo;
import com.iformall.domain.po.WxOrder;
import com.iformall.domain.po.WxOrderGroup;
import com.iformall.enums.EnumAppType;
import com.iformall.enums.EnumOrderStatus;
import com.iformall.enums.EnumOrderType;
@@ -82,24 +81,36 @@ public class OrderExpiringSchedule {
}
});

//拼团 过期与失败
List<WxOrderGroup> orderGroups = wxOrderGroupService.findList(null);
orderGroups.stream().forEach(g -> {

//拼团过期
WxOrder order = new WxOrder();
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_OVERTIME.getCode());
wxOrderMapper.select(order).parallelStream().forEach(o -> {
try {
wxOrderGroupService.updateGroupStatus(g);
returnMoney(o);
} catch (Exception e) {
logger.error(e.getMessage());
logger.error("拼团过期退款失败" + e.getMessage());
}
});


//拼团券下架
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_CANCEL.getCode());
wxOrderMapper.select(order).parallelStream().forEach(o -> {
try {
returnMoney(o);
} catch (Exception e) {
logger.error("拼团券下架退款失败" + e.getMessage());
}
});

//参团失败
WxOrder order = new WxOrder();
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode());
wxOrderMapper.select(order).parallelStream().forEach(o -> {
try {
returnMoney(o);
} catch (Exception e) {
logger.error("拼团订单退款失败" + e.getMessage());
logger.error("参团失败退款失败" + e.getMessage());
}
});



+ 1
- 0
mallinkService/src/main/java/com/iformall/service/impl/WxBillAllServiceImpl.java Просмотреть файл

@@ -117,6 +117,7 @@ public class WxBillAllServiceImpl implements WxBillAllService {
ArrayList typeList = new ArrayList();
typeList.add(EnumBillTypeParam.RENT_DEPOSIT.getCode());
typeList.add(EnumBillTypeParam.PROPERTY_DEPOSIT.getCode());
typeList.add(EnumBillTypeParam.ATHER_DEPOSIT.getCode());
wxBillAll.setTypeList(typeList);
} else if (wxBillAll.getBillTypeValue().equals(EnumBillType.PROPERTY.getCode())) {
wxBillAll.setBillTypeValue(EnumBillTypeParam.PROPERTY.getCode());


+ 1
- 1
mallinkService/src/main/java/com/iformall/service/impl/WxBillPropertyServiceImpl.java Просмотреть файл

@@ -41,7 +41,7 @@ public class WxBillPropertyServiceImpl implements WxBillPropertyService {
@Override
public PageInfo<Map<String, Object>> listAsPage(WxBillProperty record, Integer pageIndex, Integer pageSize) {
//更新账单状态
updateBillStatus(record);
//updateBillStatus(record);
PageHelper.startPage(pageIndex, pageSize);
List<Map<String, Object>> billRentList = wxBillPropertyMapper.queryBillPropertyList(record);
PageInfo<Map<String, Object>> pageInfo = new PageInfo<>(billRentList);


+ 8
- 5
mallinkService/src/main/resources/mapper/WxBillAllMapper.xml Просмотреть файл

@@ -157,19 +157,22 @@
rentShopType from (
select id,merchant_id,shop_id,tenant_id,'租金' name,1 bill_type_value,'租金'
bill_type,need_pay,receive_pay,pay,owe,receive_date,pay_date,expired_day,status,starttime,endtime,rent_shop_type
from wx_bill_rent where is_preview = 0
from wx_bill_rent where is_preview = 0 and rent_contract_id in (select id from wx_rent_contract where status in
(2,3,4))
union
select id,merchant_id,shop_id,tenant_id,'租赁押金' name,2 bill_type_value,'租赁押金'
bill_type,need_pay,receive_pay,pay,owe,receive_date,pay_date,expired_day,status,starttime,endtime,rent_shop_type
from wx_bill_rent_deposit
from wx_bill_rent_deposit where rent_contract_id in (select id from wx_rent_contract where status in (2,3,4))
union
select id,merchant_id,shop_id,tenant_id,'物业费' name,3 bill_type_value,'物业费'
bill_type,need_pay,receive_pay,pay,owe,receive_date,pay_date,expired_day,status,starttime,endtime,rent_shop_type
from wx_bill_property where is_preview = 0
from wx_bill_property where is_preview = 0 and property_contract_id in (select id from wx_property_contract
where status in(2,3,4))
union
select id,merchant_id,shop_id,tenant_id,'物业押金' name,4 bill_type_value,'物业押金'
bill_type,need_pay,receive_pay,pay,owe,receive_date,pay_date,expired_day,status,starttime,endtime,rent_shop_type
from wx_bill_property_deposit
from wx_bill_property_deposit where property_contract_id in (select id from wx_property_contract where status in
(2,3,4))
union
select id,merchant_id,shop_id,tenant_id,'水费' name,5 bill_type_value,'水费' bill_type, 0 as
need_pay,receive_pay,pay,owe,receive_date,pay_date,expired_day,status,'' starttime,'' endtime,rent_shop_type
@@ -179,7 +182,7 @@
need_pay,receive_pay,pay,owe,receive_date,pay_date,expired_day,status,'' starttime,'' endtime,rent_shop_type
from wx_bill_daily where type=2
union
select id,merchant_id,shop_id,tenant_id,name,7 bill_type_value,'其他' bill_type,0 as
select id,merchant_id,shop_id,tenant_id,name,7 bill_type_vaue,'其他' bill_type,0 as
need_pay,receive_pay,pay,owe,receive_date,pay_date,expired_day,status,'' starttime,'' endtime,rent_shop_type
from wx_bill_other
union


Загрузка…
Отмена
Сохранить