From 00d339d09598a5f6826f05fcc3624fa82e0512e9 Mon Sep 17 00:00:00 2001 From: "Stormeye.Wu" Date: Mon, 13 Aug 2018 22:12:01 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E4=B8=8B=E5=8D=95=E5=8F=8Ac?= =?UTF-8?q?=E7=AB=AF=E7=99=BB=E5=BD=95/token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mallinkCApi/pom.xml | 5 - .../main/java/com/simple/CApplication.java | 2 +- .../com/simple/annotation/AuthIgnore.java | 16 ++ .../java/com/simple/annotation/LoginUser.java | 19 ++ .../java/com/simple/config/CorsConfig.java | 22 ++ .../com/simple/config/Swagger2Config.java | 49 ++++ .../java/com/simple/config/WebMvcConfig.java | 47 ++++ .../com/simple/controller/BaseController.java | 25 ++ .../simple/controller/WxOrderController.java | 43 ++-- .../controller/WxUserGrantController.java | 203 ++++++++------- .../interceptor/AuthorizationInterceptor.java | 69 ++++++ ...oginUserHandlerMethodArgumentResolver.java | 46 ++++ .../src/main/resources/application.yml | 2 +- .../java/com/simple/common/ErrorCode.java | 11 +- .../main/java/com/simple/common/Result.java | 5 + .../java/com/simple/common/ResultData.java | 6 + .../java/com/simple/domain/po/WxAppinfo.java | 58 +++-- .../java/com/simple/domain/po/WxCUser.java | 51 +++- .../com/simple/domain/po/WxCouponOrder.java | 231 ++++++++++++++++++ .../java/com/simple/domain/po/WxOrder.java | 117 ++++----- .../simple/enums/EnumCouponOrderStatus.java | 39 +++ .../java/com/simple/enums/EnumPayType.java | 35 +++ .../com/simple/enums/EnumValidStatus.java | 38 +++ .../com/simple/mapper/WxAppinfoMapper.java | 2 +- .../java/com/simple/mapper/WxCUserMapper.java | 7 +- .../simple/mapper/WxCouponOrderMapper.java | 17 ++ .../com/simple/service/WxAppinfoService.java | 12 +- .../com/simple/service/WxCUserService.java | 18 +- .../com/simple/service/WxOrderService.java | 6 +- .../service/impl/WxAppinfoServiceImpl.java | 4 + .../service/impl/WxCUserServiceImpl.java | 35 ++- .../service/impl/WxOrderServiceImpl.java | 88 +++++-- .../service/impl/WxPayOrderServiceImpl.java | 8 +- .../service/impl/WxUserCouponServiceImpl.java | 4 + .../main/resources/mapper/WxAppinfoMapper.xml | 40 +-- .../main/resources/mapper/WxCUserMapper.xml | 36 ++- .../resources/mapper/WxCouponOrderMapper.xml | 98 ++++++++ .../main/resources/mapper/WxOrderMapper.xml | 52 ++-- 38 files changed, 1257 insertions(+), 309 deletions(-) create mode 100644 mallinkCApi/src/main/java/com/simple/annotation/AuthIgnore.java create mode 100644 mallinkCApi/src/main/java/com/simple/annotation/LoginUser.java create mode 100644 mallinkCApi/src/main/java/com/simple/config/CorsConfig.java create mode 100644 mallinkCApi/src/main/java/com/simple/config/Swagger2Config.java create mode 100644 mallinkCApi/src/main/java/com/simple/config/WebMvcConfig.java create mode 100644 mallinkCApi/src/main/java/com/simple/interceptor/AuthorizationInterceptor.java create mode 100644 mallinkCApi/src/main/java/com/simple/resolver/LoginUserHandlerMethodArgumentResolver.java create mode 100644 mallinkService/src/main/java/com/simple/domain/po/WxCouponOrder.java create mode 100644 mallinkService/src/main/java/com/simple/enums/EnumCouponOrderStatus.java create mode 100644 mallinkService/src/main/java/com/simple/enums/EnumPayType.java create mode 100644 mallinkService/src/main/java/com/simple/enums/EnumValidStatus.java create mode 100644 mallinkService/src/main/java/com/simple/mapper/WxCouponOrderMapper.java create mode 100644 mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml diff --git a/mallinkCApi/pom.xml b/mallinkCApi/pom.xml index 426d7f45e..4ef0e25ce 100644 --- a/mallinkCApi/pom.xml +++ b/mallinkCApi/pom.xml @@ -25,11 +25,6 @@ mallinkService 1.0 - - com.github.binarywang - weixin-java-miniapp - 3.0.0 - diff --git a/mallinkCApi/src/main/java/com/simple/CApplication.java b/mallinkCApi/src/main/java/com/simple/CApplication.java index 6e64298dd..c9e810cd4 100644 --- a/mallinkCApi/src/main/java/com/simple/CApplication.java +++ b/mallinkCApi/src/main/java/com/simple/CApplication.java @@ -12,7 +12,7 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2; */ @SpringBootApplication @MapperScan(basePackages = {"com.simple.mapper"}) -@EnableSwagger2 + public class CApplication { public static void main(String[] args) { diff --git a/mallinkCApi/src/main/java/com/simple/annotation/AuthIgnore.java b/mallinkCApi/src/main/java/com/simple/annotation/AuthIgnore.java new file mode 100644 index 000000000..e92b1378a --- /dev/null +++ b/mallinkCApi/src/main/java/com/simple/annotation/AuthIgnore.java @@ -0,0 +1,16 @@ +package com.simple.annotation; + +import java.lang.annotation.*; + +/** + * api接口,忽略Token验证 + * @author stormeye.wu + * @email wuguoqiang@iformall.com + * @date 2017-03-23 15:44 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface AuthIgnore { + +} diff --git a/mallinkCApi/src/main/java/com/simple/annotation/LoginUser.java b/mallinkCApi/src/main/java/com/simple/annotation/LoginUser.java new file mode 100644 index 000000000..b5ac735c0 --- /dev/null +++ b/mallinkCApi/src/main/java/com/simple/annotation/LoginUser.java @@ -0,0 +1,19 @@ +package com.simple.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 登录用户信息 + * + * @author stormeye.wu + * @email wuguoqiang@iformall.com + * @date 2017-03-23 20:39 + */ +@Target(ElementType.PARAMETER) +@Retention(RetentionPolicy.RUNTIME) +public @interface LoginUser { + +} diff --git a/mallinkCApi/src/main/java/com/simple/config/CorsConfig.java b/mallinkCApi/src/main/java/com/simple/config/CorsConfig.java new file mode 100644 index 000000000..d33a7559e --- /dev/null +++ b/mallinkCApi/src/main/java/com/simple/config/CorsConfig.java @@ -0,0 +1,22 @@ +package com.simple.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +/** + * Created by Administrator on 2017/8/9. + */ +@Configuration +public class CorsConfig extends WebMvcConfigurerAdapter { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/api/**") + .allowedOrigins("*") + .allowCredentials(true) + .allowedMethods("GET", "POST", "DELETE", "PUT") + .maxAge(3600); + } + +} diff --git a/mallinkCApi/src/main/java/com/simple/config/Swagger2Config.java b/mallinkCApi/src/main/java/com/simple/config/Swagger2Config.java new file mode 100644 index 000000000..136fbd3fb --- /dev/null +++ b/mallinkCApi/src/main/java/com/simple/config/Swagger2Config.java @@ -0,0 +1,49 @@ +package com.simple.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.ParameterBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.schema.ModelRef; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Parameter; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +import java.util.ArrayList; +import java.util.List; + +//参考:http://blog.csdn.net/catoop/article/details/50668896 +@Configuration +@EnableSwagger2 +public class Swagger2Config { + + @Bean + public Docket createRestApi() { + ParameterBuilder tokenPar = new ParameterBuilder(); + List pars = new ArrayList(); + //增加一个request的header参数 + tokenPar.name("token").description("令牌").modelRef(new ModelRef("string")).parameterType("header").required(false).build(); + pars.add(tokenPar.build()); + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .select() + .apis(RequestHandlerSelectors.basePackage("com.simple.controller")) + .paths(PathSelectors.any()) + .build() + .globalOperationParameters(pars); + } + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("c端 api") + .description("c api") + .termsOfServiceUrl("http://localhost:9000") + .version("2.0") + .build(); + } + +} \ No newline at end of file diff --git a/mallinkCApi/src/main/java/com/simple/config/WebMvcConfig.java b/mallinkCApi/src/main/java/com/simple/config/WebMvcConfig.java new file mode 100644 index 000000000..4ba634305 --- /dev/null +++ b/mallinkCApi/src/main/java/com/simple/config/WebMvcConfig.java @@ -0,0 +1,47 @@ +package com.simple.config; + +import com.simple.interceptor.AuthorizationInterceptor; +import com.simple.resolver.LoginUserHandlerMethodArgumentResolver; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +import java.util.List; + +/** + * MVC配置 + * + * @author stormeye.wu + * @email wugq@mippoint.com + * @date 2017-04-20 22:30 + */ +@Configuration +public class WebMvcConfig extends WebMvcConfigurerAdapter { + @Autowired + private AuthorizationInterceptor authorizationInterceptor; + @Autowired + private LoginUserHandlerMethodArgumentResolver loginUserHandlerMethodArgumentResolver; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(authorizationInterceptor).addPathPatterns("/api/**"); + } + + @Override + public void addArgumentResolvers(List argumentResolvers) { + argumentResolvers.add(loginUserHandlerMethodArgumentResolver); + } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("swagger-ui.html") + .addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**") + .addResourceLocations("classpath:/META-INF/resources/webjars/"); + //registry.addResourceHandler("/app/**").addResourceLocations("classpath:/app/"); + + } +} \ No newline at end of file diff --git a/mallinkCApi/src/main/java/com/simple/controller/BaseController.java b/mallinkCApi/src/main/java/com/simple/controller/BaseController.java index 72bcf7dcf..427a64661 100644 --- a/mallinkCApi/src/main/java/com/simple/controller/BaseController.java +++ b/mallinkCApi/src/main/java/com/simple/controller/BaseController.java @@ -5,12 +5,23 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import com.simple.domain.po.WxCUser; +import com.simple.interceptor.AuthorizationInterceptor; +import com.simple.service.WxCUserService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; @RestController public class BaseController { + @Autowired + private WxCUserService wxCUserService; + @InitBinder public void InitBinder(WebDataBinder dataBinder) { dataBinder.registerCustomEditor(Date.class, new PropertyEditorSupport() { @@ -32,4 +43,18 @@ public class BaseController { }); } + + public WxCUser getUser(){ + HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); + Long cUserId = (Long)request.getAttribute(AuthorizationInterceptor.LOGIN_USER_KEY); + WxCUser user = wxCUserService.getById(cUserId); + return user; + } + + public String getTenantId(){ + HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); + Long cUserId = (Long)request.getAttribute(AuthorizationInterceptor.LOGIN_USER_KEY); + WxCUser user = wxCUserService.getById(cUserId); + return user.getTenantId(); + } } diff --git a/mallinkCApi/src/main/java/com/simple/controller/WxOrderController.java b/mallinkCApi/src/main/java/com/simple/controller/WxOrderController.java index 4c2653cf8..cb67e3bc8 100644 --- a/mallinkCApi/src/main/java/com/simple/controller/WxOrderController.java +++ b/mallinkCApi/src/main/java/com/simple/controller/WxOrderController.java @@ -1,6 +1,10 @@ package com.simple.controller; +import com.simple.common.ErrorCode; +import com.simple.domain.po.WxCUser; import com.simple.enums.EnumOrderStatus; +import com.simple.exception.MallinkException; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.Assert; @@ -16,6 +20,8 @@ import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; +import java.util.Map; + @RestController @RequestMapping("wxOrder") public class WxOrderController extends BaseController { @@ -24,31 +30,24 @@ public class WxOrderController extends BaseController { @Autowired private WxOrderService wxOrderService; - @ApiOperation("分页列表接口") - @GetMapping("list") - @ApiImplicitParams({ - @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), - @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true), - @ApiImplicitParam(name = "status", value = "订单状态:-1全部;0-已下单/待付款;1-已支付;2-已取消(限定时间内未付款);3-未退款/待退款;4-已退款;5-退款失败", defaultValue = "0", required = false, dataType = "Integer") - }) - public ResultData list(@ModelAttribute WxOrder wxOrder, Integer pageNum, Integer pageSize) { - if (null == wxOrder) wxOrder = new WxOrder(); - final PageInfo page = wxOrderService.listAsPage(wxOrder, pageNum, pageSize); - return new ResultData(page); - } - - @ApiOperation("提交订单") + @ApiOperation(value = "提交订单", notes = "{\"couponId\":\"String\"}") @PostMapping("save") - @ApiImplicitParams({ - @ApiImplicitParam(name = "couponId", value = "券ID", required = true, dataType = "Long"), - @ApiImplicitParam(name = "cUserId", value = "用户ID", required = true, dataType = "Long"), - @ApiImplicitParam(name = "payment", value = "支付金额", required = true, dataType = "BigDecimal"), - @ApiImplicitParam(name = "status", value = "订单状态:-1全部;0-已下单/待付款;1-已支付;2-已取消(限定时间内未付款);3-未退款/待退款;4-已退款;5-退款失败", defaultValue = "0", required = false, dataType = "Integer") - }) - public ResultData saveOrder(@RequestBody WxOrder wxOrder) { + public ResultData saveOrder(@RequestBody Map paramMap) { //Assert.notNull(wxOrders.getName(), "角色名不能为空"); //Assert.isTrue(!checkUnique(sysRole.getName(), null), "重复的角色名"); - wxOrderService.saveOrder(wxOrder); + String couponIdStr = paramMap.get("couponId"); + if (StringUtils.isBlank(couponIdStr)) { + return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "couponId不能为空"); + } + Long couponId = Long.valueOf(couponIdStr); + WxCUser user = getUser(); + + try { + WxOrder order = wxOrderService.saveOrder(user, couponId); + return new ResultData(order); + }catch (MallinkException e) { + logger.error(e.getMessage()); + } return new ResultData(); } diff --git a/mallinkCApi/src/main/java/com/simple/controller/WxUserGrantController.java b/mallinkCApi/src/main/java/com/simple/controller/WxUserGrantController.java index cf335c68a..b45aae627 100755 --- a/mallinkCApi/src/main/java/com/simple/controller/WxUserGrantController.java +++ b/mallinkCApi/src/main/java/com/simple/controller/WxUserGrantController.java @@ -1,14 +1,23 @@ package com.simple.controller; import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; +import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; +import cn.binarywang.wx.miniapp.bean.WxMaUserInfo; +import cn.binarywang.wx.miniapp.config.WxMaInMemoryConfig; +import com.alibaba.druid.wall.WallConfig; +import com.simple.annotation.AuthIgnore; import com.simple.common.ErrorCode; +import com.simple.common.IdWorker; import com.simple.common.ResultData; +import com.simple.domain.po.WxAppinfo; import com.simple.domain.po.WxCUser; +import com.simple.service.WxAppinfoService; import com.simple.service.WxCUserService; import com.simple.utils.IPUtil; import io.swagger.annotations.ApiOperation; -import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.common.error.WxErrorException; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,28 +30,52 @@ import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; +import java.util.Date; +import java.util.HashMap; import java.util.Map; @RestController @RequestMapping("/api/user") -public class WxUserGrantController { +public class WxUserGrantController extends BaseController { private final static Logger logger = LoggerFactory.getLogger(WxUserGrantController.class); @Autowired - private WxMaService wxService; - + private WxAppinfoService wxAppinfoService; @Autowired private WxCUserService wxCUserService; + private WxMaService createFromId(String appId) { + + WxAppinfo appinfo = wxAppinfoService.getByAppId(appId); + + WxMaInMemoryConfig config = new WxMaInMemoryConfig(); + config.setAppid(appinfo.getAppId()); + config.setSecret(appinfo.getSecret()); + config.setToken(appinfo.getToken()); + config.setAesKey(appinfo.getAesKey()); + config.setMsgDataFormat(appinfo.getMsgDataFormat()); + + WxMaService service = new WxMaServiceImpl(); + service.setWxMaConfig(config); + return service; + } + /** * 用户登录 * @param map * @return */ + @AuthIgnore @PostMapping("/login") - @ApiOperation(value="用户登录", notes="{\"code\":\"string\",\"scene\":\"string\",\"sceneAddress\":\"string\"}") + @ApiOperation(value="用户登录", notes="{\"appId\":\"string\",\"code\":\"string\",\"scene\":\"string\",\"sceneAddress\":\"string\"}") public ResultData userLogin(@RequestBody Map map) { logger.debug(map.toString()); + + Map resultMap = new HashMap(); + + String appId = map.get("appId"); + WxMaService wxMaService = createFromId(appId); + String code = map.get("code"); String scene = map.get("scene"); String sceneAddress = map.get("sceneAddress"); @@ -51,50 +84,59 @@ public class WxUserGrantController { return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "code不能为空"); } + String token = null; String session_key = null; String openId = null; HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); String ipaddress = IPUtil.getIpAddr(request); try { - WxMaJscode2SessionResult session = wxService.jsCode2SessionInfo(code); + WxMaJscode2SessionResult session = wxMaService.jsCode2SessionInfo(code); //获取会话密钥(session_key) session_key = session.getSessionKey(); openId = session.getOpenid(); logger.info("session_key: " + session_key); logger.info("openId: " + openId); + resultMap.put("openId", openId); } catch (WxErrorException e) { logger.error(e.getMessage(), e); - return new ResultData(); + return new ResultData(ErrorCode.SESSION_KEY_DECODE_ERR, resultMap); } - /* + WxCUser user = new WxCUser(); + user.setAppId(appId); + user.setOpenId(openId); + try { - WxUserEntity user1 = wxCUserService.getById(); + WxCUser user1 = wxCUserService.getByOpenId(user); if (user1 != null) { + user1.createToken(new Date()); + token = user1.getToken(); + user1.setRegisterIp(ipaddress); user1.setSessionKey(session_key); - wxUserService.update(user1); + if (user1.getScene() == null) + user1.setScene(scene); + if (user1.getSceneAddress() == null) + user1.setSceneAddress(sceneAddress); + wxCUserService.saveOrUpdate(user1); + resultMap.put("token", token); } else { - WxUserEntity user = new WxUserEntity(); - user.setRegisterip(ipaddress); + user.createToken(new Date()); + token = user.getToken(); + user.setRegisterIp(ipaddress); if (user.getScene() == null) user.setScene(scene); if (user.getSceneAddress() == null) user.setSceneAddress(sceneAddress); - if (scene != null) { - user.setQrcodesource(scene); - } else { - user.setQrcodesource(sceneAddress); - } - user.setOpenid(openId); + user.setSessionKey(session_key); - wxUserService.save(user); + wxCUserService.saveOrUpdate(user); + resultMap.put("token", token); } } catch (Exception e) { - logger.error(e.getMessage(), e); - return R.error(e.toString()); + logger.error(e.getMessage()); + return new ResultData(ErrorCode.DB_FAIL.getCode(), "wx_c_user数据库保存出错", resultMap); } - */ - return new ResultData(); + return new ResultData(resultMap); } /** @@ -103,64 +145,56 @@ public class WxUserGrantController { * @return */ @PostMapping("/getUserInfo") - @ApiOperation(value="授权后获取用户的昵称,unionId等信息", notes="{\"encryptedData\":\"string\",\"iv\":\"string\",\"openId\":\"string\"}") + @ApiOperation(value="授权后获取用户的昵称,unionId等信息", notes="{\"encryptedData\":\"string\",\"iv\":\"string\"}") public ResultData getUserInfo(@RequestBody Map map) { logger.debug(map.toString()); - String openId = map.get("openId"); + Map resultMap = new HashMap(); + String encryptedData = map.get("encryptedData"); String iv = map.get("iv"); - if (StringUtils.isBlank(encryptedData)) { return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "encryptedData不能为空"); } if (StringUtils.isBlank(iv)) { return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "iv不能为空"); } - if (StringUtils.isBlank(openId)) { - return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "openId不能为空"); - } - WxCUser user = null; - /* - try { - //user = wxCUserService.queryObjectByOpenId(openId); - } catch (Exception e) { - logger.error(e.getMessage(), e); - return R.error(e.toString()); - } + WxCUser user = getUser(); + if (user != null) { + WxMaService wxMaService = createFromId(user.getAppId()); + logger.debug(user.toString()); String session_key = user.getSessionKey(); try { // 解密用户信息 - WxMaUserInfo userInfo = this.wxService.getUserService().getUserInfo(session_key, encryptedData, iv); + WxMaUserInfo userInfo = wxMaService.getUserService().getUserInfo(session_key, encryptedData, iv); if (userInfo != null) { logger.debug(userInfo.toString()); - user.setUnionid(userInfo.getUnionId()); - user.setNickname(userInfo.getNickName()); + user.setUnionId(userInfo.getUnionId()); + user.setNickName(userInfo.getNickName()); user.setGender(Integer.parseInt(userInfo.getGender())); - user.setAvatarurl(userInfo.getAvatarUrl()); + user.setAvatarUrl(userInfo.getAvatarUrl()); user.setProvince(userInfo.getProvince()); user.setCity(userInfo.getCity()); user.setLanguage(userInfo.getLanguage()); - wxUserService.update(user); - r.put("openId", user.getOpenid()); - r.put("unionId", user.getUnionid()); - r.put("msg", "获取用户信息成功!"); - return r; + wxCUserService.saveOrUpdate(user); + + resultMap.put("openId", user.getOpenId()); + resultMap.put("unionId", user.getUnionId()); + resultMap.put("msg", "获取用户信息成功!"); + return new ResultData(resultMap); } else { - return R.code(22, "解密失败"); + return new ResultData(ErrorCode.NICK_NAME_DECODE_ERR, resultMap); } } catch (Exception e) { logger.error(e.getMessage(), e); - return R.error(e.toString()); + return new ResultData(ErrorCode.DB_FAIL.getCode(), "解密并保存出错", resultMap); } } else { - return R.code(20, "用户信息未找到"); + return new ResultData(ErrorCode.USER_IS_EMPTY); } - */ - return new ResultData(); } /** @@ -168,63 +202,50 @@ public class WxUserGrantController { * @param map * @return */ - /* + @PostMapping("/getUserPhone") - @ApiOperation(value = "授权后获取用户的手机号", notes="{\"encryptedData\":\"string\",\"iv\":\"\",\"openId\":\"\"}") - public new ResultData getUserPhone(@RequestBody Map map) { + @ApiOperation(value = "授权后获取用户的手机号", notes="{\"encryptedData\":\"string\",\"iv\":\"string\"}") + public ResultData getUserPhone(@RequestBody Map map) { logger.debug(map.toString()); - R r = new R(); + Map resultMap = new HashMap(); String encryptedData = map.get("encryptedData"); String iv = map.get("iv"); - String openId = map.get("openId"); //登录凭证不能为空 if (StringUtils.isBlank(encryptedData)) { - return R.code(1, "encryptedData 不能为空"); + return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "encryptedData 不能为空"); } if (StringUtils.isBlank(iv)) { - return R.code(2, "iv 不能为空"); - } - if (StringUtils.isBlank(openId)) { - return R.code(3, "openId 不能为空"); + return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "iv 不能为空"); } - WxUserEntity user = null; + WxCUser user = getUser(); + + WxMaService wxMaService = createFromId(user.getAppId()); + String session_key = user.getSessionKey(); try { - user = wxUserService.queryObjectByOpenId(openId); + // 解密 + WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(session_key, encryptedData, iv); + if (null != phoneNoInfo) { + logger.debug(phoneNoInfo.toString()); + user.setPhone(phoneNoInfo.getPhoneNumber()); + user.setPurePhone(phoneNoInfo.getPurePhoneNumber()); + user.setCountryCode(phoneNoInfo.getCountryCode()); + wxCUserService.saveOrUpdate(user); + resultMap.put("msg","授权手机成功!"); + resultMap.put("phone",phoneNoInfo.getPhoneNumber()); + return new ResultData(resultMap); + } else { + return new ResultData(ErrorCode.PHONE_DECODE_ERR, resultMap); + } } catch (Exception e) { this.logger.error(e.getMessage(), e); - return R.error(e.toString()); - } - - if (user != null) { - logger.debug(user.toString()); - String session_key = user.getSessionKey(); - try { - // 解密 - WxMaPhoneNumberInfo phoneNoInfo = this.wxService.getUserService().getPhoneNoInfo(session_key, encryptedData, iv); - if (null != phoneNoInfo) { - logger.debug(phoneNoInfo.toString()); - user.setPhone(phoneNoInfo.getPhoneNumber()); - user.setPurephone(phoneNoInfo.getPurePhoneNumber()); - user.setCountrycode(phoneNoInfo.getCountryCode()); - wxUserService.update(user); - r.put("msg","授权手机成功!"); - r.put("phone",phoneNoInfo.getPhoneNumber()); - return r; - } else { - return R.code(22, "解密失败"); - } - } catch (Exception e) { - this.logger.error(e.getMessage(), e); - return R.error(e.toString()); - } - } else { - return R.code(20, "用户信息未找到"); + return new ResultData(ErrorCode.DB_FAIL.getCode(), "解密并保存出错", resultMap); } } - */ + + /** * 判断是否是老用户 * @param map diff --git a/mallinkCApi/src/main/java/com/simple/interceptor/AuthorizationInterceptor.java b/mallinkCApi/src/main/java/com/simple/interceptor/AuthorizationInterceptor.java new file mode 100644 index 000000000..32a62d064 --- /dev/null +++ b/mallinkCApi/src/main/java/com/simple/interceptor/AuthorizationInterceptor.java @@ -0,0 +1,69 @@ +package com.simple.interceptor; + + +import com.simple.annotation.AuthIgnore; +import com.simple.common.ErrorCode; +import com.simple.domain.po.WxCUser; +import com.simple.exception.MallinkException; +import com.simple.service.WxCUserService; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mail.MailException; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 权限(Token)验证 + * @author stormeye.wu + * @email wuguoqiang@iformall.com + * @date 2017-03-23 15:38 + */ +@Component +public class AuthorizationInterceptor extends HandlerInterceptorAdapter { + @Autowired + private WxCUserService wxCUserService; + + public static final String LOGIN_USER_KEY = "LOGIN_USER_KEY"; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + AuthIgnore annotation; + if(handler instanceof HandlerMethod) { + annotation = ((HandlerMethod) handler).getMethodAnnotation(AuthIgnore.class); + }else{ + return true; + } + + //如果有@IgnoreAuth注解,则不验证token + if(annotation != null){ + return true; + } + + //从header中获取token + String token = request.getHeader("token"); + //如果header中不存在token,则从参数中获取token + if(StringUtils.isBlank(token)){ + token = request.getParameter("token"); + } + + //token为空 + if(StringUtils.isBlank(token)){ + throw new MallinkException(ErrorCode.TOKEN_EMPTY); + } + + // 查询token信息 + WxCUser wxCUser = wxCUserService.getByToken(token); + if(wxCUser == null || wxCUser.getExpireTime().getTime() < System.currentTimeMillis()){ + throw new MallinkException(ErrorCode.TOKEN_INVALID.getCode(), "URL:" + request.getRequestURL() + " token失效,请重新登录"); + } + + //设置userId到request里,后续根据userId,获取用户信息 + request.setAttribute(LOGIN_USER_KEY, wxCUser.getId()); + + return true; + } +} diff --git a/mallinkCApi/src/main/java/com/simple/resolver/LoginUserHandlerMethodArgumentResolver.java b/mallinkCApi/src/main/java/com/simple/resolver/LoginUserHandlerMethodArgumentResolver.java new file mode 100644 index 000000000..a39617a98 --- /dev/null +++ b/mallinkCApi/src/main/java/com/simple/resolver/LoginUserHandlerMethodArgumentResolver.java @@ -0,0 +1,46 @@ +package com.simple.resolver; + +import com.simple.annotation.LoginUser; +import com.simple.domain.po.WxCUser; +import com.simple.interceptor.AuthorizationInterceptor; +import com.simple.service.WxCUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.MethodParameter; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; + +/** + * 有@LoginUser注解的方法参数,注入当前登录用户 + * @author stormeye.wu + * @email wugq@mippoint.com + * @date 2017-03-23 22:02 + */ +@Component +public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver { + @Autowired + private WxCUserService wxCUserService; + + @Override + public boolean supportsParameter(MethodParameter parameter) { + return parameter.getParameterType().isAssignableFrom(WxCUser.class) && parameter.hasParameterAnnotation(LoginUser.class); + } + + @Override + public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container, + NativeWebRequest request, WebDataBinderFactory factory) throws Exception { + //获取用户ID + Object object = request.getAttribute(AuthorizationInterceptor.LOGIN_USER_KEY, RequestAttributes.SCOPE_REQUEST); + if(object == null){ + return null; + } + + //获取用户信息 + WxCUser user = wxCUserService.getByToken((String)object); + + return user; + } +} diff --git a/mallinkCApi/src/main/resources/application.yml b/mallinkCApi/src/main/resources/application.yml index 969f60a12..278285ea9 100644 --- a/mallinkCApi/src/main/resources/application.yml +++ b/mallinkCApi/src/main/resources/application.yml @@ -1,5 +1,5 @@ server: - port: 8000 + port: 8001 context-path: /C spring: diff --git a/mallinkService/src/main/java/com/simple/common/ErrorCode.java b/mallinkService/src/main/java/com/simple/common/ErrorCode.java index 3ed749c3d..df8714916 100644 --- a/mallinkService/src/main/java/com/simple/common/ErrorCode.java +++ b/mallinkService/src/main/java/com/simple/common/ErrorCode.java @@ -29,6 +29,9 @@ public enum ErrorCode{ LOGIN_DENIED(1014, "登录失败"), TOKEN_INVALID(1015, "TOKEN无效"), + TOKEN_EMPTY(1016, "token不能为空"), + + DB_FAIL(1045, "数据库访问出错"), TOO_MANY_REQUEST(1050, "太多的请求访问"), @@ -43,6 +46,10 @@ public enum ErrorCode{ PASSWORD_ERROR(2001, "密码错误"), LOGIN_USER_OR_PWD_ERROR(2002, "用户名或密码错误"), USER_IS_LOCKED(2003, "用户已经被锁定不能登录,请与管理员联系"), + NEW_USER_FAILD(2004, "创建新用户失败"), + + + COUPON_IS_EMPTY(2020, "券不存在"), /** * 车流 2050 @@ -72,7 +79,9 @@ public enum ErrorCode{ /** * 微信 */ - + SESSION_KEY_DECODE_ERR(11001, "session_key/openId解密失败"), + NICK_NAME_DECODE_ERR(11002, "nickName,unionId解密失败"), + PHONE_DECODE_ERR(11002, "Phoned解密失败"), /** diff --git a/mallinkService/src/main/java/com/simple/common/Result.java b/mallinkService/src/main/java/com/simple/common/Result.java index 8a9b4e0bd..85ac9069d 100644 --- a/mallinkService/src/main/java/com/simple/common/Result.java +++ b/mallinkService/src/main/java/com/simple/common/Result.java @@ -24,4 +24,9 @@ public class Result { this.message = message; } + public Result(ErrorCode errorCode) { + this.code = errorCode.getCode(); + this.message = errorCode.getMessage(); + } + } diff --git a/mallinkService/src/main/java/com/simple/common/ResultData.java b/mallinkService/src/main/java/com/simple/common/ResultData.java index 3590caff0..563c0cede 100644 --- a/mallinkService/src/main/java/com/simple/common/ResultData.java +++ b/mallinkService/src/main/java/com/simple/common/ResultData.java @@ -76,6 +76,12 @@ public class ResultData extends Result { this.data = data; } + public ResultData(ErrorCode errorCode, Object data) { + this.code = errorCode.getCode(); + this.message = errorCode.getMessage(); + this.data = data; + } + public HashMap toHashMap() { HashMap map = new HashMap<>(3); map.put("code", this.code); diff --git a/mallinkService/src/main/java/com/simple/domain/po/WxAppinfo.java b/mallinkService/src/main/java/com/simple/domain/po/WxAppinfo.java index 4f906b6d4..6f83790aa 100644 --- a/mallinkService/src/main/java/com/simple/domain/po/WxAppinfo.java +++ b/mallinkService/src/main/java/com/simple/domain/po/WxAppinfo.java @@ -45,20 +45,23 @@ public class WxAppinfo implements Serializable { @io.swagger.annotations.ApiModelProperty(value="租户ID",name="tenantId") private String tenantId; /*小程序ID**/ - @io.swagger.annotations.ApiModelProperty(value="小程序ID",name="appid") - private String appid; - /*小程序secret**/ - @io.swagger.annotations.ApiModelProperty(value="小程序secret",name="secret") - private String secret; + @io.swagger.annotations.ApiModelProperty(value="小程序ID",name="appId") + private String appId; /*小程序名**/ @io.swagger.annotations.ApiModelProperty(value="小程序名",name="name") private String name; + /*小程序secret**/ + @io.swagger.annotations.ApiModelProperty(value="小程序secret",name="secret") + private String secret; /*消息token**/ @io.swagger.annotations.ApiModelProperty(value="消息token",name="token") private String token; /*消息aeskey**/ - @io.swagger.annotations.ApiModelProperty(value="消息aeskey",name="aeskey") - private String aeskey; + @io.swagger.annotations.ApiModelProperty(value="消息aeskey",name="aesKey") + private String aesKey; + /*消息类型**/ + @io.swagger.annotations.ApiModelProperty(value="消息类型",name="msgDataFormat") + private String msgDataFormat; /*微信访问token**/ @io.swagger.annotations.ApiModelProperty(value="微信访问token",name="accessToken") private String accessToken; @@ -74,17 +77,11 @@ public class WxAppinfo implements Serializable { public void setTenantId(String _tenantId) { tenantId = _tenantId; } - public String getAppid() { - return appid; + public String getAppId() { + return appId; } - public void setAppid(String _appid) { - appid = _appid; - } - public String getSecret() { - return secret; - } - public void setSecret(String _secret) { - secret = _secret; + public void setAppId(String _appId) { + appId = _appId; } public String getName() { return name; @@ -92,17 +89,29 @@ public class WxAppinfo implements Serializable { public void setName(String _name) { name = _name; } + public String getSecret() { + return secret; + } + public void setSecret(String _secret) { + secret = _secret; + } public String getToken() { return token; } public void setToken(String _token) { token = _token; } - public String getAeskey() { - return aeskey; + public String getAesKey() { + return aesKey; + } + public void setAesKey(String _aesKey) { + aesKey = _aesKey; + } + public String getMsgDataFormat() { + return msgDataFormat; } - public void setAeskey(String _aeskey) { - aeskey = _aeskey; + public void setMsgDataFormat(String _msgDataFormat) { + msgDataFormat = _msgDataFormat; } public String getAccessToken() { return accessToken; @@ -129,11 +138,12 @@ public class WxAppinfo implements Serializable { { Id_ASC("`id` ASC"),Id_DESC("`id` DESC") ,TenantId_ASC("`tenantId` ASC"),TenantId_DESC("`tenantId` DESC") - ,Appid_ASC("`appid` ASC"),Appid_DESC("`appid` DESC") - ,Secret_ASC("`secret` ASC"),Secret_DESC("`secret` DESC") + ,AppId_ASC("`appId` ASC"),AppId_DESC("`appId` DESC") ,Name_ASC("`name` ASC"),Name_DESC("`name` DESC") + ,Secret_ASC("`secret` ASC"),Secret_DESC("`secret` DESC") ,Token_ASC("`token` ASC"),Token_DESC("`token` DESC") - ,Aeskey_ASC("`aeskey` ASC"),Aeskey_DESC("`aeskey` DESC") + ,AesKey_ASC("`aesKey` ASC"),AesKey_DESC("`aesKey` DESC") + ,MsgDataFormat_ASC("`msgDataFormat` ASC"),MsgDataFormat_DESC("`msgDataFormat` DESC") ,AccessToken_ASC("`accessToken` ASC"),AccessToken_DESC("`accessToken` DESC") ,LastTokenTime_ASC("`lastTokenTime` ASC"),LastTokenTime_DESC("`lastTokenTime` DESC") ,ExpiresIn_ASC("`expiresIn` ASC"),ExpiresIn_DESC("`expiresIn` DESC") diff --git a/mallinkService/src/main/java/com/simple/domain/po/WxCUser.java b/mallinkService/src/main/java/com/simple/domain/po/WxCUser.java index 512523e16..1680ed024 100644 --- a/mallinkService/src/main/java/com/simple/domain/po/WxCUser.java +++ b/mallinkService/src/main/java/com/simple/domain/po/WxCUser.java @@ -11,12 +11,14 @@ import java.io.Serializable; @Table(name = "wx_c_user") public class WxCUser implements Serializable { private static final long serialVersionUID = 1L; + //12小时后过期 + private final static int EXPIRE = 3600 * 12; @Id protected Long id; @Transient - protected List ids; + protected List ids; @Transient protected String sortColumns; @@ -32,10 +34,11 @@ public class WxCUser implements Serializable { return sortColumns; } - public List getIds() { + public List getIds() { return ids; } - public void setIds(List ids) { + + public void setIds(List ids) { this.ids = ids; } @@ -104,6 +107,15 @@ public class WxCUser implements Serializable { /*创建时间**/ @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate") private Date createDate; + /*小程序的appId**/ + @io.swagger.annotations.ApiModelProperty(value="小程序的appId",name="appId") + private String appId; + /*用户登录用token**/ + @io.swagger.annotations.ApiModelProperty(value="用户登录用token",name="token") + private String token; + /*用户过期时间**/ + @io.swagger.annotations.ApiModelProperty(value="用户过期时间",name="expireTime") + private Date expireTime; public String getTenantId() { return tenantId; } @@ -230,6 +242,24 @@ public class WxCUser implements Serializable { public void setCreateDate(Date _createDate) { createDate = _createDate; } + public String getAppId() { + return appId; + } + public void setAppId(String _appId) { + appId = _appId; + } + public String getToken() { + return token; + } + public void setToken(String _token) { + token = _token; + } + public Date getExpireTime() { + return expireTime; + } + public void setExpireTime(Date _expireTime) { + expireTime = _expireTime; + } @@ -257,6 +287,9 @@ public class WxCUser implements Serializable { ,Score_ASC("`score` ASC"),Score_DESC("`score` DESC") ,UpdateDate_ASC("`updateDate` ASC"),UpdateDate_DESC("`updateDate` DESC") ,CreateDate_ASC("`createDate` ASC"),CreateDate_DESC("`createDate` DESC") + ,AppId_ASC("`appId` ASC"),AppId_DESC("`appId` DESC") + ,Token_ASC("`token` ASC"),Token_DESC("`token` DESC") + ,ExpireTime_ASC("`expireTime` ASC"),ExpireTime_DESC("`expireTime` DESC") ; private String value; Field(String value){ @@ -308,4 +341,16 @@ public class WxCUser implements Serializable { this.setSortColumns(Field.valueOf(sortColumns)); } } + + public void createToken(Date currentDate) { + if (expireTime == null || expireTime.getTime() < currentDate.getTime()) + { + //生成一个token + String token = UUID.randomUUID().toString(); + //过期时间 + Date expireTime = new Date(currentDate.getTime() + EXPIRE * 1000); + setToken(token); + setExpireTime(expireTime); + } + } } diff --git a/mallinkService/src/main/java/com/simple/domain/po/WxCouponOrder.java b/mallinkService/src/main/java/com/simple/domain/po/WxCouponOrder.java new file mode 100644 index 000000000..e3389bc10 --- /dev/null +++ b/mallinkService/src/main/java/com/simple/domain/po/WxCouponOrder.java @@ -0,0 +1,231 @@ +package com.simple.domain.po; + +import javax.persistence.*; +import java.util.*; +import java.math.*; +import javax.persistence.Transient; +import java.util.List; +import javax.persistence.Id; +import java.io.Serializable; + +@Table(name = "wx_coupon_order") +public class WxCouponOrder implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + protected Long id; + + @Transient + protected List ids; + @Transient + protected String sortColumns; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getSortColumns() { + return sortColumns; + } + + public List getIds() { + return ids; + } + + public void setIds(List ids) { + this.ids = ids; + } + + /***/ + @io.swagger.annotations.ApiModelProperty(value = "", name = "tenantId") + private Long tenantId; + /*单张券ID**/ + @io.swagger.annotations.ApiModelProperty(value = "单张券ID", name = "couponId") + private Long couponId; + /*c端用户id**/ + @io.swagger.annotations.ApiModelProperty(value = "c端用户id", name = "cUserId") + private Long cUserId; + /*操作券B端小程序用户ID**/ + @io.swagger.annotations.ApiModelProperty(value = "操作券B端小程序用户ID", name = "bUserId") + private Long bUserId; + /*用户订单ID**/ + @io.swagger.annotations.ApiModelProperty(value = "用户订单ID", name = "orderId") + private Long orderId; + /*该订单对应券的实际过期时间**/ + @io.swagger.annotations.ApiModelProperty(value = "该订单对应券的实际过期时间", name = "expiredTime") + private Date expiredTime; + /*状态:0,待使用 1,已核销 2,已过期 3,已作废 **/ + @io.swagger.annotations.ApiModelProperty(value = "状态:0,待使用 1,已核销 2,已过期 3,已作废 ", name = "couponOrderStatus") + private Integer couponOrderStatus; + /***/ + @io.swagger.annotations.ApiModelProperty(value = "", name = "createDate") + private Date createDate; + /***/ + @io.swagger.annotations.ApiModelProperty(value = "", name = "updateDate") + private Date updateDate; + /*单券实际购买价格**/ + @io.swagger.annotations.ApiModelProperty(value = "单券实际购买价格", name = "couponPrice") + private BigDecimal couponPrice; + + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long _tenantId) { + tenantId = _tenantId; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long _couponId) { + couponId = _couponId; + } + + public Long getCUserId() { + return cUserId; + } + + public void setCUserId(Long _cUserId) { + cUserId = _cUserId; + } + + public Long getBUserId() { + return bUserId; + } + + public void setBUserId(Long _bUserId) { + bUserId = _bUserId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long _orderId) { + orderId = _orderId; + } + + public Date getExpiredTime() { + return expiredTime; + } + + public void setExpiredTime(Date _expiredTime) { + expiredTime = _expiredTime; + } + + public Integer getCouponOrderStatus() { + return couponOrderStatus; + } + + public void setCouponOrderStatus(Integer _couponOrderStatus) { + couponOrderStatus = _couponOrderStatus; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date _createDate) { + createDate = _createDate; + } + + public Date getUpdateDate() { + return updateDate; + } + + public void setUpdateDate(Date _updateDate) { + updateDate = _updateDate; + } + + public BigDecimal getCouponPrice() { + return couponPrice; + } + + public void setCouponPrice(BigDecimal _couponPrice) { + couponPrice = _couponPrice; + } + + + public static enum Field { + CouponOrderId_ASC("`couponOrderId` ASC"), + CouponOrderId_DESC("`couponOrderId` DESC"), + TenantId_ASC("`tenantId` ASC"), + TenantId_DESC("`tenantId` DESC"), + CouponId_ASC("`couponId` ASC"), + CouponId_DESC("`couponId` DESC"), + CUserId_ASC("`cUserId` ASC"), + CUserId_DESC("`cUserId` DESC"), + BUserId_ASC("`bUserId` ASC"), + BUserId_DESC("`bUserId` DESC"), + OrderId_ASC("`orderId` ASC"), + OrderId_DESC("`orderId` DESC"), + ExpiredTime_ASC("`expiredTime` ASC"), + ExpiredTime_DESC("`expiredTime` DESC"), + CouponOrderStatus_ASC("`couponOrderStatus` ASC"), + CouponOrderStatus_DESC("`couponOrderStatus` DESC"), + CreateDate_ASC("`createDate` ASC"), + CreateDate_DESC("`createDate` DESC"), + UpdateDate_ASC("`updateDate` ASC"), + UpdateDate_DESC("`updateDate` DESC"), + CouponPrice_ASC("`couponPrice` ASC"), + CouponPrice_DESC("`couponPrice` DESC"); + + private String value; + + Field(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + public void setCol(String value) { + this.value = value; + } + + @Override + public String toString() { + return this.getValue(); + } + } + + public void setSortColumns(WxCouponOrder.Field... fields) { + if (fields == null || fields.length == 0) { + return; + } + for (int k = 0; k < fields.length; k++) { + if (fields[k] == null) { + return; + } + } + StringBuilder sb = new StringBuilder(fields[0].toString()); + for (int k = 1; k < fields.length; k++) { + sb.append(","); + sb.append(fields[k].toString()); + } + + } + + public void setSortColumns(String sortColumns) { + if (sortColumns == null || "".equals(sortColumns.trim())) { + return; + } + if (sortColumns.contains(",")) { + String[] cols = sortColumns.split(","); + java.util.List fList = new java.util.ArrayList(); + for (int k = 0; k < cols.length; k++) { + fList.add(Field.valueOf(cols[k])); + } + this.setSortColumns(fList.toArray(new Field[fList.size()])); + } else { + this.setSortColumns(Field.valueOf(sortColumns)); + } + } +} diff --git a/mallinkService/src/main/java/com/simple/domain/po/WxOrder.java b/mallinkService/src/main/java/com/simple/domain/po/WxOrder.java index bc0a99e15..8b624196d 100644 --- a/mallinkService/src/main/java/com/simple/domain/po/WxOrder.java +++ b/mallinkService/src/main/java/com/simple/domain/po/WxOrder.java @@ -16,7 +16,7 @@ public class WxOrder implements Serializable { protected Long id; @Transient - protected List ids; + protected List ids; @Transient protected String sortColumns; @@ -32,73 +32,80 @@ public class WxOrder implements Serializable { return sortColumns; } - public List getIds() { + public List getIds() { return ids; } - public void setIds(List ids) { + + public void setIds(List ids) { this.ids = ids; } + /*订单码;正反向交易保持一致。**/ + @io.swagger.annotations.ApiModelProperty(value="订单码;正反向交易保持一致。",name="orderNumber") + private Long orderNumber; /*租户ID**/ @io.swagger.annotations.ApiModelProperty(value="租户ID",name="tenantId") private String tenantId; - /*卡券ID**/ - @io.swagger.annotations.ApiModelProperty(value="卡券ID",name="couponId") - private Long couponId; /*c端用户id**/ @io.swagger.annotations.ApiModelProperty(value="c端用户id",name="cUserId") private Long cUserId; - /*支付金额**/ - @io.swagger.annotations.ApiModelProperty(value="支付金额",name="payment") - private BigDecimal payment; + /*操作券B端小程序用户ID**/ + @io.swagger.annotations.ApiModelProperty(value="操作券B端小程序用户ID",name="bUserId") + private Long bUserId; + /*0: 付款 1: 退款**/ + @io.swagger.annotations.ApiModelProperty(value="0: 付款 1: 退款",name="paymentType") + private Integer paymentType; + /*支付金额(分):允许有负数,退款时为负值。**/ + @io.swagger.annotations.ApiModelProperty(value="支付金额(分):允许有负数,退款时为负值。",name="payment") + private Integer payment; /*支付时间**/ @io.swagger.annotations.ApiModelProperty(value="支付时间",name="paymentTime") private Date paymentTime; - /*订单状态:-1全部;0-已下单/待付款;1-已支付;2-已取消(限定时间内未付款);3-未退款/待退款;4-已退款;5-退款失败**/ - @io.swagger.annotations.ApiModelProperty(value="订单状态:-1全部;0-已下单/待付款;1-已支付;2-已取消(限定时间内未付款);3-未退款/待退款;4-已退款;5-退款失败",name="status") - private Integer status; - /*券状态(3:已领取/已购买/未核销/未使用,4:已核销/已使用,5:已过期,6:已退券 )**/ - @io.swagger.annotations.ApiModelProperty(value="券状态(3:已领取/已购买/未核销/未使用,4:已核销/已使用,5:已过期,6:已退券 )",name="couponStatus") - private Integer couponStatus; - /*卡券过期时间**/ - @io.swagger.annotations.ApiModelProperty(value="卡券过期时间",name="validDate") - private Date validDate; - /*有无退款(0: 无, 1:有)**/ - @io.swagger.annotations.ApiModelProperty(value="有无退款(0: 无, 1:有)",name="refund") - private Integer refund; - /*退款时间**/ - @io.swagger.annotations.ApiModelProperty(value="退款时间",name="refundTime") - private Date refundTime; + /*订单状态:-1全部;正向交易:0-已下单/待付款;1-已支付;2-已取消(限定时间内未付款)反向交易:3-已退款;4-退款失败**/ + @io.swagger.annotations.ApiModelProperty(value="订单状态:-1全部;正向交易:0-已下单/待付款;1-已支付;2-已取消(限定时间内未付款)反向交易:3-已退款;4-退款失败",name="orderStatus") + private Integer orderStatus; /*创建时间**/ @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate") private Date createDate; /*更新时间**/ @io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateDate") private Date updateDate; + public Long getOrderNumber() { + return orderNumber; + } + public void setOrderNumber(Long _orderNumber) { + orderNumber = _orderNumber; + } public String getTenantId() { return tenantId; } public void setTenantId(String _tenantId) { tenantId = _tenantId; } - public Long getCouponId() { - return couponId; - } - public void setCouponId(Long _couponId) { - couponId = _couponId; - } public Long getCUserId() { return cUserId; } public void setCUserId(Long _cUserId) { cUserId = _cUserId; } - public BigDecimal getPayment() { + public Long getBUserId() { + return bUserId; + } + public void setBUserId(Long _bUserId) { + bUserId = _bUserId; + } + public Integer getPaymentType() { + return paymentType; + } + public void setPaymentType(Integer _paymentType) { + paymentType = _paymentType; + } + public Integer getPayment() { return payment; } - public void setPayment(BigDecimal _payment) { + public void setPayment(Integer _payment) { payment = _payment; } public Date getPaymentTime() { @@ -107,35 +114,11 @@ public class WxOrder implements Serializable { public void setPaymentTime(Date _paymentTime) { paymentTime = _paymentTime; } - public Integer getStatus() { - return status; - } - public void setStatus(Integer _status) { - status = _status; - } - public Integer getCouponStatus() { - return couponStatus; - } - public void setCouponStatus(Integer _couponStatus) { - couponStatus = _couponStatus; - } - public Date getValidDate() { - return validDate; - } - public void setValidDate(Date _validDate) { - validDate = _validDate; - } - public Integer getRefund() { - return refund; - } - public void setRefund(Integer _refund) { - refund = _refund; - } - public Date getRefundTime() { - return refundTime; + public Integer getOrderStatus() { + return orderStatus; } - public void setRefundTime(Date _refundTime) { - refundTime = _refundTime; + public void setOrderStatus(Integer _orderStatus) { + orderStatus = _orderStatus; } public Date getCreateDate() { return createDate; @@ -155,16 +138,14 @@ public class WxOrder implements Serializable { public static enum Field { Id_ASC("`id` ASC"),Id_DESC("`id` DESC") + ,OrderNumber_ASC("`orderNumber` ASC"),OrderNumber_DESC("`orderNumber` DESC") ,TenantId_ASC("`tenantId` ASC"),TenantId_DESC("`tenantId` DESC") - ,CouponId_ASC("`couponId` ASC"),CouponId_DESC("`couponId` DESC") ,CUserId_ASC("`cUserId` ASC"),CUserId_DESC("`cUserId` DESC") + ,BUserId_ASC("`bUserId` ASC"),BUserId_DESC("`bUserId` DESC") + ,PaymentType_ASC("`paymentType` ASC"),PaymentType_DESC("`paymentType` DESC") ,Payment_ASC("`payment` ASC"),Payment_DESC("`payment` DESC") ,PaymentTime_ASC("`paymentTime` ASC"),PaymentTime_DESC("`paymentTime` DESC") - ,Status_ASC("`status` ASC"),Status_DESC("`status` DESC") - ,CouponStatus_ASC("`couponStatus` ASC"),CouponStatus_DESC("`couponStatus` DESC") - ,ValidDate_ASC("`validDate` ASC"),ValidDate_DESC("`validDate` DESC") - ,Refund_ASC("`refund` ASC"),Refund_DESC("`refund` DESC") - ,RefundTime_ASC("`refundTime` ASC"),RefundTime_DESC("`refundTime` DESC") + ,OrderStatus_ASC("`orderStatus` ASC"),OrderStatus_DESC("`orderStatus` DESC") ,CreateDate_ASC("`createDate` ASC"),CreateDate_DESC("`createDate` DESC") ,UpdateDate_ASC("`updateDate` ASC"),UpdateDate_DESC("`updateDate` DESC") ; @@ -184,7 +165,7 @@ public class WxOrder implements Serializable { } } - public void setSortColumns(Field... fields) + public void setSortColumns(WxOrder.Field... fields) { if (fields == null || fields.length == 0) { return; @@ -209,7 +190,7 @@ public class WxOrder implements Serializable { } if (sortColumns.contains(",")) { String[] cols = sortColumns.split(","); - List fList = new ArrayList(); + java.util.List fList = new java.util.ArrayList(); for (int k = 0; k < cols.length; k++) { fList.add(Field.valueOf(cols[k])); } diff --git a/mallinkService/src/main/java/com/simple/enums/EnumCouponOrderStatus.java b/mallinkService/src/main/java/com/simple/enums/EnumCouponOrderStatus.java new file mode 100644 index 000000000..0fa0adbc8 --- /dev/null +++ b/mallinkService/src/main/java/com/simple/enums/EnumCouponOrderStatus.java @@ -0,0 +1,39 @@ +package com.simple.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumCouponOrderStatus { + // 0-已领取/已购买/未核销/未使用/待使用,1:已核销/已使用,3:已过期,6:已作废 + + COUPON_ORDER_USE_WAIT(0, "待使用"), + COUPON_ORDER_USED(1, "已核销"), + COUPON_ORDER_OVER_TIME(2, "已过期"), + COUPON_ORDER_INVALID(3, "已作废") + ; + + public static EnumCouponOrderStatus getEnum(Integer code) { + for (EnumCouponOrderStatus value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumCouponOrderStatus(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/simple/enums/EnumPayType.java b/mallinkService/src/main/java/com/simple/enums/EnumPayType.java new file mode 100644 index 000000000..d9ba40067 --- /dev/null +++ b/mallinkService/src/main/java/com/simple/enums/EnumPayType.java @@ -0,0 +1,35 @@ +package com.simple.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumPayType { + + PAY_PAYMENT(0, "付款"), + PAY_REFUND(1, "退款"); + + public static EnumPayType getEnum(Integer code) { + for (EnumPayType value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumPayType(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/simple/enums/EnumValidStatus.java b/mallinkService/src/main/java/com/simple/enums/EnumValidStatus.java new file mode 100644 index 000000000..4245aad42 --- /dev/null +++ b/mallinkService/src/main/java/com/simple/enums/EnumValidStatus.java @@ -0,0 +1,38 @@ +package com.simple.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumValidStatus { + + // 1.时间范围(valid_start_date,valid_end_date). 2领取后几日有效(valid_days) + + VALID_RANGE(1, "时间范围"), + VALID_DAYS(2, "领取后几日有效") + ; + + public static EnumValidStatus getEnum(Integer code) { + for (EnumValidStatus value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumValidStatus(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/simple/mapper/WxAppinfoMapper.java b/mallinkService/src/main/java/com/simple/mapper/WxAppinfoMapper.java index 660e650a8..23cca95e7 100644 --- a/mallinkService/src/main/java/com/simple/mapper/WxAppinfoMapper.java +++ b/mallinkService/src/main/java/com/simple/mapper/WxAppinfoMapper.java @@ -10,7 +10,7 @@ public interface WxAppinfoMapper extends CommonMapper { List findList(WxAppinfo wxAppinfo); - + WxAppinfo findByAppId(String appId); diff --git a/mallinkService/src/main/java/com/simple/mapper/WxCUserMapper.java b/mallinkService/src/main/java/com/simple/mapper/WxCUserMapper.java index 3371bb978..f370d5697 100644 --- a/mallinkService/src/main/java/com/simple/mapper/WxCUserMapper.java +++ b/mallinkService/src/main/java/com/simple/mapper/WxCUserMapper.java @@ -5,13 +5,12 @@ import com.simple.common.CommonMapper; import org.apache.ibatis.annotations.Param; import com.simple.domain.po.WxCUser; -public interface WxCUserMapper extends CommonMapper { +public interface WxCUserMapper extends CommonMapper { List findList(WxCUser wxCUser); + WxCUser findByOpenId(WxCUser record); - - - + WxCUser findByToken(String token); } diff --git a/mallinkService/src/main/java/com/simple/mapper/WxCouponOrderMapper.java b/mallinkService/src/main/java/com/simple/mapper/WxCouponOrderMapper.java new file mode 100644 index 000000000..0d35df6ad --- /dev/null +++ b/mallinkService/src/main/java/com/simple/mapper/WxCouponOrderMapper.java @@ -0,0 +1,17 @@ +package com.simple.mapper; + +import java.util.*; +import com.simple.common.CommonMapper; +import org.apache.ibatis.annotations.Param; +import com.simple.domain.po.WxCouponOrder; + +public interface WxCouponOrderMapper extends CommonMapper { + + List findList(WxCouponOrder wxCouponOrder); + + + + + + +} diff --git a/mallinkService/src/main/java/com/simple/service/WxAppinfoService.java b/mallinkService/src/main/java/com/simple/service/WxAppinfoService.java index 17caa32da..bf9974e99 100644 --- a/mallinkService/src/main/java/com/simple/service/WxAppinfoService.java +++ b/mallinkService/src/main/java/com/simple/service/WxAppinfoService.java @@ -10,8 +10,8 @@ public interface WxAppinfoService { * 根据实体查询分页列表 * * @param record - * @param offset - * @param limit + * @param pageIndex + * @param pageSize * @return */ PageInfo listAsPage(WxAppinfo record, Integer pageIndex, Integer pageSize); @@ -23,6 +23,14 @@ public interface WxAppinfoService { * @return */ WxAppinfo getById(Long id); + + /** + * 根据appId获得实体 + * + * @param appId + * @return + */ + WxAppinfo getByAppId(String appId); /** * 保存或更新实体 diff --git a/mallinkService/src/main/java/com/simple/service/WxCUserService.java b/mallinkService/src/main/java/com/simple/service/WxCUserService.java index c3311f05b..dcb7a6d11 100644 --- a/mallinkService/src/main/java/com/simple/service/WxCUserService.java +++ b/mallinkService/src/main/java/com/simple/service/WxCUserService.java @@ -25,12 +25,28 @@ public interface WxCUserService { */ WxCUser getById(Long id); + /** + * 根据token获得实体 + * + * @param token + * @return + */ + WxCUser getByToken(String token); + + /** + * 根据openId获得实体 + * + * @param record + * @return + */ + WxCUser getByOpenId(WxCUser record); + /** * 保存或更新实体 * * @param record */ - void saveOrUpdate(WxCUser record); + int saveOrUpdate(WxCUser record); /** * 根据Id删除实体 diff --git a/mallinkService/src/main/java/com/simple/service/WxOrderService.java b/mallinkService/src/main/java/com/simple/service/WxOrderService.java index 8611a7aac..b8f63c30a 100644 --- a/mallinkService/src/main/java/com/simple/service/WxOrderService.java +++ b/mallinkService/src/main/java/com/simple/service/WxOrderService.java @@ -2,6 +2,7 @@ package com.simple.service; import java.util.*; import com.github.pagehelper.PageInfo; +import com.simple.domain.po.WxCUser; import com.simple.domain.po.WxOrder; import com.simple.domain.vo.OrderVo; import com.simple.enums.EnumOrderStatus; @@ -37,10 +38,11 @@ public interface WxOrderService { /** * 提交订单 - * @param record + * @param user + * @param couponId * @return 订单id */ - WxOrder saveOrder(WxOrder record); + WxOrder saveOrder(WxCUser user, Long couponId); /** * 更新订单状态 diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxAppinfoServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxAppinfoServiceImpl.java index 09f919355..7d48f6f20 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxAppinfoServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxAppinfoServiceImpl.java @@ -16,6 +16,10 @@ public class WxAppinfoServiceImpl implements WxAppinfoService { @Autowired WxAppinfoMapper wxAppinfoMapper; + @Override + public WxAppinfo getByAppId(String appId) { + return wxAppinfoMapper.findByAppId(appId); + } @Override public PageInfo listAsPage(WxAppinfo record, Integer pageIndex, Integer pageSize) { diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxCUserServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxCUserServiceImpl.java index 589ea41a5..6ada899ac 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxCUserServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxCUserServiceImpl.java @@ -12,7 +12,7 @@ import com.simple.common.IdWorker; @Service public class WxCUserServiceImpl implements WxCUserService { - + @Autowired WxCUserMapper wxCUserMapper; @@ -28,15 +28,32 @@ public class WxCUserServiceImpl implements WxCUserService { } @Override - public void saveOrUpdate(WxCUser record) { - if (record.getId() == null) { + public WxCUser getByOpenId(WxCUser record) { + return wxCUserMapper.findByOpenId(record); + } + + @Override + public WxCUser getByToken(String token) { + return wxCUserMapper.findByToken(token); + } + + @Override + public int saveOrUpdate(WxCUser user) { + int ret = 0; + Date curr = new Date(); + if (user.getId() == null) { //record.setId(UUID.randomUUID().toString().replaceAll("-", "")); final IdWorker idWorker = IdWorker.get(); - record.setId(idWorker.nextId()); - wxCUserMapper.insertSelective(record); + user.setId(idWorker.nextId()); + user.setCreateDate(curr); + user.setUpdateDate(curr); + ret = wxCUserMapper.insertSelective(user); } else { - wxCUserMapper.updateByPrimaryKeySelective(record); + user.setUpdateDate(curr); + ret =wxCUserMapper.updateByPrimaryKeySelective(user); } + + return ret; } @Override @@ -45,10 +62,4 @@ public class WxCUserServiceImpl implements WxCUserService { } - - - - - - } diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxOrderServiceImpl.java index 8314b3a6b..e9f2d641a 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxOrderServiceImpl.java @@ -1,16 +1,24 @@ package com.simple.service.impl; +import java.math.BigDecimal; import java.util.*; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.simple.common.ErrorCode; +import com.simple.domain.po.WxCUser; import com.simple.domain.po.WxCoupon; +import com.simple.domain.po.WxCouponOrder; import com.simple.domain.po.WxOrder; import com.simple.domain.vo.OrderVo; +import com.simple.enums.EnumCouponOrderStatus; import com.simple.enums.EnumOrderStatus; +import com.simple.enums.EnumPayType; +import com.simple.enums.EnumValidStatus; import com.simple.exception.MallinkException; +import com.simple.mapper.WxCUserMapper; import com.simple.mapper.WxCouponMapper; +import com.simple.mapper.WxCouponOrderMapper; import com.simple.mapper.WxOrderMapper; import com.simple.service.WxOrderService; import com.simple.utils.RedisLock; @@ -29,12 +37,18 @@ public class WxOrderServiceImpl implements WxOrderService { @Autowired RedisLock redisLock; + @Autowired + WxCUserMapper wxCUserMapper; + @Autowired WxCouponMapper wxCouponMapper; @Autowired WxOrderMapper wxOrderMapper; + @Autowired + WxCouponOrderMapper wxCouponOrderMapper; + @Override public PageInfo listAsPage(WxOrder record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findList(record)); @@ -52,25 +66,34 @@ public class WxOrderServiceImpl implements WxOrderService { @Override @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public WxOrder saveOrder(WxOrder record) { - - String couponIdStr = String.valueOf(record.getCouponId()); + public WxOrder saveOrder(WxCUser user, Long couponId) { + String couponIdStr = String.valueOf(couponId); + WxCoupon coupon = wxCouponMapper.selectByPrimaryKey(couponId); + if (coupon == null) { + logger.error("券不存在, couponId: " + couponIdStr); + throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); + } //加锁 long time = System.currentTimeMillis() + RedisLock.TIMEOUT; String timeStr = String.valueOf(time); if(!redisLock.lock(couponIdStr, timeStr)) { - logger.error("此券被锁定, couponId: " + record.getCouponId()); + logger.error("此券被锁定, couponId: " + couponIdStr); throw new MallinkException(ErrorCode.TOO_MANY_REQUEST); } + BigDecimal payPrice = null; + int payment = 0; + + Date curr = new Date(); + Date valid_date = null; + try { // 检查 优惠券 库存 - WxCoupon coupon = wxCouponMapper.selectByPrimaryKey(record.getCouponId()); if (coupon.getRemainInventory() <= 0) { //解锁 redisLock.unlock(couponIdStr, timeStr); - logger.error("此券库存为0, couponId: " + record.getCouponId()); + logger.error("此券库存为0, couponId: " + couponIdStr); throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY); } // 减库存 @@ -80,24 +103,60 @@ public class WxOrderServiceImpl implements WxOrderService { //解锁 redisLock.unlock(couponIdStr, timeStr); - logger.error("此券减库存失败, couponId: " + record.getCouponId()); + logger.error("此券减库存失败, couponId: " + couponIdStr); throw new MallinkException(ErrorCode.ORDER_IS_FAIL); } + payPrice = coupon.getSalePrice(); + + BigDecimal ll = coupon.getSalePrice().multiply(new BigDecimal(100)); + payment = ll.intValue(); + + valid_date = (coupon.getValidType() == EnumValidStatus.VALID_RANGE.getCode())?coupon.getValidEndDate(): new Date((curr.getTime()/1000+coupon.getValidDays()*24*60*60)*1000); + + final IdWorker idWorker = IdWorker.get(); + Long orderNumber = idWorker.nextId(); + + WxOrder record = new WxOrder(); + + try { // 保存订单 - final IdWorker idWorker = IdWorker.get(); - record.setId(idWorker.nextId()); - record.setStatus(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); - Date curr = new Date(); + record.setId(orderNumber); + record.setOrderNumber(orderNumber); + record.setCUserId(user.getId()); + record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); + record.setPayment(payment); + record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); record.setCreateDate(curr); record.setUpdateDate(curr); wxOrderMapper.insertSelective(record); - // 返回 record - return record; + } catch (RuntimeException e) { + logger.error("保存订单:" + e.getMessage()); throw new MallinkException(ErrorCode.ORDER_IS_FAIL); } + + try { + WxCouponOrder couponOrder = new WxCouponOrder(); + couponOrder.setId(idWorker.nextId()); + couponOrder.setCouponId(couponId); + couponOrder.setCUserId(user.getId()); + couponOrder.setOrderId(orderNumber); + couponOrder.setExpiredTime(valid_date); + couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); + couponOrder.setCreateDate(curr); + couponOrder.setUpdateDate(curr); + couponOrder.setCouponPrice(payPrice); + + wxCouponOrderMapper.insertSelective(couponOrder); + + } catch (RuntimeException e) { + logger.error("WxCouponOrder:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL); + } + + return record; } @Override @@ -109,7 +168,7 @@ public class WxOrderServiceImpl implements WxOrderService { throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND); } Date currentDate = new Date(); - +/* // 0:待付款 // 1:已支付 if (enumOrderStatus == EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS) { @@ -139,6 +198,7 @@ public class WxOrderServiceImpl implements WxOrderService { // 5:退款失败 updateRecord.setStatus(enumOrderStatus.getCode()); updateRecord.setUpdateDate(currentDate); + */ return wxOrderMapper.updateByPrimaryKey(updateRecord); } diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxPayOrderServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxPayOrderServiceImpl.java index dd7c056f0..852d8c5b3 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxPayOrderServiceImpl.java @@ -78,7 +78,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { logger.warn("pay order, order not allow, repaymentReq: " + record.toString() +", payWay: " + payWay.toString()); throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND); } - if (order.getStatus() != EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()) { + if (order.getOrderStatus() != EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()) { logger.warn("pay order, order status not allow, repaymentReq: " + order.toString() + " , payWay: " + payWay.toString()); throw new MallinkException(ErrorCode.ORDER_IS_NOT_PAY); } @@ -97,8 +97,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { record.setPayTimeEnd(currentTime); // 支付单号 record.setPayOrderNo(String.valueOf(id)); - BigDecimal pl = order.getPayment().multiply(new BigDecimal(100)); - record.setPayAmount(pl.intValue()); + record.setPayAmount(order.getPayment()); record.setPayVendor(EnumPayWay.PAY_WAY_WEAPP.getCode()); record.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode()); @@ -270,7 +269,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { updatePayOrder.setPayOrderStatus(EnumPayStatus.PAY_WAY_SUCCESS.getCode()); updatePayOrder.setTransactionId(transactionId); wxPayOrderMapper.updateByPrimaryKeySelective(updatePayOrder); - + /* Map msgMap = new HashMap<>(); try { msgMap.put("name", String.valueOf(order.getCouponId())); @@ -282,6 +281,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } catch (Exception e) { logger.error("pay success handle, sms send exception, payOrderi: " + updatePayOrder+ ", msgMap: " + msgMap.toString() + ", e: " + e.getMessage()); } + */ } diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxUserCouponServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxUserCouponServiceImpl.java index 26fd32307..28a8fdd7c 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxUserCouponServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxUserCouponServiceImpl.java @@ -37,6 +37,7 @@ public class WxUserCouponServiceImpl implements WxUserCouponService { //查询订单表 WxOrder wxOrder = new WxOrder(); wxOrder.setCUserId(userId); + /* wxOrder.setCouponStatus(status); List orders = wxOrderService.findList(wxOrder); List ids = orders.stream().map(p->p.getCouponId()+"").distinct().collect(Collectors.toList()); @@ -50,15 +51,18 @@ public class WxUserCouponServiceImpl implements WxUserCouponService { wxUserCoupons.add(getWxUserCoupon(temp,couponNamesMap.get(temp.getCouponId()))); } } + */ return wxUserCoupons; } public WxUserCouponDto getWxUserCoupon(WxOrder wxOrder, String title){ WxUserCouponDto wxUserCoupon = new WxUserCouponDto(); wxUserCoupon.setOrderId(wxOrder.getId()); wxUserCoupon.setcUserId(wxOrder.getCUserId()); + /* wxUserCoupon.setCouponId(wxOrder.getCouponId()); wxUserCoupon.setCouponStatus(wxOrder.getCouponStatus()); wxUserCoupon.setValidDate(wxOrder.getValidDate()); + */ wxUserCoupon.setCouponTitle(title); return wxUserCoupon; } diff --git a/mallinkService/src/main/resources/mapper/WxAppinfoMapper.xml b/mallinkService/src/main/resources/mapper/WxAppinfoMapper.xml index a5f522c90..5f3170dcd 100644 --- a/mallinkService/src/main/resources/mapper/WxAppinfoMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxAppinfoMapper.xml @@ -4,18 +4,19 @@ - - + + - + + - `id`,`tenant_id`,`appid`,`secret`,`name`,`token`,`aeskey`,`access_token`,`last_token_time`,`expires_in` + `id`,`tenant_id`,`app_id`,`name`,`secret`,`token`,`aes_key`,`msg_data_format`,`access_token`,`last_token_time`,`expires_in` @@ -31,18 +32,18 @@ - - and `appid` like concat('%', #{appid},'%') + + and `app_id` like concat('%', #{appId},'%') - - and `secret` like concat('%', #{secret},'%') + + and `name` like concat('%', #{name},'%') - - and `name` like concat('%', #{name},'%') + + and `secret` like concat('%', #{secret},'%') @@ -51,8 +52,13 @@ - - and `aeskey` like concat('%', #{aeskey},'%') + + and `aes_key` like concat('%', #{aesKey},'%') + + + + + and `msg_data_format` like concat('%', #{msgDataFormat},'%') @@ -83,8 +89,14 @@ select from wx_appinfo - - + + + + diff --git a/mallinkService/src/main/resources/mapper/WxCUserMapper.xml b/mallinkService/src/main/resources/mapper/WxCUserMapper.xml index 5815c77be..9d9ae3fc5 100644 --- a/mallinkService/src/main/resources/mapper/WxCUserMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxCUserMapper.xml @@ -24,10 +24,13 @@ + + + - `id`,`tenant_id`,`open_id`,`union_id`,`nick_name`,`gender`,`avatar_url`,`phone`,`pure_phone`,`city`,`province`,`language`,`country_code`,`register_ip`,`verify_code_phone`,`qrcode_source`,`scene`,`scene_address`,`session_key`,`score`,`update_date`,`create_date` + `id`,`tenant_id`,`open_id`,`union_id`,`nick_name`,`gender`,`avatar_url`,`phone`,`pure_phone`,`city`,`province`,`language`,`country_code`,`register_ip`,`verify_code_phone`,`qrcode_source`,`scene`,`scene_address`,`session_key`,`score`,`update_date`,`create_date`,`app_id`,`token`,`expire_time` @@ -141,6 +144,21 @@ and `create_date` = #{createDate} + + + + and `app_id` like concat('%', #{appId},'%') + + + + + and `token` like concat('%', #{token},'%') + + + + + and `expire_time` = #{expireTime} + and id in @@ -155,10 +173,14 @@ select from wx_c_user - - - - - - + + + + diff --git a/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml new file mode 100644 index 000000000..d109c4057 --- /dev/null +++ b/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + `id`,`tenant_id`,`coupon_id`,`c_user_id`,`b_user_id`,`order_id`,`expired_time`,`coupon_order_status`,`create_date`,`update_date`,`coupon_price` + + + + where 1 = 1 + + + and `id` = #{id} + + + + + and `tenant_id` = #{tenantId} + + + + + and `coupon_id` = #{couponId} + + + + + and `c_user_id` = #{cUserId} + + + + + and `b_user_id` = #{bUserId} + + + + + and `order_id` = #{orderId} + + + + + and `expired_time` = #{expiredTime} + + + + + and `coupon_order_status` = #{couponOrderStatus} + + + + + and `create_date` = #{createDate} + + + + + and `update_date` = #{updateDate} + + + + + and `coupon_price` = #{couponPrice} + + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + + + + + + diff --git a/mallinkService/src/main/resources/mapper/WxOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxOrderMapper.xml index 5aff7862a..9f54e0fdf 100644 --- a/mallinkService/src/main/resources/mapper/WxOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxOrderMapper.xml @@ -3,22 +3,20 @@ + - - + + + - - - - - + - `id`,`tenant_id`,`coupon_id`,`c_user_id`,`payment`,`payment_time`,`status`,`coupon_status`,`valid_date`,`refund`,`refund_time`,`create_date`,`update_date` + `id`,`order_number`,`tenant_id`,`c_user_id`,`b_user_id`,`payment_type`,`payment`,`payment_time`,`order_status`,`create_date`,`update_date` @@ -29,13 +27,13 @@ - - and `tenant_id` like concat('%', #{tenantId},'%') + + and `order_number` = #{orderNumber} - - and `coupon_id` = #{couponId} + + and `tenant_id` like concat('%', #{tenantId},'%') @@ -44,38 +42,28 @@ - - and `payment` = #{payment} - - - - - and `payment_time` = #{paymentTime} - - - - - and `status` = #{status} + + and `b_user_id` = #{bUserId} - - and `coupon_status` = #{couponStatus} + + and `payment_type` = #{paymentType} - - and `valid_date` = #{validDate} + + and `payment` = #{payment} - - and `refund` = #{refund} + + and `payment_time` = #{paymentTime} - - and `refund_time` = #{refundTime} + + and `order_status` = #{orderStatus}