@@ -0,0 +1,47 @@ | |||
CREATE TABLE `user_basic_from` ( | |||
`id` bigint(0) NOT NULL, | |||
`tenant_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, | |||
`parent_tenant_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, | |||
`from_project` smallint(0) NOT NULL, | |||
`from_type` smallint(0) DEFAULT NULL, | |||
`from_id` bigint(0) DEFAULT NULL, | |||
`from_user_id` bigint(0) DEFAULT NULL, | |||
`create_date` datetime(0) NOT NULL, | |||
`plat` smallint(0) DEFAULT NULL, | |||
PRIMARY KEY (`id`) USING BTREE | |||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; | |||
CREATE TABLE `user_basic_property` ( | |||
`id` bigint(0) NOT NULL COMMENT '主键ID', | |||
`tenant_id` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '租户ID', | |||
`parent_tenant_id` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '父租户ID', | |||
`digital_avatar_glod` int(0) DEFAULT NULL COMMENT '总金币', | |||
`digital_avatar_residue_glod` int(0) DEFAULT 0 COMMENT '剩余金币', | |||
PRIMARY KEY (`id`) USING BTREE | |||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户创建视频时间表' ROW_FORMAT = Dynamic; | |||
CREATE TABLE `user_basic_property_log` ( | |||
`id` bigint(0) NOT NULL COMMENT '主键ID', | |||
`tenant_id` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '租户ID', | |||
`parent_tenant_id` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '父租户ID', | |||
`user_id` bigint(0) NOT NULL COMMENT '用户id(wx_c_user_basic_info.id)', | |||
`project_type` smallint(0) NOT NULL, | |||
`type` smallint(0) NOT NULL, | |||
`befour_gold` int(0) DEFAULT NULL, | |||
`gold_num` int(0) NOT NULL, | |||
`after_gold` int(0) DEFAULT NULL, | |||
`extra_id` bigint(0) DEFAULT NULL, | |||
`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', | |||
`detail` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, | |||
`create_date` datetime(0) DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', | |||
PRIMARY KEY (`id`) USING BTREE | |||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户创建视频记录表' ROW_FORMAT = Dynamic; | |||
product | |||
product_order | |||
product_order_sharing |
@@ -0,0 +1,2 @@ | |||
ALTER TABLE `wx_appinfo` | |||
ADD COLUMN `project_type` smallint(0) AFTER `pay_id`; |
@@ -0,0 +1,237 @@ | |||
package com.iformall.controller; | |||
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; | |||
import com.alibaba.fastjson.JSONObject; | |||
import com.google.code.kaptcha.Producer; | |||
import com.iformall.annotation.AuthIgnore; | |||
import com.iformall.annotation.TenantIgnore; | |||
import com.iformall.common.ErrorCode; | |||
import com.iformall.common.Result; | |||
import com.iformall.common.ResultData; | |||
import com.iformall.domain.po.*; | |||
import com.iformall.domain.po.sm.InviteCodeInfo; | |||
import com.iformall.enums.*; | |||
import com.iformall.exception.MallinkException; | |||
import com.iformall.service.*; | |||
import com.iformall.service.cuser.CUserServiceFactory; | |||
import com.iformall.service.sm.InviteCodeInfoService; | |||
import com.iformall.service.sm.InviteCodeService; | |||
import com.iformall.service.sm.UserConsumptionPackageService; | |||
import com.iformall.service.sm.UserCreateVideoNumService; | |||
import com.iformall.utils.Constant; | |||
import com.iformall.utils.IPUtil; | |||
import com.iformall.utils.PasswordHelper; | |||
import com.iformall.utils.RedisCacheUtils; | |||
import io.swagger.annotations.Api; | |||
import io.swagger.annotations.ApiImplicitParam; | |||
import io.swagger.annotations.ApiImplicitParams; | |||
import io.swagger.annotations.ApiOperation; | |||
import org.apache.commons.io.IOUtils; | |||
import org.apache.commons.lang3.StringUtils; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.beans.factory.annotation.Qualifier; | |||
import org.springframework.data.redis.core.RedisTemplate; | |||
import org.springframework.web.bind.annotation.*; | |||
import org.springframework.web.context.request.RequestContextHolder; | |||
import org.springframework.web.context.request.ServletRequestAttributes; | |||
import javax.imageio.ImageIO; | |||
import javax.servlet.ServletOutputStream; | |||
import javax.servlet.http.HttpServletRequest; | |||
import javax.servlet.http.HttpServletResponse; | |||
import java.awt.image.BufferedImage; | |||
import java.io.IOException; | |||
import java.util.HashMap; | |||
import java.util.List; | |||
import java.util.Map; | |||
@RestController | |||
@RequestMapping("/api/miniApp") | |||
@Api(description = "用户登陆相关接口") | |||
public class MiniAppUserController extends BaseController { | |||
private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
@Autowired | |||
private CUserServiceFactory cuserFactory; | |||
@Autowired | |||
@Qualifier("objectCommonRedisTemplate") | |||
RedisTemplate<String, Object> redisTemplate; | |||
@Autowired | |||
private WxCUserBasicInfoService wxCUserBasicInfoService; | |||
@Autowired | |||
WxAppinfoService wxAppinfoService; | |||
/** | |||
* 用户登录 | |||
* 小程序登陆 | |||
* | |||
* @param map | |||
* @return | |||
*/ | |||
@AuthIgnore | |||
@TenantIgnore | |||
@PostMapping("/login") | |||
@ApiOperation(value = "用户登录", notes = "{\"appId\":\"string\",\"code\":\"string\",\"scene\":\"string\",\"sceneAddress\":\"string\",\"latitude\":\"string\",\"longitude\":\"string\",\"systemInfo\":\"string\"}") | |||
public ResultData userLogin(@RequestBody Map<String, String> map) { | |||
logger.info("dologin >>>>>>>>>>>>>>>>>"+map.toString()); | |||
Map resultMap = new HashMap(); | |||
String appId = map.get("appId"); | |||
String code = map.get("code"); | |||
//登录凭证不能为空 | |||
if (StringUtils.isBlank(appId)) { | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "appId不能为空"); | |||
} | |||
if (StringUtils.isBlank(code)) { | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "code不能为空"); | |||
} | |||
WxAppinfo wxAppinfo = wxAppinfoService.getOnlyByAppIdFromRedis(appId); | |||
if(wxAppinfo == null){ | |||
return new ResultData(ErrorCode.APP_ID_NOT_FOUND); | |||
} | |||
if(!wxAppinfo.getEnable().equals(EnumEnableType.Enable.getCode())){ | |||
return new ResultData(ErrorCode.APP_ID_NOT_ENABLE); | |||
} | |||
EnumAppPlat appPlat = EnumAppPlat.getByCode(wxAppinfo.getPlat()); | |||
if(appPlat == null){ | |||
return new ResultData(ErrorCode.APP_PLAT_ERROR); | |||
} | |||
String session_key = null; | |||
String openId = null; | |||
String unionId = null; | |||
try { | |||
WxMaJscode2SessionResult session = cuserFactory.getCUserService(appPlat).jsCode2SessionInfo(code, wxAppinfo, false); | |||
logger.info("sessionResult: " + session); | |||
if (null != session) { | |||
logger.info("sessionResultDetail: [openid]" + session.getOpenid()+",[sessionkey]"+session.getSessionKey()+",[unionid]"+session.getUnionid()); | |||
} | |||
//获取会话密钥(session_key) | |||
session_key = session.getSessionKey(); | |||
openId = session.getOpenid(); | |||
unionId = session.getUnionid(); | |||
logger.info("session_key: " + session_key + ", openId: " + openId + ", unionId: " + unionId); | |||
resultMap.put("openId", openId); | |||
} catch (Exception e) { | |||
logger.error(e.getMessage(), e); | |||
return new ResultData(ErrorCode.SESSION_KEY_DECODE_ERR, resultMap); | |||
} | |||
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); | |||
// request.setAttribute(Constant.TENANT_ID, wxMall.getTenantId()); | |||
// request.setAttribute(Constant.PARENT_TENANT_ID, wxMall.getParentTenantId()); | |||
String ipaddress = IPUtil.getIpAddr(request); | |||
CUser cUser = new CUser(); | |||
cUser.setAppId(appId); | |||
cUser.setOpenId(openId); | |||
cUser.setUnionId(unionId); | |||
cUser.setRegisterIp(ipaddress); | |||
cUser.setSessionKey(session_key); | |||
//处理登陆用户 | |||
cUser = cuserFactory.getCUserService(appPlat).handleLoginUser(cUser); | |||
if(cUser.getUserId() != null){ | |||
WxCUserBasicInfo basicInfo = wxCUserBasicInfoService.getById(cUser.getUserId(), getTenantInfo().getTenantId()); | |||
if(basicInfo != null){ | |||
wxCUserBasicInfoService.handleLoginUser(basicInfo); | |||
resultMap.put("token", basicInfo.getToken()); | |||
} | |||
} | |||
return new ResultData(resultMap); | |||
} | |||
/** | |||
* 授权登陆 | |||
* | |||
* @param map | |||
* @return | |||
*/ | |||
@PostMapping("/loginPhone") | |||
@ApiOperation(value = "授权后获取用户的手机号", notes = "{\"encryptedData\":\"string\",\"iv\":\"string\"}") | |||
public ResultData getUserPhone(@RequestBody Map<String, String> map) { | |||
logger.info(map.toString()); | |||
String appId = map.get("appId"); | |||
String openId = map.get("openId"); | |||
String encryptedData = map.get("encryptedData"); | |||
String iv = map.get("iv"); | |||
if(StringUtils.isBlank(appId)){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "appId 不能为空"); | |||
} | |||
if(StringUtils.isBlank(openId)){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "openId 不能为空"); | |||
} | |||
WxAppinfo wxAppinfo = wxAppinfoService.getOnlyByAppIdFromRedis(appId); | |||
if(wxAppinfo == null){ | |||
return new ResultData(ErrorCode.APP_ID_NOT_FOUND); | |||
} | |||
if(!wxAppinfo.getEnable().equals(EnumEnableType.Enable.getCode())){ | |||
return new ResultData(ErrorCode.APP_ID_NOT_ENABLE); | |||
} | |||
EnumAppPlat appPlat = EnumAppPlat.getByCode(wxAppinfo.getPlat()); | |||
if(appPlat == null){ | |||
return new ResultData(ErrorCode.APP_PLAT_ERROR); | |||
} | |||
//登录凭证不能为空 | |||
if (StringUtils.isBlank(encryptedData)) { | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "encryptedData 不能为空"); | |||
} | |||
if (StringUtils.isBlank(iv)) { | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "iv 不能为空"); | |||
} | |||
String uid = map.get("uid"); | |||
UserBasicFrom from = new UserBasicFrom(); | |||
from.setPlat(appPlat.getCode()); | |||
from.setFromProject(EnumProject.PROJECT_5.getCode()); | |||
if(StringUtils.isNotBlank(uid)){ | |||
try { | |||
from.setFromUserId(Long.parseLong(uid)); | |||
from.setFromType(EnumUserBasicFrom.FROM_3.getCode()); | |||
}catch(Exception e){} | |||
} | |||
Map resultMap = new HashMap(); | |||
try { | |||
CUser user = cuserFactory.getCUserService(appPlat).getByOpenId(openId, getTenantInfo().getTenantId()); | |||
if (user == null) { | |||
return new ResultData(ErrorCode.USER_IS_EMPTY); | |||
} | |||
// 解密 并注册 | |||
WxCUserBasicInfo basicInfo = cuserFactory.getCUserService(user.getAppPlat()).decryptPhoneNoInfo(encryptedData, iv, user, wxAppinfo, false,from); | |||
wxCUserBasicInfoService.handleLoginUser(basicInfo); | |||
resultMap.put("token", basicInfo.getToken()); | |||
} catch (MallinkException e) { | |||
return new ResultData(e.getErrorCode(), e.getMessage()); | |||
}catch (Exception e) { | |||
this.logger.error(e.getMessage(), e); | |||
return new ResultData(ErrorCode.DB_FAIL.getCode(), "解密并保存出错", resultMap); | |||
} | |||
return new ResultData(resultMap); | |||
} | |||
} |
@@ -0,0 +1,53 @@ | |||
package com.iformall.controller; | |||
import com.github.pagehelper.PageInfo; | |||
import com.iformall.annotation.AuthIgnore; | |||
import com.iformall.common.ErrorCode; | |||
import com.iformall.common.ResultData; | |||
import com.iformall.domain.po.Product; | |||
import com.iformall.domain.po.base.BaseEntity; | |||
import com.iformall.domain.po.sm.PersonPhoto; | |||
import com.iformall.enums.EnumMouldSendType; | |||
import com.iformall.enums.EnumaMouldPatchStatus; | |||
import com.iformall.service.ProductService; | |||
import com.iformall.service.sm.MouldPatchSignService; | |||
import com.iformall.service.sm.PersonPhotoService; | |||
import com.iformall.utils.BaiduImageCheckUtil; | |||
import io.swagger.annotations.Api; | |||
import io.swagger.annotations.ApiImplicitParam; | |||
import io.swagger.annotations.ApiImplicitParams; | |||
import io.swagger.annotations.ApiOperation; | |||
import org.apache.commons.lang3.StringUtils; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.util.ObjectUtils; | |||
import org.springframework.web.bind.annotation.*; | |||
import org.springframework.web.multipart.MultipartFile; | |||
@RestController | |||
@RequestMapping("/api/product") | |||
@Api(description = "模板接口") | |||
public class ProductController extends BaseController { | |||
private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
@Autowired | |||
private ProductService productService; | |||
@AuthIgnore | |||
@ApiOperation("分页列表接口") | |||
@GetMapping("list") | |||
@ApiImplicitParams({ | |||
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), | |||
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) | |||
public ResultData list(@ModelAttribute Product record, Integer pageNum, Integer pageSize) { | |||
logger.debug("[" + getIpAddr() + "] ProductController::list"); | |||
if (record == null) record = new Product(); | |||
record.setSortColumns(BaseEntity.SortField.UpdateDate_DESC); | |||
final PageInfo<Product> page = productService.listAsPage(record, pageNum, pageSize); | |||
return new ResultData(page); | |||
} | |||
} |
@@ -0,0 +1,146 @@ | |||
package com.iformall.controller; | |||
import com.github.pagehelper.PageInfo; | |||
import com.iformall.annotation.AuthIgnore; | |||
import com.iformall.annotation.TenantIgnore; | |||
import com.iformall.common.ErrorCode; | |||
import com.iformall.common.Result; | |||
import com.iformall.common.ResultData; | |||
import com.iformall.domain.dto.OrderComposeSaveDto; | |||
import com.iformall.domain.dto.OrderSaveDto; | |||
import com.iformall.domain.po.CUser; | |||
import com.iformall.domain.po.Product; | |||
import com.iformall.domain.po.ProductOrder; | |||
import com.iformall.domain.po.base.BaseEntity; | |||
import com.iformall.domain.po.sm.PersonPhoto; | |||
import com.iformall.enums.EnumComposeOrder; | |||
import com.iformall.enums.EnumProductOrderPayVendor; | |||
import com.iformall.enums.EnumProductOrderStatus; | |||
import com.iformall.service.ProductOrderService; | |||
import com.iformall.service.ProductService; | |||
import com.iformall.service.pay.entity.PayExtraParam; | |||
import io.swagger.annotations.Api; | |||
import io.swagger.annotations.ApiImplicitParam; | |||
import io.swagger.annotations.ApiImplicitParams; | |||
import io.swagger.annotations.ApiOperation; | |||
import org.apache.commons.lang3.StringUtils; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.web.bind.annotation.*; | |||
import javax.servlet.http.HttpServletRequest; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.Map; | |||
@RestController | |||
@RequestMapping("/api/productOrder") | |||
@Api(description = "模板接口") | |||
public class ProductOrderController extends BaseController { | |||
private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
@Autowired | |||
private ProductOrderService productOrderService; | |||
@Autowired | |||
private ProductService productService; | |||
@ApiOperation(value = "创建订单", notes = "") | |||
@PostMapping("createOrder") | |||
public ResultData createOrder(@RequestBody ProductOrder record) { | |||
logger.debug("[" + getIpAddr() + "] ProductOrderController::createOrder"); | |||
Long productId = record.getProductId(); | |||
Integer payVendor = record.getPayVendor(); | |||
if(productId == null){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"商品编号为空"); | |||
} | |||
if(payVendor == null){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"支付方式为空"); | |||
} | |||
Product product = productService.getById(productId); | |||
if(product == null){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未查询到商品"); | |||
} | |||
EnumProductOrderPayVendor payVendorEnum = EnumProductOrderPayVendor.getEnum(payVendor); | |||
if(payVendorEnum == null){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"支付方式参数错误"); | |||
} | |||
record = new ProductOrder(); | |||
record.setUserId(getMemberId()); | |||
record.setProductId(product.getId()); | |||
record.setProductTitle(product.getTitle()); | |||
record.setProductEnTitle(product.getEnTitle()); | |||
record.setOrderStatus(EnumProductOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); | |||
record.setProjectType(product.getProjectType()); | |||
record.setPayVendor(payVendorEnum.getCode()); | |||
record.setOrderPrice(product.getPriceRmb()); | |||
record.setProfitSharing(payVendorEnum.getProfitSharing()); | |||
productOrderService.saveOrUpdate(record); | |||
return new ResultData(record.getOrderNumber()); | |||
} | |||
@AuthIgnore | |||
@ApiOperation("根据id查询接口") | |||
@GetMapping("/findByNumber") | |||
@ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true) | |||
public ResultData findByNumber(String orderNumber) { | |||
logger.debug("[" + getIpAddr() + "] ProductOrderController::findByNumber"); | |||
if(StringUtils.isBlank(orderNumber)){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"订单号为空"); | |||
} | |||
Long id = null; | |||
try{ | |||
id = Long.parseLong(orderNumber); | |||
}catch (Exception e){ } | |||
if(id == null){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"订单号异常"); | |||
} | |||
ProductOrder productOrder = productOrderService.getById(id); | |||
if(productOrder == null){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未查询到订单"); | |||
} | |||
return new ResultData(productOrder); | |||
} | |||
@AuthIgnore | |||
@ApiOperation(value = "创建支付", notes = "") | |||
@PostMapping("createPay") | |||
public ResultData createPay(@RequestBody ProductOrder record){ | |||
logger.debug("[" + getIpAddr() + "] ProductOrderController::createPay"); | |||
String orderNumber = record.getOrderNumber(); | |||
String openId = record.getOpenId(); | |||
if(StringUtils.isBlank(orderNumber)){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"订单号为空"); | |||
} | |||
Long id = null; | |||
try{ | |||
id = Long.parseLong(orderNumber); | |||
}catch (Exception e){ } | |||
if(id == null){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"订单号异常"); | |||
} | |||
ProductOrder productOrder = productOrderService.getById(id); | |||
if(productOrder == null){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未查询到订单"); | |||
} | |||
if(EnumProductOrderPayVendor.PAY_WAY_WECHAT.getCode().equals(productOrder.getPayVendor())){ | |||
if(StringUtils.isBlank(openId)){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"openId为空"); | |||
} | |||
} | |||
ResultData resultData = productOrderService.createPay(productOrder); | |||
return resultData; | |||
} | |||
} |
@@ -1,7 +1,11 @@ | |||
package com.iformall.controller; | |||
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; | |||
import com.alibaba.fastjson.JSON; | |||
import com.alibaba.fastjson.JSONObject; | |||
import com.google.code.kaptcha.Producer; | |||
import com.iformall.annotation.AuthIgnore; | |||
import com.iformall.annotation.TenantIgnore; | |||
import com.iformall.common.ErrorCode; | |||
import com.iformall.common.Result; | |||
import com.iformall.common.ResultData; | |||
@@ -15,6 +19,7 @@ import com.iformall.service.sm.InviteCodeService; | |||
import com.iformall.service.sm.UserConsumptionPackageService; | |||
import com.iformall.service.sm.UserCreateVideoNumService; | |||
import com.iformall.utils.Constant; | |||
import com.iformall.utils.IPUtil; | |||
import com.iformall.utils.PasswordHelper; | |||
import com.iformall.utils.RedisCacheUtils; | |||
import io.swagger.annotations.Api; | |||
@@ -30,9 +35,12 @@ import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.beans.factory.annotation.Qualifier; | |||
import org.springframework.data.redis.core.RedisTemplate; | |||
import org.springframework.web.bind.annotation.*; | |||
import org.springframework.web.context.request.RequestContextHolder; | |||
import org.springframework.web.context.request.ServletRequestAttributes; | |||
import javax.imageio.ImageIO; | |||
import javax.servlet.ServletOutputStream; | |||
import javax.servlet.http.HttpServletRequest; | |||
import javax.servlet.http.HttpServletResponse; | |||
import java.awt.image.BufferedImage; | |||
import java.io.IOException; | |||
@@ -99,6 +107,7 @@ public class WxUserGrantController extends BaseController { | |||
@Autowired | |||
private UserConsumptionPackageService userConsumptionPackageService; | |||
@Autowired | |||
private WxCUserAuthorityService wxCUserAuthorityService; | |||
@@ -0,0 +1,40 @@ | |||
package com.iformall.schedule; | |||
import com.iformall.domain.po.ProductOrder; | |||
import com.iformall.enums.*; | |||
import com.iformall.service.ProductOrderService; | |||
import com.iformall.utils.DateUtils; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.scheduling.annotation.Scheduled; | |||
import org.springframework.stereotype.Component; | |||
import java.util.*; | |||
@Component | |||
public class ProductOrderSharingSchedule { | |||
private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
@Autowired | |||
private ProductOrderService productOrderService; | |||
@Scheduled(cron = "0 15 2 * * ?") // 每天凌晨02:00分账重试 | |||
public void productOrderSharingSchedule() { | |||
ProductOrder productOrderQ = new ProductOrder(); | |||
productOrderQ.setOrderStatus(EnumProductOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); | |||
productOrderQ.setProfitSharing(EnumProfitSharing.PROFIT_SHARING_MAST.getCode()); | |||
productOrderQ.setPayEndDate(DateUtils.getDateBefore(7,new Date())); | |||
List<ProductOrder> orderList = productOrderService.findList(productOrderQ); | |||
for (ProductOrder order: orderList) { | |||
try{ | |||
productOrderService.handldSharing(order); | |||
}catch(Exception e){ | |||
logger.error("分账失败:" + e.getMessage()); | |||
} | |||
} | |||
} | |||
} |
@@ -0,0 +1,56 @@ | |||
package com.iformall.domain.po; | |||
import com.baomidou.mybatisplus.annotation.TableField; | |||
import com.baomidou.mybatisplus.annotation.TableName; | |||
import com.iformall.domain.po.base.TenantEntity; | |||
import lombok.Data; | |||
import lombok.EqualsAndHashCode; | |||
import lombok.ToString; | |||
import java.util.Date; | |||
@TableName(value = "product") | |||
@Data | |||
@ToString(callSuper = true) | |||
@EqualsAndHashCode(callSuper = true) | |||
public class Product extends TenantEntity { | |||
protected Long id; | |||
@io.swagger.annotations.ApiModelProperty(value="EnumProject",name="projectType") | |||
private Integer projectType; | |||
@io.swagger.annotations.ApiModelProperty(value="EnumProductType",name="type") | |||
private Integer type; | |||
@io.swagger.annotations.ApiModelProperty(value="",name="coverImg") | |||
private String coverImg; | |||
@io.swagger.annotations.ApiModelProperty(value="标题",name="title") | |||
private String title; | |||
@io.swagger.annotations.ApiModelProperty(value="",name="enTitle") | |||
private String enTitle; | |||
@io.swagger.annotations.ApiModelProperty(value="金币/积分",name="glod") | |||
private Integer glod; | |||
@io.swagger.annotations.ApiModelProperty(value="",name="detail") | |||
private String detail; | |||
@io.swagger.annotations.ApiModelProperty(value="",name="priceDollar") | |||
private Integer priceDollar; | |||
@io.swagger.annotations.ApiModelProperty(value="",name="sellPriceDollar") | |||
private Integer sellPriceDollar; | |||
@io.swagger.annotations.ApiModelProperty(value="",name="priceRmb") | |||
private Integer priceRmb; | |||
@io.swagger.annotations.ApiModelProperty(value="",name="sellPriceRmb") | |||
private Integer sellPriceRmb; | |||
@io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate") | |||
private Date createDate; | |||
@io.swagger.annotations.ApiModelProperty(value="",name="updateDate") | |||
private Date updateDate; | |||
@TableField(exist = false) | |||
private Date startDate; | |||
@TableField(exist = false) | |||
private Date endDate; | |||
} |
@@ -0,0 +1,98 @@ | |||
package com.iformall.domain.po; | |||
import com.baomidou.mybatisplus.annotation.TableField; | |||
import com.baomidou.mybatisplus.annotation.TableName; | |||
import com.iformall.domain.po.base.TenantEntity; | |||
import lombok.Data; | |||
import lombok.EqualsAndHashCode; | |||
import lombok.ToString; | |||
import java.math.BigDecimal; | |||
import java.util.Date; | |||
import java.util.List; | |||
@TableName(value = "product_order") | |||
@Data | |||
@ToString(callSuper = true) | |||
@EqualsAndHashCode(callSuper = true) | |||
public class ProductOrder extends TenantEntity { | |||
protected Long id; | |||
@io.swagger.annotations.ApiModelProperty(value="系统订单号",name="orderNumber") | |||
private String orderNumber; | |||
@io.swagger.annotations.ApiModelProperty(value="用户id",name="userId") | |||
private Long userId; | |||
@io.swagger.annotations.ApiModelProperty(value="产品ID",name="productId") | |||
private Long productId; | |||
@io.swagger.annotations.ApiModelProperty(value="",name="productTitle") | |||
private String productTitle; | |||
@io.swagger.annotations.ApiModelProperty(value="",name="productEnTitle") | |||
private String productEnTitle; | |||
@io.swagger.annotations.ApiModelProperty(value="EnumProductOrderStatus",name="orderStatus") | |||
private Integer orderStatus; | |||
@io.swagger.annotations.ApiModelProperty(value="EnumProject",name="projectType") | |||
private Integer projectType; | |||
@io.swagger.annotations.ApiModelProperty(value = "EnumProductOrderPayVendor", name = "payVendor") | |||
private Integer payVendor; | |||
@io.swagger.annotations.ApiModelProperty(value="订单金额(分)",name="orderPrice") | |||
private Integer orderPrice; | |||
@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="remark") | |||
private String remark; | |||
@io.swagger.annotations.ApiModelProperty(value="支付侧的订单号",name="orderId") | |||
private String orderId; | |||
@io.swagger.annotations.ApiModelProperty(value="支付者",name="openId") | |||
private String openId; | |||
@io.swagger.annotations.ApiModelProperty(value="EnumProfitSharing",name="profitSharing") | |||
private Integer profitSharing; | |||
@io.swagger.annotations.ApiModelProperty(value="支付单号",name="transactionId") | |||
private String transactionId; | |||
@io.swagger.annotations.ApiModelProperty(value="支付金额(分)",name="payment") | |||
private Integer payment; | |||
@io.swagger.annotations.ApiModelProperty(value="支付时间",name="paymentTime") | |||
private Date paymentTime; | |||
@io.swagger.annotations.ApiModelProperty(value="支付时间",name="paymentTime") | |||
private Integer payWay; | |||
@TableField(exist = false) | |||
protected List<Integer> statusS; | |||
@TableField(exist = false) | |||
private String orderPriceStr; | |||
public String getOrderPriceStr() { | |||
return orderPrice != null ? new BigDecimal(orderPrice).divide(new BigDecimal(100)).toPlainString() : orderPriceStr; | |||
} | |||
@TableField(exist = false) | |||
private String paymentStr; | |||
public String getPaymentStr() { | |||
return payment != null ? new BigDecimal(payment).divide(new BigDecimal(100)).toPlainString() : paymentStr; | |||
} | |||
@TableField(exist = false) | |||
private Date startDate; | |||
@TableField(exist = false) | |||
private Date endDate; | |||
@TableField(exist = false) | |||
private Date payStartDate; | |||
@TableField(exist = false) | |||
private Date payEndDate; | |||
} |
@@ -0,0 +1,60 @@ | |||
package com.iformall.domain.po; | |||
import com.baomidou.mybatisplus.annotation.TableName; | |||
import com.iformall.domain.po.base.TenantEntity; | |||
import lombok.Data; | |||
import lombok.EqualsAndHashCode; | |||
import java.util.Date; | |||
@TableName(value = "product_order_sharing") | |||
@Data | |||
@EqualsAndHashCode(callSuper = true) | |||
public class ProductOrderSharing extends TenantEntity { | |||
protected Long id; | |||
@io.swagger.annotations.ApiModelProperty(value="外部订单号=ProductOrder.orderNumber",name="outOrderId") | |||
private String outOrderId; | |||
@io.swagger.annotations.ApiModelProperty(value="订单价格",name="orderPrice") | |||
private Integer orderPrice; | |||
@io.swagger.annotations.ApiModelProperty(value="平台支付单号",name="transactionId") | |||
private String transactionId; | |||
@io.swagger.annotations.ApiModelProperty(value="EnumProject",name="projectType") | |||
private Integer projectType; | |||
@io.swagger.annotations.ApiModelProperty(value = "EnumProductOrderPayVendor", name = "payVendor") | |||
private Integer payVendor; | |||
@io.swagger.annotations.ApiModelProperty(value = "外部分账单号", name = "outSettleNo") | |||
private String outSettleNo; | |||
@io.swagger.annotations.ApiModelProperty(value = "外部分账单号", name = "settleDesc") | |||
private String settleDesc; | |||
@io.swagger.annotations.ApiModelProperty(value = "平台分账单号", name = "settleNo") | |||
private String settleNo; | |||
@io.swagger.annotations.ApiModelProperty(value = "分账金额", name = "settleAmount") | |||
private Integer settleAmount; | |||
@io.swagger.annotations.ApiModelProperty(value = "EnumProductOrderSettleStatus", name = "settleStatus") | |||
private Integer settleStatus; | |||
@io.swagger.annotations.ApiModelProperty(value="",name="settleDetail") | |||
private String settleDetail; | |||
@io.swagger.annotations.ApiModelProperty(value="手续费",name="rake") | |||
private Integer rake; | |||
@io.swagger.annotations.ApiModelProperty(value="佣金",name="commission") | |||
private Integer commission; | |||
@io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateDate") | |||
private Date updateDate; | |||
@io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate") | |||
private Date createDate; | |||
} |
@@ -0,0 +1,42 @@ | |||
package com.iformall.domain.po; | |||
import com.baomidou.mybatisplus.annotation.TableField; | |||
import com.baomidou.mybatisplus.annotation.TableName; | |||
import com.iformall.domain.po.base.TenantEntity; | |||
import lombok.Data; | |||
import lombok.EqualsAndHashCode; | |||
import lombok.ToString; | |||
import java.util.Date; | |||
@TableName(value = "user_basic_from") | |||
@Data | |||
@ToString(callSuper = true) | |||
@EqualsAndHashCode(callSuper = true) | |||
public class UserBasicFrom extends TenantEntity { | |||
protected Long id; | |||
@io.swagger.annotations.ApiModelProperty(value="EnumProject",name="fromProject") | |||
private Integer fromProject; | |||
@io.swagger.annotations.ApiModelProperty(value="EnumUserBasicFrom",name="fromType") | |||
private Integer fromType; | |||
@io.swagger.annotations.ApiModelProperty(value="邀请途径ID",name="fromId") | |||
private Long fromId; | |||
@io.swagger.annotations.ApiModelProperty(value="邀请人ID",name="fromUserId") | |||
private Long fromUserId; | |||
@io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate") | |||
private Date createDate; | |||
@io.swagger.annotations.ApiModelProperty(value="",name="plat") | |||
private Integer plat; | |||
@TableField(exist = false) | |||
private Date startDate; | |||
@TableField(exist = false) | |||
private Date endDate; | |||
} |
@@ -0,0 +1,30 @@ | |||
package com.iformall.domain.po; | |||
import cn.afterturn.easypoi.excel.annotation.Excel; | |||
import com.baomidou.mybatisplus.annotation.TableField; | |||
import com.baomidou.mybatisplus.annotation.TableName; | |||
import com.iformall.domain.po.base.TenantEntity; | |||
import lombok.Data; | |||
import lombok.EqualsAndHashCode; | |||
import lombok.ToString; | |||
import java.util.Date; | |||
@TableName(value = "user_basic_property") | |||
@Data | |||
@ToString(callSuper = true) | |||
@EqualsAndHashCode(callSuper = true) | |||
public class UserBasicProperty extends TenantEntity { | |||
protected Long id; | |||
@io.swagger.annotations.ApiModelProperty(value="数字分身账户",name="digitalAvatarGlod") | |||
private Integer digitalAvatarGlod; | |||
@io.swagger.annotations.ApiModelProperty(value="数字分身账户余额",name="digitalAvatarResidueGlod") | |||
private Integer digitalAvatarResidueGlod; | |||
@io.swagger.annotations.ApiModelProperty(value="",name="updateDate") | |||
private Date updateDate; | |||
} |
@@ -0,0 +1,49 @@ | |||
package com.iformall.domain.po; | |||
import com.baomidou.mybatisplus.annotation.TableName; | |||
import com.iformall.domain.po.base.TenantEntity; | |||
import lombok.Data; | |||
import lombok.EqualsAndHashCode; | |||
import lombok.ToString; | |||
import java.util.Date; | |||
@TableName(value = "user_basic_property_log") | |||
@Data | |||
@ToString(callSuper = true) | |||
@EqualsAndHashCode(callSuper = true) | |||
public class UserBasicPropertyLog extends TenantEntity { | |||
protected Long id; | |||
@io.swagger.annotations.ApiModelProperty(value="",name="userId") | |||
private Long userId; | |||
@io.swagger.annotations.ApiModelProperty(value="EnumProject ",name="projectType") | |||
private Integer projectType; | |||
@io.swagger.annotations.ApiModelProperty(value="EnumPropertyLogType ",name="type") | |||
private Integer type; | |||
@io.swagger.annotations.ApiModelProperty(value="",name="befourGold") | |||
private Integer befourGold; | |||
@io.swagger.annotations.ApiModelProperty(value="",name="goldNum") | |||
private Integer goldNum; | |||
@io.swagger.annotations.ApiModelProperty(value="",name="afterGold") | |||
private Integer afterGold; | |||
@io.swagger.annotations.ApiModelProperty(value="记录对应的业务ID",name="extraId") | |||
private Long extraId; | |||
@io.swagger.annotations.ApiModelProperty(value="",name="remark") | |||
private String remark; | |||
@io.swagger.annotations.ApiModelProperty(value="",name="detail") | |||
private String detail; | |||
@io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate") | |||
private Date createDate; | |||
} |
@@ -36,6 +36,8 @@ public class WxAppinfo extends BaseTenantEntity { | |||
private Integer expiresIn; | |||
@io.swagger.annotations.ApiModelProperty(value="支付ID,参看wx_pay_account",name="payId") | |||
private Long payId; | |||
@io.swagger.annotations.ApiModelProperty(value="EnumProject",name="projectType") | |||
private Integer projectType; | |||
@io.swagger.annotations.ApiModelProperty(value="1B端2C端",name="type") | |||
private Integer type; | |||
@io.swagger.annotations.ApiModelProperty(value="模板类型",name="mouldType") | |||
@@ -11,6 +11,7 @@ import com.iformall.douyin.pay.orderQuery.QueryRefundResult; | |||
import com.iformall.douyin.pay.orderQuery.QuerySettleResult; | |||
import com.iformall.douyin.pay.preOrder.*; | |||
import com.iformall.enums.EnumPayStatus; | |||
import com.iformall.enums.EnumProductOrderStatus; | |||
import com.iformall.exception.MallinkException; | |||
import com.iformall.utils.sign.SignUtils; | |||
@@ -190,19 +191,19 @@ public class DouYinPayHelper { | |||
public static int getPayStatusFromOrderQueryResult(OrderQueryResult result,String payOrderNo) { | |||
if(result == null){ | |||
return EnumPayStatus.PAY_STATUS_ORDER_NOT_EXISTS.getCode(); | |||
throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "订单查询抖音支付状态失败"+payOrderNo); | |||
} | |||
String orderStatus = result.getOrderStatus(); | |||
if(StringUtils.isBlank(orderStatus)){ | |||
return EnumPayStatus.PAY_STATUS_FAIL.getCode(); | |||
return EnumProductOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode(); | |||
}else if("PROCESSING".equals(orderStatus)){//以观后效 | |||
return EnumPayStatus.PAY_STATUS_NOTPAY.getCode(); | |||
return EnumProductOrderStatus.ORDER_STATUS_PENDING_PAYMENTING.getCode(); | |||
}else if("SUCCESS".equals(orderStatus)){ | |||
return EnumPayStatus.PAY_STATUS_SUCCESS.getCode(); | |||
return EnumProductOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode(); | |||
}else if("FAIL".equals(orderStatus)){ | |||
return EnumPayStatus.PAY_STATUS_FAIL.getCode(); | |||
return EnumProductOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode(); | |||
}else if("TIMEOUT".equals(orderStatus)){ | |||
return EnumPayStatus.PAY_STATUS_FAIL.getCode(); | |||
return EnumProductOrderStatus.ORDER_STATUS_OVERTIME_CANCEL.getCode(); | |||
} | |||
throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "订单查询抖音支付状态失败"+payOrderNo); | |||
} | |||
@@ -0,0 +1,51 @@ | |||
package com.iformall.enums; | |||
/** | |||
* Created by Stormeye on 2018/08/09. | |||
*/ | |||
public enum EnumProductOrderPayVendor { | |||
PAY_WAY_WECHAT(1, "微信小程序",EnumAppPlat.WX.getCode(),EnumProfitSharing.PROFIT_SHARING.getCode()), | |||
PAY_WAY_WECHAT_WAP(2, "微信H5",null,null), | |||
PAY_WAY_ALIPAY(3, "支付宝小程序",null,null), | |||
PAY_WAY_ALIPAY_WAP(4, "支付宝H5",null,null), | |||
PAY_WAY_TT(5, "抖音小程序",EnumAppPlat.TOUTIAO.getCode(),EnumProfitSharing.PROFIT_SHARING_MAST.getCode()), | |||
; | |||
public static EnumProductOrderPayVendor getEnum(Integer code) { | |||
for (EnumProductOrderPayVendor value : values()) { | |||
if (value.getCode().equals(code)) { | |||
return value; | |||
} | |||
} | |||
return null; | |||
} | |||
private Integer code; | |||
private String message; | |||
private Integer plat; | |||
private Integer profitSharing; | |||
EnumProductOrderPayVendor(Integer code, String message, Integer plat, Integer profitSharing) { | |||
this.code = code; | |||
this.message = message; | |||
this.plat = plat; | |||
this.profitSharing = profitSharing; | |||
} | |||
public Integer getCode() { | |||
return code; | |||
} | |||
public String getMessage() { | |||
return message; | |||
} | |||
public Integer getPlat() { | |||
return plat; | |||
} | |||
public Integer getProfitSharing() { | |||
return profitSharing; | |||
} | |||
} |
@@ -0,0 +1,38 @@ | |||
package com.iformall.enums; | |||
/** | |||
* luozukai | |||
*/ | |||
public enum EnumProductOrderSettleStatus { | |||
unfreeze_before(0, "待解冻"), | |||
unfreeze_ing(1, "解冻中"), | |||
unfreeze(2, "已解冻"), | |||
unfreeze_error(3, "解冻失败"), | |||
; | |||
public static EnumProductOrderSettleStatus getEnum(Integer code) { | |||
for (EnumProductOrderSettleStatus value : values()) { | |||
if (value.getCode().equals(code)) { | |||
return value; | |||
} | |||
} | |||
return null; | |||
} | |||
private Integer code; | |||
private String message; | |||
EnumProductOrderSettleStatus(Integer code, String message) { | |||
this.code = code; | |||
this.message = message; | |||
} | |||
public Integer getCode() { | |||
return code; | |||
} | |||
public String getMessage() { | |||
return message; | |||
} | |||
} |
@@ -0,0 +1,46 @@ | |||
package com.iformall.enums; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
/** | |||
* Created by Stormeye on 2018/08/09. | |||
*/ | |||
public enum EnumProductOrderStatus { | |||
// | |||
// ORDER_STATUS_PENDING_CREATE(0, "创建"), | |||
ORDER_STATUS_PENDING_PAYMENT(1, "待支付"), | |||
ORDER_STATUS_PENDING_PAYMENTING(2, "支付中"), | |||
ORDER_STATUS_PAYMENT_SUCCESS(3, "已支付"), | |||
ORDER_STATUS_OVERTIME_CANCEL(4, "已取消"), | |||
ORDER_STATUS_PENDING_REFUND(5,"待退款"), | |||
ORDER_STATUS_REFUND_SUCCESS(6, "已退款"), | |||
ORDER_STATUS_REFUND_FAILD(7, "退款失败"), | |||
; | |||
public static EnumProductOrderStatus getEnum(Integer code) { | |||
for (EnumProductOrderStatus value : values()) { | |||
if (value.getCode().equals(code)) { | |||
return value; | |||
} | |||
} | |||
return null; | |||
} | |||
private Integer code; | |||
private String message; | |||
EnumProductOrderStatus(Integer code, String message) { | |||
this.code = code; | |||
this.message = message; | |||
} | |||
public Integer getCode() { | |||
return code; | |||
} | |||
public String getMessage() { | |||
return message; | |||
} | |||
} |
@@ -0,0 +1,52 @@ | |||
package com.iformall.enums; | |||
import com.iformall.common.ErrorCode; | |||
import com.iformall.exception.MallinkException; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
/** | |||
* Created by Stormeye on 2018/08/09. | |||
*/ | |||
public enum EnumProductType { | |||
product_1(1, "充值金币"), | |||
; | |||
public static EnumProductType getEnum(Integer code) { | |||
for (EnumProductType value : values()) { | |||
if (value.getCode().equals(code)) { | |||
return value; | |||
} | |||
} | |||
return null; | |||
} | |||
public static List<Integer> getAllCodes(){ | |||
List<Integer> codes = new ArrayList<>(); | |||
for (EnumProductType value : values()) { | |||
codes.add(value.getCode()); | |||
} | |||
return codes; | |||
} | |||
private Integer code; | |||
private String message; | |||
EnumProductType(Integer code, String message) { | |||
this.code = code; | |||
this.message = message; | |||
} | |||
public Integer getCode() { | |||
return code; | |||
} | |||
public String getMessage() { | |||
return message; | |||
} | |||
} |
@@ -0,0 +1,36 @@ | |||
package com.iformall.enums; | |||
/** | |||
* Created by Stormeye on 2018/08/09. | |||
*/ | |||
public enum EnumProfitSharing { | |||
PROFIT_SHARING(0, "无需分账"), | |||
PROFIT_SHARING_MAST(1, "需要分账"), | |||
PROFIT_SHARING_FINISH(2, "已经分账"), | |||
; | |||
public static EnumProfitSharing getEnum(Integer code) { | |||
for (EnumProfitSharing value : values()) { | |||
if (value.getCode().equals(code)) { | |||
return value; | |||
} | |||
} | |||
return null; | |||
} | |||
private Integer code; | |||
private String message; | |||
EnumProfitSharing(Integer code, String message) { | |||
this.code = code; | |||
this.message = message; | |||
} | |||
public Integer getCode() { | |||
return code; | |||
} | |||
public String getMessage() { | |||
return message; | |||
} | |||
} |
@@ -0,0 +1,41 @@ | |||
package com.iformall.enums; | |||
/** | |||
* @author Stormeye | |||
*/ | |||
public enum EnumProject { | |||
PROJECT_1(1,"邃芒慧播"),//直播 | |||
PROJECT_2(2,"邃芒慧影"),//数字人视频 | |||
PROJECT_3(3,"邃芒慧语"),//照片说话 | |||
PROJECT_4(4,"邃芒慧侃"),//实时对话 | |||
PROJECT_5(5,"邃芒智象"),//数字人分身 | |||
; | |||
public static EnumProject getEnum(Integer code) { | |||
for (EnumProject value : values()) { | |||
if (value.getCode().equals(code)) { | |||
return value; | |||
} | |||
} | |||
return null; | |||
} | |||
private Integer code; | |||
private String message; | |||
EnumProject(Integer code, String message) { | |||
this.code = code; | |||
this.message = message; | |||
} | |||
public Integer getCode() { | |||
return code; | |||
} | |||
public String getMessage() { | |||
return message; | |||
} | |||
} |
@@ -0,0 +1,38 @@ | |||
package com.iformall.enums; | |||
/** | |||
* Created by Stormeye on 2018/08/09. | |||
*/ | |||
public enum EnumPropertyLogType { | |||
REGISTER(1,"注册"), | |||
INVITE(2,"邀请"), | |||
RECHARGE(3, "充值"), | |||
CONSUMPTION(4, "消费"), | |||
; | |||
public static EnumPropertyLogType getEnum(Integer code) { | |||
for (EnumPropertyLogType value : values()) { | |||
if (value.getCode().equals(code)) { | |||
return value; | |||
} | |||
} | |||
return null; | |||
} | |||
private Integer code; | |||
private String message; | |||
EnumPropertyLogType(Integer code, String message) { | |||
this.code = code; | |||
this.message = message; | |||
} | |||
public Integer getCode() { | |||
return code; | |||
} | |||
public String getMessage() { | |||
return message; | |||
} | |||
} |
@@ -0,0 +1,40 @@ | |||
package com.iformall.enums; | |||
/** | |||
* @author Stormeye | |||
*/ | |||
public enum EnumUserBasicFrom { | |||
FROM_1(1,"系统邀请码"), | |||
FROM_2(2,"会员邀请码"), | |||
FROM_3(3,"会员邀请"),//包括会员二维码邀请,邀请链接 | |||
; | |||
public static EnumUserBasicFrom getEnum(Integer code) { | |||
for (EnumUserBasicFrom value : values()) { | |||
if (value.getCode().equals(code)) { | |||
return value; | |||
} | |||
} | |||
return null; | |||
} | |||
private Integer code; | |||
private String message; | |||
EnumUserBasicFrom(Integer code, String message) { | |||
this.code = code; | |||
this.message = message; | |||
} | |||
public Integer getCode() { | |||
return code; | |||
} | |||
public String getMessage() { | |||
return message; | |||
} | |||
} |
@@ -0,0 +1,12 @@ | |||
package com.iformall.mapper; | |||
import com.iformall.common.CommonMapper; | |||
import com.iformall.domain.po.Product; | |||
import java.util.List; | |||
public interface ProductMapper extends CommonMapper<Product, Long>{ | |||
List<Product> findList(Product record); | |||
} |
@@ -0,0 +1,13 @@ | |||
package com.iformall.mapper; | |||
import com.iformall.common.CommonMapper; | |||
import com.iformall.domain.po.ProductOrder; | |||
import java.util.List; | |||
public interface ProductOrderMapper extends CommonMapper<ProductOrder, Long> { | |||
List<ProductOrder> findList(ProductOrder record); | |||
int orderPayUpdStatus(ProductOrder productOrder); | |||
} |
@@ -0,0 +1,12 @@ | |||
package com.iformall.mapper; | |||
import com.iformall.common.CommonMapper; | |||
import com.iformall.domain.po.UserBasicFrom; | |||
import java.util.List; | |||
public interface UserBasicFromMapper extends CommonMapper<UserBasicFrom, Long>{ | |||
List<UserBasicFrom> findList(UserBasicFrom record); | |||
} |
@@ -0,0 +1,12 @@ | |||
package com.iformall.mapper; | |||
import com.iformall.common.CommonMapper; | |||
import com.iformall.domain.po.UserBasicPropertyLog; | |||
import java.util.List; | |||
public interface UserBasicPropertyLogMapper extends CommonMapper<UserBasicPropertyLog, Long>{ | |||
List<UserBasicPropertyLog> findList(UserBasicPropertyLog record); | |||
} |
@@ -0,0 +1,13 @@ | |||
package com.iformall.mapper; | |||
import com.iformall.common.CommonMapper; | |||
import com.iformall.domain.po.UserBasicProperty; | |||
import java.util.List; | |||
public interface UserBasicPropertyMapper extends CommonMapper<UserBasicProperty, Long>{ | |||
List<UserBasicProperty> findList(UserBasicProperty record); | |||
int addGlod(UserBasicProperty userBasicProperty); | |||
} |
@@ -23,9 +23,7 @@ import com.iformall.service.pay.service.pay.wx.sft.entity.SFTCombineCloseReq; | |||
import com.iformall.service.pay.service.pay.wx.sft.entity.SFTCombinePayCommonMiniAppReq; | |||
import com.iformall.service.pay.service.pay.wx.sft.entity.SFTPayCommonMiniAppReq; | |||
import com.iformall.service.pay.service.pay.wx.sft.entity.SFTPayQueryReq; | |||
import com.iformall.service.pay.service.pay.wx.v3.entity.V3CombinePayCommonMiniAppReq; | |||
import com.iformall.service.pay.service.pay.wx.v3.entity.V3PayCommonMiniAppReq; | |||
import com.iformall.service.pay.service.pay.wx.v3.entity.V3PayQueryReq; | |||
import com.iformall.service.pay.service.pay.wx.v3.entity.*; | |||
import com.iformall.service.pay.service.refund.wx.v3.entity.V3PayRefundReq; | |||
import com.iformall.service.pay.service.share.wx.v3.entity.V3PayShareQueryReq; | |||
import com.iformall.service.pay.service.share.wx.v3.entity.V3PayShareReq; | |||
@@ -42,11 +40,17 @@ public class WxPayV3 { | |||
private static final String MERCHANT_TRANSFER_CHANGE_URL = "https://api.mch.weixin.qq.com/v3/transfer/batches"; | |||
//查询商家转账到零钱 | |||
private static final String MERCHANT_TRANSFER_QUERY_URL = "https://api.mch.weixin.qq.com/v3/transfer/batches/out-batch-no/%s"; | |||
//小程序下单-(单商户模式) | |||
private static final String PAY_MINIAPP_URL = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi"; | |||
//小程序下单-普通支付 | |||
private static final String PAY_COMMON_MINIAPP_URL = "https://api.mch.weixin.qq.com/v3/pay/partner/transactions/jsapi"; | |||
//小程序下单-普通支付-查询(单商户模式) | |||
private static final String PAY_QUERY_URL = " https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/%s"; | |||
//小程序下单-普通支付-查询 | |||
private static final String PAY_COMMON_QUERY_URL = "https://api.mch.weixin.qq.com/v3/pay/partner/transactions/out-trade-no/%s"; | |||
//小程序下单-合单支付 | |||
private static final String PAY_COMBINE_MINIAPP_URL = "https://api.mch.weixin.qq.com/v3/combine-transactions/jsapi"; | |||
//小程序下单-合单支付-查询 | |||
@@ -105,11 +109,6 @@ public class WxPayV3 { | |||
* 注意:1. 需要登录到特约商户号自己的商户后台,产品中心---APPID账号管理----我关联的appId账号,把C端小程序关联 | |||
* 2. 需要设置白名单IP | |||
* 3.微信不能开通运营账户,如果运营账户开通,则资金会从运营账户里面扣取,不会从基本账户扣取 | |||
* @param params | |||
* 请求参数 | |||
* @param certPath | |||
* 证书文件目录 | |||
* @param certPassword | |||
* 证书密码 | |||
* @return {String} | |||
* @throws WxPayException | |||
@@ -129,12 +128,6 @@ public class WxPayV3 { | |||
/** | |||
* 查询商家转账到零钱 | |||
* https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter4_3_5.shtml | |||
* @param params | |||
* 请求参数 | |||
* @param certPath | |||
* 证书文件目录 | |||
* @param certPassword | |||
* 证书密码 | |||
* @return {String} | |||
* @throws WxPayException | |||
*/ | |||
@@ -143,6 +136,14 @@ public class WxPayV3 { | |||
param.put("need_query_detail", false); | |||
return payService.postV3WithWechatpaySerial(String.format(MERCHANT_TRANSFER_QUERY_URL, batchNo), JSON.toJSONString(param)); | |||
} | |||
/** | |||
* 普通支付-小程序下单 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml | |||
* @throws WxPayException | |||
*/ | |||
public static String payCommonWithMiniApp(WxPayService payService, V3CreatePayReq payReq) throws WxPayException { | |||
return payService.postV3WithWechatpaySerial(PAY_MINIAPP_URL, JSON.toJSONString(payReq)); | |||
} | |||
/** | |||
* 普通支付-小程序下单 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_5_1.shtml | |||
@@ -151,6 +152,14 @@ public class WxPayV3 { | |||
public static String payCommonWithMiniApp(WxPayService payService,V3PayCommonMiniAppReq payReq) throws WxPayException { | |||
return payService.postV3WithWechatpaySerial(PAY_COMMON_MINIAPP_URL, JSON.toJSONString(payReq)); | |||
} | |||
/** | |||
* 普通支付-查询https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_2.shtml | |||
* @throws WxPayException | |||
*/ | |||
public static String payQuery(WxPayService payService, V3PayQuery payQuery) throws WxPayException { | |||
return payService.getV3WithWechatPaySerial(String.format(PAY_QUERY_URL, payQuery.getOut_trade_no())+"?mchid="+payQuery.getMchid()); | |||
} | |||
/** | |||
* 普通支付-查询https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_5_2.shtml | |||
@@ -0,0 +1,36 @@ | |||
package com.iformall.service; | |||
import com.github.pagehelper.PageInfo; | |||
import com.iformall.common.ResultData; | |||
import com.iformall.domain.po.*; | |||
import com.iformall.service.pay.service.pay.PayAdapterService; | |||
import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | |||
import java.util.List; | |||
public interface ProductOrderService { | |||
/** | |||
* 根据实体查询分页列表 | |||
* | |||
* @param record | |||
* @param pageIndex | |||
* @param pageSize | |||
* @return | |||
*/ | |||
PageInfo<ProductOrder> listAsPage(ProductOrder record, Integer pageIndex, Integer pageSize); | |||
void saveOrUpdate(ProductOrder record); | |||
ProductOrder getById(Long id); | |||
ResultData createPay(ProductOrder productOrder); | |||
ResultData handleProductOrderByQuery(WxAppinfo appinfo,WxPayAccount payAccount,ProductOrder productOrder,PayAdapterService payAdapterService); | |||
void handleProductOrderSuccess(ProductOrder productOrder, PayQueryAdapterResult result); | |||
List<ProductOrder> findList(ProductOrder record); | |||
void handldSharing(ProductOrder order); | |||
} |
@@ -0,0 +1,19 @@ | |||
package com.iformall.service; | |||
import com.github.pagehelper.PageInfo; | |||
import com.iformall.domain.po.Product; | |||
public interface ProductService { | |||
/** | |||
* 根据实体查询分页列表 | |||
* | |||
* @param record | |||
* @param pageIndex | |||
* @param pageSize | |||
* @return | |||
*/ | |||
PageInfo<Product> listAsPage(Product record, Integer pageIndex, Integer pageSize); | |||
Product getById(Long id); | |||
} |
@@ -0,0 +1,20 @@ | |||
package com.iformall.service; | |||
import com.github.pagehelper.PageInfo; | |||
import com.iformall.domain.po.UserBasicFrom; | |||
public interface UserBasicFromService { | |||
/** | |||
* 根据实体查询分页列表 | |||
* | |||
* @param record | |||
* @param pageIndex | |||
* @param pageSize | |||
* @return | |||
*/ | |||
PageInfo<UserBasicFrom> listAsPage(UserBasicFrom record, Integer pageIndex, Integer pageSize); | |||
void saveForm(UserBasicFrom from); | |||
} |
@@ -0,0 +1,18 @@ | |||
package com.iformall.service; | |||
import com.github.pagehelper.PageInfo; | |||
import com.iformall.domain.po.UserBasicPropertyLog; | |||
public interface UserBasicPropertyLogService { | |||
/** | |||
* 根据实体查询分页列表 | |||
* | |||
* @param record | |||
* @param pageIndex | |||
* @param pageSize | |||
* @return | |||
*/ | |||
PageInfo<UserBasicPropertyLog> listAsPage(UserBasicPropertyLog record, Integer pageIndex, Integer pageSize); | |||
} |
@@ -0,0 +1,21 @@ | |||
package com.iformall.service; | |||
import com.github.pagehelper.PageInfo; | |||
import com.iformall.domain.po.ProductOrder; | |||
import com.iformall.domain.po.UserBasicProperty; | |||
public interface UserBasicPropertyService { | |||
/** | |||
* 根据实体查询分页列表 | |||
* | |||
* @param record | |||
* @param pageIndex | |||
* @param pageSize | |||
* @return | |||
*/ | |||
PageInfo<UserBasicProperty> listAsPage(UserBasicProperty record, Integer pageIndex, Integer pageSize); | |||
void addRechargeGlod(Long userId, Integer projectType, Long extraId, Integer glod); | |||
} |
@@ -7,6 +7,7 @@ import com.iformall.domain.po.WxProjectConfig; | |||
import com.iformall.domain.po.base.TenantEntity; | |||
import com.iformall.enums.EnumAppPlat; | |||
import com.iformall.enums.EnumPayWay; | |||
import com.iformall.enums.EnumProject; | |||
import javax.servlet.http.HttpServletRequest; | |||
import javax.servlet.http.HttpServletResponse; | |||
@@ -90,4 +91,8 @@ public interface WxAppinfoService { | |||
WxAppinfo getCAppInfoFromRedis(String tenantId, EnumAppPlat appPlat); | |||
WxAppinfo getProjectCAppInfo(Integer projectType, Integer plat); | |||
WxAppinfo getProjectCAppInfoFromRedis(Integer projectType, Integer plat); | |||
} |
@@ -1,6 +1,8 @@ | |||
package com.iformall.service.cuser; | |||
import com.iformall.common.ErrorCode; | |||
import com.iformall.domain.po.CUser; | |||
import com.iformall.domain.po.UserBasicFrom; | |||
import com.iformall.domain.po.WxCUserBasicInfo; | |||
import com.iformall.domain.po.WxCUserFrom; | |||
import com.iformall.domain.po.base.BaseCUserEntity; | |||
@@ -34,6 +36,9 @@ public class BasicCUserService { | |||
@Autowired | |||
private WxCUserBasicInfoService wxCUserBasicInfoService; | |||
@Autowired | |||
private UserBasicFromService userBasicFromService; | |||
@Autowired | |||
private MallCooUserInfoService mallCooUserInfoService; | |||
@@ -100,75 +105,31 @@ public class BasicCUserService { | |||
cleanCuserToken(user.getToken()); | |||
} | |||
public Long saveToBasicInfoByCUser(TenantEntity tenantEntity,String userPhone,String userName,String avatarUrl,Integer sex,Long userId) { | |||
if (StringUtils.isBlank(userPhone)) | |||
return null; | |||
WxCUserBasicInfo byId = null; | |||
if (null != userId) { | |||
byId = wxCUserBasicInfoService.getById(userId,tenantEntity.getFinalTenantId()); | |||
} | |||
public WxCUserBasicInfo saveToBasicInfoByCUser(CUser cuser, UserBasicFrom from) { | |||
WxCUserBasicInfo basicInfo = wxCUserBasicInfoService.findInfoByPhone(tenantEntity, userPhone); | |||
WxCUserBasicInfo basicInfo = wxCUserBasicInfoService.findInfoByPhone(cuser, cuser.getPhone()); | |||
if (basicInfo != null) { | |||
if (byId != null) { | |||
if (!byId.getId().equals(basicInfo.getId())) { | |||
//数据库存在此手机号的会员,并且当前微信存在另一手机号会员 | |||
logger.error("会员" + userId + "更换手机号时,当前手机号会员表已存在:" + userPhone); | |||
return Long.valueOf(-1); | |||
} | |||
} | |||
if (!basicInfo.getTenantId().contains("," + tenantEntity.getTenantId() + ",")) { | |||
basicInfo.setTenantId(basicInfo.getTenantId() + tenantEntity.getTenantId() + ","); | |||
} | |||
basicInfo.setNickName(userName); | |||
basicInfo.setAvatarUrl(avatarUrl); | |||
basicInfo.setSex(sex); | |||
basicInfo.setNickName(cuser.getNickName()); | |||
basicInfo.setAvatarUrl(cuser.getAvatarUrl()); | |||
basicInfo.setSex(cuser.getGender()); | |||
wxCUserBasicInfoService.update(basicInfo); | |||
cleanBasicUser(basicInfo.getId()); | |||
return basicInfo.getId(); | |||
return basicInfo; | |||
} else { | |||
if (byId != null) { | |||
if (!byId.getTenantId().contains("," + tenantEntity.getTenantId() + ",")) { | |||
byId.setTenantId(byId.getTenantId() + tenantEntity.getTenantId() + ","); | |||
} | |||
byId.setPhone(userPhone); | |||
byId.setNickName(userName); | |||
byId.setAvatarUrl(avatarUrl); | |||
byId.setSex(sex); | |||
wxCUserBasicInfoService.update(byId); | |||
cleanBasicUser(byId.getId()); | |||
return byId.getId(); | |||
} else { | |||
basicInfo = new WxCUserBasicInfo(); | |||
basicInfo.setTenantId("," + tenantEntity.getTenantId() + ","); | |||
basicInfo.setFinalTenantId(tenantEntity.getFinalTenantId()); | |||
basicInfo.setPhone(userPhone); | |||
basicInfo.setNickName(userName); | |||
basicInfo.setAvatarUrl(avatarUrl); | |||
basicInfo.setSex(sex); | |||
wxCUserBasicInfoService.save(basicInfo); | |||
cleanBasicUser(basicInfo.getId()); | |||
// 首次授权, 增加成长值及积分 | |||
// 成长值 | |||
wxScoreRulesService.addScore(tenantEntity, EnumScoreType.WECHAT_PHONE, basicInfo); | |||
// 增加积分 | |||
wxCUserBasicInfoService.addCredit(basicInfo.getId(),tenantEntity,EnumScoreType.WECHAT_PHONE); | |||
// 外部注券 | |||
memCouponFromDspService.couponOrderFromDsp(tenantEntity, userPhone); | |||
try{ | |||
//推送猫酷 | |||
mallCooUserInfoService.pullByMobileMsg(tenantEntity, basicInfo.getId()); | |||
}catch(Exception e){ | |||
logger.error("发送同步会员消息异常"); | |||
} | |||
return basicInfo.getId(); | |||
basicInfo = new WxCUserBasicInfo(); | |||
basicInfo.setPhone(cuser.getNickName()); | |||
basicInfo.setNickName(cuser.getNickName()); | |||
basicInfo.setAvatarUrl(cuser.getNickName()); | |||
basicInfo.setSex(cuser.getGender()); | |||
wxCUserBasicInfoService.save(basicInfo); | |||
if(from != null){ | |||
from.setId(basicInfo.getId()); | |||
userBasicFromService.saveForm(from); | |||
} | |||
} | |||
return basicInfo; | |||
} | |||
public void setCache(String token,BaseCUserEntity baseUser) { | |||
@@ -2,9 +2,7 @@ package com.iformall.service.cuser; | |||
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; | |||
import com.iformall.domain.dto.WxCUserBasicInfoDto; | |||
import com.iformall.domain.po.CUser; | |||
import com.iformall.domain.po.WxAppinfo; | |||
import com.iformall.domain.po.WxCUserFrom; | |||
import com.iformall.domain.po.*; | |||
import com.iformall.domain.po.base.BaseCUserEntity; | |||
import com.iformall.domain.po.base.TenantEntity; | |||
import com.iformall.domain.vo.UserCountVo; | |||
@@ -26,11 +24,11 @@ public interface CUserServiceApapter { | |||
void decryptUserInfo(String encryptedData, String iv, CUser cuser, WxAppinfo wxAppinfo, Boolean isFmOpen); | |||
String decryptPhoneNoInfo(String encryptedData, String iv, CUser cuser, WxAppinfo wxAppinfo, boolean isFmOpen); | |||
WxCUserBasicInfo decryptPhoneNoInfo(String encryptedData, String iv, CUser cuser, WxAppinfo wxAppinfo, boolean isFmOpen, UserBasicFrom from); | |||
void savePhoneToBasicInfo(CUser user, String phone); | |||
CUser handleLoginUser(CUser cUser, WxCUserFrom wxCUserFrom); | |||
CUser handleLoginUser(CUser cUser); | |||
CUser getById(Long id, String tenantId); | |||
CUser getByOpenId(String openId, String tenantId); | |||
@@ -1,283 +0,0 @@ | |||
package com.iformall.service.cuser.tt; | |||
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; | |||
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; | |||
import cn.binarywang.wx.miniapp.bean.WxMaUserInfo; | |||
import com.iformall.common.ErrorCode; | |||
import com.iformall.common.IdWorker; | |||
import com.iformall.domain.dto.WxCUserBasicInfoDto; | |||
import com.iformall.domain.po.*; | |||
import com.iformall.domain.po.base.BaseCUserEntity; | |||
import com.iformall.domain.po.base.TenantEntity; | |||
import com.iformall.domain.vo.UserCountVo; | |||
import com.iformall.domain.vo.UserStructureVo; | |||
import com.iformall.douyin.miniapp.api.TtMaService; | |||
import com.iformall.enums.EnumAppPlat; | |||
import com.iformall.exception.MallinkException; | |||
import com.iformall.mapper.TtBuserMapper; | |||
import com.iformall.service.WxAppinfoService; | |||
import com.iformall.service.cuser.BasicCUserService; | |||
import com.iformall.service.cuser.CUserServiceApapter; | |||
import com.iformall.service.wechat.FmOpenService; | |||
import com.iformall.utils.Constant; | |||
import com.iformall.utils.MaUtil; | |||
import lombok.SneakyThrows; | |||
import me.chanjar.weixin.common.error.WxErrorException; | |||
import org.apache.commons.lang3.StringUtils; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.stereotype.Service; | |||
import java.util.Date; | |||
import java.util.List; | |||
@Service | |||
public class TtBUserServiceAdapter extends BasicCUserService implements CUserServiceApapter{ | |||
private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
@Autowired | |||
private WxAppinfoService wxAppinfoService; | |||
@Autowired | |||
private FmOpenService openService; | |||
@Autowired | |||
private TtBuserMapper ttBuserMapper; | |||
@Autowired | |||
MaUtil maUtil; | |||
private BaseCUserEntity generateBaseEntity(TtBuser ttBuser) { | |||
BaseCUserEntity entity = new BaseCUserEntity(); | |||
entity.setId(ttBuser.getId()); | |||
entity.setExpireTime(ttBuser.getExpireTime()); | |||
entity.setUserId(ttBuser.getUserId()); | |||
entity.setToken(ttBuser.getToken()); | |||
entity.updateTenantInfo(ttBuser); | |||
entity.setAppPlat(EnumAppPlat.TOUTIAO); | |||
WxAppinfo appInfo = wxAppinfoService.getBAppInfo(ttBuser, entity.getAppPlat()); | |||
if (null == appInfo) { | |||
throw new MallinkException(ErrorCode.USER_APPINFO_NOT_EXIST.getCode(), "当前token查询不到APP"); | |||
} | |||
entity.setAppinfo(appInfo); | |||
entity.setRealUser(ttBuser); | |||
return entity; | |||
} | |||
@Override | |||
public BaseCUserEntity getByToken(String token) { | |||
if ((!StringUtils.isBlank(token))) { | |||
TtBuser ttBuser = ttBuserMapper.findByToken(token); | |||
if (null == ttBuser) { | |||
throw new MallinkException(ErrorCode.NET_TOKEN_INVALID.getCode(), "TtBUserServiceAdapter token失效"); | |||
} | |||
return generateBaseEntity(ttBuser); | |||
}else { | |||
throw new MallinkException(ErrorCode.NET_TOKEN_INVALID.getCode(), "TtBUserServiceAdapter token失效"); | |||
} | |||
} | |||
@Override | |||
public BaseCUserEntity getByObj(Object buser) { | |||
TtBuser ttBuser = (TtBuser) buser; | |||
return generateBaseEntity(ttBuser); | |||
} | |||
@SneakyThrows | |||
@Override | |||
public WxMaJscode2SessionResult jsCode2SessionInfo(String code, WxAppinfo wxAppinfo, Boolean isFmOpen) { | |||
TtMaService ttMaService = maUtil.getTtMaService(wxAppinfo); | |||
return ttMaService.jsCode2SessionInfo(code); | |||
} | |||
@Override | |||
public void decryptUserInfo(String encryptedData, String iv, CUser cuser, WxAppinfo wxAppinfo, Boolean isFmOpen) { | |||
TtMaService ttMaService = maUtil.getTtMaService(wxAppinfo); | |||
WxMaUserInfo userInfo = ttMaService.getUserService().getUserInfo(cuser.getSessionKey(), encryptedData, iv); | |||
if (userInfo != null) { | |||
logger.info("解密用户信息 {}" + userInfo.toString()); | |||
TtBuser updateUser = new TtBuser(); | |||
updateUser.setId(cuser.getId()); | |||
updateUser.updateTenantInfo(cuser); | |||
updateUser.setUnionId(userInfo.getUnionId()); | |||
updateUser.setNickName(userInfo.getNickName()); | |||
updateUser.setGender(Integer.parseInt(userInfo.getGender())); | |||
updateUser.setAvatarUrl(userInfo.getAvatarUrl()); | |||
updateUser.setProvince(userInfo.getProvince()); | |||
updateUser.setCity(userInfo.getCity()); | |||
updateUser.setLanguage(userInfo.getLanguage()); | |||
updateUser.setUpdateDate(new Date()); | |||
ttBuserMapper.updateById(updateUser); | |||
cleanCuserToken(cuser.getToken()); | |||
} else { | |||
throw new MallinkException(ErrorCode.SYS_BEAN_EMPTY_PROPERTY_ERROR.getCode(), "未获取到用户信息"); | |||
} | |||
} | |||
@Override | |||
public String decryptPhoneNoInfo(String encryptedData, String iv, CUser cuser, WxAppinfo wxAppinfo, boolean isFmOpen) { | |||
TtMaService ttMaService = maUtil.getTtMaService(wxAppinfo); | |||
WxMaPhoneNumberInfo phoneNoInfo = ttMaService.getUserService().getPhoneNoInfo(cuser.getSessionKey(), encryptedData, iv); | |||
if (null != phoneNoInfo) { | |||
logger.info("解密用户手机号 {}" + phoneNoInfo.toString()); | |||
if(phoneNoInfo.getPhoneNumber().contains("*")){ | |||
throw new MallinkException(ErrorCode.PHONE_IS_ENCRYPTED); | |||
} | |||
TtBuser updateUser = new TtBuser(); | |||
updateUser.setId(cuser.getId()); | |||
updateUser.updateTenantInfo(cuser); | |||
updateUser.setPhone(phoneNoInfo.getPhoneNumber()); | |||
updateUser.setPurePhone(phoneNoInfo.getPurePhoneNumber()); | |||
updateUser.setCountryCode(phoneNoInfo.getCountryCode()); | |||
updateUser.setUpdateDate(new Date()); | |||
ttBuserMapper.updateById(updateUser); | |||
cleanCuserToken(cuser.getToken()); | |||
return updateUser.getPhone(); | |||
} else { | |||
throw new MallinkException(ErrorCode.PHONE_DECODE_ERR); | |||
} | |||
} | |||
@Override | |||
public void savePhoneToBasicInfo(CUser user, String phone) { | |||
TtBuser updateUser = new TtBuser(); | |||
updateUser.setId(user.getId()); | |||
updateUser.updateTenantInfo(user); | |||
updateUser.setPhone(phone); | |||
updateUser.setUpdateDate(new Date()); | |||
ttBuserMapper.updateById(updateUser); | |||
cleanCuserToken(user.getToken()); | |||
} | |||
@Override | |||
public CUser handleLoginUser(CUser cUser, WxCUserFrom wxCUserFrom) { | |||
TtBuser newUser = new TtBuser(); | |||
newUser.updateTenantInfo(cUser); | |||
newUser.setAppId(cUser.getAppId()); | |||
newUser.setOpenId(cUser.getOpenId()); | |||
TtBuser user = ttBuserMapper.findByOpenId(newUser); | |||
if (user != null) { | |||
// 已有用户 | |||
user.createToken(new Date(),user.getTenantId()); | |||
user.setRegisterIp(cUser.getRegisterIp()); | |||
user.setSessionKey(cUser.getSessionKey()); | |||
user.setUnionId(cUser.getUnionId()); | |||
user.setExtraInfo(cUser.getExtraInfo()); | |||
user.setLoginCount(user.getLoginCount() + 1); | |||
user.setActiveTime(new Date()); | |||
user.setUpdateDate(new Date()); | |||
user.setUserId(cUser.getUserId()); | |||
ttBuserMapper.updateById(user); | |||
} else { | |||
// 新用户 | |||
user = new TtBuser(); | |||
user.updateTenantInfo(cUser); | |||
user.setAppId(cUser.getAppId()); | |||
user.setOpenId(cUser.getOpenId()); | |||
final IdWorker idWorker = IdWorker.get(); | |||
user.setId(idWorker.nextId()); | |||
user.createToken(new Date(),user.getTenantId()); | |||
user.setRegisterIp(cUser.getRegisterIp()); | |||
user.setSessionKey(cUser.getSessionKey()); | |||
user.setUnionId(cUser.getUnionId()); | |||
user.setExtraInfo(cUser.getExtraInfo()); | |||
user.setLoginCount(1); | |||
user.setActiveTime(new Date()); | |||
user.setCreateDate(new Date()); | |||
user.setUpdateDate(new Date()); | |||
user.setUserId(cUser.getUserId()); | |||
ttBuserMapper.insert(user); | |||
} | |||
updateTokenCache(user.getToken(), user); | |||
return user; | |||
} | |||
@Override | |||
public CUser getById(Long id, String tenantId) { | |||
return ttBuserMapper.selectById(id); | |||
} | |||
@Override | |||
public CUser getByOpenId(String openId, String tenantId) { | |||
TtBuser buser = new TtBuser(); | |||
buser.setTenantId(tenantId); | |||
buser.setOpenId(openId); | |||
return ttBuserMapper.findByOpenId(buser); | |||
} | |||
@Override | |||
public void updateScene(CUser user) { | |||
TtBuser userL = new TtBuser(); | |||
userL.updateTenantInfo(user); | |||
userL.setId(user.getId()); | |||
userL.setScene(user.getScene()); | |||
userL.setUpdateDate(new Date()); | |||
ttBuserMapper.updateById(userL); | |||
cleanCuserToken(user.getToken()); | |||
} | |||
@Override | |||
public void updateLBS(CUser user) { | |||
TtBuser userL = new TtBuser(); | |||
userL.setId(user.getId()); | |||
userL.updateTenantInfo(user); | |||
userL.setLongitude(user.getLongitude()); | |||
userL.setLatitude(user.getLatitude()); | |||
userL.setUpdateDate(new Date()); | |||
ttBuserMapper.updateById(userL); | |||
cleanCuserToken(user.getToken()); | |||
} | |||
@Override | |||
public void updateExtInfo(CUser user) { | |||
TtBuser userL = new TtBuser(); | |||
userL.setId(user.getId()); | |||
userL.updateTenantInfo(user); | |||
userL.setExtraInfo(user.getExtraInfo()); | |||
userL.setUpdateDate( new Date()); | |||
ttBuserMapper.updateById(userL); | |||
cleanCuserToken(user.getToken()); | |||
} | |||
@Override | |||
public void updateMsgCount(CUser user) { | |||
} | |||
@Override | |||
public long findCount(WxCUserBasicInfoDto dto) { | |||
return 0l; | |||
} | |||
@Override | |||
public List<UserCountVo> findCountHistory(WxCUserBasicInfoDto dto) { | |||
return null; | |||
} | |||
@Override | |||
public void actionAfterLogin(CUser user) { | |||
} | |||
@Override | |||
public String updateQrCode(CUser user) { | |||
return null; | |||
} | |||
@Override | |||
public List<UserStructureVo> findCountData(WxCUserBasicInfoDto dto) { | |||
return null; | |||
} | |||
private void updateTokenCache(String token,Object cuser) { | |||
BaseCUserEntity baseUser = this.getByObj(cuser); | |||
setCache(token,baseUser); | |||
} | |||
} |
@@ -150,10 +150,10 @@ public class TtCUserServiceAdapter extends BasicCUserService implements CUserSer | |||
} | |||
@Override | |||
public String decryptPhoneNoInfo(String encryptedData, String iv, CUser cuser, WxAppinfo wxAppinfo, boolean isFmOpen) { | |||
public WxCUserBasicInfo decryptPhoneNoInfo(String encryptedData, String iv, CUser cuser, WxAppinfo wxAppinfo, boolean isFmOpen, UserBasicFrom from) { | |||
TtMaService ttMaService = maUtil.getTtMaService(wxAppinfo); | |||
WxMaPhoneNumberInfo phoneNoInfo = ttMaService.getUserService().getPhoneNoInfo(cuser.getSessionKey(), encryptedData, iv); | |||
if (null != phoneNoInfo) { | |||
if (null != phoneNoInfo && StringUtils.isNotBlank(phoneNoInfo.getPhoneNumber())) { | |||
if(phoneNoInfo.getPhoneNumber().contains("*")){ | |||
throw new MallinkException(ErrorCode.PHONE_IS_ENCRYPTED); | |||
} | |||
@@ -163,23 +163,16 @@ public class TtCUserServiceAdapter extends BasicCUserService implements CUserSer | |||
updateUser.setPhone(phoneNoInfo.getPhoneNumber()); | |||
updateUser.setPurePhone(phoneNoInfo.getPurePhoneNumber()); | |||
updateUser.setCountryCode(phoneNoInfo.getCountryCode()); | |||
// 更新到basicinfo | |||
Long userBasicId = saveToBasicInfoByCUser(updateUser,updateUser.getPhone(), cuser.getNickName(), cuser.getAvatarUrl(), cuser.getGender(), cuser.getUserId()); | |||
if (null != userBasicId) { | |||
if(userBasicId.intValue() == -1){ | |||
throw new MallinkException(ErrorCode.USER_PHONE_IS_FOUND); | |||
} | |||
updateUser.setUserId(userBasicId); | |||
}else{ | |||
throw new MallinkException(ErrorCode.PHONE_DECODE_ERR); | |||
} | |||
WxCUserBasicInfo basicInfo = saveToBasicInfoByCUser(updateUser,from); | |||
updateUser.setUserId(basicInfo.getId()); | |||
updateUser.setUpdateDate(new Date()); | |||
ttCUserMapper.updateById(updateUser); | |||
delForUserIdOnly(updateUser.getId(),updateUser.getUserId(),updateUser.getTenantId()); | |||
wxCUserTagsService.triggerAssignTags(EnumAssignTagsTrigger.ASSIGN_TAGS_TRIGGER_PHONE, updateUser,updateUser,null); | |||
cleanCuserToken(cuser.getToken()); | |||
return updateUser.getPhone(); | |||
ttCUserMapper.delForUserIdOnly(updateUser.getId(),updateUser.getUserId(),updateUser.getTenantId()); | |||
return basicInfo; | |||
} else { | |||
throw new MallinkException(ErrorCode.PHONE_DECODE_ERR); | |||
} | |||
@@ -193,24 +186,17 @@ public class TtCUserServiceAdapter extends BasicCUserService implements CUserSer | |||
updateUser.setPhone(phone); | |||
// 更新到basicinfo | |||
Long userBasicId = saveToBasicInfoByCUser(updateUser,updateUser.getPhone(), user.getNickName(), user.getAvatarUrl(), user.getGender(), user.getUserId()); | |||
if (null != userBasicId) { | |||
if(userBasicId.intValue() == -1){ | |||
throw new MallinkException(ErrorCode.USER_PHONE_IS_FOUND); | |||
} | |||
updateUser.setUserId(userBasicId); | |||
}else{ | |||
throw new MallinkException(ErrorCode.PHONE_DECODE_ERR); | |||
} | |||
WxCUserBasicInfo basicInfo = saveToBasicInfoByCUser(updateUser,null); | |||
updateUser.setUserId(basicInfo.getId()); | |||
updateUser.setUpdateDate(new Date()); | |||
ttCUserMapper.updateById(updateUser); | |||
delForUserIdOnly(updateUser.getId(),updateUser.getUserId(),updateUser.getTenantId()); | |||
wxCUserTagsService.triggerAssignTags(EnumAssignTagsTrigger.ASSIGN_TAGS_TRIGGER_PHONE, updateUser,updateUser,null); | |||
cleanCuserToken(user.getToken()); | |||
ttCUserMapper.delForUserIdOnly(updateUser.getId(),updateUser.getUserId(),updateUser.getTenantId()); | |||
} | |||
@Override | |||
public CUser handleLoginUser(CUser cUser, WxCUserFrom wxCUserFrom) { | |||
public CUser handleLoginUser(CUser cUser) { | |||
TtCUser newUser = new TtCUser(); | |||
newUser.updateTenantInfo(cUser); | |||
newUser.setAppId(cUser.getAppId()); | |||
@@ -229,8 +215,6 @@ public class TtCUserServiceAdapter extends BasicCUserService implements CUserSer | |||
user.setActiveTime(new Date()); | |||
user.setUpdateDate(new Date()); | |||
ttCUserMapper.updateById(user); | |||
wxCUserFrom.setIsNewUser(EnumYesOrNo.NO.getCode()); | |||
} else { | |||
user = new TtCUser(); | |||
user.setNickName(AppUtils.getAppId());//新用户随机昵称,短8位 | |||
@@ -244,19 +228,13 @@ public class TtCUserServiceAdapter extends BasicCUserService implements CUserSer | |||
user.setRegisterIp(cUser.getRegisterIp()); | |||
user.setSessionKey(cUser.getSessionKey()); | |||
user.setUnionId(cUser.getUnionId()); | |||
user.setSceneAddress(wxCUserFrom.getSceneAddress()); | |||
user.setScene(wxCUserFrom.getScene()); | |||
user.setExtraInfo(cUser.getExtraInfo()); | |||
user.setLoginCount(1); | |||
user.setActiveTime(new Date()); | |||
user.setCreateDate(new Date()); | |||
user.setUpdateDate(new Date()); | |||
ttCUserMapper.insert(user); | |||
wxCUserFrom.setIsNewUser(EnumYesOrNo.YES.getCode()); | |||
} | |||
wxCUserFrom.setCUserId(user.getId()); | |||
actionMsgAfterLogin(wxCUserFrom); | |||
updateTokenCache(user.getToken(), user); | |||
return user; | |||
} | |||
@@ -1,328 +0,0 @@ | |||
package com.iformall.service.cuser.wx; | |||
import cn.binarywang.wx.miniapp.api.WxMaService; | |||
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; | |||
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; | |||
import cn.binarywang.wx.miniapp.bean.WxMaUserInfo; | |||
import com.iformall.common.ErrorCode; | |||
import com.iformall.common.IdWorker; | |||
import com.iformall.domain.dto.WxCUserBasicInfoDto; | |||
import com.iformall.domain.po.*; | |||
import com.iformall.domain.po.base.BaseCUserEntity; | |||
import com.iformall.domain.po.base.TenantEntity; | |||
import com.iformall.domain.vo.UserCountVo; | |||
import com.iformall.domain.vo.UserStructureVo; | |||
import com.iformall.enums.EnumAppPlat; | |||
import com.iformall.exception.MallinkException; | |||
import com.iformall.mapper.WxAppinfoMapper; | |||
import com.iformall.mapper.WxBuserMapper; | |||
import com.iformall.service.WxAppinfoService; | |||
import com.iformall.service.cuser.BasicCUserService; | |||
import com.iformall.service.cuser.CUserServiceApapter; | |||
import com.iformall.service.wechat.FmOpenService; | |||
import com.iformall.utils.Constant; | |||
import com.iformall.utils.MaUtil; | |||
import lombok.SneakyThrows; | |||
import me.chanjar.weixin.common.error.WxErrorException; | |||
import org.apache.commons.lang3.StringUtils; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.stereotype.Service; | |||
import java.util.Date; | |||
import java.util.List; | |||
@Service | |||
public class WxBUserServiceAdapter extends BasicCUserService implements CUserServiceApapter{ | |||
private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
@Autowired | |||
private WxAppinfoService wxAppinfoService; | |||
@Autowired | |||
private WxAppinfoMapper wxAppinfoMapper; | |||
@Autowired | |||
private FmOpenService openService; | |||
@Autowired | |||
private WxBuserMapper wxBuserMapper; | |||
@Autowired | |||
MaUtil maUtil; | |||
private BaseCUserEntity generateBaseEntity(WxBuser wxBuser) { | |||
BaseCUserEntity entity = new BaseCUserEntity(); | |||
entity.setId(wxBuser.getId()); | |||
entity.setExpireTime(wxBuser.getExpireTime()); | |||
entity.setUserId(wxBuser.getUserId()); | |||
entity.setToken(wxBuser.getToken()); | |||
entity.updateTenantInfo(wxBuser); | |||
entity.setAppPlat(EnumAppPlat.WX); | |||
WxAppinfo appInfo = wxAppinfoService.getBAppInfo(wxBuser, entity.getAppPlat()); | |||
if (null == appInfo) { | |||
throw new MallinkException(ErrorCode.USER_APPINFO_NOT_EXIST.getCode(), "当前token查询不到APP"); | |||
} | |||
entity.setAppinfo(appInfo); | |||
entity.setRealUser(wxBuser); | |||
return entity; | |||
} | |||
@Override | |||
public BaseCUserEntity getByToken(String token) { | |||
if ((!StringUtils.isBlank(token))) { | |||
WxBuser wxBuser = wxBuserMapper.findByToken(token); | |||
if (null == wxBuser) { | |||
throw new MallinkException(ErrorCode.NET_TOKEN_INVALID.getCode(), "WxBUserServiceAdapter token失效"); | |||
} | |||
return generateBaseEntity(wxBuser); | |||
}else { | |||
throw new MallinkException(ErrorCode.NET_TOKEN_INVALID.getCode(), "WxBUserServiceAdapter token失效"); | |||
} | |||
} | |||
@Override | |||
public BaseCUserEntity getByObj(Object buser) { | |||
WxBuser wxBuser = (WxBuser) buser; | |||
return generateBaseEntity(wxBuser); | |||
} | |||
@SneakyThrows | |||
@Override | |||
public WxMaJscode2SessionResult jsCode2SessionInfo(String code, WxAppinfo wxAppinfo, Boolean isFmOpen) { | |||
WxMaService wxMaService = this.getWxMaService(wxAppinfo, isFmOpen); | |||
return wxMaService.jsCode2SessionInfo(code); | |||
} | |||
@Override | |||
public void decryptUserInfo(String encryptedData, String iv, CUser cuser, WxAppinfo wxAppinfo, Boolean isFmOpen) { | |||
WxMaService wxMaService = this.getWxMaService(wxAppinfo, isFmOpen); | |||
WxMaUserInfo userInfo = wxMaService.getUserService().getUserInfo(cuser.getSessionKey(), encryptedData, iv); | |||
if (userInfo != null) { | |||
logger.info("解密用户信息 {}" + userInfo.toString()); | |||
WxBuser updateUser = new WxBuser(); | |||
updateUser.setId(cuser.getId()); | |||
updateUser.updateTenantInfo(cuser); | |||
updateUser.setUnionId(userInfo.getUnionId()); | |||
updateUser.setNickName(userInfo.getNickName()); | |||
updateUser.setGender(Integer.parseInt(userInfo.getGender())); | |||
updateUser.setAvatarUrl(userInfo.getAvatarUrl()); | |||
updateUser.setProvince(userInfo.getProvince()); | |||
updateUser.setCity(userInfo.getCity()); | |||
updateUser.setLanguage(userInfo.getLanguage()); | |||
updateUser.setUpdateDate(new Date()); | |||
wxBuserMapper.updateById(updateUser); | |||
cleanCuserToken(cuser.getToken()); | |||
} else { | |||
throw new MallinkException(ErrorCode.SYS_BEAN_EMPTY_PROPERTY_ERROR.getCode(), "未获取到用户信息"); | |||
} | |||
} | |||
@Override | |||
public String decryptPhoneNoInfo(String encryptedData, String iv, CUser cuser, WxAppinfo wxAppinfo, boolean isFmOpen) { | |||
WxMaService wxMaService = this.getWxMaService(wxAppinfo, isFmOpen); | |||
WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(cuser.getSessionKey(), encryptedData, iv); | |||
if (null != phoneNoInfo) { | |||
logger.info("解密用户手机号 {}" + phoneNoInfo.toString()); | |||
if(phoneNoInfo.getPhoneNumber().contains("*")){ | |||
throw new MallinkException(ErrorCode.PHONE_IS_ENCRYPTED); | |||
} | |||
WxBuser updateUser = new WxBuser(); | |||
updateUser.setId(cuser.getId()); | |||
updateUser.updateTenantInfo(cuser); | |||
updateUser.setPhone(phoneNoInfo.getPhoneNumber()); | |||
updateUser.setPurePhone(phoneNoInfo.getPurePhoneNumber()); | |||
updateUser.setCountryCode(phoneNoInfo.getCountryCode()); | |||
updateUser.setUpdateDate(new Date()); | |||
wxBuserMapper.updateById(updateUser); | |||
cleanCuserToken(cuser.getToken()); | |||
return updateUser.getPhone(); | |||
} else { | |||
throw new MallinkException(ErrorCode.PHONE_DECODE_ERR); | |||
} | |||
} | |||
@Override | |||
public void savePhoneToBasicInfo(CUser user, String phone) { | |||
WxBuser updateUser = new WxBuser(); | |||
updateUser.setId(user.getId()); | |||
updateUser.updateTenantInfo(user); | |||
updateUser.setPhone(phone); | |||
updateUser.setUpdateDate(new Date()); | |||
wxBuserMapper.updateById(updateUser); | |||
cleanCuserToken(user.getToken()); | |||
} | |||
@Override | |||
public CUser handleLoginUser(CUser cUser, WxCUserFrom wxCUserFrom) { | |||
WxBuser newUser = new WxBuser(); | |||
newUser.updateTenantInfo(cUser); | |||
newUser.setAppId(cUser.getAppId()); | |||
newUser.setOpenId(cUser.getOpenId()); | |||
WxBuser user = wxBuserMapper.findByOpenId(newUser); | |||
if (user != null) { | |||
// 已有用户 | |||
user.createToken(new Date(),user.getTenantId()); | |||
user.setRegisterIp(cUser.getRegisterIp()); | |||
user.setSessionKey(cUser.getSessionKey()); | |||
user.setUnionId(cUser.getUnionId()); | |||
user.setExtraInfo(cUser.getExtraInfo()); | |||
user.setLoginCount(user.getLoginCount() + 1); | |||
user.setActiveTime(new Date()); | |||
user.setUpdateDate(new Date()); | |||
user.setUserId(cUser.getUserId()); | |||
wxBuserMapper.updateById(user); | |||
} else { | |||
// 新用户 | |||
user = new WxBuser(); | |||
user.updateTenantInfo(cUser); | |||
user.setAppId(cUser.getAppId()); | |||
user.setOpenId(cUser.getOpenId()); | |||
final IdWorker idWorker = IdWorker.get(); | |||
user.setId(idWorker.nextId()); | |||
user.createToken(new Date(),user.getTenantId()); | |||
user.setRegisterIp(cUser.getRegisterIp()); | |||
user.setSessionKey(cUser.getSessionKey()); | |||
user.setUnionId(cUser.getUnionId()); | |||
user.setExtraInfo(cUser.getExtraInfo()); | |||
user.setLoginCount(1); | |||
user.setActiveTime(new Date()); | |||
user.setCreateDate(new Date()); | |||
user.setUpdateDate(new Date()); | |||
user.setUserId(cUser.getUserId()); | |||
wxBuserMapper.insert(user); | |||
} | |||
updateTokenCache(user.getToken(), user); | |||
return user; | |||
} | |||
@Override | |||
public CUser getById(Long id, String tenantId) { | |||
return wxBuserMapper.selectById(id); | |||
} | |||
@Override | |||
public CUser getByOpenId(String openId, String tenantId) { | |||
WxBuser buser = new WxBuser(); | |||
buser.setTenantId(tenantId); | |||
buser.setOpenId(openId); | |||
return wxBuserMapper.findByOpenId(buser); | |||
} | |||
@Override | |||
public void updateScene(CUser user) { | |||
WxBuser userL = new WxBuser(); | |||
userL.updateTenantInfo(user); | |||
userL.setId(user.getId()); | |||
userL.setScene(user.getScene()); | |||
userL.setUpdateDate(new Date()); | |||
wxBuserMapper.updateById(userL); | |||
cleanCuserToken(user.getToken()); | |||
} | |||
@Override | |||
public void updateLBS(CUser user) { | |||
WxBuser userL = new WxBuser(); | |||
userL.setId(user.getId()); | |||
userL.updateTenantInfo(user); | |||
userL.setLongitude(user.getLongitude()); | |||
userL.setLatitude(user.getLatitude()); | |||
userL.setUpdateDate(new Date()); | |||
wxBuserMapper.updateById(userL); | |||
cleanCuserToken(user.getToken()); | |||
} | |||
@Override | |||
public void updateExtInfo(CUser user) { | |||
WxBuser userL = new WxBuser(); | |||
userL.setId(user.getId()); | |||
userL.updateTenantInfo(user); | |||
userL.setExtraInfo(user.getExtraInfo()); | |||
userL.setUpdateDate( new Date()); | |||
wxBuserMapper.updateById(userL); | |||
cleanCuserToken(user.getToken()); | |||
} | |||
@Override | |||
public void updateMsgCount(CUser user) { | |||
} | |||
@Override | |||
public long findCount(WxCUserBasicInfoDto dto) { | |||
return 0l; | |||
} | |||
@Override | |||
public List<UserCountVo> findCountHistory(WxCUserBasicInfoDto dto) { | |||
return null; | |||
} | |||
@Override | |||
public void actionAfterLogin(CUser user) { | |||
} | |||
@Override | |||
public String updateQrCode(CUser user) { | |||
return null; | |||
} | |||
@Override | |||
public List<UserStructureVo> findCountData(WxCUserBasicInfoDto dto) { | |||
return null; | |||
} | |||
private WxMaService getWxMaService(WxAppinfo wxAppinfo, Boolean isFmOpen) { | |||
WxMaService wxMaService = null; | |||
if (isFmOpen) { | |||
wxMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(wxAppinfo.getAppId()); | |||
} else { | |||
wxMaService = maUtil.getWeappService(wxAppinfo); | |||
if (StringUtils.isBlank(wxAppinfo.getAccessToken())) { | |||
// 如果没有accessToken,主动获取保存到数据库中,下次访问可以拿来使用 | |||
updateAppAccessToken(wxAppinfo, wxMaService); | |||
} else { | |||
// 检查token是否已过期, 1小时就重新获取 | |||
Date curDate = new Date(); | |||
if (curDate.getTime() > wxAppinfo.getLastTokenTime().getTime() + Constant.H_EXPIRE) { | |||
updateAppAccessToken(wxAppinfo, wxMaService); | |||
} | |||
} | |||
} | |||
return wxMaService; | |||
} | |||
private void updateAppAccessToken(WxAppinfo wxAppinfo, WxMaService wxMaService) { | |||
try { | |||
String accessToken = wxMaService.getAccessToken(true); | |||
WxAppinfo updateApp = new WxAppinfo(); | |||
updateApp.setAppId(wxAppinfo.getAppId()); | |||
updateApp.setAccessToken(accessToken); | |||
updateApp.setLastTokenTime(new Date()); | |||
updateApp.setExpiresIn(7200); | |||
wxAppinfo.setAccessToken(updateApp.getAccessToken()); | |||
wxAppinfo.setLastTokenTime(updateApp.getLastTokenTime()); | |||
wxAppinfo.setExpiresIn(updateApp.getExpiresIn()); | |||
wxAppinfoMapper.updateAccessToken(updateApp); | |||
} catch (WxErrorException e) { | |||
logger.error(e.getMessage()); | |||
} catch (Exception e) { | |||
logger.error(e.getMessage()); | |||
} | |||
} | |||
private void updateTokenCache(String token,Object cuser) { | |||
BaseCUserEntity baseUser = this.getByObj(cuser); | |||
setCache(token,baseUser); | |||
} | |||
} |
@@ -162,10 +162,10 @@ public class WxCUserServiceAdapter extends BasicCUserService implements CUserSer | |||
} | |||
@Override | |||
public String decryptPhoneNoInfo(String encryptedData, String iv, CUser cuser, WxAppinfo wxAppinfo, boolean isFmOpen) { | |||
public WxCUserBasicInfo decryptPhoneNoInfo(String encryptedData, String iv, CUser cuser, WxAppinfo wxAppinfo, boolean isFmOpen, UserBasicFrom from) { | |||
WxMaService wxMaService = this.getWxMaService(wxAppinfo, isFmOpen); | |||
WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(cuser.getSessionKey(), encryptedData, iv); | |||
if (null != phoneNoInfo) { | |||
if (null != phoneNoInfo && StringUtils.isNotBlank(phoneNoInfo.getPhoneNumber())) { | |||
logger.info("解密用户手机号 {}" + phoneNoInfo.toString()); | |||
if(phoneNoInfo.getPhoneNumber().contains("*")){ | |||
throw new MallinkException(ErrorCode.PHONE_IS_ENCRYPTED); | |||
@@ -178,21 +178,14 @@ public class WxCUserServiceAdapter extends BasicCUserService implements CUserSer | |||
updateUser.setCountryCode(phoneNoInfo.getCountryCode()); | |||
// 更新到basicinfo | |||
Long userBasicId = saveToBasicInfoByCUser(updateUser,updateUser.getPhone(), cuser.getNickName(), cuser.getAvatarUrl(), cuser.getGender(), cuser.getUserId()); | |||
if (null != userBasicId) { | |||
if(userBasicId.intValue() == -1){ | |||
throw new MallinkException(ErrorCode.USER_PHONE_IS_FOUND); | |||
} | |||
updateUser.setUserId(userBasicId); | |||
}else{ | |||
throw new MallinkException(ErrorCode.PHONE_DECODE_ERR); | |||
} | |||
WxCUserBasicInfo basicInfo = saveToBasicInfoByCUser(updateUser,from); | |||
updateUser.setUserId(basicInfo.getId()); | |||
updateUser.setUpdateDate(new Date()); | |||
wxCUserMapper.updateById(updateUser); | |||
delForUserIdOnly(updateUser.getId(),updateUser.getUserId(),updateUser.getTenantId()); | |||
wxCUserTagsService.triggerAssignTags(EnumAssignTagsTrigger.ASSIGN_TAGS_TRIGGER_PHONE, updateUser,updateUser,null); | |||
cleanCuserToken(cuser.getToken()); | |||
return updateUser.getPhone(); | |||
wxCUserMapper.delForUserIdOnly(updateUser.getId(),updateUser.getUserId(),updateUser.getTenantId()); | |||
return basicInfo; | |||
} else { | |||
throw new MallinkException(ErrorCode.PHONE_DECODE_ERR); | |||
} | |||
@@ -205,25 +198,17 @@ public class WxCUserServiceAdapter extends BasicCUserService implements CUserSer | |||
updateUser.updateTenantInfo(user); | |||
updateUser.setPhone(phone); | |||
// 更新到basicinfo | |||
Long userBasicId = saveToBasicInfoByCUser(updateUser,updateUser.getPhone(), user.getNickName(), user.getAvatarUrl(), user.getGender(), user.getUserId()); | |||
if (null != userBasicId) { | |||
if(userBasicId.intValue() == -1){ | |||
throw new MallinkException(ErrorCode.USER_PHONE_IS_FOUND); | |||
} | |||
updateUser.setUserId(userBasicId); | |||
}else{ | |||
throw new MallinkException(ErrorCode.PHONE_DECODE_ERR); | |||
} | |||
WxCUserBasicInfo basicInfo = saveToBasicInfoByCUser(updateUser,null); | |||
updateUser.setUserId(basicInfo.getId()); | |||
updateUser.setUpdateDate(new Date()); | |||
wxCUserMapper.updateById(updateUser); | |||
delForUserIdOnly(updateUser.getId(),updateUser.getUserId(),updateUser.getTenantId()); | |||
wxCUserTagsService.triggerAssignTags(EnumAssignTagsTrigger.ASSIGN_TAGS_TRIGGER_PHONE, updateUser,updateUser,null); | |||
cleanCuserToken(user.getToken()); | |||
wxCUserMapper.delForUserIdOnly(updateUser.getId(),updateUser.getUserId(),updateUser.getTenantId()); | |||
} | |||
@Override | |||
public CUser handleLoginUser(CUser cUser, WxCUserFrom wxCUserFrom) { | |||
public CUser handleLoginUser(CUser cUser) { | |||
WxCUser newUser = new WxCUser(); | |||
newUser.updateTenantInfo(cUser); | |||
newUser.setAppId(cUser.getAppId()); | |||
@@ -231,46 +216,37 @@ public class WxCUserServiceAdapter extends BasicCUserService implements CUserSer | |||
WxCUser user = wxCUserMapper.findByOpenId(newUser); | |||
Date now = new Date(); | |||
if (user != null) { | |||
// 已有用户 | |||
user.createToken(new Date(),user.getTenantId()); | |||
user.setRegisterIp(cUser.getRegisterIp()); | |||
user.setSessionKey(cUser.getSessionKey()); | |||
user.setUnionId(cUser.getUnionId()); | |||
user.setExtraInfo(cUser.getExtraInfo()); | |||
user.setLoginCount(user.getLoginCount() + 1); | |||
user.setActiveTime(new Date()); | |||
user.setUpdateDate(new Date()); | |||
user.setActiveTime(now); | |||
user.setUpdateDate(now); | |||
wxCUserMapper.updateById(user); | |||
wxCUserFrom.setIsNewUser(EnumYesOrNo.NO.getCode()); | |||
} else { | |||
// 新用户 | |||
user = new WxCUser(); | |||
user.setNickName(AppUtils.getAppId());//新用户随机昵称,短8位 | |||
user.setNickName("未设置昵称"); | |||
user.updateTenantInfo(cUser); | |||
user.setAppId(cUser.getAppId()); | |||
user.setOpenId(cUser.getOpenId()); | |||
final IdWorker idWorker = IdWorker.get(); | |||
user.setId(idWorker.nextId()); | |||
user.createToken(new Date(),user.getTenantId()); | |||
user.setRegisterIp(cUser.getRegisterIp()); | |||
user.setSessionKey(cUser.getSessionKey()); | |||
user.setUnionId(cUser.getUnionId()); | |||
user.setSceneAddress(wxCUserFrom.getSceneAddress()); | |||
user.setScene(wxCUserFrom.getScene()); | |||
user.setExtraInfo(cUser.getExtraInfo()); | |||
user.setLoginCount(1); | |||
user.setActiveTime(new Date()); | |||
user.setCreateDate(new Date()); | |||
user.setUpdateDate(new Date()); | |||
user.setActiveTime(now); | |||
user.setCreateDate(now); | |||
user.setUpdateDate(now); | |||
user.createToken(now,user.getTenantId()); | |||
wxCUserMapper.insert(user); | |||
wxCUserFrom.setIsNewUser(EnumYesOrNo.YES.getCode()); | |||
} | |||
wxCUserFrom.setCUserId(user.getId()); | |||
actionMsgAfterLogin(wxCUserFrom); | |||
updateTokenCache(user.getToken(), user); | |||
return user; | |||
} | |||
@@ -72,6 +72,25 @@ public class WxPayOrderServiceHelper { | |||
} | |||
return null; | |||
} | |||
public static EnumProductOrderStatus getProductOrderStatus(String trade_state) { | |||
if ("SUCCESS".equals(trade_state)) { | |||
return EnumProductOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS; | |||
}else if ("REFUND".equals(trade_state)) { | |||
return EnumProductOrderStatus.ORDER_STATUS_REFUND_SUCCESS; | |||
}else if ("NOTPAY".equals(trade_state)) { | |||
return EnumProductOrderStatus.ORDER_STATUS_PENDING_PAYMENT; | |||
}else if ("CLOSED".equals(trade_state)) { | |||
return EnumProductOrderStatus.ORDER_STATUS_OVERTIME_CANCEL; | |||
}else if ("REVOKED".equals(trade_state)) { | |||
return EnumProductOrderStatus.ORDER_STATUS_PENDING_PAYMENT; | |||
}else if ("USERPAYING".equals(trade_state)) { | |||
return EnumProductOrderStatus.ORDER_STATUS_PENDING_PAYMENTING; | |||
}else if ("PAYERROR".equals(trade_state)) { | |||
return EnumProductOrderStatus.ORDER_STATUS_PENDING_PAYMENT; | |||
} | |||
return null; | |||
} | |||
public static int getPayStatusFromMap(Map<String, String> returnMap,String payOrderNo) { | |||
String return_code = returnMap.get("return_code"); | |||
@@ -0,0 +1,212 @@ | |||
package com.iformall.service.impl; | |||
import com.github.pagehelper.PageHelper; | |||
import com.github.pagehelper.PageInfo; | |||
import com.iformall.common.ErrorCode; | |||
import com.iformall.common.IdWorker; | |||
import com.iformall.common.ResultData; | |||
import com.iformall.domain.po.*; | |||
import com.iformall.enums.EnumProductOrderPayVendor; | |||
import com.iformall.enums.EnumProductOrderStatus; | |||
import com.iformall.enums.EnumProductType; | |||
import com.iformall.exception.MallinkException; | |||
import com.iformall.mapper.ProductMapper; | |||
import com.iformall.mapper.ProductOrderMapper; | |||
import com.iformall.service.ProductOrderService; | |||
import com.iformall.service.UserBasicPropertyService; | |||
import com.iformall.service.WxAppinfoService; | |||
import com.iformall.service.WxPayAccountService; | |||
import com.iformall.service.pay.PayServiceFactory; | |||
import com.iformall.service.pay.service.pay.PayAdapterService; | |||
import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | |||
import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | |||
import com.iformall.service.pay.service.share.PayShareAdapterService; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.springframework.aop.framework.AopContext; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.stereotype.Service; | |||
import org.springframework.transaction.annotation.Propagation; | |||
import org.springframework.transaction.annotation.Transactional; | |||
import java.util.Date; | |||
import java.util.List; | |||
@Service | |||
@Slf4j | |||
public class ProductOrderServiceImpl implements ProductOrderService { | |||
private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
@Autowired | |||
ProductOrderMapper productOrderMapper; | |||
@Autowired | |||
ProductMapper productMapper; | |||
@Autowired | |||
UserBasicPropertyService userBasicPropertyService; | |||
@Autowired | |||
WxAppinfoService wxAppinfoService; | |||
@Autowired | |||
WxPayAccountService wxPayAccountService; | |||
@Autowired | |||
PayServiceFactory payServiceFactory; | |||
@Override | |||
public PageInfo<ProductOrder> listAsPage(ProductOrder record, Integer pageIndex, Integer pageSize) { | |||
return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> productOrderMapper.findList(record)); | |||
} | |||
@Override | |||
public void saveOrUpdate(ProductOrder record) { | |||
Date now = new Date(); | |||
if (record.getId() == null) { | |||
final IdWorker idWorker = IdWorker.get(); | |||
record.setId(idWorker.nextId()); | |||
record.setOrderNumber(record.getId().toString()); | |||
record.setCreateDate(now); | |||
record.setUpdateDate(now); | |||
productOrderMapper.insert(record); | |||
} else { | |||
record.setUpdateDate(now); | |||
productOrderMapper.updateById(record); | |||
} | |||
} | |||
@Override | |||
public ProductOrder getById(Long id) { | |||
return productOrderMapper.selectById(id); | |||
} | |||
@Override | |||
public ResultData createPay(ProductOrder productOrder) { | |||
if(!EnumProductOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode().equals(productOrder.getOrderStatus())){ | |||
return new ResultData(ErrorCode.ORDER_HAD_PAY); | |||
} | |||
PayAdapterService payAdapterService = payServiceFactory.getPayAdapterService(productOrder.getPayVendor()); | |||
if(payAdapterService == null){ | |||
return new ResultData(ErrorCode.ORDER_IS_NOT_PAY.getCode(),"该订单不支持当前支付"); | |||
} | |||
EnumProductOrderPayVendor payVendoEnum = EnumProductOrderPayVendor.getEnum(productOrder.getPayVendor()); | |||
WxAppinfo appinfo = wxAppinfoService.getProjectCAppInfoFromRedis(productOrder.getProjectType(), payVendoEnum.getPlat()); | |||
if(appinfo == null){ | |||
return new ResultData(ErrorCode.ORDER_IS_NOT_PAY.getCode(),"未找到支付应用"); | |||
} | |||
WxPayAccount payAccount = wxPayAccountService.getByIdFromRedis(appinfo.getPayId()); | |||
if(payAccount == null){ | |||
return new ResultData(ErrorCode.ORDER_IS_NOT_PAY.getCode(),"未找到支付密钥"); | |||
} | |||
ResultData resultData = handleProductOrderByQuery(appinfo,payAccount,productOrder,payAdapterService); | |||
if(ResultData.SUCCESS != resultData.code){ | |||
return resultData; | |||
} | |||
if(!EnumProductOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode().equals(productOrder.getOrderStatus())){ | |||
return new ResultData(ErrorCode.ORDER_HAD_PAY); | |||
} | |||
try { | |||
PayAdapterResult payResult = payAdapterService.createPay(productOrder, appinfo, payAccount); | |||
if(payResult.isSuccess()){ | |||
ProductOrder updOrder = new ProductOrder(); | |||
updOrder.setId(productOrder.getId()); | |||
updOrder.setOrderId(payResult.getTransactionId()); | |||
updOrder.setUpdateDate(new Date()); | |||
productOrderMapper.updateById(updOrder); | |||
return new ResultData(payResult.getData()); | |||
}else{ | |||
return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), payResult.getMsg(), payResult.getData()); | |||
} | |||
} catch (Exception e) { | |||
e.printStackTrace(); | |||
return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(),"支付订单异常"); | |||
} | |||
} | |||
@Override | |||
public ResultData handleProductOrderByQuery(WxAppinfo appinfo,WxPayAccount payAccount,ProductOrder productOrder,PayAdapterService payAdapterService) { | |||
try { | |||
PayQueryAdapterResult result = payAdapterService.queryPayStatus(productOrder, appinfo, payAccount); | |||
Integer productOrderStatus = result.getCode(); | |||
if(productOrderStatus == null){ | |||
return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(),"查询支付单异常"); | |||
} | |||
if(EnumProductOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode().equals(productOrderStatus)){ | |||
ProductOrderServiceImpl proxy = (ProductOrderServiceImpl) AopContext.currentProxy(); | |||
proxy.handleProductOrderSuccess(productOrder,result); | |||
}else if(EnumProductOrderStatus.ORDER_STATUS_OVERTIME_CANCEL.getCode().equals(productOrderStatus) | |||
|| EnumProductOrderStatus.ORDER_STATUS_REFUND_SUCCESS.getCode().equals(productOrderStatus)){ | |||
productOrder.setOpenId(result.getOpenId()); | |||
productOrder.setTransactionId(result.getTransactionId()); | |||
productOrder.setPaymentTime(result.getPayTime()); | |||
productOrder.setPayWay(result.getWay()); | |||
productOrder.setOrderStatus(productOrderStatus); | |||
productOrder.setUpdateDate(new Date()); | |||
int num = productOrderMapper.orderPayUpdStatus(productOrder); | |||
}else if(EnumProductOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode().equals(productOrderStatus)){ | |||
}else{ | |||
return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(),"支付单状态异常"); | |||
} | |||
} catch (Exception e) { | |||
e.printStackTrace(); | |||
return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),e.getMessage()); | |||
} | |||
return new ResultData(); | |||
} | |||
@Override | |||
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) | |||
public void handleProductOrderSuccess(ProductOrder productOrder, PayQueryAdapterResult result) { | |||
if(!EnumProductOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode().equals(productOrder.getOrderStatus())){ | |||
return; | |||
} | |||
productOrder.setOpenId(result.getOpenId()); | |||
productOrder.setTransactionId(result.getTransactionId()); | |||
productOrder.setPaymentTime(result.getPayTime()); | |||
productOrder.setPayWay(result.getWay()); | |||
productOrder.setOrderStatus(result.getCode()); | |||
productOrder.setUpdateDate(new Date()); | |||
int num = productOrderMapper.orderPayUpdStatus(productOrder); | |||
if(num == 0){ | |||
return; | |||
}else if(num > 1){ | |||
throw new MallinkException(ErrorCode.ORDER_UPDATE_ERR); | |||
} | |||
Product product = productMapper.selectById(productOrder.getProductId()); | |||
if(EnumProductType.product_1.getCode().equals(product.getType())){ | |||
userBasicPropertyService.addRechargeGlod(productOrder.getUserId(),product.getProjectType(),productOrder.getId(),product.getGlod()); | |||
} | |||
} | |||
@Override | |||
public List<ProductOrder> findList(ProductOrder record) { | |||
return productOrderMapper.findList(record); | |||
} | |||
@Override | |||
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) | |||
public void handldSharing(ProductOrder order) { | |||
PayShareAdapterService payShareAdapterService = payServiceFactory.getPayShareAdapterService(order.getPayVendor()); | |||
payShareAdapterService.noReciverShare() | |||
} | |||
} |
@@ -0,0 +1,35 @@ | |||
package com.iformall.service.impl; | |||
import com.github.pagehelper.PageHelper; | |||
import com.github.pagehelper.PageInfo; | |||
import com.iformall.domain.po.Product; | |||
import com.iformall.mapper.ProductMapper; | |||
import com.iformall.service.ProductService; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.stereotype.Service; | |||
import java.util.Date; | |||
@Service | |||
@Slf4j | |||
public class ProductServiceImpl implements ProductService { | |||
private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
@Autowired | |||
ProductMapper productFromMapper; | |||
@Override | |||
public PageInfo<Product> listAsPage(Product record, Integer pageIndex, Integer pageSize) { | |||
return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> productFromMapper.findList(record)); | |||
} | |||
@Override | |||
public Product getById(Long id) { | |||
return productFromMapper.selectById(id); | |||
} | |||
} |
@@ -0,0 +1,46 @@ | |||
package com.iformall.service.impl; | |||
import com.github.pagehelper.PageHelper; | |||
import com.github.pagehelper.PageInfo; | |||
import com.iformall.domain.po.UserBasicFrom; | |||
import com.iformall.mapper.UserBasicFromMapper; | |||
import com.iformall.service.UserBasicFromService; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.stereotype.Service; | |||
import java.util.Date; | |||
@Service | |||
@Slf4j | |||
public class UserBasicFromServiceImpl implements UserBasicFromService { | |||
private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
@Autowired | |||
UserBasicFromMapper userBasicFromMapper; | |||
@Override | |||
public PageInfo<UserBasicFrom> listAsPage(UserBasicFrom record, Integer pageIndex, Integer pageSize) { | |||
return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> userBasicFromMapper.findList(record)); | |||
} | |||
@Override | |||
public void saveForm(UserBasicFrom from) { | |||
if(from.getId() == null){ | |||
return; | |||
} | |||
from.setCreateDate(new Date()); | |||
try{ | |||
int insert = userBasicFromMapper.insert(from); | |||
if(insert == 1){ | |||
//todo 邀请逻辑 | |||
} | |||
}catch(Exception e){} | |||
} | |||
} |
@@ -0,0 +1,29 @@ | |||
package com.iformall.service.impl; | |||
import com.github.pagehelper.PageHelper; | |||
import com.github.pagehelper.PageInfo; | |||
import com.iformall.domain.po.UserBasicPropertyLog; | |||
import com.iformall.mapper.UserBasicPropertyLogMapper; | |||
import com.iformall.service.UserBasicPropertyLogService; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.stereotype.Service; | |||
@Service | |||
@Slf4j | |||
public class UserBasicPropertyLogServiceImpl implements UserBasicPropertyLogService { | |||
private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
@Autowired | |||
UserBasicPropertyLogMapper userBasicPropertyLogMapper; | |||
@Override | |||
public PageInfo<UserBasicPropertyLog> listAsPage(UserBasicPropertyLog record, Integer pageIndex, Integer pageSize) { | |||
return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> userBasicPropertyLogMapper.findList(record)); | |||
} | |||
} |
@@ -0,0 +1,95 @@ | |||
package com.iformall.service.impl; | |||
import com.github.pagehelper.PageHelper; | |||
import com.github.pagehelper.PageInfo; | |||
import com.iformall.common.ErrorCode; | |||
import com.iformall.common.IdWorker; | |||
import com.iformall.domain.po.*; | |||
import com.iformall.enums.EnumProductOrderStatus; | |||
import com.iformall.enums.EnumProductType; | |||
import com.iformall.enums.EnumProject; | |||
import com.iformall.enums.EnumPropertyLogType; | |||
import com.iformall.exception.MallinkException; | |||
import com.iformall.mapper.ProductMapper; | |||
import com.iformall.mapper.UserBasicPropertyLogMapper; | |||
import com.iformall.mapper.UserBasicPropertyMapper; | |||
import com.iformall.mapper.WxCUserBasicInfoMapper; | |||
import com.iformall.service.UserBasicPropertyService; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.stereotype.Service; | |||
import org.springframework.transaction.annotation.Propagation; | |||
import org.springframework.transaction.annotation.Transactional; | |||
import java.util.Date; | |||
@Service | |||
@Slf4j | |||
public class UserBasicPropertyServiceImpl implements UserBasicPropertyService { | |||
private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
@Autowired | |||
UserBasicPropertyMapper userBasicPropertyMapper; | |||
@Autowired | |||
ProductMapper productMapper; | |||
@Autowired | |||
WxCUserBasicInfoMapper wxCUserBasicInfoMapper; | |||
@Autowired | |||
UserBasicPropertyLogMapper userBasicPropertyLogMapper; | |||
@Override | |||
public PageInfo<UserBasicProperty> listAsPage(UserBasicProperty record, Integer pageIndex, Integer pageSize) { | |||
return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> userBasicPropertyMapper.findList(record)); | |||
} | |||
@Override | |||
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) | |||
public void addRechargeGlod(Long userId, Integer projectType, Long extraId, Integer glod) { | |||
WxCUserBasicInfo basicInfo = wxCUserBasicInfoMapper.selectById(userId); | |||
if(basicInfo == null){ | |||
throw new MallinkException(ErrorCode.USER_IS_EMPTY); | |||
} | |||
Date now = new Date(); | |||
UserBasicProperty userBasicProperty = userBasicPropertyMapper.selectById(userId); | |||
Integer befourGold = 0; | |||
if(EnumProject.PROJECT_5.getCode().equals(projectType)){ | |||
if(userBasicProperty == null){ | |||
userBasicProperty = new UserBasicProperty(); | |||
userBasicProperty.setId(userId); | |||
userBasicProperty.setDigitalAvatarGlod(glod); | |||
userBasicProperty.setDigitalAvatarResidueGlod(glod); | |||
userBasicProperty.setUpdateDate(now); | |||
userBasicPropertyMapper.insert(userBasicProperty); | |||
}else{ | |||
befourGold = userBasicProperty.getDigitalAvatarResidueGlod(); | |||
userBasicProperty.setDigitalAvatarGlod(glod); | |||
userBasicProperty.setDigitalAvatarResidueGlod(glod); | |||
userBasicProperty.setUpdateDate(now); | |||
userBasicPropertyMapper.addGlod(userBasicProperty); | |||
} | |||
UserBasicPropertyLog userBasicPropertyLog = new UserBasicPropertyLog(); | |||
final IdWorker idWorker = IdWorker.get(); | |||
userBasicPropertyLog.setId(idWorker.nextId()); | |||
userBasicPropertyLog.setUserId(userId); | |||
userBasicPropertyLog.setProjectType(projectType); | |||
userBasicPropertyLog.setType(EnumPropertyLogType.RECHARGE.getCode()); | |||
userBasicPropertyLog.setBefourGold(befourGold); | |||
userBasicPropertyLog.setGoldNum(glod); | |||
userBasicPropertyLog.setAfterGold(befourGold+glod); | |||
userBasicPropertyLog.setExtraId(extraId); | |||
userBasicPropertyLog.setCreateDate(now); | |||
userBasicPropertyLogMapper.insert(userBasicPropertyLog); | |||
} | |||
} | |||
} |
@@ -8,10 +8,7 @@ import com.iformall.domain.po.WxAppinfo; | |||
import com.iformall.domain.po.WxCoupon; | |||
import com.iformall.domain.po.WxProjectConfig; | |||
import com.iformall.domain.po.base.TenantEntity; | |||
import com.iformall.enums.EnumAppPlat; | |||
import com.iformall.enums.EnumAppType; | |||
import com.iformall.enums.EnumCouponType; | |||
import com.iformall.enums.EnumPayWay; | |||
import com.iformall.enums.*; | |||
import com.iformall.mapper.WxAppinfoMapper; | |||
import com.iformall.service.WxAppinfoService; | |||
import com.iformall.service.WxMallService; | |||
@@ -239,6 +236,37 @@ public class WxAppinfoServiceImpl implements WxAppinfoService { | |||
return record; | |||
} | |||
@Override | |||
public WxAppinfo getProjectCAppInfo(Integer projectType, Integer plat) { | |||
if(projectType == null || plat == null){ | |||
return null; | |||
} | |||
WxAppinfo appinfoQ = new WxAppinfo(); | |||
appinfoQ.setProjectType(projectType); | |||
appinfoQ.setPlat(plat); | |||
appinfoQ.setType(EnumAppType.C.getCode()); | |||
WxAppinfo appInfo = wxAppinfoMapper.selectOne(new QueryWrapper<>(appinfoQ)); | |||
return appInfo; | |||
} | |||
@Override | |||
public WxAppinfo getProjectCAppInfoFromRedis(Integer projectType, Integer plat) { | |||
if(projectType == null || plat == null){ | |||
return null; | |||
} | |||
WxAppinfo record = null; | |||
String key = Constant.appinfoPrev + projectType + "-" + plat | |||
+ "-" + EnumAppType.C.getCode(); | |||
record = RedisCacheUtils.getCacheObject(wxAppinfoRedisTemplate, key, WxAppinfo.class); | |||
if (null == record) { | |||
record = this.getProjectCAppInfo(projectType, plat); | |||
if(record != null){ | |||
RedisCacheUtils.cache(wxAppinfoRedisTemplate, key, record, 3600*24*7); | |||
} | |||
} | |||
return record; | |||
} | |||
private void deleteRedis(Long id){ | |||
WxAppinfo record = this.getById(id); | |||
if(record != null){ | |||
@@ -991,6 +991,7 @@ public class WxCUserBasicInfoServiceImpl implements WxCUserBasicInfoService,IExc | |||
@Override | |||
public void update(WxCUserBasicInfo record) { | |||
record.setUpdateDate(new Date()); | |||
wxCUserBasicInfoMapper.updateById(record); | |||
} | |||
@@ -4,6 +4,7 @@ import java.util.Map; | |||
import java.util.concurrent.ConcurrentHashMap; | |||
import com.iformall.enums.EnumAppPlat; | |||
import com.iformall.enums.EnumPayVersion; | |||
import com.iformall.enums.EnumProductOrderPayVendor; | |||
import com.iformall.service.pay.service.refund.douyin.TtRefundAdapterService; | |||
import com.iformall.service.pay.service.refund.wx.v2.WxRefundAdapterService; | |||
import com.iformall.service.pay.service.refund.wx.v3.WxRefundV3AdapterService; | |||
@@ -45,6 +46,9 @@ public class PayServiceFactory { | |||
private Map<String,PayShareAdapterService> shareMap = null; | |||
private Map<String,RefundPayAdapterService> refundMap = null; | |||
private Map<String,CashOutAdapterService> cashoutMap = null; | |||
private Map<String,PayAdapterService> payVendorServiceMap = null; | |||
private Map<String,PayShareAdapterService> payVendorShareMap = null; | |||
@Autowired | |||
WxMiniAppPayAdapterService wxMiniAppPayService; | |||
@@ -118,6 +122,18 @@ public class PayServiceFactory { | |||
} | |||
return qrcodeMap; | |||
} | |||
private Map<String,PayAdapterService> getPayVendorServiceMap() { | |||
if (null == payVendorServiceMap) { | |||
payVendorServiceMap = new ConcurrentHashMap<String,PayAdapterService>(); | |||
payVendorServiceMap.put(EnumProductOrderPayVendor.PAY_WAY_WECHAT.getCode()+"_", wxMiniAppPayV3AdapterService); | |||
payVendorServiceMap.put(EnumProductOrderPayVendor.PAY_WAY_WECHAT_WAP.getCode()+"_", wxH5PayService); | |||
// payVendorServiceMap.put(EnumProductOrderPayVendor.PAY_WAY_ALIPAY.getCode()+"_", ); | |||
// payVendorServiceMap.put(EnumProductOrderPayVendor.PAY_WAY_ALIPAY_WAP.getCode()+"_",); | |||
payVendorServiceMap.put(EnumProductOrderPayVendor.PAY_WAY_TT.getCode()+"_",ttMiniAppPayService); | |||
} | |||
return payVendorServiceMap; | |||
} | |||
private Map<String,PayShareAdapterService> getShareMap(){ | |||
if (null == shareMap ) { | |||
@@ -170,6 +186,18 @@ public class PayServiceFactory { | |||
} | |||
return shareMap; | |||
} | |||
private Map<String,PayShareAdapterService> getPayVendorShareMap(){ | |||
if (null == payVendorShareMap ) { | |||
payVendorShareMap = new ConcurrentHashMap<String, PayShareAdapterService>(); | |||
payVendorShareMap.put(EnumProductOrderPayVendor.PAY_WAY_WECHAT.getCode()+"_", wxPayShareV3Service); | |||
payVendorShareMap.put(EnumProductOrderPayVendor.PAY_WAY_WECHAT_WAP.getCode()+"_", null); | |||
// payVendorShareMap.put(EnumProductOrderPayVendor.PAY_WAY_ALIPAY.getCode()+"_", ); | |||
// payVendorShareMap.put(EnumProductOrderPayVendor.PAY_WAY_ALIPAY_WAP.getCode()+"_",); | |||
payVendorShareMap.put(EnumProductOrderPayVendor.PAY_WAY_TT.getCode()+"_",ttShareService); | |||
} | |||
return payVendorShareMap; | |||
} | |||
private Map<String,RefundPayAdapterService> getRefundMap(){ | |||
if (null == refundMap ) { | |||
@@ -202,6 +230,14 @@ public class PayServiceFactory { | |||
return service; | |||
} | |||
public PayAdapterService getPayAdapterService(Integer payVendor) throws MallinkException{ | |||
PayAdapterService service = getPayVendorServiceMap().get(payVendor+"_"); | |||
if (null == service) { | |||
throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(),"payWay["+payVendor+"] 支付service未找到"); | |||
} | |||
return service; | |||
} | |||
public PayAdapterService getQrcodeService(Integer type,Integer payVersion) throws MallinkException{ | |||
PayAdapterService service = getQrcodeMap().get(type+"_"+payVersion); | |||
if (null == service) { | |||
@@ -241,6 +277,14 @@ public class PayServiceFactory { | |||
} | |||
return shareService; | |||
} | |||
public PayShareAdapterService getPayShareAdapterService(Integer payVendor) throws MallinkException{ | |||
PayShareAdapterService shareService = getPayVendorShareMap().get(payVendor+"_"); | |||
if (null == shareService) { | |||
throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(),"payWay["+payVendor+"] 分账service未找到"); | |||
} | |||
return shareService; | |||
} | |||
public RefundPayAdapterService getRefundPayAdapterService(Integer type,Integer payVersion) throws MallinkException{ | |||
RefundPayAdapterService refundService = getRefundMap().get(type+"_"+payVersion); | |||
@@ -29,6 +29,15 @@ public interface PayAdapterService { | |||
*/ | |||
public PayAdapterResult pay(WxPayAccount payAccount,WxPayOrder record ,WxComposeOrder composeOrder,List<WxOrder> childOrders,String productName,EnumPayShare isShare,WxAppinfo appInfo,Date currentDate, PayExtraParam params) throws Exception; | |||
/** | |||
* 真正支付过程,调用对应端的API调用支付 | |||
* @param payAccount WxPayAccount | |||
* @param order ProductOrder | |||
* @param appInfo C端app | |||
* @throws Exception | |||
*/ | |||
public PayAdapterResult createPay(ProductOrder order,WxAppinfo appInfo,WxPayAccount payAccount) throws Exception; | |||
/** | |||
* 查询支付结果,调用对应端的API查询支付结果 | |||
* @param oldRecord WxPayOrder | |||
@@ -39,6 +48,8 @@ public interface PayAdapterService { | |||
* @throws Exception | |||
*/ | |||
public PayQueryAdapterResult queryPayStatus(WxPayOrder oldRecord,WxAppinfo appInfo,WxPayAccount payAccount) throws Exception; | |||
public PayQueryAdapterResult queryPayStatus(ProductOrder order,WxAppinfo appInfo,WxPayAccount payAccount) throws Exception; | |||
/** | |||
* 根据返回结果对象解析出支付状态 | |||
@@ -11,6 +11,7 @@ import com.iformall.domain.vo.WxOrderCouponVo; | |||
import com.iformall.douyin.miniapp.api.TtMaService; | |||
import com.iformall.douyin.pay.DouYinPayHelper; | |||
import com.iformall.douyin.pay.TtPayService; | |||
import com.iformall.douyin.pay.orderQuery.OrderQueryResult; | |||
import com.iformall.douyin.pay.preOrder.CreatePreOrderResult; | |||
import com.iformall.douyin.pay.preOrder.DouYinCreatePreOrder; | |||
import com.iformall.douyin.payv2.request.TtPayUnifiedOrderV2Request; | |||
@@ -19,6 +20,7 @@ import com.iformall.enums.*; | |||
import com.iformall.exception.MallinkException; | |||
import com.iformall.mapper.*; | |||
import com.iformall.service.WxCouponService; | |||
import com.iformall.service.helper.WxPayOrderServiceHelper; | |||
import com.iformall.service.order.OrderAdapterService; | |||
import com.iformall.service.order.OrderFactory; | |||
import com.iformall.service.order.entity.WxComposeChildOrderShare; | |||
@@ -221,12 +223,52 @@ public class TtMiniAppPayAdapterService extends BaseTtPayAdapterService implemen | |||
// return par; | |||
} | |||
@Override | |||
public PayAdapterResult createPay(ProductOrder order, WxAppinfo appInfo, WxPayAccount payAccount) throws Exception { | |||
DouYinCreatePreOrder preOrder = new DouYinCreatePreOrder(); | |||
preOrder.setAppId(appInfo.getAppId()); | |||
preOrder.setSercrect(appInfo.getSecret()); | |||
preOrder.setSalt(payAccount.getApiKey()); | |||
preOrder.setOutOrderNo(order.getOrderNumber()); | |||
preOrder.setTotalAmount(order.getOrderPrice()); | |||
preOrder.setSubject(appInfo.getName()+"-"+order.getProductTitle()); | |||
preOrder.setBody(appInfo.getName()+"-"+order.getProductTitle()); | |||
preOrder.setValidTime(30*60); | |||
// preOrder.setNotifyUrl();//回调地址 | |||
// preOrder.setThirdpartyId();//第三方服务商ID | |||
// preOrder.setStoreId(record.getStoreId()); | |||
CreatePreOrderResult preOrderResult = DouYinPayHelper.createPreOrder(preOrder); | |||
PayAdapterResult par = new PayAdapterResult(); | |||
par.setSuccess(preOrderResult.isSuccess()); | |||
par.setMsg(preOrderResult.getMsg()); | |||
par.setTransactionId(preOrderResult.getOrderId()); | |||
par.setData(preOrderResult); | |||
return par; | |||
} | |||
@Override | |||
public PayQueryAdapterResult queryPayStatus(WxPayOrder oldRecord, WxAppinfo appInfo, | |||
WxPayAccount payAccount) throws Exception { | |||
return super.queryPayStatus(oldRecord,appInfo, payAccount); | |||
} | |||
@Override | |||
public PayQueryAdapterResult queryPayStatus(ProductOrder order, WxAppinfo appInfo, WxPayAccount payAccount) throws Exception { | |||
OrderQueryResult orderQueryResult = DouYinPayHelper.orderQuery(appInfo.getAppId(), payAccount.getApiKey(), order.getOrderNumber(), null); | |||
int code = DouYinPayHelper.getPayStatusFromOrderQueryResult(orderQueryResult,order.getOrderNumber()); | |||
PayQueryAdapterResult result = new PayQueryAdapterResult(); | |||
result.setCode(code); | |||
result.setMsg(EnumProductOrderStatus.getEnum(code).getMessage()); | |||
result.setTransactionId(orderQueryResult.getChannelNo()); | |||
result.setWay(orderQueryResult.getWay()); | |||
if(StringUtils.isNotBlank(orderQueryResult.getPayTime())){ | |||
result.setPayTime(DateUtils.stringToDate(orderQueryResult.getPayTime(),DateUtils.DATE_TIME_PATTERN)); | |||
} | |||
return result; | |||
} | |||
@Override | |||
public int queryPayStatus(PayQueryAdapterResult statusObject, String orderOutNo) throws Exception { | |||
return super.queryPayStatus(statusObject, orderOutNo); | |||
@@ -1,6 +1,7 @@ | |||
package com.iformall.service.pay.service.pay.entity; | |||
import java.io.Serializable; | |||
import java.util.Date; | |||
import lombok.Data; | |||
import lombok.ToString; | |||
@@ -10,8 +11,10 @@ import lombok.ToString; | |||
public class PayQueryAdapterResult implements Serializable{ | |||
private static final long serialVersionUID = -8271349001408799798L; | |||
public PayQueryAdapterResult(){} | |||
public PayQueryAdapterResult(int code, String msg, Integer way, Object data,String transactionId,String endTimeStr) { | |||
public PayQueryAdapterResult(Integer code, String msg, Integer way, Object data,String transactionId,String endTimeStr) { | |||
this.code = code; | |||
this.msg = msg; | |||
this.way = way; | |||
@@ -20,16 +23,22 @@ public class PayQueryAdapterResult implements Serializable{ | |||
this.endTimeStr = endTimeStr; | |||
} | |||
private int code; | |||
private Integer code; | |||
private Integer way; | |||
private String msg; | |||
//抖音支付方式 | |||
private Integer way; | |||
private Object data; | |||
//支付订单号 | |||
private String transactionId; | |||
private String openId; | |||
//支付时间 | |||
private Date payTime; | |||
private String endTimeStr; | |||
} |
@@ -29,6 +29,11 @@ public class WxH5PaySFTService extends BaseWxPaySFTAdapterService implements CDr | |||
return null; | |||
} | |||
@Override | |||
public PayAdapterResult createPay(ProductOrder order, WxAppinfo appInfo, WxPayAccount payAccount) throws Exception { | |||
return null; | |||
} | |||
@Override | |||
public PayQueryAdapterResult queryPayStatus(WxPayOrder oldRecord, WxAppinfo appInfo, | |||
WxPayAccount payAccount) throws Exception { | |||
@@ -36,6 +41,11 @@ public class WxH5PaySFTService extends BaseWxPaySFTAdapterService implements CDr | |||
return null; | |||
} | |||
@Override | |||
public PayQueryAdapterResult queryPayStatus(ProductOrder order, WxAppinfo appInfo, WxPayAccount payAccount) throws Exception { | |||
return null; | |||
} | |||
@Override | |||
public int queryPayStatus(PayQueryAdapterResult statusObject, String orderOutNo) throws Exception { | |||
//return super.queryPayStatus(statusObject, orderOutNo); | |||
@@ -193,7 +193,12 @@ public class WxMiniAppPaySFTAdapterService extends BaseWxPaySFTAdapterService i | |||
// return getOrderPResult(response); | |||
} | |||
} | |||
@Override | |||
public PayAdapterResult createPay(ProductOrder order, WxAppinfo appInfo, WxPayAccount payAccount) throws Exception { | |||
return null; | |||
} | |||
private PayQueryAdapterResult getPayCommonQueryResult(String response) { | |||
JSONObject result = JSON.parseObject(response); | |||
String transtionId = result.getString("transaction_id"); | |||
@@ -261,6 +266,11 @@ public class WxMiniAppPaySFTAdapterService extends BaseWxPaySFTAdapterService i | |||
} | |||
} | |||
@Override | |||
public PayQueryAdapterResult queryPayStatus(ProductOrder order, WxAppinfo appInfo, WxPayAccount payAccount) throws Exception { | |||
return null; | |||
} | |||
@Override | |||
public int queryPayStatus(PayQueryAdapterResult statusObject, String orderOutNo) throws Exception { | |||
return getPayCommonQueryResult((String)statusObject.getData()).getCode(); | |||
@@ -28,12 +28,22 @@ public class WxH5PayService extends BaseWxPayV2AdapterService implements CDrivi | |||
return null; | |||
} | |||
@Override | |||
public PayAdapterResult createPay(ProductOrder order, WxAppinfo appInfo, WxPayAccount payAccount) throws Exception { | |||
return null; | |||
} | |||
@Override | |||
public PayQueryAdapterResult queryPayStatus(WxPayOrder oldRecord, WxAppinfo appInfo, | |||
WxPayAccount payAccount) throws Exception { | |||
return super.queryPayStatus(oldRecord, appInfo, payAccount); | |||
} | |||
@Override | |||
public PayQueryAdapterResult queryPayStatus(ProductOrder order, WxAppinfo appInfo, WxPayAccount payAccount) throws Exception { | |||
return null; | |||
} | |||
@Override | |||
public int queryPayStatus(PayQueryAdapterResult statusObject, String orderOutNo) throws Exception { | |||
return super.queryPayStatus(statusObject, orderOutNo); | |||
@@ -248,13 +248,23 @@ public class WxMiniAppPayAdapterService extends BaseWxPayV2AdapterService implem | |||
} | |||
} | |||
@Override | |||
@Override | |||
public PayAdapterResult createPay(ProductOrder order, WxAppinfo appInfo, WxPayAccount payAccount) throws Exception { | |||
return null; | |||
} | |||
@Override | |||
public PayQueryAdapterResult queryPayStatus(WxPayOrder oldRecord, WxAppinfo appInfo, | |||
WxPayAccount payAccount) throws Exception { | |||
return super.queryPayStatus(oldRecord,appInfo, payAccount); | |||
} | |||
@Override | |||
@Override | |||
public PayQueryAdapterResult queryPayStatus(ProductOrder order, WxAppinfo appInfo, WxPayAccount payAccount) throws Exception { | |||
return null; | |||
} | |||
@Override | |||
public int queryPayStatus(PayQueryAdapterResult statusObject, String orderOutNo) throws Exception { | |||
return super.queryPayStatus(statusObject, orderOutNo); | |||
} | |||
@@ -216,8 +216,13 @@ public class WxMiniMaPayAdapterService extends BaseWxPayV2AdapterService impleme | |||
} | |||
} | |||
@Autowired | |||
@Override | |||
public PayAdapterResult createPay(ProductOrder order, WxAppinfo appInfo, WxPayAccount payAccount) throws Exception { | |||
return null; | |||
} | |||
@Autowired | |||
WxCUserMapper wxCUserMapper; | |||
@Autowired | |||
WxCUserService wxCUserService; | |||
@@ -250,7 +255,12 @@ public class WxMiniMaPayAdapterService extends BaseWxPayV2AdapterService impleme | |||
return super.queryPayStatus(oldRecord,appInfo, payAccount); | |||
} | |||
@Override | |||
@Override | |||
public PayQueryAdapterResult queryPayStatus(ProductOrder order, WxAppinfo appInfo, WxPayAccount payAccount) throws Exception { | |||
return null; | |||
} | |||
@Override | |||
public int queryPayStatus(PayQueryAdapterResult statusObject, String orderOutNo) throws Exception { | |||
return super.queryPayStatus(statusObject, orderOutNo); | |||
} | |||
@@ -0,0 +1,17 @@ | |||
package com.iformall.service.pay.service.pay.wx.v3.entity; | |||
import lombok.Data; | |||
@Data | |||
public class V3CreatePayReq { | |||
private String appid;// | |||
private String mchid;// | |||
private String description;//商品描述 | |||
private String out_trade_no;//商户订单号 | |||
private String attach;//附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用,实际情况下只有支付完成状态才会返回该字段。 | |||
private String notify_url;//通知地址,不允许携带查询串 | |||
private V3PaySettleReq settle_info;//结算信息 | |||
private V3PayAmountReq amount;//订单金额 | |||
private V3Payer payer;//支付者 | |||
} |
@@ -0,0 +1,13 @@ | |||
package com.iformall.service.pay.service.pay.wx.v3.entity; | |||
import com.alibaba.fastjson.annotation.JSONField; | |||
import lombok.Data; | |||
@Data | |||
public class V3PayQuery { | |||
private String mchid; | |||
private String out_trade_no;//商户订单号 | |||
} |
@@ -0,0 +1,10 @@ | |||
package com.iformall.service.pay.service.pay.wx.v3.entity; | |||
import lombok.Data; | |||
@Data | |||
public class V3Payer { | |||
private String openid;//用户在子商户appid下的唯一标识 | |||
} |
@@ -9,6 +9,9 @@ import java.util.List; | |||
import java.util.Map; | |||
import com.iformall.domain.po.*; | |||
import com.iformall.enums.*; | |||
import com.iformall.service.pay.service.pay.wx.v3.entity.*; | |||
import com.iformall.utils.*; | |||
import org.apache.commons.lang3.StringUtils; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.stereotype.Service; | |||
@@ -21,11 +24,6 @@ import com.github.binarywang.wxpay.service.WxPayService; | |||
import com.iformall.common.ErrorCode; | |||
import com.iformall.common.Result; | |||
import com.iformall.common.ResultData; | |||
import com.iformall.enums.EnumOrderStatus; | |||
import com.iformall.enums.EnumPayMchType; | |||
import com.iformall.enums.EnumPayMode; | |||
import com.iformall.enums.EnumPayShare; | |||
import com.iformall.enums.EnumPayStatus; | |||
import com.iformall.exception.MallinkException; | |||
import com.iformall.pay.WxPay; | |||
import com.iformall.pay.WxPayOrderP; | |||
@@ -49,18 +47,6 @@ import com.iformall.service.pay.service.pay.wx.sft.entity.SFTPaySettleReq; | |||
import com.iformall.service.pay.service.pay.wx.sft.entity.SFTPayerReq; | |||
import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayV2AdapterService; | |||
import com.iformall.service.pay.service.pay.wx.v3.BaseWxPayV3AdapterService; | |||
import com.iformall.service.pay.service.pay.wx.v3.entity.V3CombineItemOrder; | |||
import com.iformall.service.pay.service.pay.wx.v3.entity.V3CombinePayCommonMiniAppReq; | |||
import com.iformall.service.pay.service.pay.wx.v3.entity.V3CombinePayerReq; | |||
import com.iformall.service.pay.service.pay.wx.v3.entity.V3PayAmountReq; | |||
import com.iformall.service.pay.service.pay.wx.v3.entity.V3PayCommonMiniAppReq; | |||
import com.iformall.service.pay.service.pay.wx.v3.entity.V3PayQueryReq; | |||
import com.iformall.service.pay.service.pay.wx.v3.entity.V3PaySettleReq; | |||
import com.iformall.service.pay.service.pay.wx.v3.entity.V3PayerReq; | |||
import com.iformall.utils.BeanUtils; | |||
import com.iformall.utils.MaUtil; | |||
import com.iformall.utils.MapUtil; | |||
import com.iformall.utils.Utility; | |||
import lombok.extern.slf4j.Slf4j; | |||
@@ -109,8 +95,32 @@ public class WxMiniAppPayV3AdapterService extends BaseWxPayV3AdapterService impl | |||
return req; | |||
} | |||
private V3CreatePayReq generateCreatePayRequest(ProductOrder productOrder,WxAppinfo appInfo,WxPayAccount payAccount) throws Exception { | |||
V3CreatePayReq req = new V3CreatePayReq(); | |||
req.setAppid(appInfo.getAppId()); | |||
req.setMchid(payAccount.getMchId()); | |||
try { | |||
//中文必须要这样,否则会双方签名失败 | |||
req.setDescription(WxPayV3.handleChinese(appInfo.getName()+"-"+productOrder.getProductTitle())); | |||
} catch (UnsupportedEncodingException e) { | |||
req.setDescription("weixin miniApp product"); | |||
} | |||
req.setOut_trade_no(productOrder.getOrderNumber()); | |||
req.setNotify_url(payAccount.getPayNotifyV3Url()); | |||
V3PayAmountReq amout = new V3PayAmountReq(); | |||
amout.setTotal(productOrder.getOrderPrice()); | |||
req.setAmount(amout); | |||
V3Payer payer = new V3Payer(); | |||
payer.setOpenid(productOrder.getOpenId()); | |||
req.setPayer(payer); | |||
return req; | |||
} | |||
private PayAdapterResult getOrderPResult(String response,WxPayOrder record,WxPayAccount payAccount,WxAppinfo appInfo,WxPayService payService) { | |||
private PayAdapterResult getOrderPResult(String response,WxPayService payService,WxAppinfo appInfo,WxPayAccount payAccount,String order_no) { | |||
PayAdapterResult par = new PayAdapterResult(); | |||
if (StringUtils.isBlank(response)) { | |||
par.setSuccess(false); | |||
@@ -124,15 +134,13 @@ public class WxMiniAppPayV3AdapterService extends BaseWxPayV3AdapterService impl | |||
}else { | |||
par.setSuccess(true); | |||
par.setMsg("success."); | |||
record.setPrepayId(prepayId); | |||
record.setUpdateTime(new Date()); | |||
par.setData(getPayRetMap(payService,appInfo, prepayId, payAccount, record)); | |||
par.setData(getPayRetMap(payService,appInfo, prepayId, order_no)); | |||
} | |||
} | |||
return par; | |||
} | |||
private Map getPayRetMap(WxPayService payService,WxAppinfo appInfo,String prepayId,WxPayAccount payAccount,WxPayOrder record) { | |||
private Map getPayRetMap(WxPayService payService,WxAppinfo appInfo,String prepayId,String order_no) { | |||
String timestamp = String.valueOf(Utility.getCurrentTimeStamp()); | |||
String noncestr = Utility.generate32UUID(); | |||
String signAgent = WxPayV3.getMiniAppPayEntry(payService, appInfo.getAppId(), timestamp, noncestr, prepayId); | |||
@@ -143,7 +151,7 @@ public class WxMiniAppPayV3AdapterService extends BaseWxPayV3AdapterService impl | |||
returnMap.put("package", "prepay_id=" + prepayId); | |||
returnMap.put("paySign", signAgent); | |||
returnMap.put("signType", "RSA"); | |||
returnMap.put("payOrderId", String.valueOf(record.getId())); | |||
returnMap.put("payOrderId", order_no); | |||
return returnMap; | |||
} | |||
@@ -210,7 +218,7 @@ public class WxMiniAppPayV3AdapterService extends BaseWxPayV3AdapterService impl | |||
V3PayCommonMiniAppReq payReq = generatePayCommonRequest(payAccount,composeOrder,productName,record,openId,appInfo,currentDate); | |||
try { | |||
String response = WxPayV3.payCommonWithMiniApp(payService, payReq); | |||
return getOrderPResult(response,record,payAccount,appInfo,payService); | |||
return getOrderPResult(response,payService,appInfo,payAccount,record.getId().toString()); | |||
}catch(WxPayException e) { | |||
log.error("wexin pay v3 error",e); | |||
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),e.getCustomErrorMsg()); | |||
@@ -225,6 +233,21 @@ public class WxMiniAppPayV3AdapterService extends BaseWxPayV3AdapterService impl | |||
} | |||
} | |||
@Override | |||
public PayAdapterResult createPay(ProductOrder order, WxAppinfo appInfo, WxPayAccount payAccount) throws Exception { | |||
WxPayService payService = maUtil.getWxPayServiceBySelfModel(appInfo, payAccount); | |||
V3CreatePayReq payReq = generateCreatePayRequest(order,appInfo,payAccount); | |||
try { | |||
String response = WxPayV3.payCommonWithMiniApp(payService, payReq); | |||
return getOrderPResult(response,payService,appInfo,payAccount,order.getOrderNumber()); | |||
}catch(WxPayException e) { | |||
log.error("wexin pay v3 error",e); | |||
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),e.getCustomErrorMsg()); | |||
} | |||
} | |||
private PayQueryAdapterResult getPayCommonQueryResult(String response) { | |||
JSONObject result = JSON.parseObject(response); | |||
String transtionId = result.getString("transaction_id"); | |||
@@ -241,6 +264,33 @@ public class WxMiniAppPayV3AdapterService extends BaseWxPayV3AdapterService impl | |||
PayQueryAdapterResult qresult = new PayQueryAdapterResult(payStatus.getCode(), tradeStateDesc,null, response,transtionId,successTime); | |||
return qresult; | |||
} | |||
private PayQueryAdapterResult getPayQueryResult(String response) { | |||
JSONObject result = JSON.parseObject(response); | |||
String transtionId = result.getString("transaction_id"); | |||
String tradeState = result.getString("trade_state"); | |||
String tradeStateDesc = result.getString("trade_state_desc"); | |||
String successTime = result.getString("success_time"); | |||
JSONObject payer = result.getJSONObject("payer"); | |||
String openid = payer.getString("openid"); | |||
EnumProductOrderStatus payStatus = WxPayOrderServiceHelper.getProductOrderStatus(tradeState); | |||
if (null == payStatus) { | |||
throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "订单查询微信支付状态非法["+tradeState+"]"); | |||
} | |||
if (StringUtils.isBlank(tradeStateDesc)) { | |||
tradeStateDesc = payStatus.getMessage(); | |||
} | |||
PayQueryAdapterResult qresult = new PayQueryAdapterResult(); | |||
qresult.setCode(payStatus.getCode()); | |||
qresult.setMsg(tradeStateDesc); | |||
qresult.setTransactionId(transtionId); | |||
qresult.setOpenId(openid); | |||
if(StringUtils.isNotBlank(successTime)){ | |||
qresult.setPayTime(DateUtils.rfc3339Formatter(successTime)); | |||
} | |||
return qresult; | |||
} | |||
private PayQueryAdapterResult getPayCombineQueryResult(String response) { | |||
JSONObject result = JSON.parseObject(response); | |||
@@ -298,6 +348,44 @@ public class WxMiniAppPayV3AdapterService extends BaseWxPayV3AdapterService impl | |||
} | |||
} | |||
/** | |||
* 单商户模式 | |||
* @param order | |||
* @param appInfo | |||
* @param payAccount | |||
* @return | |||
* @throws Exception | |||
*/ | |||
@Override | |||
public PayQueryAdapterResult queryPayStatus(ProductOrder order, WxAppinfo appInfo, WxPayAccount payAccount) throws Exception { | |||
WxPayService payService = maUtil.getWxPayServiceBySelfModel(appInfo, payAccount); | |||
V3PayQuery req = new V3PayQuery(); | |||
req.setMchid(payAccount.getMchId()); | |||
req.setOut_trade_no(order.getOrderNumber()); | |||
try { | |||
String response = WxPayV3.payQuery(payService, req); | |||
if (StringUtils.isBlank(response)){ | |||
log.error("pay common v3 query response is null."+JSON.toJSONString(req)); | |||
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"pay common v3 query response is null."+JSON.toJSONString(req)); | |||
} | |||
return getPayQueryResult(response); | |||
}catch(WxPayException e) { | |||
log.error("pay common v3 query response error",e); | |||
if("ORDER_CLOSED".equals(e.getErrCode())){ | |||
PayQueryAdapterResult result = new PayQueryAdapterResult(); | |||
result.setCode(EnumProductOrderStatus.ORDER_STATUS_OVERTIME_CANCEL.getCode()); | |||
result.setMsg(EnumProductOrderStatus.ORDER_STATUS_OVERTIME_CANCEL.getMessage()); | |||
return result; | |||
}else if("ORDER_NOT_EXIST".equals(e.getErrCode()) || "ORDERNOTEXIST".equals(e.getErrCode())){ | |||
PayQueryAdapterResult result = new PayQueryAdapterResult(); | |||
result.setCode(EnumProductOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); | |||
result.setMsg(EnumProductOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getMessage()); | |||
return result; | |||
} | |||
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),e.getCustomErrorMsg()); | |||
} | |||
} | |||
@Override | |||
public int queryPayStatus(PayQueryAdapterResult statusObject, String orderOutNo) throws Exception { | |||
return getPayCommonQueryResult((String)statusObject.getData()).getCode(); | |||
@@ -360,6 +360,20 @@ public class DateUtils { | |||
return formatter.format(date); | |||
} | |||
/** | |||
* 获得当前时间前几天 | |||
* | |||
* @param days | |||
* 前几天 | |||
* @return | |||
*/ | |||
public static Date getDateBefore(int days, Date myDate) { | |||
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); | |||
long myTime = (myDate.getTime() / 1000) - 60 * 60 * 24 * days; | |||
Date date = new Date(myTime * 1000); | |||
return date; | |||
} | |||
/** | |||
* 获得当前时间前几天 | |||
* | |||
@@ -0,0 +1,70 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||
<mapper namespace="com.iformall.mapper.ProductMapper"> | |||
<resultMap id="BaseResultMap" type="com.iformall.domain.po.Product"> | |||
<id column="id" jdbcType="BIGINT" property="id" /> | |||
<result column="tenant_id" jdbcType="VARCHAR" property="tenantId" /> | |||
<result column="parent_tenant_id" jdbcType="VARCHAR" property="parentTenantId"/> | |||
<result column="project_type" jdbcType="INTEGER" property="projectType" /> | |||
<result column="type" jdbcType="INTEGER" property="type" /> | |||
<result column="cover_img" jdbcType="VARCHAR" property="coverImg"/> | |||
<result column="title" jdbcType="VARCHAR" property="title"/> | |||
<result column="en_title" jdbcType="VARCHAR" property="enTitle"/> | |||
<result column="glod" jdbcType="INTEGER" property="glod" /> | |||
<result column="detail" jdbcType="VARCHAR" property="detail"/> | |||
<result column="price_dollar" jdbcType="INTEGER" property="priceDollar" /> | |||
<result column="sell_price_dollar" jdbcType="INTEGER" property="sellPriceDollar" /> | |||
<result column="price_rmb" jdbcType="INTEGER" property="priceRmb" /> | |||
<result column="sell_price_rmb" jdbcType="INTEGER" property="sellPriceRmb" /> | |||
<result column="create_date" jdbcType="TIMESTAMP" property="createDate" /> | |||
<result column="update_date" jdbcType="TIMESTAMP" property="updateDate"/> | |||
</resultMap> | |||
<sql id="allColumns"> | |||
`id`,`tenant_id`,`parent_tenant_id`,`project_type`,`type`, | |||
`cover_img`,`title`,`en_title`,`glod`,`detail`, | |||
`price_dollar`,`sell_price_dollar`,`price_rmb`,`sell_price_rmb`, | |||
`create_date`,`update_date` | |||
</sql> | |||
<sql id="dynamicWhereConditions"> | |||
where is_del = 0 | |||
<if test=" null != id "> and `id` = #{id} </if> | |||
<if test=" null != tenantId and '' != tenantId"> | |||
and `tenant_id` = #{tenantId} | |||
</if> | |||
<if test=" null != parentTenantId and '' != parentTenantId"> | |||
and `parent_tenant_id` = #{parentTenantId} | |||
</if> | |||
<if test=" null != projectType "> and `project_type` = #{projectType} </if> | |||
<if test=" null != type "> and `type` = #{type} </if> | |||
<if test=" null != title and '' != title"> | |||
and `title` like concat('%', #{title},'%') | |||
</if> | |||
<if test=" null != enTitle and '' != enTitle"> | |||
and `en_title` like concat('%', #{enTitle},'%') | |||
</if> | |||
<if test=" null != startDate "> | |||
and `create_date` >= #{startDate} | |||
</if> | |||
<if test=" null != endDate"> | |||
and `create_date` <= #{endDate} | |||
</if> | |||
<if test=" null != ids "> | |||
and id in | |||
<foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")"> | |||
#{idItem} | |||
</foreach> | |||
</if> | |||
<if test=" null != sortColumns"> order by ${sortColumns} </if> | |||
</sql> | |||
<select id="findList" parameterType="com.iformall.domain.po.Product" resultMap="BaseResultMap"> | |||
select <include refid="allColumns" /> | |||
from product | |||
<include refid="dynamicWhereConditions" /> | |||
</select> | |||
</mapper> |
@@ -0,0 +1,141 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||
<mapper namespace="com.iformall.mapper.ProductOrderMapper"> | |||
<resultMap id="BaseResultMap" type="com.iformall.domain.po.ProductOrder"> | |||
<id column="id" jdbcType="BIGINT" property="id"/> | |||
<result column="order_number" jdbcType="VARCHAR" property="orderNumber"/> | |||
<result column="tenant_id" jdbcType="VARCHAR" property="tenantId"/> | |||
<result column="parent_tenant_id" jdbcType="VARCHAR" property="parentTenantId" /> | |||
<result column="user_id" jdbcType="BIGINT" property="userId"/> | |||
<result column="product_id" jdbcType="BIGINT" property="productId"/> | |||
<result column="product_title" jdbcType="VARCHAR" property="productTitle"/> | |||
<result column="product_en_title" jdbcType="VARCHAR" property="productEnTitle"/> | |||
<result column="order_status" jdbcType="INTEGER" property="orderStatus"/> | |||
<result column="project_type" jdbcType="TINYINT" property="projectType"/> | |||
<result column="pay_vendor" jdbcType="TINYINT" property="payVendor" /> | |||
<result column="order_price" jdbcType="INTEGER" property="orderPrice"/> | |||
<result column="create_date" jdbcType="TIMESTAMP" property="createDate"/> | |||
<result column="update_date" jdbcType="TIMESTAMP" property="updateDate"/> | |||
<result column="remark" jdbcType="VARCHAR" property="remark"/> | |||
<result column="order_id" jdbcType="VARCHAR" property="orderId"/> | |||
<result column="open_id" jdbcType="VARCHAR" property="openId"/> | |||
<result column="profit_sharing" jdbcType="INTEGER" property="profitSharing"/> | |||
<result column="transaction_id" jdbcType="VARCHAR" property="transactionId"/> | |||
<result column="payment" jdbcType="INTEGER" property="payment"/> | |||
<result column="payment_time" jdbcType="TIMESTAMP" property="paymentTime"/> | |||
<result column="pay_way" jdbcType="INTEGER" property="payWay"/> | |||
</resultMap> | |||
<sql id="allColumns"> | |||
`id`,`order_number`,`tenant_id`,`parent_tenant_id`,`user_id`,`product_id`,`product_title`,`product_en_title`,`order_status`, | |||
`project_type`,`pay_vendor`,`order_price`,`create_date`,`update_date`, | |||
`remark`,`order_id`,`open_id`,`profit_sharing`,`transaction_id`,`payment`,`payment_time`,`pay_way` | |||
</sql> | |||
<sql id="dynamicWhereConditions"> | |||
where 1 = 1 | |||
<if test=" null != id "> | |||
and `id` = #{id} | |||
</if> | |||
<if test=" null != orderNumber "> | |||
and `order_number` = #{orderNumber} | |||
</if> | |||
<if test=" null != tenantId and '' != tenantId"> | |||
and `tenant_id` = #{tenantId} | |||
</if> | |||
<if test=" null != parentTenantId and '' != parentTenantId"> | |||
and `parent_tenant_id` = #{parentTenantId} | |||
</if> | |||
<if test=" null != userId "> | |||
and `user_id` = #{userId} | |||
</if> | |||
<if test=" null != productId "> | |||
and `product_id` = #{productId} | |||
</if> | |||
<if test=" null != productTitle and '' != productTitle"> | |||
and `product_title` like concat('%', #{productTitle},'%') | |||
</if> | |||
<if test=" null != productEnTitle and '' != productEnTitle"> | |||
and `product_en_title` like concat('%', #{productEnTitle},'%') | |||
</if> | |||
<if test=" null != projectType "> and `project_type` = #{projectType} </if> | |||
<if test=" null != payVendor "> and `pay_vendor` = #{payVendor} </if> | |||
<if test=" null != orderId "> | |||
and `order_id` = #{orderId} | |||
</if> | |||
<if test=" null != profitSharing "> | |||
and `profit_sharing` = #{profitSharing} | |||
</if> | |||
<if test=" null != transactionId "> | |||
and `transaction_id` = #{transactionId} | |||
</if> | |||
<if test=" null != orderStatus "> | |||
and `order_status` = #{orderStatus} | |||
</if> | |||
<if test=" null != startDate "> | |||
and `create_date` >= #{startDate} | |||
</if> | |||
<if test=" null != endDate"> | |||
and `create_date` <= #{endDate} | |||
</if> | |||
<if test=" null != payStartDate "> | |||
and `payment_time` >= #{payStartDate} | |||
</if> | |||
<if test=" null != payEndDate"> | |||
and `payment_time` <= #{payEndDate} | |||
</if> | |||
<if test=" null != statusS "> | |||
and `order_status` in | |||
<foreach collection="statusS" index="index" item="sItem" open="(" separator="," close=")"> | |||
#{sItem} | |||
</foreach> | |||
</if> | |||
<if test=" null != ids "> | |||
and id in | |||
<foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")"> | |||
#{idItem} | |||
</foreach> | |||
</if> | |||
<if test=" null != sortColumns">order by ${sortColumns}</if> | |||
</sql> | |||
<select id="findList" parameterType="com.iformall.domain.po.ProductOrder" resultMap="BaseResultMap"> | |||
select | |||
<include refid="allColumns"/> | |||
from product_order | |||
<include refid="dynamicWhereConditions"/> | |||
</select> | |||
<update id="orderPayUpdStatus" parameterType="com.iformall.domain.po.ProductOrder"> | |||
update product_order | |||
set `order_status` = #{orderStatus} | |||
,`update_date` = #{updateDate} | |||
<if test=" null != openId"> | |||
,`open_id` = #{openId} | |||
</if> | |||
<if test=" null != transactionId"> | |||
,`transaction_id` = #{transactionId} | |||
</if> | |||
<if test=" null != paymentTime"> | |||
,`payment_time` = #{paymentTime} | |||
</if> | |||
<if test=" null != payWay"> | |||
,`pay_way` = #{payWay} | |||
</if> | |||
where id = #{id} and `order_status` != #{orderStatus} | |||
</update> | |||
</mapper> |
@@ -0,0 +1,58 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||
<mapper namespace="com.iformall.mapper.UserBasicFromMapper"> | |||
<resultMap id="BaseResultMap" type="com.iformall.domain.po.UserBasicFrom"> | |||
<id column="id" jdbcType="BIGINT" property="id" /> | |||
<result column="tenant_id" jdbcType="VARCHAR" property="tenantId" /> | |||
<result column="parent_tenant_id" jdbcType="VARCHAR" property="parentTenantId"/> | |||
<result column="from_project" jdbcType="INTEGER" property="fromProject" /> | |||
<result column="from_type" jdbcType="INTEGER" property="fromType" /> | |||
<result column="from_id" jdbcType="BIGINT" property="fromId" /> | |||
<result column="from_user_id" jdbcType="BIGINT" property="fromUserId" /> | |||
<result column="create_date" jdbcType="TIMESTAMP" property="createDate" /> | |||
</resultMap> | |||
<sql id="allColumns"> | |||
`id`,`tenant_id`,`parent_tenant_id`, | |||
`from_project`,`from_type`,`from_id`,`from_user_id`,`plat`, | |||
`create_date` | |||
</sql> | |||
<sql id="dynamicWhereConditions"> | |||
where 1 = 1 | |||
<if test=" null != id "> and `id` = #{id} </if> | |||
<if test=" null != tenantId and '' != tenantId"> | |||
and `tenant_id` = #{tenantId} | |||
</if> | |||
<if test=" null != parentTenantId and '' != parentTenantId"> | |||
and `parent_tenant_id` = #{parentTenantId} | |||
</if> | |||
<if test=" null != fromProject "> and `from_project` = #{fromProject} </if> | |||
<if test=" null != fromType "> and `from_type` = #{fromType} </if> | |||
<if test=" null != fromId "> and `from_id` = #{fromId} </if> | |||
<if test=" null != fromUserId "> and `from_user_id` = #{fromUserId} </if> | |||
<if test=" null != plat "> and `plat` = #{plat} </if> | |||
<if test=" null != startDate "> | |||
and `create_date` >= #{startDate} | |||
</if> | |||
<if test=" null != endDate"> | |||
and `create_date` <= #{endDate} | |||
</if> | |||
<if test=" null != ids "> | |||
and id in | |||
<foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")"> | |||
#{idItem} | |||
</foreach> | |||
</if> | |||
<if test=" null != sortColumns"> order by ${sortColumns} </if> | |||
</sql> | |||
<select id="findList" parameterType="com.iformall.domain.po.UserBasicFrom" resultMap="BaseResultMap"> | |||
select <include refid="allColumns" /> | |||
from user_basic_from | |||
<include refid="dynamicWhereConditions" /> | |||
</select> | |||
</mapper> |
@@ -0,0 +1,61 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||
<mapper namespace="com.iformall.mapper.UserBasicPropertyLogMapper"> | |||
<resultMap id="BaseResultMap" type="com.iformall.domain.po.UserBasicPropertyLog"> | |||
<id column="id" jdbcType="BIGINT" property="id" /> | |||
<result column="tenant_id" jdbcType="VARCHAR" property="tenantId" /> | |||
<result column="parent_tenant_id" jdbcType="VARCHAR" property="parentTenantId"/> | |||
<result column="user_id" jdbcType="BIGINT" property="userId" /> | |||
<result column="project_type" jdbcType="INTEGER" property="projectType" /> | |||
<result column="type" jdbcType="INTEGER" property="type" /> | |||
<result column="befour_gold" jdbcType="INTEGER" property="befourGold" /> | |||
<result column="gold_num" jdbcType="INTEGER" property="goldNum" /> | |||
<result column="after_gold" jdbcType="INTEGER" property="afterGold" /> | |||
<result column="extra_id" jdbcType="BIGINT" property="extraId" /> | |||
<result column="remark" jdbcType="VARCHAR" property="remark" /> | |||
<result column="detail" jdbcType="VARCHAR" property="detail" /> | |||
<result column="create_date" jdbcType="TIMESTAMP" property="createDate" /> | |||
</resultMap> | |||
<sql id="allColumns"> | |||
`id`,`tenant_id`,`parent_tenant_id`,`user_id`, | |||
`project_type`,`type`,`befour_gold`,`gold_num`,`after_gold`, | |||
`extra_id`,`remark`,`detail`,`create_date` | |||
</sql> | |||
<sql id="dynamicWhereConditions"> | |||
where 1 = 1 | |||
<if test=" null != id "> and `id` = #{id} </if> | |||
<if test=" null != tenantId and '' != tenantId"> | |||
and `tenant_id` = #{tenantId} | |||
</if> | |||
<if test=" null != parentTenantId and '' != parentTenantId"> | |||
and `parent_tenant_id` = #{parentTenantId} | |||
</if> | |||
<if test=" null != userId "> and `user_id` = #{userId} </if> | |||
<if test=" null != projectType "> and `project_type` = #{projectType} </if> | |||
<if test=" null != type "> and `type` = #{type} </if> | |||
<if test=" null != startDate "> | |||
and `create_date` >= #{startDate} | |||
</if> | |||
<if test=" null != endDate"> | |||
and `create_date` <= #{endDate} | |||
</if> | |||
<if test=" null != ids "> | |||
and id in | |||
<foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")"> | |||
#{idItem} | |||
</foreach> | |||
</if> | |||
<if test=" null != sortColumns"> order by ${sortColumns} </if> | |||
</sql> | |||
<select id="findList" parameterType="com.iformall.domain.po.UserBasicPropertyLog" resultMap="BaseResultMap"> | |||
select <include refid="allColumns" /> | |||
from user_basic_property_log | |||
<include refid="dynamicWhereConditions" /> | |||
</select> | |||
</mapper> |
@@ -0,0 +1,52 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||
<mapper namespace="com.iformall.mapper.UserBasicPropertyMapper"> | |||
<resultMap id="BaseResultMap" type="com.iformall.domain.po.UserBasicProperty"> | |||
<id column="id" jdbcType="BIGINT" property="id" /> | |||
<result column="tenant_id" jdbcType="VARCHAR" property="tenantId" /> | |||
<result column="parent_tenant_id" jdbcType="VARCHAR" property="parentTenantId"/> | |||
<result column="digital_avatar_glod" jdbcType="INTEGER" property="digitalAvatarGlod" /> | |||
<result column="digital_avatar_residue_glod" jdbcType="INTEGER" property="digitalAvatarResidueGlod" /> | |||
<result column="update_date" jdbcType="TIMESTAMP" property="updateDate"/> | |||
</resultMap> | |||
<sql id="allColumns"> | |||
`id`,`tenant_id`,`parent_tenant_id`, | |||
`digital_avatar_glod`,`digital_avatar_residue_glod`, | |||
`update_date` | |||
</sql> | |||
<sql id="dynamicWhereConditions"> | |||
where 1 = 1 | |||
<if test=" null != id "> and `id` = #{id} </if> | |||
<if test=" null != tenantId and '' != tenantId"> | |||
and `tenant_id` = #{tenantId} | |||
</if> | |||
<if test=" null != parentTenantId and '' != parentTenantId"> | |||
and `parent_tenant_id` = #{parentTenantId} | |||
</if> | |||
<if test=" null != ids "> | |||
and id in | |||
<foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")"> | |||
#{idItem} | |||
</foreach> | |||
</if> | |||
<if test=" null != sortColumns"> order by ${sortColumns} </if> | |||
</sql> | |||
<select id="findList" parameterType="com.iformall.domain.po.UserBasicProperty" resultMap="BaseResultMap"> | |||
select <include refid="allColumns" /> | |||
from user_basic_property | |||
<include refid="dynamicWhereConditions" /> | |||
</select> | |||
<update id="addGlod" parameterType="com.iformall.domain.po.UserBasicProperty"> | |||
update user_basic_property | |||
set `update_date` = #{updateDate} | |||
,`digital_avatar_glod` = digital_avatar_glod+#{digitalAvatarGlod} | |||
,`digital_avatar_residue_glod` = digital_avatar_residue_glod+#{digitalAvatarResidueGlod} | |||
where id = #{id} | |||
</update> | |||
</mapper> |
@@ -15,6 +15,7 @@ | |||
<result column="last_token_time" jdbcType="TIMESTAMP" property="lastTokenTime"/> | |||
<result column="expires_in" jdbcType="INTEGER" property="expiresIn"/> | |||
<result column="pay_id" jdbcType="BIGINT" property="payId"/> | |||
<result column="project_type" jdbcType="INTEGER" property="projectType"/> | |||
<result column="type" jdbcType="INTEGER" property="type"/> | |||
<result column="mould_type" jdbcType="INTEGER" property="mouldType"/> | |||
<result column="enable" jdbcType="INTEGER" property="enable"/> | |||
@@ -30,7 +31,7 @@ | |||
<sql id="allColumns"> | |||
`id`,`tenant_id`,`app_id`,`parent_app_id`,`name`, | |||
`secret`,`token`,`aes_key`,`msg_data_format`,`access_token`,`last_token_time`,`expires_in`, | |||
`pay_id`,`type`,`mould_type`,`enable`,`plat`,`sort_url`,`business_license`,`icp` | |||
`pay_id`,`project_type`,`type`,`mould_type`,`enable`,`plat`,`sort_url`,`business_license`,`icp` | |||
</sql> | |||
<sql id="dynamicWhereConditions"> | |||
@@ -86,6 +87,9 @@ | |||
<if test=" null != payId "> | |||
and `pay_id` = #{payId} | |||
</if> | |||
<if test=" null != projectType "> | |||
and `project_type` = #{projectType} | |||
</if> | |||
<if test=" null != type "> | |||
and `type` = #{type} | |||
</if> | |||