diff --git a/mallinkAdmin/src/main/java/com/simple/config/PayProperty.java b/mallinkAdmin/src/main/java/com/simple/config/PayProperty.java new file mode 100644 index 000000000..d19332327 --- /dev/null +++ b/mallinkAdmin/src/main/java/com/simple/config/PayProperty.java @@ -0,0 +1,24 @@ +package com.simple.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @author Stormeye + */ +@Component +@ConfigurationProperties(prefix = "pay") +public class PayProperty { + /** + * 真实支付 + */ + private boolean real; + + public boolean isReal() { + return real; + } + + public void setReal(boolean real) { + this.real = real; + } +} diff --git a/mallinkAdmin/src/main/java/com/simple/controller/WxCUserBasicInfoController.java b/mallinkAdmin/src/main/java/com/simple/controller/WxCUserBasicInfoController.java index 7f6465d2b..e53dc6c37 100644 --- a/mallinkAdmin/src/main/java/com/simple/controller/WxCUserBasicInfoController.java +++ b/mallinkAdmin/src/main/java/com/simple/controller/WxCUserBasicInfoController.java @@ -22,10 +22,14 @@ import com.simple.domain.dto.WxCuerBasicInfoDto; import com.simple.domain.po.WxCUser; import com.simple.domain.po.WxCUserBasicInfo; import com.simple.domain.po.WxCUserTags; +import com.simple.domain.po.WxCoupon; +import com.simple.domain.po.WxCouponOrder; import com.simple.domain.po.WxTags; import com.simple.service.WxCUserBasicInfoService; import com.simple.service.WxCUserService; import com.simple.service.WxCUserTagsService; +import com.simple.service.WxCouponOrderService; +import com.simple.service.WxCouponService; import com.simple.service.WxTagsService; import io.swagger.annotations.Api; @@ -49,6 +53,12 @@ public class WxCUserBasicInfoController extends BaseController @Autowired private WxCUserService wxCUserService; + + @Autowired + private WxCouponOrderService wxCouponOrderService; + + @Autowired + private WxCouponService wxCouponService; private Logger logger = Logger.getLogger(WxCUserBasicInfoController.class); @@ -100,17 +110,18 @@ public class WxCUserBasicInfoController extends BaseController @ApiOperation("根据id更新接口") @PostMapping("update") public ResultData update(@RequestBody WxCUserBasicInfo wxCUserBasicInfo) { + WxCUserBasicInfo info = wxCUserBasicInfoService.getById(wxCUserBasicInfo.getId()); wxCUserBasicInfo.setTenantId(getTenantId()); - if(StringUtils.isNotBlank(wxCUserBasicInfo.getTags())) { + if(StringUtils.isNotBlank(wxCUserBasicInfo.getTagIds())) { WxCUserTags record =new WxCUserTags(); - record.setUserId(wxCUserBasicInfo.getCUserId()); + record.setUserId(info.getCUserId()); record.setTenantId(getTenantId()); PageInfo page = wxCUserTagsService.listAsPage(record, 1, 1); if(page.getSize()>0) { WxCUserTags t = page.getList().get(0); record.setId(t.getId()); } - String tags = wxCUserBasicInfo.getTags(); + String tags = wxCUserBasicInfo.getTagIds(); List tagIdList = new ArrayList<>(); for(String t:tags.split(",")) { tagIdList.add(Long.valueOf(t)); @@ -143,13 +154,43 @@ public class WxCUserBasicInfoController extends BaseController WxTags wxTags =new WxTags(); wxTags.setIds(ids); PageInfo page = wxTagsService.listAsPage(wxTags, 1, 5000); - if(page.getSize()>0) { - info.setTagList(page.getList()); + String tagNames=""; + String tagIds=""; + List tagIdList = new ArrayList<>(); + for(WxTags wt:page.getList()) { + tagNames+=wt.getName()+"/"; + tagIds+=wt.getId()+","; + tagIdList.add(wt.getId()); + } + if(StringUtils.isNotBlank(tagNames)) { + info.setTagNames(tagNames.substring(0,tagNames.length()-1)); } + if(StringUtils.isNoneBlank(tagIds)) { + info.setTagIds(tagIds.substring(0,tagIds.length()-1)); + } + long count = wxCUserTagsService.findCountByTag(tagIdList); + info.setCount(count); } } return new ResultData(Result.SUCCESS,"查询成功",info); } - + @ApiOperation("根据userId查询交易记录接口") + @GetMapping("/findOrderCouponByUserId") + @ApiImplicitParam(name="userId",value="userId",dataType="Long", paramType = "query",required=true) + public ResultData findOrderCouponByUserId(Long userId,Integer pageNum, Integer pageSize) { + WxCouponOrder corder = new WxCouponOrder(); + corder.setCUserId(userId); + corder.setTenantId(getTenantId()); + PageInfo page = wxCouponOrderService.listAsPage(corder, pageNum, pageSize); + if(page.getSize()>0) { + List list = page.getList(); + for(WxCouponOrder c:list) { + WxCoupon coupon = wxCouponService.getById(c.getCouponId()); + c.setCouponName(coupon.getTitle()); + c.setSalePrice(coupon.getPrice()); + } + } + return new ResultData(Result.SUCCESS,"查询成功",page); + } } diff --git a/mallinkAdmin/src/main/java/com/simple/controller/WxMallBuildingController.java b/mallinkAdmin/src/main/java/com/simple/controller/WxMallBuildingController.java index 38e652982..c5c22dc42 100644 --- a/mallinkAdmin/src/main/java/com/simple/controller/WxMallBuildingController.java +++ b/mallinkAdmin/src/main/java/com/simple/controller/WxMallBuildingController.java @@ -70,6 +70,12 @@ public class WxMallBuildingController extends BaseController return wxMallBuildingService.getbuildinglist(getTenantId()); } + @ApiOperation("获取楼层楼座数据") + @GetMapping("getbuildingfloorlist") + public ResultData getbuildingfloorlist() { + return wxMallBuildingService.getbuildingfloorlist(getTenantId()); + } + } diff --git a/mallinkAdmin/src/main/resources/application.yml b/mallinkAdmin/src/main/resources/application.yml index bec78e171..bbe11e8d8 100644 --- a/mallinkAdmin/src/main/resources/application.yml +++ b/mallinkAdmin/src/main/resources/application.yml @@ -37,3 +37,6 @@ pagehelper: mapper: mappers: - com.simple.common.CommonMapper + +pay: + real: false \ No newline at end of file diff --git a/mallinkBApi/src/main/java/com/simple/config/PayProperty.java b/mallinkBApi/src/main/java/com/simple/config/PayProperty.java new file mode 100644 index 000000000..d19332327 --- /dev/null +++ b/mallinkBApi/src/main/java/com/simple/config/PayProperty.java @@ -0,0 +1,24 @@ +package com.simple.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @author Stormeye + */ +@Component +@ConfigurationProperties(prefix = "pay") +public class PayProperty { + /** + * 真实支付 + */ + private boolean real; + + public boolean isReal() { + return real; + } + + public void setReal(boolean real) { + this.real = real; + } +} diff --git a/mallinkBApi/src/main/java/com/simple/controller/WxDateAmountRecordController.java b/mallinkBApi/src/main/java/com/simple/controller/WxDateAmountRecordController.java index f54259d8e..6b259c324 100644 --- a/mallinkBApi/src/main/java/com/simple/controller/WxDateAmountRecordController.java +++ b/mallinkBApi/src/main/java/com/simple/controller/WxDateAmountRecordController.java @@ -39,24 +39,32 @@ public class WxDateAmountRecordController extends BaseController public ResultData getRecord() { Calendar c =Calendar.getInstance(); int weekOfYear =c.get(Calendar.WEEK_OF_YEAR); + int day =c.get(Calendar.DAY_OF_WEEK); WxDateAmountRecord temp = new WxDateAmountRecord(); - temp.setDayOfWeek(weekOfYear); + temp.setWeekOfYear(weekOfYear); WxMerchantBUser u = getUser(); temp.setTenantId(u.getTenantId()); temp.setMerchantId(u.getMerchantId()); AmountRecordVo vo = new AmountRecordVo(); - vo.setOrderAmountList(getAmountRecord(temp, 0)); - vo.setVerifyAmountList(getAmountRecord(temp, 0)); + vo.setOrderAmountList(getAmountRecord(temp, day,0,vo)); + vo.setVerifyAmountList(getAmountRecord(temp,day, 1,vo)); return new ResultData(Result.SUCCESS,"ok",vo); } - private List getAmountRecord( WxDateAmountRecord temp,int type){ + private List getAmountRecord( WxDateAmountRecord temp,int day ,int type,AmountRecordVo vo){ temp.setType(type); List list =new ArrayList<>(); for(int i=1;i<=7;i++) {//周日是1 temp.setDayOfWeek(i); PageInfo page = wxDateAmountRecordService.listAsPage(temp, 1, 1); if(page.getSize()>0) { + if(i==day ) { + if(type==0) { + vo.setOrderAmount(page.getList().get(0).getPayPrice()); + }else { + vo.setVerifyAmount(page.getList().get(0).getPayPrice()); + } + } list.add(page.getList().get(0)); } } diff --git a/mallinkBApi/src/main/java/com/simple/controller/WxMsgValidationcodeController.java b/mallinkBApi/src/main/java/com/simple/controller/WxMsgValidationcodeController.java index 4fde2135e..91372708c 100644 --- a/mallinkBApi/src/main/java/com/simple/controller/WxMsgValidationcodeController.java +++ b/mallinkBApi/src/main/java/com/simple/controller/WxMsgValidationcodeController.java @@ -1,7 +1,12 @@ package com.simple.controller; +import com.simple.common.ErrorCode; import com.simple.common.ResultData; +import com.simple.domain.po.WxMerchant; +import com.simple.domain.po.WxMerchantBUser; import com.simple.domain.po.WxMsgValidationcode; +import com.simple.service.WxMerchantBUserService; +import com.simple.service.WxMerchantService; import com.simple.service.WxMsgValidationcodeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -21,6 +26,14 @@ public class WxMsgValidationcodeController extends BaseController { @Autowired private WxMsgValidationcodeService wxMsgValidationcodeService; + @Autowired + private WxMerchantBUserService wxMerchantBUserService; + + @Autowired + private WxMerchantService wxMerchantService; + + + @GetMapping("sendvalidationcode") @ApiImplicitParams({ @ApiImplicitParam(name = "tenantId", value = "租户ID", dataType = "String", paramType = "query"), @@ -28,6 +41,29 @@ public class WxMsgValidationcodeController extends BaseController { @ApiImplicitParam(name = "type", value = "场景", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "appid", value = "appid", dataType = "String", paramType = "query", required = true)}) public ResultData sendvalidationcode(String tenantId, String phone, Integer type, String appid) { + + WxMerchantBUser user = new WxMerchantBUser(); + user.setAppId(appid); + user.setPhone(phone); + + WxMerchantBUser buser=wxMerchantBUserService.getBUserByAppId(user); + if (buser==null) { + logger.error("B端用户不存在, phone: " + phone); + return new ResultData(ErrorCode.USER_IS_EMPTY); + } + + + WxMerchant merchant = wxMerchantService.getById(user.getMerchantId()); + if (merchant==null) { + logger.error("B端所在商户不存在, id: " + user.getMerchantId()); + return new ResultData(ErrorCode.MERCHANT_INFO_NOT_FOUND); + } + + if(merchant.getStatus()==0){ + logger.error("B端所在商户已停用, id: " + merchant.getId()); + return new ResultData(ErrorCode.MERCHANT_INFO_NOT_VALID); + } + WxMsgValidationcode wxMsgValidationcode = new WxMsgValidationcode(); wxMsgValidationcode.setTenantId(tenantId); wxMsgValidationcode.setPhone(phone); diff --git a/mallinkBApi/src/main/java/com/simple/controller/WxOrderController.java b/mallinkBApi/src/main/java/com/simple/controller/WxOrderController.java index c8b030584..bc2890051 100644 --- a/mallinkBApi/src/main/java/com/simple/controller/WxOrderController.java +++ b/mallinkBApi/src/main/java/com/simple/controller/WxOrderController.java @@ -101,8 +101,17 @@ public class WxOrderController extends BaseController { orderId = Long.valueOf(orderIdStr); } catch (NumberFormatException e) { logger.error("orderId " + orderIdStr + ", e:" + e.getMessage()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "订单ID转换异常"); } - wxOrderService.updateOrderStatus(orderId, EnumOrderStatus.ORDER_STATUS_PENDING_REFUND); + try { + WxOrder order = wxOrderService.getById(orderId); + if (order != null) { + wxOrderService.updateOrderStatus(order, EnumOrderStatus.ORDER_STATUS_PENDING_REFUND); + } + } catch (Exception e) { + logger.error("orderId " + orderIdStr + ", e:" + e.getMessage()); + } + return new ResultData(); } } diff --git a/mallinkBApi/src/main/java/com/simple/controller/WxRefundOrderController.java b/mallinkBApi/src/main/java/com/simple/controller/WxRefundOrderController.java index c9905eb36..89239c4db 100644 --- a/mallinkBApi/src/main/java/com/simple/controller/WxRefundOrderController.java +++ b/mallinkBApi/src/main/java/com/simple/controller/WxRefundOrderController.java @@ -4,12 +4,12 @@ import com.github.pagehelper.PageInfo; import com.simple.common.ErrorCode; import com.simple.common.Result; import com.simple.common.ResultData; -import com.simple.domain.po.WxAppinfo; -import com.simple.domain.po.WxMerchantBUser; -import com.simple.domain.po.WxRefundOrder; +import com.simple.config.PayProperty; +import com.simple.domain.po.*; +import com.simple.enums.EnumPayStatus; import com.simple.enums.EnumPayWay; import com.simple.exception.MallinkException; -import com.simple.service.WxRefundOrderService; +import com.simple.service.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -27,25 +27,33 @@ import java.util.Map; public class WxRefundOrderController extends BaseController { private Logger logger = Logger.getLogger(WxRefundOrderController.class); + @Autowired + private PayProperty payProperty; + + @Autowired + private WxCouponOrderService wxCouponOrderService; + + @Autowired + private WxOrderService wxOrderService; + + @Autowired + private WxPayOrderService wxPayOrderService; + @Autowired private WxRefundOrderService wxRefundOrderService; - @ApiOperation(value = "发起退款", notes = "{\"orderId\":,\"string\", \"payOrderId\":\"string\"}") + @ApiOperation(value = "发起退款", notes = "{\"orderId\":\"string\"}") @PostMapping("/create") public ResultData create(@RequestBody Map paramMap) { + // couponOrder发起退款 logger.info("/api/refund/create" + paramMap.toString()); //Assert.notNull(wxRefundOrder.getName(), "角色名不能为空"); //Assert.isTrue(!checkUnique(sysRole.getName(), null), "重复的角色名"); String orderIdStr = paramMap.get("orderId"); - String payOrderIdStr = paramMap.get("payOrderId"); if (StringUtils.isBlank(orderIdStr)) { logger.error("orderId不能为空: " + paramMap.toString()); return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); } - if (StringUtils.isBlank(payOrderIdStr)) { - logger.error("payOrderId不能为空: " + paramMap.toString()); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); - } Long orderId = 0L; try { orderId = Long.valueOf(orderIdStr); @@ -53,14 +61,49 @@ public class WxRefundOrderController extends BaseController { logger.error("orderId参数不正确: " + paramMap.toString()); return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); } - WxRefundOrder refundOrder = new WxRefundOrder(); - refundOrder.setPayOrderNo(payOrderIdStr); - refundOrder.setOrderId(orderId); + + WxOrder order = null; + try { + order = wxOrderService.getById(orderId); + } catch (Exception e) { + logger.error("订单不存在: " + orderIdStr); + return new ResultData(ErrorCode.ORDER_IS_NOT_FIND.getCode(), "订单不存在: " + orderIdStr); + } + if (order == null) { + logger.error("订单不存在: " + orderIdStr); + return new ResultData(ErrorCode.ORDER_IS_NOT_FIND.getCode(), "订单不存在: " + orderIdStr); + } + if (order.getPayment() <= 0) { + logger.error("订单支付金额小于等于0: " + order.toString()); + throw new MallinkException(ErrorCode.REFUND_PAY_ORDER_IS_ZERO); + } + + WxPayOrder payOrderQ = new WxPayOrder(); + payOrderQ.setCUserId(order.getCUserId()); + payOrderQ.setOrderId(orderId); + payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_WAY_SUCCESS.getCode()); + + WxPayOrder payOrder = null; + + try { + payOrder = wxPayOrderService.getByObj(payOrderQ); + } catch (Exception e) { + logger.error("payOrder不存在"); + return new ResultData(ErrorCode.PAY_ORDER_NOT_FOUND.getCode(), "支付订单不存在,无法退款"); + } + if (payOrder == null) { + logger.error("payOrder不存在"); + return new ResultData(ErrorCode.PAY_ORDER_NOT_FOUND.getCode(), "支付订单不存在,无法退款"); + } + + WxRefundOrder refundOrderQ = new WxRefundOrder(); + refundOrderQ.setPayOrderNo(String.valueOf(payOrder.getId())); + refundOrderQ.setOrderId(orderId); WxMerchantBUser bUser = getUser(); WxAppinfo appinfo = getAppInfo(bUser.getAppId()); try { - wxRefundOrderService.createRefundOrder(appinfo, refundOrder, EnumPayWay.PAY_WAY_WEAPP); + wxRefundOrderService.createRefundOrder(payProperty.isReal(), appinfo, refundOrderQ, payOrder, EnumPayWay.PAY_WAY_WEAPP); return new ResultData(); } catch (MallinkException e) { logger.error(e.getMessage()); diff --git a/mallinkBApi/src/main/resources/application.yml b/mallinkBApi/src/main/resources/application.yml index 4f5159bdd..979ecee43 100644 --- a/mallinkBApi/src/main/resources/application.yml +++ b/mallinkBApi/src/main/resources/application.yml @@ -37,3 +37,6 @@ pagehelper: mapper: mappers: - com.simple.common.CommonMapper + +pay: + real: false \ No newline at end of file diff --git a/mallinkCApi/src/main/java/com/simple/config/PayProperty.java b/mallinkCApi/src/main/java/com/simple/config/PayProperty.java new file mode 100644 index 000000000..2a4d23e73 --- /dev/null +++ b/mallinkCApi/src/main/java/com/simple/config/PayProperty.java @@ -0,0 +1,26 @@ +package com.simple.config; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @author Stormeye + */ +@Component +@ConfigurationProperties(prefix = "pay") +public class PayProperty { + /** + * 真实支付 + */ + private boolean real; + + public boolean isReal() { + return real; + } + + public void setReal(boolean real) { + this.real = real; + } +} diff --git a/mallinkCApi/src/main/java/com/simple/controller/WxCouponChannelController.java b/mallinkCApi/src/main/java/com/simple/controller/WxCouponChannelController.java index f86461c8b..d37d67a6a 100644 --- a/mallinkCApi/src/main/java/com/simple/controller/WxCouponChannelController.java +++ b/mallinkCApi/src/main/java/com/simple/controller/WxCouponChannelController.java @@ -1,5 +1,6 @@ package com.simple.controller; +import com.simple.domain.vo.WxCouponChannelVo; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.Assert; @@ -16,13 +17,15 @@ import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; @RestController -@RequestMapping("wxCouponChannel") +@RequestMapping("/api/wxCouponChannel") public class WxCouponChannelController extends BaseController { + private Logger logger = Logger.getLogger(WxCouponChannelController.class); + @Autowired private WxCouponChannelService wxCouponChannelService; - private Logger logger = Logger.getLogger(WxCouponChannelController.class); + @ApiOperation("分页列表接口") @GetMapping("list") @@ -31,33 +34,11 @@ public class WxCouponChannelController extends BaseController @ApiImplicitParam(name="pageSize",value="每页条数",dataType="int", paramType = "query",required=true)}) public ResultData list(@ModelAttribute WxCouponChannel wxCouponChannel,Integer pageNum, Integer pageSize) { if (null == wxCouponChannel) wxCouponChannel = new WxCouponChannel(); - final PageInfo page = wxCouponChannelService.listAsPage(wxCouponChannel, pageNum, pageSize); + wxCouponChannel.setTenantId(getTenantId()); + final PageInfo page = wxCouponChannelService.listPageCAPI(wxCouponChannel, pageNum, pageSize); return new ResultData(page); } - @ApiOperation("新增接口") - @PostMapping("add") - public ResultData add(@RequestBody WxCouponChannel wxCouponChannel) { - //Assert.notNull(wxCouponChannel.getName(), "角色名不能为空"); - //Assert.isTrue(!checkUnique(sysRole.getName(), null), "重复的角色名"); - wxCouponChannelService.saveOrUpdate(wxCouponChannel); - return new ResultData(); - } - - @ApiOperation("根据id更新接口") - @PostMapping("update") - public ResultData update(@RequestBody WxCouponChannel wxCouponChannel) { - wxCouponChannelService.saveOrUpdate(wxCouponChannel); - return new ResultData(); - } - - @ApiOperation("根据id删除接口") - @GetMapping("/del") - @ApiImplicitParam(name="id",value="id",dataType="Long", paramType = "query",required=true) - public ResultData delete(Long id) { - wxCouponChannelService.deleteById(id); - return new ResultData(Result.SUCCESS, "删除成功", null); - } @ApiOperation("根据id查询接口") @GetMapping("/findById") diff --git a/mallinkCApi/src/main/java/com/simple/controller/WxCouponController.java b/mallinkCApi/src/main/java/com/simple/controller/WxCouponController.java index 3af45bf88..263c602c3 100644 --- a/mallinkCApi/src/main/java/com/simple/controller/WxCouponController.java +++ b/mallinkCApi/src/main/java/com/simple/controller/WxCouponController.java @@ -16,7 +16,7 @@ import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; @RestController -@RequestMapping("wxCoupon") +@RequestMapping("/api/wxCoupon") public class WxCouponController extends BaseController { private Logger logger = Logger.getLogger(WxCouponController.class); @@ -30,6 +30,7 @@ public class WxCouponController extends BaseController { @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) public ResultData list(@ModelAttribute WxCoupon wxCoupon, Integer pageNum, Integer pageSize) { if (null == wxCoupon) wxCoupon = new WxCoupon(); + wxCoupon.setTenantId(getTenantId()); final PageInfo page = wxCouponService.listAsPage(wxCoupon, pageNum, pageSize); return new ResultData(page); } diff --git a/mallinkCApi/src/main/java/com/simple/controller/WxCouponSendController.java b/mallinkCApi/src/main/java/com/simple/controller/WxCouponSendController.java index b43a78ab1..ee27fb2b9 100644 --- a/mallinkCApi/src/main/java/com/simple/controller/WxCouponSendController.java +++ b/mallinkCApi/src/main/java/com/simple/controller/WxCouponSendController.java @@ -31,33 +31,11 @@ public class WxCouponSendController extends BaseController @ApiImplicitParam(name="pageSize",value="每页条数",dataType="int", paramType = "query",required=true)}) public ResultData list(@ModelAttribute WxCouponSend wxCouponSend,Integer pageNum, Integer pageSize) { if (null == wxCouponSend) wxCouponSend = new WxCouponSend(); + wxCouponSend.setTenantId(getTenantId()); final PageInfo page = wxCouponSendService.listAsPage(wxCouponSend, pageNum, pageSize); return new ResultData(page); } - @ApiOperation("新增接口") - @PostMapping("add") - public ResultData add(@RequestBody WxCouponSend wxCouponSend) { - //Assert.notNull(wxCouponSend.getName(), "角色名不能为空"); - //Assert.isTrue(!checkUnique(sysRole.getName(), null), "重复的角色名"); - wxCouponSendService.saveOrUpdate(wxCouponSend); - return new ResultData(); - } - - @ApiOperation("根据id更新接口") - @PostMapping("update") - public ResultData update(@RequestBody WxCouponSend wxCouponSend) { - wxCouponSendService.saveOrUpdate(wxCouponSend); - return new ResultData(); - } - - @ApiOperation("根据id删除接口") - @GetMapping("/del") - @ApiImplicitParam(name="id",value="id",dataType="Long", paramType = "query",required=true) - public ResultData delete(Long id) { - wxCouponSendService.deleteById(id); - return new ResultData(Result.SUCCESS, "删除成功", null); - } @ApiOperation("根据id查询接口") @GetMapping("/findById") diff --git a/mallinkCApi/src/main/java/com/simple/controller/WxMsgValidationcodeController.java b/mallinkCApi/src/main/java/com/simple/controller/WxMsgValidationcodeController.java new file mode 100644 index 000000000..43907885d --- /dev/null +++ b/mallinkCApi/src/main/java/com/simple/controller/WxMsgValidationcodeController.java @@ -0,0 +1,68 @@ +package com.simple.controller; + +import com.simple.common.ResultData; +import com.simple.domain.po.WxMsgValidationcode; +import com.simple.service.WxMerchantBUserService; +import com.simple.service.WxMerchantService; +import com.simple.service.WxMsgValidationcodeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/wxMsgValidationcode") +@Api(description="短信验证相关接口") +public class WxMsgValidationcodeController extends BaseController { + private Logger logger = Logger.getLogger(WxMsgValidationcodeController.class); + + @Autowired + private WxMsgValidationcodeService wxMsgValidationcodeService; + + @Autowired + private WxMerchantBUserService wxMerchantBUserService; + + @Autowired + private WxMerchantService wxMerchantService; + + + + @GetMapping("sendvalidationcode") + @ApiImplicitParams({ + @ApiImplicitParam(name = "tenantId", value = "租户ID", dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query", required = true), + @ApiImplicitParam(name = "type", value = "场景", dataType = "Integer", paramType = "query", required = true), + @ApiImplicitParam(name = "appid", value = "appid", dataType = "String", paramType = "query", required = true)}) + public ResultData sendvalidationcode(String tenantId, String phone, Integer type, String appid) { + + WxMsgValidationcode wxMsgValidationcode = new WxMsgValidationcode(); + wxMsgValidationcode.setTenantId(tenantId); + wxMsgValidationcode.setPhone(phone); + wxMsgValidationcode.setType(type); + wxMsgValidationcode.setAppid(appid); + return wxMsgValidationcodeService.sendvalidationcode(wxMsgValidationcode); + } + + @GetMapping("hasvalidationcode") + @ApiImplicitParams({ + @ApiImplicitParam(name = "tenantId", value = "租户ID", dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query", required = true), + @ApiImplicitParam(name = "type", value = "场景", dataType = "Integer", paramType = "query", required = true), + @ApiImplicitParam(name = "code", value = "验证码", dataType = "String", paramType = "query", required = true), + @ApiImplicitParam(name = "appid", value = "appid", dataType = "String", paramType = "query", required = true)}) + public ResultData hasvalidationcode(String tenantId, String phone, Integer type, String code, String appid) { + WxMsgValidationcode wxMsgValidationcode = new WxMsgValidationcode(); + wxMsgValidationcode.setTenantId(tenantId); + wxMsgValidationcode.setPhone(phone); + wxMsgValidationcode.setType(type); + wxMsgValidationcode.setCode(code); + wxMsgValidationcode.setAppid(appid); + return wxMsgValidationcodeService.hasvalidationcode(wxMsgValidationcode); + } + + +} diff --git a/mallinkCApi/src/main/java/com/simple/controller/WxOrderController.java b/mallinkCApi/src/main/java/com/simple/controller/WxOrderController.java index 9b961c639..baac52a8b 100644 --- a/mallinkCApi/src/main/java/com/simple/controller/WxOrderController.java +++ b/mallinkCApi/src/main/java/com/simple/controller/WxOrderController.java @@ -46,10 +46,12 @@ public class WxOrderController extends BaseController { return new ResultData(ErrorCode.SYS_PARAMETER_CAST_ERROR.getCode(), "couponId: " + couponIdStr + ", e:" + e.getMessage()); } - Long cUserId = getUserId(); + WxCUser user = getUser(); + + WxOrder order = null; try { - WxOrder order = wxOrderService.sendUserFreeCoupon(cUserId, couponId); + order = wxOrderService.sendUserFreeCoupon(user.getId(), couponId); return new ResultData(order); } catch (MallinkException e) { logger.error(e.getMessage()); @@ -107,7 +109,16 @@ public class WxOrderController extends BaseController { logger.error(e.getMessage()); return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL, "orderId: " + orderIdStr + ", e: " + e.getMessage()); } - wxOrderService.updateOrderStatus(orderId, EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL); + try { + WxOrder order = wxOrderService.getById(orderId); + if (order != null) { + wxOrderService.updateOrderStatus(order, EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL); + } + } catch (Exception e) { + logger.error("取消订单失败: " + e.getMessage()); + return new ResultData(ErrorCode.ORDER_IS_FAIL.getCode(), "取消订单失败: " + e.getMessage()); + } + return new ResultData(); } @@ -118,7 +129,7 @@ public class WxOrderController extends BaseController { //Assert.isTrue(!checkUnique(sysRole.getName(), null), "重复的角色名"); String orderIdStr = paramMap.get("orderId"); if (StringUtils.isBlank(orderIdStr)) { - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId不能为空"); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "退款订单ID不能为空"); } Long orderId = 0L; WxCUser user = getUser(); @@ -126,8 +137,17 @@ public class WxOrderController extends BaseController { orderId = Long.valueOf(orderIdStr); } catch (NumberFormatException e) { logger.error(e.getMessage()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "退款订单ID转换失败"); + } + try { + WxOrder order = wxOrderService.getById(orderId); + if (order != null) { + wxOrderService.updateOrderStatus(order, EnumOrderStatus.ORDER_STATUS_REFUND_SUCCESS); + } + } catch (Exception e) { + logger.error("更新退款订单状态失败:" + e.getMessage()); + return new ResultData(ErrorCode.REFUND_ORDER_ERROR.getCode(), "更新退款订单状态失败:" + e.getMessage()); } - wxOrderService.updateOrderStatus(orderId, EnumOrderStatus.ORDER_STATUS_REFUND_SUCCESS); return new ResultData(); } @@ -160,8 +180,20 @@ public class WxOrderController extends BaseController { orderId = Long.valueOf(orderIdStr); } catch (NumberFormatException e) { logger.error("parse orderId failed"); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "订单ID转换异常"); + } + WxOrder order = null; + try { + order = wxOrderService.getById(orderId); + if (order != null) { + return new ResultData(Result.SUCCESS, "查询成功", order); + } else { + return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); + } + } catch (Exception e) { + logger.error("parse orderId failed"); + return new ResultData(ErrorCode.DB_FAIL.getCode(), "订单查询未成功,e:" + e.getMessage()); } - return new ResultData(Result.SUCCESS, "查询成功", wxOrderService.getById(orderId)); } diff --git a/mallinkCApi/src/main/java/com/simple/controller/WxPayOrderController.java b/mallinkCApi/src/main/java/com/simple/controller/WxPayOrderController.java index c159c9cec..099bf31c9 100644 --- a/mallinkCApi/src/main/java/com/simple/controller/WxPayOrderController.java +++ b/mallinkCApi/src/main/java/com/simple/controller/WxPayOrderController.java @@ -3,6 +3,7 @@ package com.simple.controller; import cn.binarywang.wx.miniapp.api.WxMaService; import com.simple.annotation.AuthIgnore; import com.simple.common.ErrorCode; +import com.simple.config.PayProperty; import com.simple.domain.po.WxAppinfo; import com.simple.domain.po.WxCUser; import com.simple.enums.EnumPayStatus; @@ -39,6 +40,9 @@ public class WxPayOrderController extends BaseController { private Logger logger = Logger.getLogger(WxPayOrderController.class); + @Autowired + private PayProperty payProperty; + @Autowired private WxPayOrderService wxPayOrderService; @@ -66,7 +70,7 @@ public class WxPayOrderController extends BaseController { try { record.setIp(IPUtil.getIpAddr(request)); - return wxPayOrderService.createPayOrder(appInfo, user, record, EnumPayWay.PAY_WAY_WECHAT); + return wxPayOrderService.createPayOrder(payProperty.isReal(), appInfo, user, record, EnumPayWay.PAY_WAY_WECHAT); } catch (MallinkException e) { logger.error("payment wechat, order create error, req 2: " + record.toString() + ", e:" + e.getMessage()); return new ResultData(e.getErrorCode(), e.getMessage()); @@ -92,7 +96,6 @@ public class WxPayOrderController extends BaseController { try { orderId = Long.valueOf(orderIdStr); } catch (NumberFormatException e) { - orderId = 0L; logger.error("orderId参数不正确: " + paramMap.toString() + ", e:" + e.getMessage()); return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId参数不正确"); } @@ -118,8 +121,8 @@ public class WxPayOrderController extends BaseController { return new ResultData(e.getErrorCode(), e.getMessage()); } catch (Exception e) { logger.error("支付状态更新失败3: " + payOrder.toString() + ", e:" + e.getMessage()); + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "支付状态更新失败3: " + payOrder.toString() + ", e:" + e.getMessage()); } - return new ResultData(ErrorCode.PAY_ORDER_ERROR); } @ApiOperation("分页列表接口") diff --git a/mallinkCApi/src/main/java/com/simple/controller/WxRefundOrderController.java b/mallinkCApi/src/main/java/com/simple/controller/WxRefundOrderController.java deleted file mode 100644 index 7dcea585f..000000000 --- a/mallinkCApi/src/main/java/com/simple/controller/WxRefundOrderController.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.simple.controller; - -import com.github.pagehelper.PageInfo; -import com.simple.common.ErrorCode; -import com.simple.common.Result; -import com.simple.common.ResultData; -import com.simple.domain.po.WxAppinfo; -import com.simple.domain.po.WxCUser; -import com.simple.domain.po.WxMerchantBUser; -import com.simple.domain.po.WxRefundOrder; -import com.simple.enums.EnumPayWay; -import com.simple.exception.MallinkException; -import com.simple.service.WxRefundOrderService; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -@RestController -@RequestMapping("/api/refund") -public class WxRefundOrderController extends BaseController -{ - private Logger logger = Logger.getLogger(WxRefundOrderController.class); - - @Autowired - private WxRefundOrderService wxRefundOrderService; - - @ApiOperation(value = "发起退款", notes = "{\"orderId\":,\"string\", \"payOrderId\":\"string\"}") - @PostMapping("/create") - public ResultData create(@RequestBody Map paramMap) { - logger.info("/api/refund/create" + paramMap.toString()); - //Assert.notNull(wxRefundOrder.getName(), "角色名不能为空"); - //Assert.isTrue(!checkUnique(sysRole.getName(), null), "重复的角色名"); - String orderIdStr = paramMap.get("orderId"); - String payOrderIdStr = paramMap.get("payOrderId"); - if (StringUtils.isBlank(orderIdStr)) { - logger.error("orderId不能为空: " + paramMap.toString()); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId不能为空"); - } - if (StringUtils.isBlank(payOrderIdStr)) { - logger.error("payOrderId不能为空: " + paramMap.toString()); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payOrderId不能为空"); - } - Long orderId = 0L; - try { - orderId = Long.valueOf(orderIdStr); - } catch (NumberFormatException e) { - logger.error("orderId参数不正确: " + paramMap.toString()); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId参数不正确"); - } - WxRefundOrder refundOrder = new WxRefundOrder(); - refundOrder.setPayOrderNo(payOrderIdStr); - refundOrder.setOrderId(orderId); - - WxCUser cUser = getUser(); - WxAppinfo appinfo = getAppInfo(cUser.getAppId()); - try { - wxRefundOrderService.createRefundOrder(appinfo, refundOrder, EnumPayWay.PAY_WAY_WEAPP); - return new ResultData(); - } catch (MallinkException e) { - logger.error(e.getMessage()); - return new ResultData(e.getErrorCode(), e.getMessage()); - } catch (Exception e) { - logger.error(e.getMessage()); - return new ResultData(ErrorCode.REFUND_ORDER_ERROR); - } - } - - @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 WxRefundOrder wxRefundOrder,Integer pageNum, Integer pageSize) { - if (null == wxRefundOrder) wxRefundOrder = new WxRefundOrder(); - final PageInfo page = wxRefundOrderService.listAsPage(wxRefundOrder, pageNum, pageSize); - return new ResultData(page); - } - - @ApiOperation("根据id查询接口") - @GetMapping("/findById") - @ApiImplicitParam(name="id",value="id",dataType="Long", paramType = "query",required=true) - public ResultData findById(Long id) { - return new ResultData(Result.SUCCESS,"查询成功",wxRefundOrderService.getById(id)); - } - - - -} diff --git a/mallinkCApi/src/main/java/com/simple/controller/WxUserGrantController.java b/mallinkCApi/src/main/java/com/simple/controller/WxUserGrantController.java index 35469d9cb..d4104f7c7 100755 --- a/mallinkCApi/src/main/java/com/simple/controller/WxUserGrantController.java +++ b/mallinkCApi/src/main/java/com/simple/controller/WxUserGrantController.java @@ -237,7 +237,7 @@ public class WxUserGrantController extends BaseController { * 检查用户状态 * @return */ - @GetMapping("/checkUserStatus") + @PostMapping("/checkUserStatus") @ApiOperation(value = "判断是否是老用户", notes="") public ResultData checkUserStatus() { Map resultMap = new HashMap(); @@ -245,13 +245,25 @@ public class WxUserGrantController extends BaseController { if (!StringUtils.isBlank(user.getUnionId())) { resultMap.put("unionId", user.getUnionId()); } + //if (StringUtils.isBlank(user.getUnionId())) { + // logger.warn("用户昵称未授权,跳转到用户授权页!"); + // return new ResultData(ErrorCode.NICK_NAME_NOT_FOUND.getCode(), "用户昵称未授权,请跳转到用户昵称授权页!", resultMap); + //} + return new ResultData(Result.SUCCESS, "是老用户,已完成所有授权", resultMap); + } + + /** + * 检查用户状态 + * @return + */ + @PostMapping("/checkPhoneStatus") + @ApiOperation(value = "判断是否是老用户", notes="") + public ResultData checkPhoneStatus() { + Map resultMap = new HashMap(); + WxCUser user = getUser(); if (!StringUtils.isBlank(user.getPhone())) { resultMap.put("phone", user.getPhone()); } - if (StringUtils.isBlank(user.getUnionId())) { - logger.warn("用户昵称未授权,跳转到用户授权页!"); - return new ResultData(ErrorCode.NICK_NAME_NOT_FOUND.getCode(), "用户昵称未授权,请跳转到用户昵称授权页!", resultMap); - } if (StringUtils.isBlank(user.getPhone())) { logger.warn("用户手机号未授权,跳转到授权手机号页!"); return new ResultData(ErrorCode.PHONE_NOT_FOUND.getCode(), "用户手机号未授权,请跳转到授权手机号页!", resultMap); diff --git a/mallinkCApi/src/main/resources/application.yml b/mallinkCApi/src/main/resources/application.yml index 278285ea9..cfcc52773 100644 --- a/mallinkCApi/src/main/resources/application.yml +++ b/mallinkCApi/src/main/resources/application.yml @@ -37,3 +37,6 @@ pagehelper: mapper: mappers: - com.simple.common.CommonMapper + +pay: + real: false diff --git a/mallinkService/src/main/java/com/simple/common/ErrorCode.java b/mallinkService/src/main/java/com/simple/common/ErrorCode.java index f1b9a7d47..3ba3ef047 100644 --- a/mallinkService/src/main/java/com/simple/common/ErrorCode.java +++ b/mallinkService/src/main/java/com/simple/common/ErrorCode.java @@ -121,6 +121,7 @@ public enum ErrorCode{ /** * 支付 */ + PAY_ORDER_NOT_FOUND(12000, "支付订单不存在"), PAY_ORDER_EXIST(12001, "支付订单已存在"), PAY_ORDER_ERROR(12002, "支付订单异常"), PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR(12003 , "支付验签失败"), diff --git a/mallinkService/src/main/java/com/simple/domain/po/WxCUserBasicInfo.java b/mallinkService/src/main/java/com/simple/domain/po/WxCUserBasicInfo.java index c3f5886cb..89abc7e02 100644 --- a/mallinkService/src/main/java/com/simple/domain/po/WxCUserBasicInfo.java +++ b/mallinkService/src/main/java/com/simple/domain/po/WxCUserBasicInfo.java @@ -83,25 +83,35 @@ public class WxCUserBasicInfo implements Serializable { @io.swagger.annotations.ApiModelProperty(value="用户姓名",name="name") private String name; @Transient - private String tags; + private String tagIds; @Transient - private List tagList; - + private String tagNames; + @Transient + private long count; + + public long getCount() { + return count; + } - public List getTagList() { - return tagList; + public void setCount(long count) { + this.count = count; } - public void setTagList(List tagList) { - this.tagList = tagList; + public String getTagNames() { + return tagNames; } - public String getTags() { - return tags; + public void setTagNames(String tagNames) { + this.tagNames = tagNames; + } + + + public String getTagIds() { + return tagIds; } - public void setTags(String tags) { - this.tags = tags; + public void setTagIds(String tagIds) { + this.tagIds = tagIds; } public String getPhone() { diff --git a/mallinkService/src/main/java/com/simple/domain/po/WxCouponChannel.java b/mallinkService/src/main/java/com/simple/domain/po/WxCouponChannel.java index 025127f50..f021b9fa0 100644 --- a/mallinkService/src/main/java/com/simple/domain/po/WxCouponChannel.java +++ b/mallinkService/src/main/java/com/simple/domain/po/WxCouponChannel.java @@ -39,9 +39,20 @@ public class WxCouponChannel implements Serializable { public void setIds(List ids) { this.ids = ids; } - - - + + + /***/ + @io.swagger.annotations.ApiModelProperty(value="",name="business") + private String business; + + public String getBusiness() { + return business; + } + + public void setBusiness(String business) { + this.business = business; + } + /*租户ID**/ @io.swagger.annotations.ApiModelProperty(value="租户ID",name="tenantId") private String tenantId; diff --git a/mallinkService/src/main/java/com/simple/domain/po/WxCouponOrder.java b/mallinkService/src/main/java/com/simple/domain/po/WxCouponOrder.java index 5a923c713..c94d2397e 100644 --- a/mallinkService/src/main/java/com/simple/domain/po/WxCouponOrder.java +++ b/mallinkService/src/main/java/com/simple/domain/po/WxCouponOrder.java @@ -1,12 +1,13 @@ package com.simple.domain.po; -import javax.persistence.*; -import java.util.*; -import java.math.*; -import javax.persistence.Transient; +import java.io.Serializable; +import java.text.DecimalFormat; +import java.util.Date; import java.util.List; + import javax.persistence.Id; -import java.io.Serializable; +import javax.persistence.Table; +import javax.persistence.Transient; @Table(name = "wx_coupon_order") public class WxCouponOrder implements Serializable { @@ -71,8 +72,58 @@ public class WxCouponOrder implements Serializable { /*单券实际购买价格**/ @io.swagger.annotations.ApiModelProperty(value = "单券实际购买价格", name = "couponPrice") private Integer couponPrice; - - public String getTenantId() { + + @Transient + private String couponName; + @Transient + private String couponPriceStr; + + @Transient + private String salePriceStr; + @Transient + private Integer salePrice; + + public String getCouponPriceStr() { + if(couponPrice!=null) { + DecimalFormat df=new DecimalFormat("0.00"); + couponPriceStr = df.format((float)couponPrice/100); + } + return couponPriceStr; + } + + public void setCouponPriceStr(String couponPriceStr) { + this.couponPriceStr = couponPriceStr; + } + + public String getSalePriceStr() { + if(salePrice!=null) { + DecimalFormat df=new DecimalFormat("0.00"); + salePriceStr = df.format((float)salePrice/100); + } + return salePriceStr; + } + + public void setSalePriceStr(String salePriceStr) { + this.salePriceStr = salePriceStr; + } + + public Integer getSalePrice() { + return salePrice; + } + + public void setSalePrice(Integer salePrice) { + this.salePrice = salePrice; + } + + public String getCouponName() { + return couponName; + } + + public void setCouponName(String couponName) { + this.couponName = couponName; + } + + public String getTenantId() { return tenantId; } diff --git a/mallinkService/src/main/java/com/simple/domain/po/WxMallBuilding.java b/mallinkService/src/main/java/com/simple/domain/po/WxMallBuilding.java index 8cb95aae2..69bb67348 100644 --- a/mallinkService/src/main/java/com/simple/domain/po/WxMallBuilding.java +++ b/mallinkService/src/main/java/com/simple/domain/po/WxMallBuilding.java @@ -1,12 +1,11 @@ package com.simple.domain.po; -import javax.persistence.*; -import java.util.*; -import java.math.*; -import javax.persistence.Transient; -import java.util.List; import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; import java.io.Serializable; +import java.util.Date; +import java.util.List; @Table(name = "wx_mall_building") public class WxMallBuilding implements Serializable { @@ -38,9 +37,11 @@ public class WxMallBuilding implements Serializable { public void setIds(List ids) { this.ids = ids; } - - - + + @Transient + protected List floors; + + /*租户ID**/ @io.swagger.annotations.ApiModelProperty(value="租户ID",name="tenantId") private String tenantId; @@ -96,7 +97,13 @@ public class WxMallBuilding implements Serializable { updateDate = _updateDate; } + public List getFloors() { + return floors; + } + public void setFloors(List floors) { + this.floors = floors; + } public static enum Field { diff --git a/mallinkService/src/main/java/com/simple/domain/po/WxMerchantBUser.java b/mallinkService/src/main/java/com/simple/domain/po/WxMerchantBUser.java index f1a7255eb..660f0b46a 100644 --- a/mallinkService/src/main/java/com/simple/domain/po/WxMerchantBUser.java +++ b/mallinkService/src/main/java/com/simple/domain/po/WxMerchantBUser.java @@ -77,6 +77,10 @@ public class WxMerchantBUser implements Serializable { @io.swagger.annotations.ApiModelProperty(value="name",name="name") private String name; + @io.swagger.annotations.ApiModelProperty(value="删除状态1删除0未删除",name="status") + private Integer status; + + public String getTenantId() { return tenantId; } @@ -146,6 +150,14 @@ public class WxMerchantBUser implements Serializable { this.name = _name; } + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + public static enum Field { Id_ASC("`id` ASC"),Id_DESC("`id` DESC") @@ -160,6 +172,7 @@ public class WxMerchantBUser implements Serializable { ,Token_ASC("`token` ASC"),Token_DESC("`token` DESC") ,ExpireTime_ASC("`expireTime` ASC"),ExpireTime_DESC("`expireTime` DESC") ,Name_ASC("`name` ASC"),Name_DESC("`name` DESC") + ,Status_ASC("`status` ASC"),Status_DESC("`status` DESC") ; private String value; diff --git a/mallinkService/src/main/java/com/simple/domain/po/WxOrder.java b/mallinkService/src/main/java/com/simple/domain/po/WxOrder.java index 0190585d1..c16bda544 100644 --- a/mallinkService/src/main/java/com/simple/domain/po/WxOrder.java +++ b/mallinkService/src/main/java/com/simple/domain/po/WxOrder.java @@ -57,6 +57,9 @@ public class WxOrder implements Serializable { /*操作券B端小程序用户ID**/ @io.swagger.annotations.ApiModelProperty(value="操作券B端小程序用户ID",name="bUserId") private Long bUserId; + /*券ID-产品ID将来的产品都会放在coupon表里**/ + @io.swagger.annotations.ApiModelProperty(value="券ID",name="couponId") + private Long couponId; /*0: 付款 1: 退款**/ @io.swagger.annotations.ApiModelProperty(value="0: 付款 1: 退款",name="paymentType") private Integer paymentType; @@ -108,6 +111,14 @@ public class WxOrder implements Serializable { public void setBUserId(Long _bUserId) { bUserId = _bUserId; } + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long _couponId) { + this.couponId = _couponId; + } + public Integer getPaymentType() { return paymentType; } @@ -161,6 +172,7 @@ public class WxOrder implements Serializable { ,CUserId_ASC("`cUserId` ASC"),CUserId_DESC("`cUserId` DESC") ,MerchantId_ASC("`merchantId` ASC"),MerchantId_DESC("`merchantId` DESC") ,BUserId_ASC("`bUserId` ASC"),BUserId_DESC("`bUserId` DESC") + ,CouponId_ASC("`couponId` ASC"),CouponId_DESC("`couponId` DESC") ,PaymentType_ASC("`paymentType` ASC"),PaymentType_DESC("`paymentType` DESC") ,Payment_ASC("`payment` ASC"),Payment_DESC("`payment` DESC") ,PaymentTime_ASC("`paymentTime` ASC"),PaymentTime_DESC("`paymentTime` DESC") diff --git a/mallinkService/src/main/java/com/simple/domain/vo/AmountRecordVo.java b/mallinkService/src/main/java/com/simple/domain/vo/AmountRecordVo.java index cfca6e507..3ab1f4265 100644 --- a/mallinkService/src/main/java/com/simple/domain/vo/AmountRecordVo.java +++ b/mallinkService/src/main/java/com/simple/domain/vo/AmountRecordVo.java @@ -1,6 +1,7 @@ package com.simple.domain.vo; import java.io.Serializable; +import java.text.DecimalFormat; /** * 交易记录核销记录Vo * @author jinguo @@ -15,10 +16,61 @@ public class AmountRecordVo implements Serializable{ * */ private static final long serialVersionUID = 4494858079134918638L; - - List orderAmountList; + //交易金额记录 + private List orderAmountList; + //核销金额记录 + private List verifyAmountList; + + private Integer orderAmount; + + private String orderAmountStr; - List verifyAmountList; + private Integer verifyAmount; + + private String verifyAmountStr; + + public String getOrderAmountStr() { + if(orderAmount!=null) { + DecimalFormat df=new DecimalFormat("0.00"); + orderAmountStr = df.format((float)orderAmount/100); + } + return orderAmountStr; + } + + public String getVerifyAmountStr() { + if(verifyAmount!=null) { + DecimalFormat df=new DecimalFormat("0.00"); + verifyAmountStr = df.format((float)verifyAmount/100); + } + return verifyAmountStr; + } + + public Integer getOrderAmount() { + return orderAmount; + } + + public void setOrderAmount(Integer orderAmount) { + this.orderAmount = orderAmount; + } + + public Integer getVerifyAmount() { + return verifyAmount; + } + + public void setVerifyAmount(Integer verifyAmount) { + this.verifyAmount = verifyAmount; + } + + public void setOrderAmountStr(String orderAmountStr) { + this.orderAmountStr = orderAmountStr; + } + + public void setVerifyAmountStr(String verifyAmountStr) { + this.verifyAmountStr = verifyAmountStr; + } + + + public List getOrderAmountList() { return orderAmountList; diff --git a/mallinkService/src/main/java/com/simple/domain/vo/WxCouponChannelVo.java b/mallinkService/src/main/java/com/simple/domain/vo/WxCouponChannelVo.java new file mode 100644 index 000000000..dca0477df --- /dev/null +++ b/mallinkService/src/main/java/com/simple/domain/vo/WxCouponChannelVo.java @@ -0,0 +1,162 @@ +package com.simple.domain.vo; + +import com.simple.domain.po.WxCoupon; +import com.simple.domain.po.WxCouponChannel; + +import javax.persistence.Transient; +import java.io.Serializable; +import java.text.DecimalFormat; +import java.util.Date; + +/** + * Created by syf on 2018/8/22. + */ +public class WxCouponChannelVo extends WxCouponChannel implements Serializable { + private static final long serialVersionUID = 1L; + @io.swagger.annotations.ApiModelProperty(value="剩余库存",name="remainInventory") + private Integer remainInventory; + @io.swagger.annotations.ApiModelProperty(value="封面图",name="coverImg") + private String coverImg; + + /*副标题**/ + @io.swagger.annotations.ApiModelProperty(value="副标题",name="subTitle") + private String subTitle; + /*售价(适用于类型2,3,4,5)**/ + @io.swagger.annotations.ApiModelProperty(value="售价(适用于类型2,3,4,5)",name="salePrice") + private Integer salePrice; + /*使用条件金额(适用于类型1,2,3,4)**/ + @io.swagger.annotations.ApiModelProperty(value="使用条件金额(适用于类型1,2,3,4)",name="usePrice") + private Integer usePrice; + + @Transient + private String salePriceStr; + + @Transient + private String usePriceStr; + + /*限领张数**/ + @io.swagger.annotations.ApiModelProperty(value="限领张数",name="useLimitQuantity") + private Integer useLimitQuantity; + + /*1.主动领取2.定向投放**/ + @io.swagger.annotations.ApiModelProperty(value="1.主动领取2.定向投放",name="sendType") + private Integer sendType; + /*发放开始时间**/ + @io.swagger.annotations.ApiModelProperty(value="发放开始时间",name="sendStartDate") + private Date sendStartDate; + /*发放结束时间**/ + @io.swagger.annotations.ApiModelProperty(value="发放结束时间",name="sendEndDate") + private Date sendEndDate; + + public Integer getRemainInventory() { + return remainInventory; + } + + public void setRemainInventory(Integer remainInventory) { + this.remainInventory = remainInventory; + } + + public String getCoverImg() { + return coverImg; + } + + public void setCoverImg(String coverImg) { + this.coverImg = coverImg; + } + + public String getSubTitle() { + return subTitle; + } + + public void setSubTitle(String subTitle) { + this.subTitle = subTitle; + } + + public Integer getSalePrice() { + return salePrice; + } + + public void setSalePrice(Integer salePrice) { + this.salePrice = salePrice; + } + + public Integer getUsePrice() { + return usePrice; + } + + public void setUsePrice(Integer usePrice) { + this.usePrice = usePrice; + } + + public Integer getUseLimitQuantity() { + return useLimitQuantity; + } + + public void setUseLimitQuantity(Integer useLimitQuantity) { + this.useLimitQuantity = useLimitQuantity; + } + + public Integer getSendType() { + return sendType; + } + + public void setSendType(Integer sendType) { + this.sendType = sendType; + } + + public Date getSendStartDate() { + return sendStartDate; + } + + public void setSendStartDate(Date sendStartDate) { + this.sendStartDate = sendStartDate; + } + + public Date getSendEndDate() { + return sendEndDate; + } + + public void setSendEndDate(Date sendEndDate) { + this.sendEndDate = sendEndDate; + } + + public String getSalePriceStr() { + if(salePrice!=null) { + DecimalFormat df=new DecimalFormat("0.00"); + salePriceStr = df.format((float)salePrice/100); + } + return salePriceStr; + } + + public void setSalePriceStr(String salePriceStr) { + this.salePriceStr = salePriceStr; + } + + public String getUsePriceStr() { + if(usePrice!=null) { + DecimalFormat df=new DecimalFormat("0.00"); + usePriceStr = df.format((float)usePrice/100); + } + return usePriceStr; + } + + public void setUsePriceStr(String usePriceStr) { + this.usePriceStr = usePriceStr; + } + + public WxCouponChannelVo(){} + public WxCouponChannelVo setWxCoupon (WxCoupon wxCoupon){ + this.coverImg=wxCoupon.getCoverImg(); + this.remainInventory=wxCoupon.getRemainInventory(); + this.salePrice=wxCoupon.getSalePrice(); + this.sendStartDate=wxCoupon.getSendStartDate(); + this.sendEndDate=wxCoupon.getSendEndDate(); + this.sendType=wxCoupon.getSendType(); + this.useLimitQuantity=wxCoupon.getUseLimitQuantity(); + this.usePrice=wxCoupon.getUsePrice(); + this.subTitle=wxCoupon.getSubTitle(); + return this; + } + + +} diff --git a/mallinkService/src/main/java/com/simple/domain/vo/WxUserCouponVo.java b/mallinkService/src/main/java/com/simple/domain/vo/WxUserCouponVo.java new file mode 100644 index 000000000..74c08d0c7 --- /dev/null +++ b/mallinkService/src/main/java/com/simple/domain/vo/WxUserCouponVo.java @@ -0,0 +1,14 @@ +package com.simple.domain.vo; + +import com.simple.domain.po.WxCouponOrder; + +public class WxUserCouponVo extends WxCouponOrder{ + + /** + * + */ + private static final long serialVersionUID = 6687954932922444531L; + + + +} diff --git a/mallinkService/src/main/java/com/simple/enums/EnumCouponStatus.java b/mallinkService/src/main/java/com/simple/enums/EnumCouponStatus.java index 6fd5739be..3e730d29f 100644 --- a/mallinkService/src/main/java/com/simple/enums/EnumCouponStatus.java +++ b/mallinkService/src/main/java/com/simple/enums/EnumCouponStatus.java @@ -5,15 +5,11 @@ package com.simple.enums; */ public enum EnumCouponStatus { - // 0-草稿/待生效;1-已生效/已发布/已投放;2-已下架;3-已领取/已购买/未核销/未使用,4:已核销/已使用,5:已过期,6:已退券 + // 0-草稿/待生效;1-已生效/已发布/已投放;2-已下架; COUPON_STATUS_DRAFT(0, "草稿"), COUPON_STATUS_THROW_IN(1, "已投放"), COUPON_STATUS_TAKE_OFFF(2, "已下架"), - COUPON_STATUS_NOT_USED(3, "未使用"), - COUPON_STATUS_USED(4,"已使用"), - COUPON_STATUS_OVER_TIME(5, "已过期"), - COUPON_STATUS_BACKED(6, "已退券") ; public static EnumCouponStatus getEnum(Integer code) { diff --git a/mallinkService/src/main/java/com/simple/mapper/WxCouponChannelMapper.java b/mallinkService/src/main/java/com/simple/mapper/WxCouponChannelMapper.java index f948b1489..b5bd20448 100644 --- a/mallinkService/src/main/java/com/simple/mapper/WxCouponChannelMapper.java +++ b/mallinkService/src/main/java/com/simple/mapper/WxCouponChannelMapper.java @@ -2,12 +2,15 @@ package com.simple.mapper; import java.util.*; import com.simple.common.CommonMapper; +import com.simple.domain.vo.WxCouponChannelVo; import org.apache.ibatis.annotations.Param; import com.simple.domain.po.WxCouponChannel; public interface WxCouponChannelMapper extends CommonMapper { List findList(WxCouponChannel wxCouponChannel); + + List findVoList(WxCouponChannel wxCouponChannel); diff --git a/mallinkService/src/main/java/com/simple/mapper/WxOrderMapper.java b/mallinkService/src/main/java/com/simple/mapper/WxOrderMapper.java index b6f7ed209..d90112eca 100644 --- a/mallinkService/src/main/java/com/simple/mapper/WxOrderMapper.java +++ b/mallinkService/src/main/java/com/simple/mapper/WxOrderMapper.java @@ -2,6 +2,7 @@ package com.simple.mapper; import java.util.*; import com.simple.common.CommonMapper; +import com.simple.domain.po.WxCouponOrder; import com.simple.domain.vo.OrderVo; import org.apache.ibatis.annotations.Param; import com.simple.domain.po.WxOrder; @@ -14,4 +15,5 @@ public interface WxOrderMapper extends CommonMapper { Map queryObject(OrderVo orderVo); + List findListOfUnpaidOrderByDate(Map dateMap); } diff --git a/mallinkService/src/main/java/com/simple/schedule/DaliyAmountSchedule.java b/mallinkService/src/main/java/com/simple/schedule/DaliyAmountSchedule.java index 55f031d11..951a531c0 100644 --- a/mallinkService/src/main/java/com/simple/schedule/DaliyAmountSchedule.java +++ b/mallinkService/src/main/java/com/simple/schedule/DaliyAmountSchedule.java @@ -1,6 +1,8 @@ package com.simple.schedule; +import com.simple.common.IdWorker; import com.simple.domain.po.WxCouponOrder; +import com.simple.domain.po.WxDateAmountRecord; import com.simple.domain.po.WxMall; import com.simple.domain.po.WxMerchant; import com.simple.mapper.*; @@ -64,42 +66,72 @@ public class DaliyAmountSchedule { for (int j=0; j < merchantList.size(); j++) { merchant = merchantList.get(j); - HashMap dateMap = new HashMap(); + Map dateMap = new HashMap(); SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); String dateString = fmt.format(new Date()); + Date startDate = null; try { - Date startDate = fmt.parse(dateString); - dateMap.put("startDate", startDate); - dateMap.put("endDate", new Date()); - dateMap.put("merchantID",merchant.getId()); - - List list = wxCouponOrderMapper.findListOfOrderedByDate(dateMap); - logger.info("find " + list.size() + " coupon order from " + startDate + " to " + new Date()); - int total_price = 0; - for(WxCouponOrder couponOrder : list) { - total_price = total_price + couponOrder.getCouponPrice(); - } - logger.info("\nFound " + list.size() + " coupon orders \n" + - "for " + merchant.getId() + "\n" + - "from " + startDate + " to " + new Date() +"\n" + - "TOTAL ORDER=" + total_price); - - - list= wxCouponOrderMapper.findListOfVerifiedByDate(dateMap); - logger.info("find " + list.size() + " coupon order from " + startDate + " to " + new Date()); - total_price = 0; - for(WxCouponOrder couponOrder : list) { - total_price = total_price + couponOrder.getCouponPrice(); - } - logger.info("\nFound " + list.size() + " coupon orders \n" + - "for " + merchant.getId() + "\n" + - "from " + startDate + " to " + new Date() +"\n" + - "TOTAL VERIFIED=" + total_price); - //daliy amount 落表 - + startDate = fmt.parse(dateString); } catch (ParseException e) { logger.error("Parse date string failed"); + continue; + } + dateMap.put("startDate", startDate); + dateMap.put("endDate", new Date()); + dateMap.put("merchantID",merchant.getId()); + + List list = wxCouponOrderMapper.findListOfOrderedByDate(dateMap); + logger.info("find " + list.size() + " coupon order from " + startDate + " to " + new Date()); + int total_price = 0; + for(WxCouponOrder couponOrder : list) { + total_price = total_price + couponOrder.getCouponPrice(); + } + logger.info("\nFound " + list.size() + " coupon orders \n" + + "for " + merchant.getId() + "\n" + + "from " + startDate + " to " + new Date() +"\n" + + "TOTAL ORDER=" + total_price); + + + Date now = new Date(); + Calendar cal = Calendar.getInstance(); + cal.setTime(now); // 将时分秒,毫秒域清零 + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + now = cal.getTime(); + + WxDateAmountRecord dateAmountRecord = new WxDateAmountRecord(); + dateAmountRecord.setId(IdWorker.get().nextId()); + dateAmountRecord.setCreateDate(new Date()); + dateAmountRecord.setUpdateDate(new Date()); + dateAmountRecord.setPayPrice(total_price); + dateAmountRecord.setMerchantId(merchant.getId()); + dateAmountRecord.setTenantId(merchant.getTenantId()); + dateAmountRecord.setType(0); + dateAmountRecord.setDate(now); + dateAmountRecord.setDayOfWeek(cal.get(Calendar.DAY_OF_WEEK)); + dateAmountRecord.setMonth(cal.get(Calendar.MONTH)); + dateAmountRecord.setWeekOfYear(cal.get(Calendar.WEEK_OF_YEAR)); + + wxDateAmountRecordService.saveDaliyAmount(dateAmountRecord); + + list= wxCouponOrderMapper.findListOfVerifiedByDate(dateMap); + logger.info("find " + list.size() + " coupon order from " + startDate + " to " + new Date()); + total_price = 0; + for(WxCouponOrder couponOrder : list) { + total_price = total_price + couponOrder.getCouponPrice(); } + logger.info("\nFound " + list.size() + " coupon orders \n" + + "for " + merchant.getId() + "\n" + + "from " + startDate + " to " + new Date() +"\n" + + "TOTAL VERIFIED=" + total_price); + + dateAmountRecord.setId(IdWorker.get().nextId()); + dateAmountRecord.setPayPrice(total_price); + dateAmountRecord.setType(1); + wxDateAmountRecordService.saveDaliyAmount(dateAmountRecord); + } } } diff --git a/mallinkService/src/main/java/com/simple/schedule/MsgSendingSchedule.java b/mallinkService/src/main/java/com/simple/schedule/MsgSendingSchedule.java index 6b2456fde..bb711d476 100644 --- a/mallinkService/src/main/java/com/simple/schedule/MsgSendingSchedule.java +++ b/mallinkService/src/main/java/com/simple/schedule/MsgSendingSchedule.java @@ -77,8 +77,8 @@ public class MsgSendingSchedule { String sign = HMACSHA256.sha256_HMAC(sb.toString(), secret); message.put("sign", sign.toUpperCase()); - String str32 = "198b02e8fd704e96198b02e8fd704e96"; - String iv = "198b02e8fd704e96"; + String str32 = HMACSHA256.STR2; + String iv = HMACSHA256.IV; Map params = new HashMap<>(); params.put("iv", iv); diff --git a/mallinkService/src/main/java/com/simple/schedule/OrderExpireSchedule.java b/mallinkService/src/main/java/com/simple/schedule/OrderExpireSchedule.java new file mode 100644 index 000000000..4b6b8a194 --- /dev/null +++ b/mallinkService/src/main/java/com/simple/schedule/OrderExpireSchedule.java @@ -0,0 +1,59 @@ +package com.simple.schedule; + +import com.simple.domain.po.WxCouponOrder; +import com.simple.domain.po.WxMall; +import com.simple.domain.po.WxMerchant; +import com.simple.domain.po.WxOrder; +import com.simple.enums.EnumOrderStatus; +import com.simple.mapper.WxCouponOrderMapper; +import com.simple.mapper.WxMallMapper; +import com.simple.mapper.WxMerchantMapper; +import com.simple.mapper.WxOrderMapper; +import com.simple.service.WxDateAmountRecordService; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Component +public class OrderExpireSchedule { + + private final Logger logger = Logger.getLogger(OrderExpireSchedule.class); + + private final int TIME_OUT_VALUE = 15 * 60 * 1000; //15分钟 + + @Autowired + WxOrderMapper wxOrderMapper; + + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + @Scheduled(cron = "0 */5 * * * *?") // 每5分钟检查一次 + //@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次 + public void orderExpireSchedule() { + + Map dateMap = new HashMap(); + Date curDate = new Date(); + + //dateMap.put("startDate",new Date(curDate.getTime() - 2*TIME_OUT_VALUE)); + dateMap.put("endDate", new Date(curDate.getTime() - TIME_OUT_VALUE )); + List wxOrderList = wxOrderMapper.findListOfUnpaidOrderByDate(dateMap); + + for(WxOrder wxOrder: wxOrderList){ + wxOrder.setUpdateDate(new Date()); + wxOrder.setOrderStatus(EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL.getCode()); + wxOrderMapper.updateByPrimaryKeySelective(wxOrder); + + logger.info("\nFound " + wxOrder.getId() + "\n" + + " create at " + wxOrder.getCreateDate() +"\n" + + " expired at " + new Date()); + } + } +} \ No newline at end of file diff --git a/mallinkService/src/main/java/com/simple/service/WxCouponChannelService.java b/mallinkService/src/main/java/com/simple/service/WxCouponChannelService.java index 66db5d5ba..74192f9ec 100644 --- a/mallinkService/src/main/java/com/simple/service/WxCouponChannelService.java +++ b/mallinkService/src/main/java/com/simple/service/WxCouponChannelService.java @@ -1,8 +1,8 @@ package com.simple.service; -import java.util.*; import com.github.pagehelper.PageInfo; import com.simple.domain.po.WxCouponChannel; +import com.simple.domain.vo.WxCouponChannelVo; public interface WxCouponChannelService { @@ -15,6 +15,8 @@ public interface WxCouponChannelService { * @return */ PageInfo listAsPage(WxCouponChannel record, Integer pageIndex, Integer pageSize); + + PageInfo listPageCAPI(WxCouponChannel record, Integer pageIndex, Integer pageSize); /** * 根据Id获得实体 diff --git a/mallinkService/src/main/java/com/simple/service/WxDateAmountRecordService.java b/mallinkService/src/main/java/com/simple/service/WxDateAmountRecordService.java index b86b617e7..f9881c1b5 100644 --- a/mallinkService/src/main/java/com/simple/service/WxDateAmountRecordService.java +++ b/mallinkService/src/main/java/com/simple/service/WxDateAmountRecordService.java @@ -49,8 +49,10 @@ public interface WxDateAmountRecordService { int updateAmount(String tenantId,Long merchantId ,Integer type,Integer payPrice); - - - + /** + * 记录每日交易核销总额 + */ + + void saveDaliyAmount(WxDateAmountRecord amount); } diff --git a/mallinkService/src/main/java/com/simple/service/WxMallBuildingService.java b/mallinkService/src/main/java/com/simple/service/WxMallBuildingService.java index 43b63c037..d43f0592c 100644 --- a/mallinkService/src/main/java/com/simple/service/WxMallBuildingService.java +++ b/mallinkService/src/main/java/com/simple/service/WxMallBuildingService.java @@ -42,4 +42,6 @@ public interface WxMallBuildingService { ResultData getbuildinglist(String tenantId); + ResultData getbuildingfloorlist(String tenantId); + } diff --git a/mallinkService/src/main/java/com/simple/service/WxOrderService.java b/mallinkService/src/main/java/com/simple/service/WxOrderService.java index 47e55ec7a..c0cfa1d22 100644 --- a/mallinkService/src/main/java/com/simple/service/WxOrderService.java +++ b/mallinkService/src/main/java/com/simple/service/WxOrderService.java @@ -53,11 +53,18 @@ public interface WxOrderService { WxOrder sendUserFreeCoupon(Long userId, Long couponId); /** - * 更新订单状态 - * @param orderId + * orderSuccess 订单已支付 + * @param updateOrder + * @return + */ + int orderSuccess(WxOrder updateOrder); + + /** + * updateOrderStatus 更新订单状态, 只针对已取消及已退款 + * @param updateOrder * @param enumOrderStatus */ - int updateOrderStatus(Long orderId, EnumOrderStatus enumOrderStatus); + int updateOrderStatus(WxOrder updateOrder, EnumOrderStatus enumOrderStatus); /** * 根据Id获得实体 diff --git a/mallinkService/src/main/java/com/simple/service/WxPayOrderService.java b/mallinkService/src/main/java/com/simple/service/WxPayOrderService.java index 1187f71a4..1ebf9e81b 100644 --- a/mallinkService/src/main/java/com/simple/service/WxPayOrderService.java +++ b/mallinkService/src/main/java/com/simple/service/WxPayOrderService.java @@ -18,7 +18,7 @@ public interface WxPayOrderService { * @param payWay * @return */ - ResultData createPayOrder(WxAppinfo appInfo, WxCUser user, WxPayOrder record, EnumPayWay payWay); + ResultData createPayOrder(boolean isReal, WxAppinfo appInfo, WxCUser user, WxPayOrder record, EnumPayWay payWay); /** * 异步通知 @@ -78,6 +78,14 @@ public interface WxPayOrderService { */ WxPayOrder getById(Long id); + /** + * 根据obj获得实体 + * + * @param payOrder + * @return + */ + WxPayOrder getByObj(WxPayOrder payOrder); + /** diff --git a/mallinkService/src/main/java/com/simple/service/WxRefundOrderService.java b/mallinkService/src/main/java/com/simple/service/WxRefundOrderService.java index ff4bc8ba7..48c4f7259 100644 --- a/mallinkService/src/main/java/com/simple/service/WxRefundOrderService.java +++ b/mallinkService/src/main/java/com/simple/service/WxRefundOrderService.java @@ -4,6 +4,7 @@ import java.util.*; import com.github.pagehelper.PageInfo; import com.simple.common.ResultData; import com.simple.domain.po.WxAppinfo; +import com.simple.domain.po.WxPayOrder; import com.simple.domain.po.WxRefundOrder; import com.simple.enums.EnumPayWay; @@ -11,12 +12,14 @@ public interface WxRefundOrderService { /** * 创建退款订单 + * @param isReal * @param appInfo * @param record 退款订单请求 + * @param payOrder 支付订单 * @param payWay * @return */ - ResultData createRefundOrder(WxAppinfo appInfo, WxRefundOrder record, EnumPayWay payWay); + ResultData createRefundOrder(boolean isReal, WxAppinfo appInfo, WxRefundOrder record, WxPayOrder payOrder, EnumPayWay payWay); /** * 退款订单查询 diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxCouponChannelServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxCouponChannelServiceImpl.java index 2ca38048f..64588733a 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxCouponChannelServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxCouponChannelServiceImpl.java @@ -1,10 +1,13 @@ package com.simple.service.impl; import java.util.*; +import java.util.stream.Collectors; + import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.simple.domain.po.WxCoupon; import com.simple.domain.po.WxCouponChannel; +import com.simple.domain.vo.WxCouponChannelVo; import com.simple.mapper.WxCouponChannelMapper; import com.simple.service.WxCouponChannelService; import com.simple.service.WxCouponService; @@ -22,6 +25,13 @@ public class WxCouponChannelServiceImpl implements WxCouponChannelService { WxCouponService wxCouponService; + /** + * B端业务端 + * @param record + * @param pageIndex + * @param pageSize + * @return + */ @Override public PageInfo listAsPage(WxCouponChannel record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponChannelMapper.findList(record)); @@ -64,11 +74,13 @@ public class WxCouponChannelServiceImpl implements WxCouponChannelService { } + @Transactional public void addCuponChannel(Long couponid,Integer channelId,String tanantId){ - WxCoupon wxCouponUP = new WxCoupon(); - wxCouponUP.setId(couponid); - wxCouponUP.setStatus(1); - wxCouponService.saveOrUpdate(wxCouponUP); + WxCoupon wxCoupon = wxCouponService.getById(couponid); + if(wxCoupon.getStatus()!=1) { + wxCoupon.setStatus(1); + wxCouponService.saveOrUpdate(wxCoupon); + } WxCouponChannel wxCouponChannel = new WxCouponChannel(); wxCouponChannel.setCouponId(couponid); wxCouponChannel.setCouponStatus(1); @@ -77,5 +89,33 @@ public class WxCouponChannelServiceImpl implements WxCouponChannelService { saveOrUpdate(wxCouponChannel); } + /** + * C端api使用,关联查找的券时已生效 + * @param record + * @param pageIndex + * @param pageSize + * @return + */ + @Override + public PageInfo listPageCAPI(WxCouponChannel record, Integer pageIndex, Integer pageSize) { + List wxCouponChannelVoList = new ArrayList<>(); + PageHelper.startPage(pageIndex, pageSize); + wxCouponChannelVoList = wxCouponChannelMapper.findVoList(record); + if(wxCouponChannelVoList.isEmpty()){ + return new PageInfo<>(wxCouponChannelVoList); + } + List couponIds = wxCouponChannelVoList.stream().map(p->p.getCouponId()).distinct().collect(Collectors.toList()); + WxCoupon wxCoupon = new WxCoupon(); + wxCoupon.setIds(couponIds); + List wxCoupons = wxCouponService.findList(wxCoupon); + Map couponNamesMap = wxCoupons.stream().collect(Collectors.toMap(WxCoupon::getId,p->p)); + for (WxCouponChannelVo wxcouponVo:wxCouponChannelVoList) { + if(couponNamesMap.get(wxcouponVo.getCouponId())!=null){ + wxcouponVo.setWxCoupon(couponNamesMap.get(wxcouponVo.getCouponId())); + } + } + return new PageInfo<>(wxCouponChannelVoList); + } + } diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxDateAmountRecordServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxDateAmountRecordServiceImpl.java index b2f2a7fec..efc598f8c 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxDateAmountRecordServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxDateAmountRecordServiceImpl.java @@ -59,8 +59,34 @@ public class WxDateAmountRecordServiceImpl implements WxDateAmountRecordService r.setTenantId(tenantId); r.setMerchantId(merchantId); r.setType(type); + List list = wxDateAmountRecordMapper.findList(r); r.setPayPrice(payPrice); + if(!list.isEmpty()) {//今天没数据就新增一条 + r.setDayOfWeek(cal1.get(Calendar.DAY_OF_WEEK)); + r.setMonth(cal1.get(Calendar.MONTH)); + r.setWeekOfYear(cal1.get(Calendar.WEEK_OF_YEAR)); + return wxDateAmountRecordMapper.insertSelective(r); + } return wxDateAmountRecordMapper.updateAmount(r); } - + + @Override + public void saveDaliyAmount(WxDateAmountRecord amount) { + + WxDateAmountRecord record = new WxDateAmountRecord(); + record.setDate(amount.getDate()); + record.setTenantId(amount.getTenantId()); + record.setMerchantId(amount.getMerchantId()); + record.setType(amount.getType()); + + List list = wxDateAmountRecordMapper.findList(record); + + if (list.size() > 0){ + list.get(0).setPayPrice(amount.getPayPrice()); + list.get(0).setUpdateDate(new Date()); + wxDateAmountRecordMapper.updateByPrimaryKeySelective(list.get(0)); + }else{ + wxDateAmountRecordMapper.insertSelective(amount); + } + } } diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxMallBuildingServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxMallBuildingServiceImpl.java index 050f56a37..8b31933c4 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxMallBuildingServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxMallBuildingServiceImpl.java @@ -1,15 +1,19 @@ package com.simple.service.impl; -import java.util.*; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import com.simple.common.IdWorker; import com.simple.common.ResultData; import com.simple.domain.po.WxMallBuilding; +import com.simple.domain.po.WxMallFloor; import com.simple.mapper.WxMallBuildingMapper; +import com.simple.mapper.WxMallFloorMapper; import com.simple.service.WxMallBuildingService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.simple.common.IdWorker; + +import java.util.List; +import java.util.stream.Collectors; @Service public class WxMallBuildingServiceImpl implements WxMallBuildingService { @@ -17,6 +21,8 @@ public class WxMallBuildingServiceImpl implements WxMallBuildingService { @Autowired WxMallBuildingMapper wxMallBuildingMapper; + @Autowired + WxMallFloorMapper wxMallFloorMapper; @Override public PageInfo listAsPage(WxMallBuilding record, Integer pageIndex, Integer pageSize) { @@ -53,5 +59,33 @@ public class WxMallBuildingServiceImpl implements WxMallBuildingService { return new ResultData(list); } + @Override + public ResultData getbuildingfloorlist(String tenantId) { + WxMallBuilding wxMallBuilding = new WxMallBuilding(); + wxMallBuilding.setTenantId(tenantId); + List buildings = wxMallBuildingMapper.findList(wxMallBuilding); + List wxMallBuildings = buildings.stream().map(b -> { + WxMallBuilding tempb = new WxMallBuilding(); + tempb.setId(b.getId()); + tempb.setName(b.getName()); + return tempb; + }).collect(Collectors.toList()); + + for(WxMallBuilding building:wxMallBuildings){ + WxMallFloor wxMallFloor = new WxMallFloor(); + wxMallFloor.setBuildingId(building.getId()); + List wxMallFloors = wxMallFloorMapper.findList(wxMallFloor).stream().map(f -> { + WxMallFloor tempf = new WxMallFloor(); + tempf.setId(f.getId()); + tempf.setFloorName(f.getFloorName()); + return tempf; + }).collect(Collectors.toList()); + building.setFloors(wxMallFloors); + + } + + return new ResultData(wxMallBuildings); + } + } diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxMerchantBUserServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxMerchantBUserServiceImpl.java index 7da93e763..945a82aaa 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxMerchantBUserServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxMerchantBUserServiceImpl.java @@ -84,6 +84,7 @@ public class WxMerchantBUserServiceImpl implements WxMerchantBUserService { public boolean hasphone(String phone) { WxMerchantBUser bUser = new WxMerchantBUser(); bUser.setPhone(phone); + bUser.setStatus(0); List list = wxMerchantBUserMapper.findList(bUser); return list.size()>=1?true:false; } diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxMerchantServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxMerchantServiceImpl.java index 65d8e6ba4..b78648a71 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxMerchantServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxMerchantServiceImpl.java @@ -62,6 +62,7 @@ public class WxMerchantServiceImpl implements WxMerchantService { WxMerchantBUser wxMerchantBUser = new WxMerchantBUser(); wxMerchantBUser.setMerchantId(wxMerchant.getId()); + wxMerchantBUser.setStatus(0); List bUserList = wxMerchantBUserMapper.findList(wxMerchantBUser); wxMerchant.setbUsers(bUserList); return wxMerchant; @@ -122,13 +123,8 @@ public class WxMerchantServiceImpl implements WxMerchantService { WxShopMapper.updateByPrimaryKeySelective(wxShop); } - //删除之前的关联用户 List bUsers = wxMerchant.getbUsers(); - for(WxMerchantBUser user:bUsers){ - wxMerchantBUserMapper.deleteByPrimaryKey(user.getId()); - } - //保存商户关联用户 for(WxMerchantBUser user:bUsers){ long id = idWorker.nextId(); @@ -140,6 +136,7 @@ public class WxMerchantServiceImpl implements WxMerchantService { date = new Date(); user.setCreateDate(date); user.setUpdateDate(date); + user.setStatus(0); wxMerchantBUserMapper.insertSelective(user); } @@ -188,25 +185,43 @@ public class WxMerchantServiceImpl implements WxMerchantService { WxShopMapper.updateByPrimaryKeySelective(wxShop); } - //删除之前的关联用户 List bUsers = wxMerchant.getbUsers(); - for(WxMerchantBUser user:bUsers){ - wxMerchantBUserMapper.deleteByPrimaryKey(user.getId()); + //删除之前的关联用户 + WxMerchantBUser bUser = new WxMerchantBUser(); + bUser.setMerchantId(wxMerchant.getId()); + List wxMerchantBUserMapperList = wxMerchantBUserMapper.findList(bUser); + for(WxMerchantBUser wxMerchantBUser:wxMerchantBUserMapperList){ + wxMerchantBUser.setStatus(1); + wxMerchantBUserMapper.updateByPrimaryKeySelective(wxMerchantBUser); } + //保存商户关联用户 for(WxMerchantBUser user:bUsers){ - long id = idWorker.nextId(); - user.setId(id); - user.setBUserId(id); - user.setMerchantId(wxMerchant.getId()); - user.setTenantId(wxMerchant.getTenantId()); - user.setAppId(wxAppinfo.getAppId()); - date = new Date(); - user.setCreateDate(date); - user.setUpdateDate(date); - wxMerchantBUserMapper.insertSelective(user); + if(user.getId()==null){//没有id的新增 + long id = idWorker.nextId(); + user.setId(id); + user.setBUserId(id); + user.setMerchantId(wxMerchant.getId()); + user.setTenantId(wxMerchant.getTenantId()); + user.setAppId(wxAppinfo.getAppId()); + date = new Date(); + user.setCreateDate(date); + user.setUpdateDate(date); + user.setStatus(0); + wxMerchantBUserMapper.insertSelective(user); + }else{//有id的更新 + user.setBUserId(user.getId()); + user.setMerchantId(wxMerchant.getId()); + user.setTenantId(wxMerchant.getTenantId()); + user.setAppId(wxAppinfo.getAppId()); + date = new Date(); + user.setUpdateDate(date); + user.setStatus(0); + wxMerchantBUserMapper.updateByPrimaryKeySelective(user); + } + } diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxMsgModelServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxMsgModelServiceImpl.java index 08ee0f964..60b4837c0 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxMsgModelServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxMsgModelServiceImpl.java @@ -81,8 +81,8 @@ public class WxMsgModelServiceImpl implements WxMsgModelService { String sign = HMACSHA256.sha256_HMAC(sb.toString(), secret); message.put("sign", sign.toUpperCase()); - String str32 = "198b02e8fd704e96198b02e8fd704e96"; - String iv = "198b02e8fd704e96"; + String str32 = HMACSHA256.STR2; + String iv = HMACSHA256.IV; Map params = new HashMap<>(); params.put("iv", iv); diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxMsgServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxMsgServiceImpl.java index 289f68b4e..8144d1a23 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxMsgServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxMsgServiceImpl.java @@ -155,8 +155,8 @@ public class WxMsgServiceImpl implements WxMsgService { String sign = HMACSHA256.sha256_HMAC(sb.toString(), secret); message.put("sign", sign.toUpperCase()); - String str32 = "198b02e8fd704e96198b02e8fd704e96"; - String iv = "198b02e8fd704e96"; + String str32 = HMACSHA256.STR2; + String iv = HMACSHA256.IV; Map params = new HashMap<>(); params.put("iv", iv); diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxMsgValidationcodeModelServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxMsgValidationcodeModelServiceImpl.java index a90fb0b16..d7fe9bc21 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxMsgValidationcodeModelServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxMsgValidationcodeModelServiceImpl.java @@ -84,8 +84,8 @@ public class WxMsgValidationcodeModelServiceImpl implements WxMsgValidationcodeM String sign = HMACSHA256.sha256_HMAC(sb.toString(), secret); message.put("sign", sign.toUpperCase()); - String str32 = "198b02e8fd704e96198b02e8fd704e96"; - String iv = "198b02e8fd704e96"; + String str32 = HMACSHA256.STR2; + String iv = HMACSHA256.IV; Map params = new HashMap<>(); params.put("iv", iv); diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxMsgValidationcodeServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxMsgValidationcodeServiceImpl.java index 047285f90..4993446e2 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxMsgValidationcodeServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxMsgValidationcodeServiceImpl.java @@ -78,29 +78,6 @@ public class WxMsgValidationcodeServiceImpl implements WxMsgValidationcodeServic @Override public ResultData sendvalidationcode(WxMsgValidationcode wxMsgValidationcode) { - WxMerchantBUser user = new WxMerchantBUser(); - user.setAppId(wxMsgValidationcode.getAppid()); - user.setPhone(wxMsgValidationcode.getPhone()); - - List userList = wxMerchantBUserMapper.findList(user); - if (userList.size()==0) { - logger.error("B端用户不存在, phone: " + wxMsgValidationcode.getPhone()); - return new ResultData(ErrorCode.USER_IS_EMPTY); - } - - WxMerchant wxMerchant = new WxMerchant(); - wxMerchant.setId(userList.get(0).getId()); - List merchantList = wxMerchantMapper.findList(wxMerchant); - if (merchantList.size()==0) { - logger.error("B端所在商户不存在, id: " + userList.get(0).getId()); - return new ResultData(ErrorCode.MERCHANT_INFO_NOT_FOUND); - } - - wxMerchant = merchantList.get(0); - if(wxMerchant.getStatus()==0){ - logger.error("B端所在商户已停用, id: " + userList.get(0).getId()); - return new ResultData(ErrorCode.MERCHANT_INFO_NOT_VALID); - } //1、查看是否存在未过期的短信,有返回成功 没有继续 List wxmsgvalidationcodelist = wxMsgValidationcodeMapper.findList(wxMsgValidationcode); @@ -160,8 +137,8 @@ public class WxMsgValidationcodeServiceImpl implements WxMsgValidationcodeServic String sign = HMACSHA256.sha256_HMAC(sb.toString(), secret); message.put("sign", sign.toUpperCase()); - String str32 = "198b02e8fd704e96198b02e8fd704e96"; - String iv = "198b02e8fd704e96"; + String str32 = HMACSHA256.STR2; + String iv = HMACSHA256.IV; Map params = new HashMap<>(); params.put("iv", iv); diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxOrderServiceImpl.java index cd528226d..8829ef98b 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxOrderServiceImpl.java @@ -1,6 +1,5 @@ package com.simple.service.impl; -import java.math.BigDecimal; import java.util.*; import com.github.pagehelper.PageHelper; @@ -8,14 +7,10 @@ import com.github.pagehelper.PageInfo; import com.simple.common.ErrorCode; import com.simple.domain.po.*; import com.simple.domain.vo.OrderVo; -import com.simple.enums.EnumCouponOrderStatus; -import com.simple.enums.EnumOrderStatus; -import com.simple.enums.EnumPayType; -import com.simple.enums.EnumValidStatus; +import com.simple.enums.*; import com.simple.exception.MallinkException; import com.simple.mapper.*; import com.simple.service.WxOrderService; -import com.simple.service.WxPayAccountService; import com.simple.utils.RedisLock; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; @@ -71,29 +66,45 @@ public class WxOrderServiceImpl implements WxOrderService { return wxOrderMapper.queryObject(orderVo); } - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public WxOrder saveOrder(WxCUser user, Long couponId) { - String couponIdStr = String.valueOf(couponId); - WxCoupon coupon = wxCouponMapper.selectByPrimaryKey(couponId); - if (coupon == null) { - logger.error("券不存在, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); + private int getUserCouponOrderCount(WxCUser user, WxCoupon counpon) { + // 用户购买的券包数量 + // + Order 待支付 + // + couponOrder 待使用 + int countOrder = 0, countCouponOrder = 0; + WxOrder orderQ = new WxOrder(); + orderQ.setCouponId(counpon.getId()); + orderQ.setCUserId(user.getId()); + orderQ.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); + try { + countOrder = wxOrderMapper.selectCount(orderQ); + }catch (Exception e) { + logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL); } - //加锁 + + WxCouponOrder couponOrderQ = new WxCouponOrder(); + couponOrderQ.setCouponId(counpon.getId()); + couponOrderQ.setCUserId(user.getId()); + couponOrderQ.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); + try { + countCouponOrder = wxCouponOrderMapper.selectCount(couponOrderQ); + }catch (Exception e) { + logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL); + } + + return countOrder + countCouponOrder; + } + + private void stockReduce(WxCUser user, WxCoupon coupon, String couponIdStr) { long time = System.currentTimeMillis() + RedisLock.TIMEOUT; String timeStr = String.valueOf(time); + // 库存加锁 if(!redisLock.lock(couponIdStr, timeStr)) { logger.error("此券被锁定, couponId: " + couponIdStr); throw new MallinkException(ErrorCode.TOO_MANY_REQUEST); } - int payPrice = 0; - int payment = 0; - - Date curr = new Date(); - Date valid_date = null; - // 检查 优惠券 库存 if (coupon.getRemainInventory() <= 0) { //解锁 @@ -105,17 +116,13 @@ public class WxOrderServiceImpl implements WxOrderService { // check 购买是否超限 int count = 0; try { - WxCouponOrder query = new WxCouponOrder(); - query.setCouponId(couponId); - query.setCUserId(user.getId()); - query.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); - count = wxCouponOrderMapper.selectCount(query); - }catch (Exception e) { + count = getUserCouponOrderCount(user, coupon); + } catch (Exception e) { //解锁 redisLock.unlock(couponIdStr, timeStr); - logger.error("购买是否超限-DB, couponId: " + couponIdStr + ", e:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL); + throw new MallinkException(ErrorCode.DB_FAIL); } + if (count > coupon.getUseLimitQuantity()) { //解锁 redisLock.unlock(couponIdStr, timeStr); @@ -135,69 +142,146 @@ public class WxOrderServiceImpl implements WxOrderService { logger.error("此券减库存失败, couponId: " + couponIdStr); throw new MallinkException(ErrorCode.ORDER_IS_FAIL); } + } - payPrice = coupon.getSalePrice(); - payment = coupon.getSalePrice(); + private void stockBack(WxOrder updateOrder) { + // 已取消/已退款,库存加1 + // 获取订单相关coupon + Long couponId = updateOrder.getCouponId(); + String couponIdStr = "" + couponId; + //加锁 + long time = System.currentTimeMillis() + RedisLock.TIMEOUT; + String timeStr = String.valueOf(time); - valid_date = (coupon.getValidType() == EnumValidStatus.VALID_RANGE.getCode())? - coupon.getValidEndDate(): - new Date((curr.getTime()/1000+coupon.getValidDays()*24*60*60)*1000); + if(!redisLock.lock(couponIdStr, timeStr)) { + logger.error("此券被锁定, couponId: " + couponIdStr); + throw new MallinkException(ErrorCode.TOO_MANY_REQUEST); + } + try { + WxCoupon coupon = wxCouponMapper.selectByPrimaryKey(couponId); + coupon.setRemainInventory(coupon.getRemainInventory() + 1); + wxCouponMapper.updateByPrimaryKeySelective(coupon); + } catch (Exception e) { + logger.error("库存+1失败, e:" + e.getMessage()); + throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "库存+1失败, e:" + e.getMessage()); + } finally { + //解锁 + redisLock.unlock(couponIdStr, timeStr); + } + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public WxOrder saveOrder(WxCUser user, Long couponId) { + // 检查用户 + if (user == null) { + logger.error("用户不存在"); + throw new MallinkException(ErrorCode.USER_IS_EMPTY); + } + // 获取券信息 + String couponIdStr = String.valueOf(couponId); + WxCoupon coupon = wxCouponMapper.selectByPrimaryKey(couponId); + if (coupon == null) { + logger.error("券不存在, couponId: " + couponIdStr); + throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); + } + if (coupon.getStatus() == EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode()) { + logger.error("券已下架, couponId: " + couponIdStr); + throw new MallinkException(ErrorCode.COUPON_ORDER_IS_INVALID); + } + + /* + WxMerchant wxMerchant = wxMerchantMapper.selectByPrimaryKey(coupon.getMerchantId()); + if (wxMerchant == null) { + logger.error("商户不存在, couponId: " + couponIdStr); + throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); + } + if (wxMerchant.getStatus() == EnumMerchantStatus.NOT_VALID.getCode()) { + logger.error("商户已禁用, couponId: " + couponIdStr); + throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_VALID); + } + */ + + // 减库存操作 + try { + stockReduce(user, coupon, couponIdStr); + } catch (Exception e) { + logger.error("减库存失败, couponId: " + couponIdStr); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(), "减库存失败, couponId: " + couponIdStr); + } + + Date curr = new Date(); + + int payment = coupon.getSalePrice(); final IdWorker idWorker = IdWorker.get(); Long orderNumber = idWorker.nextId(); // body // tenant_id + merchant_id + title + subtitle - String bodyStr = coupon.getTitle() + "/" + coupon.getSubTitle(); + String bodyStr = coupon.getTitle() + "-" + coupon.getSubTitle(); WxOrder record = new WxOrder(); + record.setId(orderNumber); + record.setTenantId(user.getTenantId()); + record.setOrderNumber(orderNumber); + record.setCUserId(user.getId()); + record.setMerchantId(coupon.getMerchantId()); + record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); + record.setPayment(payment); + record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); + record.setDetail(bodyStr); + record.setCreateDate(curr); + record.setUpdateDate(curr); try { // 保存订单 - record.setId(orderNumber); - record.setTenantId(user.getTenantId()); - record.setOrderNumber(orderNumber); - record.setCUserId(user.getId()); - record.setMerchantId(coupon.getMerchantId()); - record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); - record.setPayment(payment); - record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); - record.setDetail(bodyStr); - record.setCreateDate(curr); - record.setUpdateDate(curr); wxOrderMapper.insertSelective(record); } catch (RuntimeException e) { - // TODO 增库存 + // 加库存 + stockBack(record); logger.error("保存订单:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(), "保存订单失败:" + record.toString()); } + return record; + } + + /** + * 创建 couponOrder + * @param user + * @param order + * @param coupon + */ + private void createCouponOrder(WxCUser user, WxOrder order, WxCoupon coupon) { + Date curr = new Date(); + Date valid_date = (coupon.getValidType() == EnumValidStatus.VALID_RANGE.getCode())? + coupon.getValidEndDate(): + new Date((curr.getTime()/1000+coupon.getValidDays()*24*60*60)*1000); + final IdWorker idWorker = IdWorker.get(); try { WxCouponOrder couponOrder = new WxCouponOrder(); couponOrder.setId(idWorker.nextId()); couponOrder.setTenantId(user.getTenantId()); - couponOrder.setCouponId(couponId); + couponOrder.setCouponId(order.getCouponId()); couponOrder.setCUserId(user.getId()); - couponOrder.setOrderId(orderNumber); + couponOrder.setOrderId(order.getOrderNumber()); couponOrder.setExpiredTime(valid_date); couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); couponOrder.setCreateDate(curr); couponOrder.setUpdateDate(curr); - couponOrder.setCouponPrice(payPrice); + couponOrder.setCouponPrice(order.getPayment()); wxCouponOrderMapper.insertSelective(couponOrder); - } catch (RuntimeException e) { - // TODO 增库存 logger.error("WxCouponOrder:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(), "couponOrder保存失败!"); } - - return record; } @Override public WxOrder sendUserFreeCoupon(Long userId, Long couponId) { + // check 用户状态 WxCUser user = null; try { user = wxCUserMapper.selectByPrimaryKey(userId); @@ -209,78 +293,25 @@ public class WxOrderServiceImpl implements WxOrderService { throw new MallinkException(ErrorCode.USER_IS_EMPTY); } + // 检查券状态 String couponIdStr = String.valueOf(couponId); WxCoupon coupon = wxCouponMapper.selectByPrimaryKey(couponId); if (coupon == null) { logger.error("券不存在, couponId: " + couponIdStr); throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); } + if (coupon.getStatus() == EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode()) { + logger.error("券已下架, couponId: " + couponIdStr); + throw new MallinkException(ErrorCode.COUPON_ORDER_IS_INVALID); + } if (coupon.getSalePrice() != 0) { logger.error("券不免费, couponId: " + couponIdStr); throw new MallinkException(ErrorCode.COUPON_IS_NOT_FREE); } - //加锁 - long time = System.currentTimeMillis() + RedisLock.TIMEOUT; - String timeStr = String.valueOf(time); - if(!redisLock.lock(couponIdStr, timeStr)) { - logger.error("此券被锁定, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.TOO_MANY_REQUEST); - } - int payPrice = 0; - int payment = 0; + int payment = coupon.getSalePrice(); Date curr = new Date(); - Date valid_date = null; - - // 检查 优惠券 库存 - if (coupon.getRemainInventory() <= 0) { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - logger.error("此券库存为0, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY); - } - - // check 购买是否超限 - int count = 0; - try { - WxCouponOrder query = new WxCouponOrder(); - query.setCouponId(couponId); - query.setCUserId(user.getId()); - query.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); - count = wxCouponOrderMapper.selectCount(query); - }catch (Exception e) { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - logger.error("购买是否超限-DB, couponId: " + couponIdStr + ", e:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL); - } - if (count > coupon.getUseLimitQuantity()) { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); - throw new MallinkException(ErrorCode.ORDER_IS_LIMITED); - } - - try { - // 减库存 - coupon.setRemainInventory(coupon.getRemainInventory() - 1); - wxCouponMapper.updateByPrimaryKeySelective(coupon); - //解锁 - redisLock.unlock(couponIdStr, timeStr); - } catch (RuntimeException e) { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - logger.error("此券减库存失败, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL); - } - - payPrice = coupon.getSalePrice(); - payment = coupon.getSalePrice(); - - valid_date = (coupon.getValidType() == EnumValidStatus.VALID_RANGE.getCode())? - coupon.getValidEndDate(): - new Date((curr.getTime()/1000+coupon.getValidDays()*24*60*60)*1000); final IdWorker idWorker = IdWorker.get(); Long orderNumber = idWorker.nextId(); @@ -290,95 +321,106 @@ public class WxOrderServiceImpl implements WxOrderService { String bodyStr = coupon.getTitle() + "/" + coupon.getSubTitle(); WxOrder record = new WxOrder(); - + record.setId(orderNumber); + record.setTenantId(user.getTenantId()); + record.setOrderNumber(orderNumber); + record.setCUserId(user.getId()); + record.setMerchantId(coupon.getMerchantId()); + record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); + record.setPayment(payment); + record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); + record.setDetail(bodyStr); + record.setCreateDate(curr); + record.setUpdateDate(curr); + + // 保存订单 try { - // 保存订单 - record.setId(orderNumber); - record.setTenantId(user.getTenantId()); - record.setOrderNumber(orderNumber); - record.setCUserId(user.getId()); - record.setMerchantId(coupon.getMerchantId()); - record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); - record.setPayment(payment); - record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); - record.setDetail(bodyStr); - record.setCreateDate(curr); - record.setUpdateDate(curr); wxOrderMapper.insertSelective(record); - } catch (RuntimeException e) { - // TODO 增库存 + } catch (Exception e) { + //加库存 + stockBack(record); logger.error("保存订单:" + e.getMessage()); throw new MallinkException(ErrorCode.ORDER_IS_FAIL); } + // 创建couponOrder try { - WxCouponOrder couponOrder = new WxCouponOrder(); - couponOrder.setId(idWorker.nextId()); - couponOrder.setTenantId(user.getTenantId()); - couponOrder.setCouponId(couponId); - couponOrder.setCUserId(user.getId()); - couponOrder.setOrderId(orderNumber); - couponOrder.setExpiredTime(valid_date); - couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); - couponOrder.setCreateDate(curr); - couponOrder.setUpdateDate(curr); - couponOrder.setCouponPrice(payPrice); - - wxCouponOrderMapper.insertSelective(couponOrder); - } catch (RuntimeException e) { - // TODO 增库存 - logger.error("WxCouponOrder:" + e.getMessage()); + createCouponOrder(user, record, coupon); + } catch (Exception e) { + logger.error("保存订单:" + e.getMessage()); throw new MallinkException(ErrorCode.ORDER_IS_FAIL); } + return record; } @Override @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public int updateOrderStatus(Long orderId,EnumOrderStatus enumOrderStatus) { - WxOrder updateRecord = wxOrderMapper.selectByPrimaryKey(orderId); - if (updateRecord == null) { - logger.error("order updateStatus, order not found, orderId:" + updateRecord.getId()); - throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND); - } + public int orderSuccess(WxOrder updateOrder) { Date currentDate = new Date(); + WxCoupon coupon = wxCouponMapper.selectByPrimaryKey(updateOrder.getCouponId()); + if (coupon == null) { + logger.error("券不存在, couponId: " + updateOrder.getCouponId()); + throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); + } + if (coupon.getStatus() == EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode()) { + logger.error("券已下架, couponId: " + updateOrder.getCouponId()); + throw new MallinkException(ErrorCode.COUPON_ORDER_IS_INVALID); + } + WxCUser user = wxCUserMapper.selectByPrimaryKey(updateOrder.getCUserId()); + if (user == null) { + logger.error("用户不存在, userId: " + updateOrder.getCUserId()); + throw new MallinkException(ErrorCode.USER_IS_EMPTY); + } + // 已支付,更新支付时间 + updateOrder.setPaymentTime(currentDate); + updateOrder.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); + updateOrder.setUpdateDate(currentDate); + int ret = 0; + try { + ret = wxOrderMapper.updateByPrimaryKey(updateOrder); + } catch (Exception e) { + logger.error("订单更新失败:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(), "订单更新失败:" + e.getMessage()); + } + // 创建couponOrder + try { + createCouponOrder(user, updateOrder, coupon); + } catch (Exception e) { + logger.error("保存订单:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL); + } + return ret; + } + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public int updateOrderStatus(WxOrder updateOrder, EnumOrderStatus enumOrderStatus) { + Date currentDate = new Date(); switch (enumOrderStatus) { - case ORDER_STATUS_PAYMENT_SUCCESS: { - // 已支付,更新支付时间 - updateRecord.setPaymentTime(currentDate); - break; - } case ORDER_STATUS_OVERTIME_CANCEL: case ORDER_STATUS_REFUND_SUCCESS: - { - // 已取消/已退款,库存加1 - // 获取订单相关coupon - WxCouponOrder couponOrder = new WxCouponOrder(); - couponOrder.setOrderId(orderId); - List colist = wxCouponOrderMapper.findList(couponOrder); - for(WxCouponOrder couponOrderX : colist) { - String couponIdStr = String.valueOf(couponOrderX.getCouponId()); - //加锁 - long time = System.currentTimeMillis() + RedisLock.TIMEOUT; - String timeStr = String.valueOf(time); - if(!redisLock.lock(couponIdStr, timeStr)) { - logger.error("此券被锁定, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.TOO_MANY_REQUEST); - } - WxCoupon coupon = wxCouponMapper.selectByPrimaryKey(couponOrderX.getCouponId()); - coupon.setRemainInventory(coupon.getRemainInventory() + 1); - wxCouponMapper.updateByPrimaryKeySelective(coupon); - //解锁 - redisLock.unlock(couponIdStr, timeStr); + { + try { + stockBack(updateOrder); + } catch (Exception e) { + logger.error("库存+1失败, e:" + e.getMessage()); + throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "库存+1失败, e:" + e.getMessage()); } break; } } - updateRecord.setOrderStatus(enumOrderStatus.getCode()); - updateRecord.setUpdateDate(currentDate); - return wxOrderMapper.updateByPrimaryKey(updateRecord); + int ret = 0; + try { + updateOrder.setOrderStatus(enumOrderStatus.getCode()); + updateOrder.setUpdateDate(currentDate); + ret = wxOrderMapper.updateByPrimaryKey(updateOrder); + }catch (Exception e) { + logger.error("订单状态更新失败, e:" + e.getMessage()); + throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "订单状态更新失败, e:" + e.getMessage()); + } + return ret; } @Override diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxPayOrderServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxPayOrderServiceImpl.java index 93d419513..6ca8c8c39 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxPayOrderServiceImpl.java @@ -16,10 +16,7 @@ import com.simple.enums.EnumPayStatus; import com.simple.enums.EnumPayType; import com.simple.enums.EnumPayWay; import com.simple.exception.MallinkException; -import com.simple.mapper.WxAppinfoMapper; -import com.simple.mapper.WxOrderMapper; -import com.simple.mapper.WxPayAccountMapper; -import com.simple.mapper.WxPayOrderMapper; +import com.simple.mapper.*; import com.simple.pay.WxPay; import com.simple.pay.WxPayOrderP; import com.simple.pay.WxPayment; @@ -44,6 +41,9 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { @Autowired WxAppinfoMapper wxAppinfoMapper; + @Autowired + WxCUserMapper wxCUserMapper; + @Autowired WxPayAccountMapper wxPayAccountMapper; @@ -73,7 +73,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { "\"NOT_UTF8\":{\"detail\":\"编码格式错误\",\"reason\":\"未使用指定编码格式\",\"resolution\":\"请使用UTF-8编码格式\"}}"); @Override - public ResultData createPayOrder(WxAppinfo appInfo, WxCUser user, WxPayOrder record, EnumPayWay payWay) { + public ResultData createPayOrder(boolean isReal, WxAppinfo appInfo, WxCUser user, WxPayOrder record, EnumPayWay payWay) { final IdWorker idworker = IdWorker.get(); try { @@ -122,32 +122,32 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } WxPayAccount payAccount = wxPayAccountMapper.selectByPrimaryKey(appInfo.getPayId()); - - // 统一下单 - String noncestr = Utility.generate32UUID(); - WxPayOrderP wxPayOrderP = new WxPayOrderP(); - wxPayOrderP.setOpenid(user.getOpenId()); - wxPayOrderP.setAppid(user.getAppId()); - wxPayOrderP.setMch_id(payAccount.getMchId()); - wxPayOrderP.setNonce_str(noncestr); - wxPayOrderP.setBody(order.getDetail()); - wxPayOrderP.setOut_trade_no(record.getPayOrderNo()); - wxPayOrderP.setTotal_fee(order.getPayment()); - wxPayOrderP.setSpbill_create_ip(record.getIp()); // 终端IP - wxPayOrderP.setNotify_url(payAccount.getPayNotifyUrl()); - wxPayOrderP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型 - wxPayOrderP.setProduct_id(String.valueOf(order.getId())); // 订单ID - wxPayOrderP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentDate)); - Date futureDate = new Date(); - futureDate.setTime(currentDate.getTime() + 15*60*1000); - wxPayOrderP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(futureDate)); // 15分钟后结束 - wxPayOrderP.setSign(WxPayment.createSign(BeanUtils.toStringMap(wxPayOrderP), payAccount.getApiKey())); - String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderP)); - logger.info("pay order, wechat pushOrder, " + wxPayOrderP.toString() + ", response: " + response.toString()); - Map returnMap = WxPayment.xmlToMap(response); - returnMap.put("payOrderId", payOrderNo); - String result_code = returnMap.get("result_code"); - if ("SUCCESS".equals(result_code)) { + if (isReal) { + // 统一下单 + String noncestr = Utility.generate32UUID(); + WxPayOrderP wxPayOrderP = new WxPayOrderP(); + wxPayOrderP.setOpenid(user.getOpenId()); + wxPayOrderP.setAppid(user.getAppId()); + wxPayOrderP.setMch_id(payAccount.getMchId()); + wxPayOrderP.setNonce_str(noncestr); + wxPayOrderP.setBody(order.getDetail()); + wxPayOrderP.setOut_trade_no(record.getPayOrderNo()); + wxPayOrderP.setTotal_fee(order.getPayment()); + wxPayOrderP.setSpbill_create_ip(record.getIp()); // 终端IP + wxPayOrderP.setNotify_url(payAccount.getPayNotifyUrl()); + wxPayOrderP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型 + wxPayOrderP.setProduct_id(String.valueOf(order.getId())); // 订单ID + wxPayOrderP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentDate)); + Date futureDate = new Date(); + futureDate.setTime(currentDate.getTime() + 15*60*1000); + wxPayOrderP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(futureDate)); // 15分钟后结束 + wxPayOrderP.setSign(WxPayment.createSign(BeanUtils.toStringMap(wxPayOrderP), payAccount.getApiKey())); + String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderP)); + logger.info("pay order, wechat pushOrder, " + wxPayOrderP.toString() + ", response: " + response.toString()); + Map returnMap = WxPayment.xmlToMap(response); + returnMap.put("payOrderId", payOrderNo); + String result_code = returnMap.get("result_code"); + if ("SUCCESS".equals(result_code)) { /* Map signMap = WxPayment.buildWeappSecondSignMap(returnMap.get("appid"), String.valueOf(Utility.getCurrentTimeStamp()), @@ -158,24 +158,44 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { returnMap.putAll(signMap); returnMap.put("paySign", signAgent); */ - String prepay_id = returnMap.get("prepay_id"); - String timestamp = String.valueOf(Utility.getCurrentTimeStamp()); - Map sighMap = MapUtil.getOrderMap(); - sighMap.put("appId", returnMap.get("appid")); - sighMap.put("timeStamp", timestamp); - sighMap.put("nonceStr", noncestr); - sighMap.put("package", "prepay_id=" + prepay_id); - sighMap.put("signType", "MD5"); - String signAgent = WxPayment.createSign(sighMap, payAccount.getApiKey()); - returnMap.put("timeStamp", timestamp); - returnMap.put("nonceStr", noncestr); - returnMap.put("package", "prepay_id=" + prepay_id); - returnMap.put("paySign", signAgent); - logger.info("back to UI: " +returnMap.toString()); - return new ResultData(Result.SUCCESS, "创建支付订单成功", returnMap); + String prepay_id = returnMap.get("prepay_id"); + String timestamp = String.valueOf(Utility.getCurrentTimeStamp()); + Map sighMap = MapUtil.getOrderMap(); + sighMap.put("appId", returnMap.get("appid")); + sighMap.put("timeStamp", timestamp); + sighMap.put("nonceStr", noncestr); + sighMap.put("package", "prepay_id=" + prepay_id); + sighMap.put("signType", "MD5"); + String signAgent = WxPayment.createSign(sighMap, payAccount.getApiKey()); + returnMap.put("timeStamp", timestamp); + returnMap.put("nonceStr", noncestr); + returnMap.put("package", "prepay_id=" + prepay_id); + returnMap.put("paySign", signAgent); + logger.info("back to UI: " +returnMap.toString()); + return new ResultData(Result.SUCCESS, "创建支付订单成功", returnMap); + } else { + JSONObject errObj = errorMap.getJSONObject(result_code); + return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errObj.toJSONString(), returnMap); + } } else { - JSONObject errObj = errorMap.getJSONObject(result_code); - return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errObj.toJSONString(), returnMap); + WxPayOrderP wxPayOrderP = new WxPayOrderP(); + wxPayOrderP.setOpenid(user.getOpenId()); + wxPayOrderP.setAppid(user.getAppId()); + wxPayOrderP.setMch_id(payAccount.getMchId()); + wxPayOrderP.setBody(order.getDetail()); + wxPayOrderP.setOut_trade_no(record.getPayOrderNo()); + wxPayOrderP.setTotal_fee(order.getPayment()); + wxPayOrderP.setSpbill_create_ip(record.getIp()); // 终端IP + wxPayOrderP.setNotify_url(payAccount.getPayNotifyUrl()); + wxPayOrderP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型 + wxPayOrderP.setProduct_id(String.valueOf(order.getId())); // 订单ID + wxPayOrderP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentDate)); + Date futureDate = new Date(); + futureDate.setTime(currentDate.getTime() + 15*60*1000); + wxPayOrderP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(futureDate)); // 15分钟后结束 + wxPayOrderP.setSign(WxPayment.createSign(BeanUtils.toStringMap(wxPayOrderP), payAccount.getApiKey())); + Map returnMap = BeanUtils.toStringMap(wxPayOrderP); + return new ResultData(Result.SUCCESS, "创建支付订单成功", returnMap); } } catch (RuntimeException e) { throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); @@ -310,25 +330,32 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { // 修改支付订单状态 + WxPayOrder updateOrder = new WxPayOrder(); + updateOrder.setId(record.getId()); + updateOrder.setOrderId(record.getOrderId()); + updateOrder.setUpdateTime(currentDate); + updateOrder.setPayOrderStatus(EnumPayStatus.PAY_WAY_SUCCESS.getCode()); + updateOrder.setTransactionId(transactionId); try { - WxPayOrder updateOrder = new WxPayOrder(); - updateOrder.setId(record.getId()); - updateOrder.setOrderId(record.getOrderId()); - updateOrder.setUpdateTime(currentDate); - updateOrder.setPayOrderStatus(EnumPayStatus.PAY_WAY_SUCCESS.getCode()); - updateOrder.setTransactionId(transactionId); wxPayOrderMapper.updateByPrimaryKeySelective(updateOrder); } catch (Exception e) { - logger.error(e.getMessage()); - throw new MallinkException(ErrorCode.DB_FAIL); + logger.error("支付订单数据库更新失败: " + e.getMessage()); + throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "支付订单数据库更新失败: " + e.getMessage()); } // 修改订单状态 try { - wxOrderService.updateOrderStatus(order.getId(), EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS); + wxOrderService.updateOrderStatus(order, EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS); } catch (Exception e) { - logger.error(e.getMessage()); - throw new MallinkException(ErrorCode.DB_FAIL); + logger.error("订单数据库更新失败: " + e.getMessage()); + throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "订单数据库更新失败: " + e.getMessage()); + } + // 创建couponOrder + try { + wxOrderService.updateOrderStatus(order, EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS); + } catch (Exception e) { + logger.error("订单数据库更新失败: " + e.getMessage()); + throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "订单数据库更新失败: " + e.getMessage()); } /* @@ -360,19 +387,24 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { logger.error("pay handle, order " + record.getOrderId() + " not found , payOrderGid : " + record.getPayOrderNo()); throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND); } + WxCUser user = wxCUserMapper.selectByPrimaryKey(order.getCUserId()); + if (user == null) { + logger.error("pay handle, order " + record.getOrderId() + " not found , payOrderGid : " + record.getPayOrderNo()); + throw new MallinkException(ErrorCode.USER_IS_EMPTY); + } Date currentDate = new Date(); if (record.getId() > 0) { // 修改支付订单状态 // 订单金额为0时,支付订单不创建,直接更改订单状态 + WxPayOrder updateOrder = new WxPayOrder(); + updateOrder.setId(record.getId()); + updateOrder.setOrderId(record.getOrderId()); + updateOrder.setUpdateTime(currentDate); + updateOrder.setPayOrderStatus(record.getPayOrderStatus()); + updateOrder.setPayTimeEnd(currentDate); + updateOrder.setFailReason(record.getFailReason()); try { - WxPayOrder updateOrder = new WxPayOrder(); - updateOrder.setId(record.getId()); - updateOrder.setOrderId(record.getOrderId()); - updateOrder.setUpdateTime(currentDate); - updateOrder.setPayOrderStatus(record.getPayOrderStatus()); - updateOrder.setPayTimeEnd(currentDate); - updateOrder.setFailReason(record.getFailReason()); wxPayOrderMapper.updateByPrimaryKeySelective(updateOrder); } catch (Exception e) { logger.error(e.getMessage()); @@ -383,17 +415,17 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { // 修改订单状态 if (record.getPayOrderStatus() == EnumPayStatus.PAY_WAY_SUCCESS.getCode()) { try { - int _count = wxOrderService.updateOrderStatus(order.getId(), EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS); + int _count = wxOrderService.orderSuccess(order); if (_count > 1) { throw new MallinkException(ErrorCode.ORDER_IS_FAIL); } } catch (Exception e) { logger.error(e.getMessage()); - throw new MallinkException(ErrorCode.DB_FAIL); + throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "订单更新"); } } else if (record.getPayOrderStatus() == EnumPayStatus.PAY_WAY_CANCEL.getCode()) { try { - int _count = wxOrderService.updateOrderStatus(order.getId(), EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL); + int _count = wxOrderService.updateOrderStatus(order, EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL); if (_count > 1) { throw new MallinkException(ErrorCode.ORDER_IS_FAIL); } @@ -428,6 +460,15 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { return wxPayOrderMapper.selectByPrimaryKey(id); } + @Override + public WxPayOrder getByObj(WxPayOrder payOrderQ) { + List list = wxPayOrderMapper.findList(payOrderQ); + if (list.size() > 0) { + return list.get(0); + } + return null; + } + @Override public void saveOrUpdate(WxPayOrder record) { if (record.getId() == null) { diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxRefundOrderServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxRefundOrderServiceImpl.java index 35e08f431..4731a8889 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxRefundOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxRefundOrderServiceImpl.java @@ -11,7 +11,6 @@ import com.simple.common.Result; import com.simple.common.ResultData; import com.simple.domain.po.*; import com.simple.enums.EnumOrderStatus; -import com.simple.enums.EnumPayStatus; import com.simple.enums.EnumPayWay; import com.simple.enums.EnumRefundStatus; import com.simple.exception.MallinkException; @@ -42,6 +41,9 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { @Autowired WxRefundOrderMapper wxRefundOrderMapper; + @Autowired + WxCouponVerifyMapper wxCouponVerifyMapper; + @Autowired WxOrderMapper wxOrderMapper; @@ -211,7 +213,7 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { "}"); @Override - public ResultData createRefundOrder(WxAppinfo appInfo, WxRefundOrder record, EnumPayWay payWay) { + public ResultData createRefundOrder(boolean isReal, WxAppinfo appInfo, WxRefundOrder record, WxPayOrder payOrder, EnumPayWay payWay) { WxPayAccount payAccount = wxPayAccountMapper.selectByPrimaryKey(appInfo.getPayId()); if (StringUtils.isBlank(payAccount.getApiKey())) { logger.error("支付密钥为空"); @@ -227,57 +229,25 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { logger.error("退款订单已存在, 无法再提交退款申请"); throw new MallinkException(ErrorCode.REFUND_ORDER_EXIST.getCode(), "退款订单已存在, 无法再提交退款申请"); } - // check 支付 订单 - WxPayOrder payOrder = null; - Long payOrderId = 0L; - try { - payOrderId = Long.valueOf(record.getPayOrderNo()); - } catch (NumberFormatException e) { - logger.error("参数转换异常: payOrderId-" + record.getPayOrderNo()); - throw new MallinkException(ErrorCode.SYS_PARAMETER_CAST_ERROR.getCode(), "参数转换异常: payOrderId-" + record.getPayOrderNo()); - } - try { - WxPayOrder payOrderQ = new WxPayOrder(); - payOrderQ.setOrderId(record.getOrderId()); - payOrderQ.setId(payOrderId); - payOrderQ.setPayOrderNo(record.getPayOrderNo()); - payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_WAY_SUCCESS.getCode()); - List payOrderList = wxPayOrderMapper.findList(payOrderQ); - if (payOrderList.size() > 0) { - payOrder = payOrderList.get(0); - } - } catch (Exception e) { - logger.error("数据库获取异常: " + e.getMessage()); - throw new MallinkException(ErrorCode.DB_FAIL); - } - - if (payOrder == null) { - logger.error("支付订单不存在: " + record.toString()); - throw new MallinkException(ErrorCode.REFUND_PAY_ORDER_IS_NOT_EXIST); - } - if (payOrder.getPayAmount() <= 0) { - logger.error("支付订单金额小于等于0: " + record.toString()); - throw new MallinkException(ErrorCode.REFUND_PAY_ORDER_IS_ZERO); - } - - // TODO 检查 是否已核销, 已核销不能退款 // 创建退款订单 final IdWorker idWorker = IdWorker.get(); Long id = idWorker.nextId(); Date currentDate = new Date(); + record.setId(id); + record.setTenantId(appInfo.getTenantId()); + record.setCreateTime(currentDate); + record.setUpdateTime(currentDate); + record.setTransactionId(payOrder.getTransactionId()); + record.setCUserId(payOrder.getCUserId()); + record.setTotalFee(payOrder.getPayAmount()); + record.setRefundFee(payOrder.getPayAmount()); + record.setRefundTimeStart(currentDate); + record.setRefundOrderStatus(EnumRefundStatus.REFUND_WAIT.getCode()); + + // 退款订单 try { - record.setId(id); - record.setTenantId(appInfo.getTenantId()); - record.setCreateTime(currentDate); - record.setUpdateTime(currentDate); - record.setTransactionId(payOrder.getTransactionId()); - record.setCUserId(payOrder.getCUserId()); - record.setTotalFee(payOrder.getPayAmount()); - record.setRefundFee(payOrder.getPayAmount()); - record.setRefundTimeStart(currentDate); - record.setRefundOrderStatus(EnumRefundStatus.REFUND_WAIT.getCode()); int sqlRow = wxRefundOrderMapper.insertSelective(record); if(sqlRow != 1) { logger.error("退款订单数据库插入出错: " + record.toString()); @@ -300,40 +270,60 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { wxRefundOrderP.setTotal_fee(record.getTotalFee()); wxRefundOrderP.setRefund_fee(record.getRefundFee()); - Map signMap = new HashMap(); - try { - signMap = BeanUtils.toStringMap(wxRefundOrderP); - } catch (Exception e) { - logger.error("退款签名异常"); - throw new MallinkException(ErrorCode.SYS_PARAMETER_CAST_ERROR.getCode(), "退款签名异常"); - } - String signAgent = WxPayment.createSign(signMap, payAccount.getApiKey()); - signMap.put("sign", signAgent); - String response = WxPay.orderRefund(signMap, payAccount.getCertPath(), payAccount.getApiKey()); - logger.info("微信退款订单:" + wxRefundOrderP.toString() + ", response: " + response.toString()); - Map returnMap = WxPayment.xmlToMap(response); - String result_no = returnMap.get("result_code"); - String refund_id = returnMap.get("refund_id"); - // 设置 微信退款订单号 - record.setRefundId(refund_id); - if ("SUCCESS".equals(result_no)) { - logger.error("微信退款订单申请成功: " + returnMap.toString()); + if (isReal) { + Map signMap = new HashMap(); try { - record.setRefundOrderStatus(EnumRefundStatus.REFUND_REQ_SUCCESS.getCode()); - wxRefundOrderMapper.updateByPrimaryKey(record); - return new ResultData(Result.SUCCESS, "退款订单申请成功", returnMap); + signMap = BeanUtils.toStringMap(wxRefundOrderP); } catch (Exception e) { - logger.error("微信退款订单更新入库出错: " + e.getMessage() + ", record: " + record.toString()); - throw new MallinkException(ErrorCode.REFUND_ORDER_ERROR); + logger.error("退款签名异常"); + throw new MallinkException(ErrorCode.SYS_PARAMETER_CAST_ERROR.getCode(), "退款签名异常"); + } + + String signAgent = WxPayment.createSign(signMap, payAccount.getApiKey()); + signMap.put("sign", signAgent); + String response = WxPay.orderRefund(signMap, payAccount.getCertPath(), payAccount.getApiKey()); + logger.info("微信退款订单:" + wxRefundOrderP.toString() + ", response: " + response.toString()); + Map returnMap = WxPayment.xmlToMap(response); + String result_no = returnMap.get("result_code"); + String refund_id = returnMap.get("refund_id"); + // 设置 微信退款订单号 + record.setRefundId(refund_id); + if ("SUCCESS".equals(result_no)) { + logger.error("微信退款订单申请成功: " + returnMap.toString()); + try { + record.setRefundOrderStatus(EnumRefundStatus.REFUND_REQ_SUCCESS.getCode()); + wxRefundOrderMapper.updateByPrimaryKey(record); + return new ResultData(Result.SUCCESS, "退款订单申请成功", returnMap); + } catch (Exception e) { + logger.error("微信退款订单更新入库出错: " + e.getMessage() + ", record: " + record.toString()); + throw new MallinkException(ErrorCode.REFUND_ORDER_ERROR); + } + } else { + logger.error("微信退款订单申请失败: " + returnMap.toString()); + try { + record.setRefundOrderStatus(EnumRefundStatus.REFUND_REQ_FAIL.getCode()); + wxRefundOrderMapper.updateByPrimaryKey(record); + JSONObject errObj = errorRefundReqMap.getJSONObject(result_no); + return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errObj.toJSONString(), returnMap); + } catch(Exception e) { + logger.error("微信退款订单更新入库出错: " + e.getMessage() + ", record: " + record.toString()); + throw new MallinkException(ErrorCode.REFUND_ORDER_ERROR); + } } } else { - logger.error("微信退款订单申请失败: " + returnMap.toString()); + // 虚拟支付 + Map returnMap = null; + try { + returnMap = BeanUtils.toStringMap(wxRefundOrderP); + } catch (Exception e) { + logger.error("退款签名异常"); + throw new MallinkException(ErrorCode.SYS_PARAMETER_CAST_ERROR.getCode(), "退款签名异常"); + } try { - record.setRefundOrderStatus(EnumRefundStatus.REFUND_REQ_FAIL.getCode()); + record.setRefundOrderStatus(EnumRefundStatus.REFUND_REQ_SUCCESS.getCode()); wxRefundOrderMapper.updateByPrimaryKey(record); - JSONObject errObj = errorRefundReqMap.getJSONObject(result_no); - return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errObj.toJSONString(), returnMap); - } catch(Exception e) { + return new ResultData(Result.SUCCESS, "退款订单申请成功", returnMap); + } catch (Exception e) { logger.error("微信退款订单更新入库出错: " + e.getMessage() + ", record: " + record.toString()); throw new MallinkException(ErrorCode.REFUND_ORDER_ERROR); } @@ -493,15 +483,15 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { } Date currentDate = new Date(); + WxRefundOrder updateOrder = new WxRefundOrder(); + updateOrder.setId(refundOrder.getId()); + updateOrder.setOrderId(refundOrder.getOrderId()); + updateOrder.setUpdateTime(currentDate); + updateOrder.setRefundOrderStatus(EnumRefundStatus.REFUND_SUCCESS.getCode()); + updateOrder.setTransactionId(transactionId); + updateOrder.setRefundId(refundId); // 修改退款订单状态 try { - WxRefundOrder updateOrder = new WxRefundOrder(); - updateOrder.setId(refundOrder.getId()); - updateOrder.setOrderId(refundOrder.getOrderId()); - updateOrder.setUpdateTime(currentDate); - updateOrder.setRefundOrderStatus(EnumRefundStatus.REFUND_SUCCESS.getCode()); - updateOrder.setTransactionId(transactionId); - updateOrder.setRefundId(refundId); wxRefundOrderMapper.updateByPrimaryKeySelective(updateOrder); } catch (Exception e) { logger.error(e.getMessage()); @@ -510,7 +500,7 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { // 修改订单状态 try { - wxOrderService.updateOrderStatus(order.getId(), EnumOrderStatus.ORDER_STATUS_REFUND_SUCCESS); + wxOrderService.updateOrderStatus(order, EnumOrderStatus.ORDER_STATUS_REFUND_SUCCESS); } catch (Exception e) { logger.error(e.getMessage()); throw new MallinkException(ErrorCode.DB_FAIL); diff --git a/mallinkService/src/main/java/com/simple/utils/HMACSHA256.java b/mallinkService/src/main/java/com/simple/utils/HMACSHA256.java index a4984b008..b602ba2c2 100644 --- a/mallinkService/src/main/java/com/simple/utils/HMACSHA256.java +++ b/mallinkService/src/main/java/com/simple/utils/HMACSHA256.java @@ -5,6 +5,10 @@ import javax.crypto.spec.SecretKeySpec; public class HMACSHA256 { + public static final String STR2 = "198b02e8fd704e96198b02e8fd704e96"; + public static final String IV = "198b02e8fd704e96"; + + public static String byteArrayToHexString(byte[] b) { StringBuilder hs = new StringBuilder(); String stmp; diff --git a/mallinkService/src/main/resources/mapper/WxCouponChannelMapper.xml b/mallinkService/src/main/resources/mapper/WxCouponChannelMapper.xml index f2cc85a26..5191ab548 100644 --- a/mallinkService/src/main/resources/mapper/WxCouponChannelMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxCouponChannelMapper.xml @@ -10,12 +10,13 @@ + - `id`,`tenant_id`,`merchant_id`,`coupon_id`,`coupon_status`,`type`,`title`,`target_ad`,`create_date`,`update_date` + `id`,`tenant_id`,`merchant_id`,`coupon_id`,`coupon_status`,`type`,`title`,`target_ad`,`business`,`create_date`,`update_date` @@ -83,6 +84,25 @@ select from wx_coupon_channel + + + + + + + + + + + + + + + + diff --git a/mallinkService/src/main/resources/mapper/WxMerchantBUserMapper.xml b/mallinkService/src/main/resources/mapper/WxMerchantBUserMapper.xml index e35e13063..7c156dcf3 100644 --- a/mallinkService/src/main/resources/mapper/WxMerchantBUserMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxMerchantBUserMapper.xml @@ -14,11 +14,11 @@ - + - `id`,`tenant_id`,`b_user_id`,`phone`,`b_user_pwd`,`merchant_id`,`create_date`,`update_date`,`app_id`,`token`,`expire_time`,`name` + `id`,`tenant_id`,`b_user_id`,`phone`,`b_user_pwd`,`merchant_id`,`create_date`,`update_date`,`app_id`,`token`,`expire_time`,`name`,`status` @@ -81,6 +81,9 @@ and `name` = #{name} + + and `status` = #{status} + and id in diff --git a/mallinkService/src/main/resources/mapper/WxOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxOrderMapper.xml index 785b57305..f86f362c2 100644 --- a/mallinkService/src/main/resources/mapper/WxOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxOrderMapper.xml @@ -7,6 +7,7 @@ + @@ -52,8 +53,13 @@ and `b_user_id` = #{bUserId} - - + + + + and `coupon_id` = #{couponId} + + + and `payment_type` = #{paymentType} @@ -183,7 +189,16 @@ - - - + +