diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/contract/WxRentContractController.java b/mallinkAdmin/src/main/java/com/iformall/controller/contract/WxRentContractController.java index 74650727f..f15388d9f 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/contract/WxRentContractController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/contract/WxRentContractController.java @@ -130,7 +130,9 @@ public class WxRentContractController extends BaseController { @SystemControllerLog(description = "租赁合同-添加") public ResultData add(@RequestBody WxRentContract wxRentContract) { logger.debug("[" + getIpAddr() + "] WxRentContractController::add"); - + if(StringUtils.isBlank(wxRentContract.getBusDiscountRatio())){ + wxRentContract.setBusDiscountTime(new Integer(0)); + } WxMerchant wxMerchant = new WxMerchant(); wxMerchant.setName(wxRentContract.getMerchantName()); wxMerchant.setId(wxRentContract.getMerchantId()); @@ -169,6 +171,10 @@ public class WxRentContractController extends BaseController { @SystemControllerLog(description = "租赁合同-更新") public ResultData update(@RequestBody WxRentContract wxRentContract) { logger.debug("[" + getIpAddr() + "] WxRentContractController::update"); + + if(StringUtils.isBlank(wxRentContract.getBusDiscountRatio())){ + wxRentContract.setBusDiscountTime(new Integer(0)); + } MallUserInfo user = getUser(); wxRentContract.setTenantId(user.getTenantId()); wxRentContract.setAdjustPeriodHandle(); @@ -195,6 +201,9 @@ public class WxRentContractController extends BaseController { @SystemControllerLog(description = "租赁合同-更新金额") public ResultData updateMoney(@RequestBody WxRentContract wxRentContract) { logger.debug("[" + getIpAddr() + "] WxRentContractController::updateMoney"); + if(StringUtils.isBlank(wxRentContract.getBusDiscountRatio())){ + wxRentContract.setBusDiscountTime(new Integer(0)); + } MallUserInfo user = getUser(); wxRentContract.setTenantId(user.getTenantId()); wxRentContract.setAdjustPeriodHandle(); @@ -210,6 +219,9 @@ public class WxRentContractController extends BaseController { @SystemControllerLog(description = "租赁合同-更新文件") public ResultData updateFile(@RequestBody WxRentContract wxRentContract) { logger.debug("[" + getIpAddr() + "] WxRentContractController::updateFile"); + if(StringUtils.isBlank(wxRentContract.getBusDiscountRatio())){ + wxRentContract.setBusDiscountTime(new Integer(0)); + } MallUserInfo user = getUser(); wxRentContract.setTenantId(user.getTenantId()); wxRentContract.setAdjustPeriodHandle(); diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/rent/WxBillSettleController.java b/mallinkAdmin/src/main/java/com/iformall/controller/rent/WxBillSettleController.java index a132b2dbd..7c78f09eb 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/rent/WxBillSettleController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/rent/WxBillSettleController.java @@ -2,14 +2,10 @@ package com.iformall.controller.rent; import com.github.pagehelper.PageInfo; import com.iformall.annotation.SystemControllerLog; -import com.iformall.common.Result; import com.iformall.common.ResultData; import com.iformall.controller.base.BaseController; import com.iformall.domain.po.BaseEntity; -import com.iformall.domain.po.WxBillRent; import com.iformall.domain.po.WxBillSettle; -import com.iformall.domain.po.WxBillSettleRecord; -import com.iformall.service.WxBillRentService; import com.iformall.service.WxBillSettleRecordService; import com.iformall.service.WxBillSettleService; import io.swagger.annotations.ApiImplicitParam; @@ -19,7 +15,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -53,21 +48,13 @@ public class WxBillSettleController extends BaseController { return new ResultData(page); } - @PostMapping("add") - @ApiOperation("账单管理-结算单-新增") - @SystemControllerLog(description = "账单管理-结算单-新增") - public ResultData add(@RequestBody WxBillSettle wxBillSettle) { - logger.debug("[" + getIpAddr() + "] WxBillSettleController::add"); + @PostMapping("addOrUpdate") + @ApiOperation("账单管理-结算单-新增或编辑") + @SystemControllerLog(description = "账单管理-结算单-新增或编辑") + public ResultData addOrUpdate(@RequestBody WxBillSettle wxBillSettle) { + logger.debug("[" + getIpAddr() + "] WxBillSettleController::addOrUpdate"); wxBillSettle.setTenantId(getTenantId()); - return wxBillSettleService.saveOrUpdate(wxBillSettle); - } - - @PostMapping("update") - @ApiOperation("账单管理-结算单-更新") - @SystemControllerLog(description = "账单管理-结算单-更新") - public ResultData update(@RequestBody WxBillSettle wxBillSettle) { - logger.debug("[" + getIpAddr() + "] WxBillSettleController::update"); - return wxBillSettleService.saveOrUpdate(wxBillSettle); + return wxBillSettleService.saveOrUpdate(wxBillSettle,getUser()); } @GetMapping("exportSettle") diff --git a/mallinkAdmin/src/main/java/com/iformall/log/UserDataRuleAspect.java b/mallinkAdmin/src/main/java/com/iformall/log/UserDataRuleAspect.java index f7c889c7a..971ac5e76 100644 --- a/mallinkAdmin/src/main/java/com/iformall/log/UserDataRuleAspect.java +++ b/mallinkAdmin/src/main/java/com/iformall/log/UserDataRuleAspect.java @@ -7,6 +7,7 @@ import com.iformall.annotation.UserDataRuleAnnotation; import com.iformall.domain.po.BaseEntity; import com.iformall.domain.po.MallUserInfo; import com.iformall.domain.po.WxUserDataRule; +import com.iformall.mapper.WxRentContractMapper; import com.iformall.service.WxUserDataRuleService; import com.iformall.shiro.UserSession; import org.apache.commons.lang3.StringUtils; @@ -37,6 +38,9 @@ public class UserDataRuleAspect { @Autowired private WxUserDataRuleService wxUserDataRuleService; + @Autowired + private WxRentContractMapper wxRentContractMapper; + @Pointcut("@annotation(com.iformall.annotation.UserDataRuleAnnotation)") public void userDataRulePointcut() { } @@ -90,7 +94,14 @@ public class UserDataRuleAspect { BaseEntity baseEntity = (BaseEntity) args[0]; baseEntity.setFloorForRule(buildingFloor); baseEntity.setBusinessForRule(businessForRule); + String contract = "contract"; + if (StringUtils.isNotEmpty(buildingFloor) && value.contains(contract)) { + int count = wxRentContractMapper.getShopCountMax(); + String[] tempShop = new String[count]; + baseEntity.setTempShop(tempShop); + } } + } } diff --git a/mallinkAdmin/src/main/resources/db/migration/V201908291022__L_FLOW.sql b/mallinkAdmin/src/main/resources/db/migration/V201908291022__L_FLOW.sql new file mode 100644 index 000000000..9000f56de --- /dev/null +++ b/mallinkAdmin/src/main/resources/db/migration/V201908291022__L_FLOW.sql @@ -0,0 +1,81 @@ +alter table wx_flow_config modify `parent_id` BIGINT(20) NULL DEFAULT NULL; + +INSERT INTO `wx_flow_config` (`id`, `parent_id`, `tenant_id`, `name`, `type`, `model_id`, `sort`) +select (select unix_timestamp(now()) + CEILING(RAND()*90000+10000)) id, + (select id from wx_flow_config where name = '账单审批' and tenant_id = 789) parent_id, + '789' tenant_id, '结算单审核' name, 10 type, 0 model_id, 2 sort from dual; + +INSERT INTO `wx_flow_config` (`id`, `parent_id`, `tenant_id`, `name`, `type`, `model_id`, `sort`) +select (select unix_timestamp(now()) + CEILING(RAND()*90000+10000)) id, + (select id from wx_flow_config where name = '账单审批' and tenant_id = 790) parent_id, + '790' tenant_id, '结算单审核' name, 10 type, 0 model_id, 2 sort from dual; + +INSERT INTO `wx_flow_config` (`id`, `parent_id`, `tenant_id`, `name`, `type`, `model_id`, `sort`) +select (select unix_timestamp(now()) + CEILING(RAND()*90000+10000)) id, + (select id from wx_flow_config where name = '账单审批' and tenant_id = 1000) parent_id, + '1000' tenant_id, '结算单审核' name, 10 type, 0 model_id, 2 sort from dual; + +INSERT INTO `wx_flow_config` (`id`, `parent_id`, `tenant_id`, `name`, `type`, `model_id`, `sort`) +select (select unix_timestamp(now()) + CEILING(RAND()*90000+10000)) id, + (select id from wx_flow_config where name = '账单审批' and tenant_id = 1001) parent_id, + '1001' tenant_id, '结算单审核' name, 10 type, 0 model_id, 2 sort from dual; + +INSERT INTO `wx_flow_config` (`id`, `parent_id`, `tenant_id`, `name`, `type`, `model_id`, `sort`) +select (select unix_timestamp(now()) + CEILING(RAND()*90000+10000)) id, + (select id from wx_flow_config where name = '账单审批' and tenant_id = 1002) parent_id, + '1002' tenant_id, '结算单审核' name, 10 type, 0 model_id, 2 sort from dual; + +INSERT INTO `wx_flow_config` (`id`, `parent_id`, `tenant_id`, `name`, `type`, `model_id`, `sort`) +select (select unix_timestamp(now()) + CEILING(RAND()*90000+10000)) id, + (select id from wx_flow_config where name = '账单审批' and tenant_id = 1003) parent_id, + '1003' tenant_id, '结算单审核' name, 10 type, 0 model_id, 2 sort from dual; + +INSERT INTO `wx_flow_config` (`id`, `parent_id`, `tenant_id`, `name`, `type`, `model_id`, `sort`) +select (select unix_timestamp(now()) + CEILING(RAND()*90000+10000)) id, + (select id from wx_flow_config where name = '账单审批' and tenant_id = 1004) parent_id, + '1004' tenant_id, '结算单审核' name, 10 type, 0 model_id, 2 sort from dual; + +INSERT INTO `wx_flow_config` (`id`, `parent_id`, `tenant_id`, `name`, `type`, `model_id`, `sort`) +select (select unix_timestamp(now()) + CEILING(RAND()*90000+10000)) id, + (select id from wx_flow_config where name = '账单审批' and tenant_id = 1005) parent_id, + '1005' tenant_id, '结算单审核' name, 10 type, 0 model_id, 2 sort from dual; + +INSERT INTO `wx_flow_config` (`id`, `parent_id`, `tenant_id`, `name`, `type`, `model_id`, `sort`) +select (select unix_timestamp(now()) + CEILING(RAND()*90000+10000)) id, + (select id from wx_flow_config where name = '账单审批' and tenant_id = 1006) parent_id, + '1006' tenant_id, '结算单审核' name, 10 type, 0 model_id, 2 sort from dual; + +INSERT INTO `wx_flow_config` (`id`, `parent_id`, `tenant_id`, `name`, `type`, `model_id`, `sort`) +select (select unix_timestamp(now()) + CEILING(RAND()*90000+10000)) id, + (select id from wx_flow_config where name = '账单审批' and tenant_id = 1007) parent_id, + '1007' tenant_id, '结算单审核' name, 10 type, 0 model_id, 2 sort from dual; + +INSERT INTO `wx_flow_config` (`id`, `parent_id`, `tenant_id`, `name`, `type`, `model_id`, `sort`) +select (select unix_timestamp(now()) + CEILING(RAND()*90000+10000)) id, + (select id from wx_flow_config where name = '账单审批' and tenant_id = 1008) parent_id, + '1008' tenant_id, '结算单审核' name, 10 type, 0 model_id, 2 sort from dual; + +INSERT INTO `wx_flow_config` (`id`, `parent_id`, `tenant_id`, `name`, `type`, `model_id`, `sort`) +select (select unix_timestamp(now()) + CEILING(RAND()*90000+10000)) id, + (select id from wx_flow_config where name = '账单审批' and tenant_id = 1009) parent_id, + '1009' tenant_id, '结算单审核' name, 10 type, 0 model_id, 2 sort from dual; + +INSERT INTO `wx_flow_config` (`id`, `parent_id`, `tenant_id`, `name`, `type`, `model_id`, `sort`) +select (select unix_timestamp(now()) + CEILING(RAND()*90000+10000)) id, + (select id from wx_flow_config where name = '账单审批' and tenant_id = 1010) parent_id, + '1010' tenant_id, '结算单审核' name, 10 type, 0 model_id, 2 sort from dual; + +INSERT INTO `wx_flow_config` (`id`, `parent_id`, `tenant_id`, `name`, `type`, `model_id`, `sort`) +select (select unix_timestamp(now()) + CEILING(RAND()*90000+10000)) id, + (select id from wx_flow_config where name = '账单审批' and tenant_id = 1011) parent_id, + '1011' tenant_id, '结算单审核' name, 10 type, 0 model_id, 2 sort from dual; + +INSERT INTO `wx_flow_config` (`id`, `parent_id`, `tenant_id`, `name`, `type`, `model_id`, `sort`) +select (select unix_timestamp(now()) + CEILING(RAND()*90000+10000)) id, + (select id from wx_flow_config where name = '账单审批' and tenant_id = 1012) parent_id, + '1012' tenant_id, '结算单审核' name, 10 type, 0 model_id, 2 sort from dual; + +INSERT INTO `wx_flow_config` (`id`, `parent_id`, `tenant_id`, `name`, `type`, `model_id`, `sort`) +select (select unix_timestamp(now()) + CEILING(RAND()*90000+10000)) id, + (select id from wx_flow_config where name = '账单审批' and tenant_id = 1013) parent_id, + '1013' tenant_id, '结算单审核' name, 10 type, 0 model_id, 2 sort from dual; \ No newline at end of file diff --git a/mallinkAdmin/src/main/resources/db/migration/V201908291150__G_PERMISSION.sql b/mallinkAdmin/src/main/resources/db/migration/V201908291150__G_PERMISSION.sql new file mode 100644 index 000000000..e9412d9cd --- /dev/null +++ b/mallinkAdmin/src/main/resources/db/migration/V201908291150__G_PERMISSION.sql @@ -0,0 +1 @@ +update mall_permission set parent_id=5,icon='icon-quanyiguanli-' where id=513; \ No newline at end of file diff --git a/mallinkAdmin/src/main/resources/db/migration/V201908291430__POS_CHANGED.sql b/mallinkAdmin/src/main/resources/db/migration/V201908291430__POS_CHANGED.sql new file mode 100644 index 000000000..3df19e4ea --- /dev/null +++ b/mallinkAdmin/src/main/resources/db/migration/V201908291430__POS_CHANGED.sql @@ -0,0 +1,5 @@ +alter table wx_pay_order +add `pos_payment_type` tinyint(6) NULL COMMENT '支付方式: 0微信;1支付宝;2现金;3会员折扣;4优惠券;5预付卡;6银行卡,来源于POS' after `pay_from`, +modify `ip` varchar(20) NULL COMMENT 'ip地址', +change column `pos_pay_id` `pos_pay_order_id` bigint(20) NULL COMMENT 'POS支付订单ID', +change column `type` `pay_from` tinyint(6) NULL COMMENT '支付类型(0:C端微信支付, 1:POS支付)'; diff --git a/mallinkBApi/src/main/java/com/iformall/controller/WxCouponOrderController.java b/mallinkBApi/src/main/java/com/iformall/controller/WxCouponOrderController.java index 839481b5c..78592c3ad 100644 --- a/mallinkBApi/src/main/java/com/iformall/controller/WxCouponOrderController.java +++ b/mallinkBApi/src/main/java/com/iformall/controller/WxCouponOrderController.java @@ -164,7 +164,7 @@ public class WxCouponOrderController extends BaseController { } if(couponOrder != null) { - wxCouponOrderService.sendInsideCouponVerifyMsg(couponOrder.getTenantId(), couponOrderId, wxMerchantBUser.getId(), EnumCouponVerifyType.VERIFY_B.getCode()); + wxCouponOrderService.sendInsideCouponVerifyMsg(couponOrder.getTenantId(), couponOrderId, wxMerchantBUser.getId()); } return new ResultData(couponOrder); diff --git a/mallinkPosApi/src/main/java/com/iformall/controller/PosController.java b/mallinkPosApi/src/main/java/com/iformall/controller/PosController.java index eabdebe36..4656e2b99 100644 --- a/mallinkPosApi/src/main/java/com/iformall/controller/PosController.java +++ b/mallinkPosApi/src/main/java/com/iformall/controller/PosController.java @@ -21,6 +21,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import java.text.SimpleDateFormat; import java.util.*; @RestController @@ -30,6 +31,8 @@ public class PosController extends BaseController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); + private final SimpleDateFormat neuDateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + private final PosService posService; private final ThDevInfoService thDevInfoService; private final WxCouponOrderService couponOrderService; @@ -313,12 +316,11 @@ public class PosController extends BaseController { WxPayConstant.RET_FAIL, 500, e.getMessage()); } - doActionAfterVerify(params, retMap, EnumCouponVerifyType.VERIFY_POS_INDEPENDENT); return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", WxPayConstant.RET_SUCCESS, null); } - private void doActionAfterVerify(@RequestBody Map params, Map retMap, EnumCouponVerifyType verifyType) { + private void doActionAfterVerify(Map params, Map retMap) { String tenantId = params.get(WxPayConstant.TENANT_ID); // 租户ID String buUserIdStr = params.get(WxPayConstant.BUSER_ID); // POS操作员ID String couponOrderIdStr = params.get(WxPayConstant.COUPON_ORDER_ID); // 券ID @@ -334,7 +336,7 @@ public class PosController extends BaseController { String errCode = retMap.get(WxPayConstant.ERR_CODE); if(StringUtils.isBlank(errCode)) { // 无异常信息,核销成功 - couponOrderService.sendInsideCouponVerifyMsg(tenantId, couponOrderId, buUserId, verifyType.getCode()); + couponOrderService.sendInsideCouponVerifyMsg(tenantId, couponOrderId, buUserId); } } @@ -450,6 +452,37 @@ public class PosController extends BaseController { } } + @ApiOperation(value = "POS订单同步", notes = "支付成功/支付取消后订单同步") + @PostMapping("/posOrderSync") + @SystemControllerLog(description = "POS订单同步") + public Map posOrderSync(@RequestBody Map params) { + logger.info(params.toString()); + JSONObject payContent = new JSONObject(); + + // 1. check sign + Map retMap = checkSign(params, payContent); + if (retMap != null) { + // 签名相关异常返回 + return retMap; + } + String resKey = payContent.getString(WxPayConstant.RES_KEY); + logger.info(WxPayConstant.RES_KEY + ": " + resKey); + + try { + retMap = posService.posOrderSync(params); + return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", + WxPayConstant.RET_SUCCESS, null); + } catch (MallinkException e) { + return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", + WxPayConstant.RET_FAIL, + e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", + WxPayConstant.RET_FAIL, + 500, e.getMessage()); + } + } + private Map couponOrderPayVerify(@RequestBody Map params) { JSONObject payContent = new JSONObject(); @@ -474,7 +507,7 @@ public class PosController extends BaseController { 500, e.getMessage()); } - doActionAfterVerify(params, retMap, EnumCouponVerifyType.VERIFY_POS_PAY); + doActionAfterVerify(params, retMap); return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", WxPayConstant.RET_SUCCESS, null); } @@ -531,7 +564,7 @@ public class PosController extends BaseController { String errCode = retMap.get(WxPayConstant.VERIFY); if(errCode.equalsIgnoreCase(WxPayConstant.TRUE)) { // 核销成功 - couponOrderService.sendInsideCouponVerifyMsg(tenantId, couponOrderId, buUserId, EnumCouponVerifyType.VERIFY_POS_PAY.getCode()); + couponOrderService.sendInsideCouponVerifyMsg(tenantId, couponOrderId, buUserId); } } @@ -670,36 +703,6 @@ public class PosController extends BaseController { } } - @ApiOperation(value = "POS订单同步", notes = "支付成功/支付取消后订单同步") - @PostMapping("/posOrderSync") - @SystemControllerLog(description = "POS订单同步") - public Map posOrderSync(@RequestBody Map params) { - logger.info(params.toString()); - JSONObject payContent = new JSONObject(); - - // 1. check sign - Map retMap = checkSign(params, payContent); - if (retMap != null) { - // 签名相关异常返回 - return retMap; - } - String resKey = payContent.getString(WxPayConstant.RES_KEY); - logger.info(WxPayConstant.RES_KEY + ": " + resKey); - - try { - - } catch (MallinkException e) { - return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", - WxPayConstant.RET_FAIL, - e.getErrorCode(), e.getMessage()); - } catch (Exception e) { - return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", - WxPayConstant.RET_FAIL, - 500, e.getMessage()); - } - return null; - } - /** * 构造返回map,无签名, 有错误 @@ -717,6 +720,7 @@ public class PosController extends BaseController { retMap.put(WxPayConstant.RESULT_CODE, resCode); retMap.put(WxPayConstant.ERR_CODE, "" + errCode); retMap.put(WxPayConstant.ERR_CODE_DES, errMsg); + retMap.put(WxPayConstant.TIMESTAMP, neuDateFormat.format(new Date())); return retMap; } @@ -737,6 +741,8 @@ public class PosController extends BaseController { retMap.put(WxPayConstant.RETURN_CODE, retCode); retMap.put(WxPayConstant.RETURN_MSG, retMsg); retMap.put(WxPayConstant.RESULT_CODE, resCode); + retMap.put(WxPayConstant.TIMESTAMP, neuDateFormat.format(new Date())); + if (err != null) { retMap.put(WxPayConstant.ERR_CODE, "" + err.getCode()); retMap.put(WxPayConstant.ERR_CODE_DES, err.getMessage()); @@ -764,6 +770,7 @@ public class PosController extends BaseController { retMap.put(WxPayConstant.RESULT_CODE, resCode); retMap.put(WxPayConstant.ERR_CODE, "" + errCode); retMap.put(WxPayConstant.ERR_CODE_DES, errMsg); + retMap.put(WxPayConstant.TIMESTAMP, neuDateFormat.format(new Date())); return WxPayment.buildSignAfterParasMapForHMAC(retMap, resKey); } diff --git a/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java b/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java index f9e45bca5..af1e52df8 100644 --- a/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java +++ b/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java @@ -1103,12 +1103,27 @@ public class PosServiceImpl implements PosService { // 核销取消 if (couponOrderCVo.getCouponOrderStatus().equals(EnumCouponOrderStatus.COUPON_ORDER_USED.getCode()) && actionType.equals(EnumPosActionType.VERIFY_CANCEL)) { + // 检查是否有发放的券, 有则无法退券 + try { + cancelVerify(couponOrderCVo, buUserId, posOrderId); + retMap.put(WxPayConstant.CANCEL, WxPayConstant.TRUE); + return retMap; + } catch (MallinkException e) { + logger.error(e.getMessage()); + throw new MallinkException(e.getErrorCode(), e.getMessage()); + } + /* logger.info("券已被核销无法取消: " + couponOrderIdStr); retMap.put(WxPayConstant.CANCEL, WxPayConstant.FALSE); - String errMessage = String.format("此券核销后无法退回,原价:%s元, 售价:%s元", coupon.getPriceStr(), couponOrderCVo.getCouponPriceStr()); - // TODO 系统发放的券 + Map cancelMap = new HashMap(); + cancelMap.put(WxPayConstant.PRICE, coupon.getPrice()); + cancelMap.put(WxPayConstant.SALE_PRICE, coupon.getSalePrice()); + retMap.put(WxPayConstant.CANCEL_JSON, JSON.toJSONString(cancelMap)); + String errMessage = String.format("此券核销后无法退回,原价:%s元, 售价:%s元", coupon.getPriceStr(), coupon.getSalePriceStr()); + // TODO 系统发放的券, 也加入核销信息中 retMap.put(WxPayConstant.CANCEL_DES, errMessage); return retMap; + */ } String errMessage = "取消异常:未知的核销状态-" + couponOrderCVo.getCouponOrderStatus()+ ", 核销action-" + actionType.getCode(); logger.error(errMessage); @@ -1243,6 +1258,7 @@ public class PosServiceImpl implements PosService { } // 2. update couponOrder + Date curDate = new Date(); try { WxCouponOrder couponOrder = new WxCouponOrder(); couponOrder.setId(couponOrderCVo.getId()); @@ -1257,7 +1273,7 @@ public class PosServiceImpl implements PosService { actionType.equals(EnumPosActionType.VERIFY_PAY)) { couponOrder.setBUserId(buUserId); } - couponOrder.setUpdateDate(new Date()); + couponOrder.setUpdateDate(curDate); if (couponOrder.getBUserId() == null) { num = couponOrderMapper.updateVerifyCouponOrder(couponOrder); } else { @@ -1755,6 +1771,7 @@ public class PosServiceImpl implements PosService { String merchantIdStr = params.get(WxPayConstant.NEU_MERCHANT_ID); // 商户ID String buUserIdStr = params.get(WxPayConstant.NEU_BU_USER_ID); // POS操作员ID String cuUserIdStr = params.get(WxPayConstant.NEU_MEM_ID); // 富茂系统会员ID + String sceneTypeStr = params.get(WxPayConstant.NEU_ORDER_SCENE_TYPE); // 场景类型 String posOrderIdStr = params.get(WxPayConstant.NEU_ORDER_ID); // POS订单ID String posOrderTimeStr = params.get(WxPayConstant.NEU_ORDER_TIME); // POS订单时间 String posAmountStr = params.get(WxPayConstant.NEU_ORDER_AMOUNT); // POS订单总额 @@ -1778,6 +1795,9 @@ public class PosServiceImpl implements PosService { if (StringUtils.isBlank(cuUserIdStr)) { errParam(WxPayConstant.NEU_MEM_ID); } + if (StringUtils.isBlank(sceneTypeStr)) { + errParam(WxPayConstant.NEU_ORDER_SCENE_TYPE); + } if (StringUtils.isBlank(posOrderIdStr)) { errParam(WxPayConstant.NEU_ORDER_ID); } @@ -1792,14 +1812,16 @@ public class PosServiceImpl implements PosService { } Long merchantId, buUserId, posOrderId, memId; - Integer posAmount = 0; + Long posAmount = 0L; + Integer sceneType; Date orderTime = null; try { merchantId = Long.valueOf(merchantIdStr); buUserId = Long.valueOf(buUserIdStr); memId = Long.valueOf(cuUserIdStr); + sceneType = Integer.valueOf(sceneTypeStr); posOrderId = Long.valueOf(posOrderIdStr); - posAmount = Integer.valueOf(posAmountStr); + posAmount = Long.valueOf(posAmountStr); } catch (NumberFormatException e) { logger.error(e.getMessage()); throw new MallinkException(ErrorCode.SYS_PARAMETER_CAST_ERROR.getCode(), e.getMessage()); @@ -1813,9 +1835,9 @@ public class PosServiceImpl implements PosService { // 2. check merchant WxMerchant merchant = checkAndGetMerchant(merchantId); // 3. check buUser - final WxMerchantBUser merchantBUser = checkAndGetMerchantUser(merchantId, buUserId); + WxMerchantBUser merchantBUser = checkAndGetMerchantUser(buUserId, merchantId); if (posStatusStr.equalsIgnoreCase(WxPayConstant.NEU_ORDER_PAY)) { - WxOrder order = createOrderByPos(merchantBUser, memId, posOrderId, posAmount, orderTime); + WxOrder order = createOrderByPos(merchantBUser, memId, posOrderId, posAmount.intValue(), orderTime); String payDetail = params.get(WxPayConstant.NEU_PAY_DETAIL); JSONObject payDetailObj = JSON.parseObject(payDetail); JSONArray payDetailList = payDetailObj.getJSONArray(WxPayConstant.NEU_PAY_DETAIL_LIST); @@ -1841,13 +1863,14 @@ public class PosServiceImpl implements PosService { logger.error(e.getMessage()); throw new MallinkException(ErrorCode.SYS_PARAMETER_CAST_ERROR.getCode(), e.getMessage()); } - if (neuPayOrderType.equalsIgnoreCase(String.valueOf(EnumNeuPosPamentType.MEM_DISCOUNT.getCode()))) { + if (neuPayOrderType.equals(String.valueOf(EnumNeuPosPamentType.MEM_DISCOUNT.getCode()))) { // 会员折扣 WxPayOrder payOrder = payOrderFromMemDiscount(merchantBUser, order, memId, neuPayOrderId, neuPaymentAmount, neuPosPayOrderTime); - } else if (neuPayOrderType.equalsIgnoreCase(String.valueOf(EnumNeuPosPamentType.MEM_COUPON.getCode()))) { - // 优惠券, 交易核销 - WxPayOrder payOrder = payOrderFromCouponVerify(merchantBUser, order, memId, neuPayOrderId, neuPaymentAmount, neuPosPayOrderTime, neuPayThirdNo); - } else if (neuPayOrderType.equalsIgnoreCase(String.valueOf(EnumNeuPosPamentType.MEM_CARD.getCode()))) { + } else if (neuPayOrderType.equals(String.valueOf(EnumNeuPosPamentType.MEM_COUPON.getCode()))) { + // 优惠券 + WxPayOrder payOrder = payOrderFromCouponVerify(merchantBUser, order, memId, sceneType, + neuPayOrderId, neuPaymentAmount, neuPosPayOrderTime, neuPayThirdNo); + } else if (neuPayOrderType.equals(String.valueOf(EnumNeuPosPamentType.MEM_CARD.getCode()))) { // 预付卡, 不能退 WxPayOrder payOrder = payOrderFromCard(merchantBUser, order, memId, neuPayOrderId, neuPaymentAmount, neuPosPayOrderTime, neuPayThirdNo); } else { @@ -1939,6 +1962,7 @@ public class PosServiceImpl implements PosService { WxMerchantBUser merchantBUser, WxOrder order, Long memId, + Integer sceneType, Long posPayOrderId, String neuPaymentAmount, Date neuPosPayOrderTime, String posPayOrderNo) { // 1. insert into PayOrder WxPayOrder payOrder = new WxPayOrder() {{ @@ -1948,6 +1972,7 @@ public class PosServiceImpl implements PosService { setId(id); setTenantId(merchantBUser.getTenantId()); setCUserId(memId); + setBUserId(merchantBUser.getId()); setOrderId(order.getId()); setCreateTime(curDate); setUpdateTime(curDate); @@ -1958,9 +1983,10 @@ public class PosServiceImpl implements PosService { setPayVendor(EnumPayWay.PAY_WAY_POS_NEU.getCode()); setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); setShare(EnumPayShare.NO.getCode()); + setPayFrom(EnumPayFrom.POS.getCode()); setPosPayOrderId(posPayOrderId); setPosPayOrderTime(neuPosPayOrderTime.getTime()); - setPosPaymentType(EnumNeuPosPamentType.MEM_DISCOUNT.getCode()); + setPosPaymentType(EnumNeuPosPamentType.MEM_COUPON.getCode()); setPosPayDes("POS优惠券支付"); setPosPayOrderNo(posPayOrderNo); }}; @@ -1969,7 +1995,13 @@ public class PosServiceImpl implements PosService { logger.error("pay order insert error: " + payOrder.toString()); throw new MallinkException(ErrorCode.DB_FAIL); } - // 2. 核销 + Long couponOrderId = Long.valueOf(posPayOrderNo); + // 2. 预核销->核销 + if (sceneType.equals(EnumPosSceneType.PAY.getCode())) { + // TODO + } + // 3. 核销后处理 + couponOrderService.sendInsideCouponVerifyMsg(merchantBUser.getTenantId(), couponOrderId, merchantBUser.getId()); return payOrder; } diff --git a/mallinkPosApi/src/test/java/com/iformall/pos/test/PosAppTest.java b/mallinkPosApi/src/test/java/com/iformall/pos/test/PosAppTest.java index 748fb5e25..0f229e06f 100644 --- a/mallinkPosApi/src/test/java/com/iformall/pos/test/PosAppTest.java +++ b/mallinkPosApi/src/test/java/com/iformall/pos/test/PosAppTest.java @@ -1,5 +1,7 @@ package com.iformall.pos.test; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.databind.ObjectMapper; import com.iformall.PosApplication; @@ -23,6 +25,8 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultHandlers; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -41,6 +45,8 @@ public class PosAppTest { @Autowired private MockMvc mockMvc; + private static final SimpleDateFormat neuDateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + private static final String devId = "neupos"; private static final String devReqKey = "qVH2YDmXJ$ok4a95"; private static final String devResKey = "VE#1fB2PhUe@&3Of"; @@ -51,6 +57,8 @@ public class PosAppTest { private static final String phone = "13120223636"; private static final String password = "drpos345"; + private static final String posSN = "1"; + /* 可用的交易券, 支付可用(1, 2, 6), 核销可用(4, 6, 8, 9) coupon_order_id, coupon_type, 售价, 面额, cancellable @@ -106,20 +114,7 @@ public class PosAppTest { reqObj.put(WxPayConstant.TENANT_ID, tenantId); reqObj.put(WxPayConstant.PHONE, phone); reqObj.put(WxPayConstant.PASSWORD, password); - reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); - String reqJsonStr = JSONObject.toJSONString(reqObj); - MvcResult result = mockMvc.perform( - MockMvcRequestBuilders.post("/checkUserPassword") - .contentType(MediaType.APPLICATION_JSON) - .content(reqJsonStr)) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andDo(MockMvcResultHandlers.print()) - .andReturn(); - String responseStr = result.getResponse().getContentAsString(); - ObjectMapper mapper = new ObjectMapper(); - Map respMap = mapper.readValue(responseStr, Map.class); - boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); - System.out.println("response sign: " + resSigned); + boolean resSigned = sendAndRes("/checkUserPassword", reqObj); Assert.assertEquals(resSigned, true); } @Test @@ -128,20 +123,7 @@ public class PosAppTest { reqObj.put(WxPayConstant.NONCE_STR, "1"); reqObj.put(WxPayConstant.DEV_ID, devId); reqObj.put(WxPayConstant.TENANT_ID, tenantId); - reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); - String reqJsonStr = JSONObject.toJSONString(reqObj); - MvcResult result = mockMvc.perform( - MockMvcRequestBuilders.post("/getPosMemConfig") - .contentType(MediaType.APPLICATION_JSON) - .content(reqJsonStr)) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andDo(MockMvcResultHandlers.print()) - .andReturn(); - String responseStr = result.getResponse().getContentAsString(); - ObjectMapper mapper = new ObjectMapper(); - Map respMap = mapper.readValue(responseStr, Map.class); - boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); - System.out.println("response sign: " + resSigned); + boolean resSigned = sendAndRes("/getPosMemConfig", reqObj); Assert.assertEquals(resSigned, true); } @@ -151,19 +133,7 @@ public class PosAppTest { reqObj.put(WxPayConstant.NONCE_STR, "1"); reqObj.put(WxPayConstant.DEV_ID, devId); reqObj.put(WxPayConstant.TENANT_ID, tenantId); - reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); - String reqJsonStr = JSONObject.toJSONString(reqObj); - MvcResult result = mockMvc.perform( - MockMvcRequestBuilders.post("/getQrCode") - .contentType(MediaType.APPLICATION_JSON) - .content(reqJsonStr)) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andDo(MockMvcResultHandlers.print()) - .andReturn(); - String responseStr = result.getResponse().getContentAsString(); - ObjectMapper mapper = new ObjectMapper(); - Map respMap = mapper.readValue(responseStr, Map.class); - boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); + boolean resSigned = sendAndRes("/getQrCode", reqObj); Assert.assertEquals(resSigned, true); } @@ -173,7 +143,22 @@ public class PosAppTest { String phone = "13910154397"; String posOrderId = "1"; String posAmount = "200"; - doCheckMem(memId, phone, posOrderId, posAmount); + Map reqObj = new HashMap<>(); + reqObj.put(WxPayConstant.NONCE_STR, "1"); + reqObj.put(WxPayConstant.DEV_ID, devId); + reqObj.put(WxPayConstant.TENANT_ID, tenantId); + reqObj.put(WxPayConstant.MERCHANT_ID, merchantId); + reqObj.put(WxPayConstant.BUSER_ID, buUserId); + if (StringUtils.isNotBlank(memId)) { + reqObj.put(WxPayConstant.MEM_ID, memId); + } + if (StringUtils.isNotBlank(phone)) { + reqObj.put(WxPayConstant.MEM_PHONE, phone); + } + reqObj.put(WxPayConstant.POS_ORDER_ID, posOrderId); + reqObj.put(WxPayConstant.POS_AMOUNT, posAmount); + boolean resSigned = sendAndRes("/checkMem", reqObj); + Assert.assertEquals(resSigned, true); } @Test @@ -182,7 +167,22 @@ public class PosAppTest { String phone = "13910154397"; String posAmount = "20000"; String selCoList = "[\"321877927162249216\"]"; - doCalcMem(memId, phone, posAmount, selCoList); + Map reqObj = new HashMap<>(); + reqObj.put(WxPayConstant.NONCE_STR, "1"); + reqObj.put(WxPayConstant.DEV_ID, devId); + reqObj.put(WxPayConstant.TENANT_ID, tenantId); + reqObj.put(WxPayConstant.MERCHANT_ID, merchantId); + reqObj.put(WxPayConstant.BUSER_ID, buUserId); + if (StringUtils.isNotBlank(memId)) { + reqObj.put(WxPayConstant.MEM_ID, memId); + } + if (StringUtils.isNotBlank(phone)) { + reqObj.put(WxPayConstant.MEM_PHONE, phone); + } + reqObj.put(WxPayConstant.POS_AMOUNT, posAmount); + reqObj.put(WxPayConstant.SELECTED_COUPON_ORDER_LIST, selCoList); + boolean resSigned = sendAndRes("/calcMem", reqObj); + Assert.assertEquals(resSigned, true); } @Test @@ -217,6 +217,57 @@ public class PosAppTest { doCouponOrderVerifyCancel(couponOrderId, posOrderId); } + @Test + public void verifySyncTest() throws Exception { + String memId = "321178010928119808"; + String memPhone = "13910154397"; + String sceneType = "2"; // 核销 + String posOrderId = "1"; + String posAmount = "20000"; + String posPayOrderId = "1"; + String posPaymentType = "4"; + String posPaymentTypeDes = "优惠券"; + String posPaymentStatus = "0"; + + String couponOrderId = "321878223800205312"; + + Date curDate = new Date(); + + Map payDetailOne = new HashMap<>(); + payDetailOne.put(WxPayConstant.NEU_PAY_ORDER_ID, posPayOrderId); + payDetailOne.put(WxPayConstant.NEU_PAY_ORDER_TIME, neuDateFormat.format(curDate)); + payDetailOne.put(WxPayConstant.NEU_PAY_ORDER_TYPE, posPaymentType); + payDetailOne.put(WxPayConstant.NEU_PAY_ORDER_TYPE_DES, posPaymentTypeDes); + payDetailOne.put(WxPayConstant.NEU_PAY_ORDER_PARAM, "{}"); + payDetailOne.put(WxPayConstant.NEU_PAY_ORDER_STATUS, posPaymentStatus); + payDetailOne.put(WxPayConstant.NEU_PAY_ORDER_OUT_NO, couponOrderId); + payDetailOne.put(WxPayConstant.NEU_PAY_ORDER_AMOUNT, posAmount); + payDetailOne.put(WxPayConstant.NEU_PAY_ORDER_OUT_TIME, neuDateFormat.format(curDate)); + + JSONArray payDetailList = new JSONArray(); + payDetailList.add(payDetailOne); + + Map reqObj = new HashMap<>(); + reqObj.put(WxPayConstant.NONCE_STR, "1"); + reqObj.put(WxPayConstant.DEV_ID, devId); + reqObj.put(WxPayConstant.NEU_TENANT_ID, tenantId); + reqObj.put(WxPayConstant.NEU_MERCHANT_ID, merchantId); + reqObj.put(WxPayConstant.NEU_BU_USER_ID, buUserId); + reqObj.put(WxPayConstant.NEU_MEM_ID, memId); + reqObj.put(WxPayConstant.NEU_MEM_PHONE, memPhone); + reqObj.put(WxPayConstant.NEU_ORDER_SCENE_TYPE, sceneType); + reqObj.put(WxPayConstant.NEU_ORDER_ID, posOrderId); + reqObj.put(WxPayConstant.NEU_ORDER_TIME, neuDateFormat.format(curDate)); + reqObj.put(WxPayConstant.NEU_ORDER_AMOUNT, posAmount); + reqObj.put(WxPayConstant.NEU_ORDER_CREATE_SN, posSN); + reqObj.put(WxPayConstant.NEU_ORDER_STATUS, "0"); + JSONObject payDetail = new JSONObject(); + payDetail.put(WxPayConstant.NEU_PAY_DETAIL_LIST, JSON.toJSONString(payDetailList)); + reqObj.put(WxPayConstant.NEU_PAY_DETAIL, JSON.toJSONString(payDetail)); + boolean resSigned = sendAndRes("/posOrderSync", reqObj); + Assert.assertEquals(resSigned, true); + } + @Test public void couponOrderPreVerifyTest() throws Exception { String couponOrderId = "321877927162249216"; @@ -264,67 +315,7 @@ public class PosAppTest { doCardPayPreCancel(cardId, cardSpendId, posOrderId); } - private void doCheckMem(String memId, String phone, String posOrderId, String posAmount) throws Exception { - Map reqObj = new HashMap<>(); - reqObj.put(WxPayConstant.NONCE_STR, "1"); - reqObj.put(WxPayConstant.DEV_ID, devId); - reqObj.put(WxPayConstant.TENANT_ID, tenantId); - reqObj.put(WxPayConstant.MERCHANT_ID, merchantId); - reqObj.put(WxPayConstant.BUSER_ID, buUserId); - if (StringUtils.isNotBlank(memId)) { - reqObj.put(WxPayConstant.MEM_ID, memId); - } - if (StringUtils.isNotBlank(phone)) { - reqObj.put(WxPayConstant.MEM_PHONE, phone); - } - reqObj.put(WxPayConstant.POS_ORDER_ID, posOrderId); - reqObj.put(WxPayConstant.POS_AMOUNT, posAmount); - reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); - String reqJsonStr = JSONObject.toJSONString(reqObj); - MvcResult result = mockMvc.perform( - MockMvcRequestBuilders.post("/checkMem") - .contentType(MediaType.APPLICATION_JSON) - .content(reqJsonStr)) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andDo(MockMvcResultHandlers.print()) - .andReturn(); - String responseStr = result.getResponse().getContentAsString(); - ObjectMapper mapper = new ObjectMapper(); - Map respMap = mapper.readValue(responseStr, Map.class); - boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); - Assert.assertEquals(resSigned, true); - } - private void doCalcMem(String memId, String phone, String posAmount, String selCoList) throws Exception { - Map reqObj = new HashMap<>(); - reqObj.put(WxPayConstant.NONCE_STR, "1"); - reqObj.put(WxPayConstant.DEV_ID, devId); - reqObj.put(WxPayConstant.TENANT_ID, tenantId); - reqObj.put(WxPayConstant.MERCHANT_ID, merchantId); - reqObj.put(WxPayConstant.BUSER_ID, buUserId); - if (StringUtils.isNotBlank(memId)) { - reqObj.put(WxPayConstant.MEM_ID, memId); - } - if (StringUtils.isNotBlank(phone)) { - reqObj.put(WxPayConstant.MEM_PHONE, phone); - } - reqObj.put(WxPayConstant.POS_AMOUNT, posAmount); - reqObj.put(WxPayConstant.SELECTED_COUPON_ORDER_LIST, selCoList); - reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); - String reqJsonStr = JSONObject.toJSONString(reqObj); - MvcResult result = mockMvc.perform( - MockMvcRequestBuilders.post("/calcMem") - .contentType(MediaType.APPLICATION_JSON) - .content(reqJsonStr)) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andDo(MockMvcResultHandlers.print()) - .andReturn(); - String responseStr = result.getResponse().getContentAsString(); - ObjectMapper mapper = new ObjectMapper(); - Map respMap = mapper.readValue(responseStr, Map.class); - boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); - Assert.assertEquals(resSigned, true); - } private void doCheckCouponOrder(String couponOrderId, String sceneType, String posOrderId, String posAmount) throws Exception { Map reqObj = new HashMap<>(); @@ -337,19 +328,7 @@ public class PosAppTest { reqObj.put(WxPayConstant.SCENE_TYPE, sceneType); reqObj.put(WxPayConstant.POS_ORDER_ID, posOrderId); reqObj.put(WxPayConstant.POS_AMOUNT, posAmount); - reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); - String reqJsonStr = JSONObject.toJSONString(reqObj); - MvcResult result = mockMvc.perform( - MockMvcRequestBuilders.post("/checkCouponOrder") - .contentType(MediaType.APPLICATION_JSON) - .content(reqJsonStr)) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andDo(MockMvcResultHandlers.print()) - .andReturn(); - String responseStr = result.getResponse().getContentAsString(); - ObjectMapper mapper = new ObjectMapper(); - Map respMap = mapper.readValue(responseStr, Map.class); - boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); + boolean resSigned = sendAndRes("/checkCouponOrder", reqObj); Assert.assertEquals(resSigned, true); } @@ -362,20 +341,7 @@ public class PosAppTest { reqObj.put(WxPayConstant.BUSER_ID, buUserId); reqObj.put(WxPayConstant.COUPON_ORDER_ID, couponOrderId); reqObj.put(WxPayConstant.POS_ORDER_ID, posOrderId); - reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); - String reqJsonStr = JSONObject.toJSONString(reqObj); - MvcResult result = mockMvc.perform( - MockMvcRequestBuilders.post("/couponOrderVerify") - .contentType(MediaType.APPLICATION_JSON) - .content(reqJsonStr)) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andDo(MockMvcResultHandlers.print()) - .andReturn(); - String responseStr = result.getResponse().getContentAsString(); - - ObjectMapper mapper = new ObjectMapper(); - Map respMap = mapper.readValue(responseStr, Map.class); - boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); + boolean resSigned = sendAndRes("/couponOrderVerify", reqObj); Assert.assertEquals(resSigned, true); } @@ -388,19 +354,7 @@ public class PosAppTest { reqObj.put(WxPayConstant.BUSER_ID, buUserId); reqObj.put(WxPayConstant.COUPON_ORDER_ID, couponOrderId); reqObj.put(WxPayConstant.POS_ORDER_ID, posOrderId); - reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); - String reqJsonStr = JSONObject.toJSONString(reqObj); - MvcResult result = mockMvc.perform( - MockMvcRequestBuilders.post("/couponOrderVerifyCancel") - .contentType(MediaType.APPLICATION_JSON) - .content(reqJsonStr)) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andDo(MockMvcResultHandlers.print()) - .andReturn(); - String responseStr = result.getResponse().getContentAsString(); - ObjectMapper mapper = new ObjectMapper(); - Map respMap = mapper.readValue(responseStr, Map.class); - boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); + boolean resSigned = sendAndRes("/couponOrderVerifyCancel", reqObj); Assert.assertEquals(resSigned, true); } @@ -414,19 +368,7 @@ public class PosAppTest { reqObj.put(WxPayConstant.COUPON_ORDER_ID, couponOrderId); reqObj.put(WxPayConstant.POS_ORDER_ID, posOrderId); reqObj.put(WxPayConstant.POS_AMOUNT, posAmount); - reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); - String reqJsonStr = JSONObject.toJSONString(reqObj); - MvcResult result = mockMvc.perform( - MockMvcRequestBuilders.post("/couponOrderPreVerify") - .contentType(MediaType.APPLICATION_JSON) - .content(reqJsonStr)) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andDo(MockMvcResultHandlers.print()) - .andReturn(); - String responseStr = result.getResponse().getContentAsString(); - ObjectMapper mapper = new ObjectMapper(); - Map respMap = mapper.readValue(responseStr, Map.class); - boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); + boolean resSigned = sendAndRes("/couponOrderPreVerify", reqObj); Assert.assertEquals(resSigned, true); } @@ -440,19 +382,7 @@ public class PosAppTest { reqObj.put(WxPayConstant.BUSER_ID, buUserId); reqObj.put(WxPayConstant.COUPON_ORDER_ID, couponOrderId); reqObj.put(WxPayConstant.POS_ORDER_ID, posOrderId); - reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); - String reqJsonStr = JSONObject.toJSONString(reqObj); - MvcResult result = mockMvc.perform( - MockMvcRequestBuilders.post("/couponOrderPreVerifyCancel") - .contentType(MediaType.APPLICATION_JSON) - .content(reqJsonStr)) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andDo(MockMvcResultHandlers.print()) - .andReturn(); - String responseStr = result.getResponse().getContentAsString(); - ObjectMapper mapper = new ObjectMapper(); - Map respMap = mapper.readValue(responseStr, Map.class); - boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); + boolean resSigned = sendAndRes("/couponOrderPreVerifyCancel", reqObj); Assert.assertEquals(resSigned, true); } @@ -466,19 +396,7 @@ public class PosAppTest { reqObj.put(WxPayConstant.COUPON_ORDER_ID, couponOrderId); reqObj.put(WxPayConstant.POS_ORDER_ID, posOrderId); reqObj.put(WxPayConstant.POS_AMOUNT, posAmount); - reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); - String reqJsonStr = JSONObject.toJSONString(reqObj); - MvcResult result = mockMvc.perform( - MockMvcRequestBuilders.post("/couponOrderPayVerifyOne") - .contentType(MediaType.APPLICATION_JSON) - .content(reqJsonStr)) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andDo(MockMvcResultHandlers.print()) - .andReturn(); - String responseStr = result.getResponse().getContentAsString(); - ObjectMapper mapper = new ObjectMapper(); - Map respMap = mapper.readValue(responseStr, Map.class); - boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); + boolean resSigned = sendAndRes("/couponOrderPayVerifyOne", reqObj); Assert.assertEquals(resSigned, true); } @@ -492,19 +410,7 @@ public class PosAppTest { reqObj.put(WxPayConstant.SELECTED_COUPON_ORDER_LIST, couponOrderIdList); reqObj.put(WxPayConstant.POS_ORDER_ID, posOrderId); reqObj.put(WxPayConstant.POS_AMOUNT, posAmount); - reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); - String reqJsonStr = JSONObject.toJSONString(reqObj); - MvcResult result = mockMvc.perform( - MockMvcRequestBuilders.post("/couponOrderPayVerifyList") - .contentType(MediaType.APPLICATION_JSON) - .content(reqJsonStr)) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andDo(MockMvcResultHandlers.print()) - .andReturn(); - String responseStr = result.getResponse().getContentAsString(); - ObjectMapper mapper = new ObjectMapper(); - Map respMap = mapper.readValue(responseStr, Map.class); - boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); + boolean resSigned = sendAndRes("/couponOrderPayVerifyList", reqObj); Assert.assertEquals(resSigned, true); } @@ -518,19 +424,7 @@ public class PosAppTest { reqObj.put(WxPayConstant.POS_ORDER_ID, posOrderId); reqObj.put(WxPayConstant.POS_AMOUNT, posAmount); reqObj.put(WxPayConstant.CARD_ID, cardId); - reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); - String reqJsonStr = JSONObject.toJSONString(reqObj); - MvcResult result = mockMvc.perform( - MockMvcRequestBuilders.post("/cardPayPre") - .contentType(MediaType.APPLICATION_JSON) - .content(reqJsonStr)) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andDo(MockMvcResultHandlers.print()) - .andReturn(); - String responseStr = result.getResponse().getContentAsString(); - ObjectMapper mapper = new ObjectMapper(); - Map respMap = mapper.readValue(responseStr, Map.class); - boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); + boolean resSigned = sendAndRes("/cardPayPre", reqObj); Assert.assertEquals(resSigned, true); } @@ -545,72 +439,23 @@ public class PosAppTest { reqObj.put(WxPayConstant.POS_ORDER_ID, posOrderId); reqObj.put(WxPayConstant.CARD_ID, cardId); reqObj.put(WxPayConstant.CARD_SPEND_ID, cardSpendId); - reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); - String reqJsonStr = JSONObject.toJSONString(reqObj); - MvcResult result = mockMvc.perform( - MockMvcRequestBuilders.post("/cardPayPreCancel") - .contentType(MediaType.APPLICATION_JSON) - .content(reqJsonStr)) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andDo(MockMvcResultHandlers.print()) - .andReturn(); - String responseStr = result.getResponse().getContentAsString(); - ObjectMapper mapper = new ObjectMapper(); - Map respMap = mapper.readValue(responseStr, Map.class); - boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); - Assert.assertEquals(resSigned, true); - } - - private void doCardPay(String cardId, String posOrderId, String posAmount) throws Exception { - Map reqObj = new HashMap<>(); - reqObj.put(WxPayConstant.NONCE_STR, "1"); - reqObj.put(WxPayConstant.DEV_ID, devId); - reqObj.put(WxPayConstant.TENANT_ID, tenantId); - reqObj.put(WxPayConstant.MERCHANT_ID, merchantId); - reqObj.put(WxPayConstant.BUSER_ID, buUserId); - reqObj.put(WxPayConstant.POS_ORDER_ID, posOrderId); - reqObj.put(WxPayConstant.POS_AMOUNT, posAmount); - reqObj.put(WxPayConstant.CARD_ID, cardId); - reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); - String reqJsonStr = JSONObject.toJSONString(reqObj); - MvcResult result = mockMvc.perform( - MockMvcRequestBuilders.post("/cardPay") - .contentType(MediaType.APPLICATION_JSON) - .content(reqJsonStr)) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andDo(MockMvcResultHandlers.print()) - .andReturn(); - String responseStr = result.getResponse().getContentAsString(); - ObjectMapper mapper = new ObjectMapper(); - Map respMap = mapper.readValue(responseStr, Map.class); - boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); + boolean resSigned = sendAndRes("/cardPayPreCancel", reqObj); Assert.assertEquals(resSigned, true); } - - private void doCardPayCancel(String cardId, String cardSpendId, String posOrderId) throws Exception { - Map reqObj = new HashMap<>(); - reqObj.put(WxPayConstant.NONCE_STR, "1"); - reqObj.put(WxPayConstant.DEV_ID, devId); - reqObj.put(WxPayConstant.TENANT_ID, tenantId); - reqObj.put(WxPayConstant.MERCHANT_ID, merchantId); - reqObj.put(WxPayConstant.BUSER_ID, buUserId); - reqObj.put(WxPayConstant.POS_ORDER_ID, posOrderId); - reqObj.put(WxPayConstant.CARD_ID, cardId); - reqObj.put(WxPayConstant.CARD_SPEND_ID, cardSpendId); - reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); - String reqJsonStr = JSONObject.toJSONString(reqObj); - MvcResult result = mockMvc.perform( - MockMvcRequestBuilders.post("/cardPayCancel") - .contentType(MediaType.APPLICATION_JSON) - .content(reqJsonStr)) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andDo(MockMvcResultHandlers.print()) - .andReturn(); - String responseStr = result.getResponse().getContentAsString(); - ObjectMapper mapper = new ObjectMapper(); - Map respMap = mapper.readValue(responseStr, Map.class); - boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); - Assert.assertEquals(resSigned, true); - } + private boolean sendAndRes(String url, Map reqObj) throws Exception { + reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); + String reqJsonStr = JSONObject.toJSONString(reqObj); + MvcResult result = mockMvc.perform( + MockMvcRequestBuilders.post(url) + .contentType(MediaType.APPLICATION_JSON) + .content(reqJsonStr)) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andDo(MockMvcResultHandlers.print()) + .andReturn(); + String responseStr = result.getResponse().getContentAsString(); + ObjectMapper mapper = new ObjectMapper(); + Map respMap = mapper.readValue(responseStr, Map.class); + return WxPayment.verifyNotifyHMAC(respMap, devResKey); + } } diff --git a/mallinkService/src/main/java/com/iformall/domain/po/BaseEntity.java b/mallinkService/src/main/java/com/iformall/domain/po/BaseEntity.java index 2a54ec3f0..1a3e2ce7b 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/BaseEntity.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/BaseEntity.java @@ -36,6 +36,8 @@ public class BaseEntity implements Serializable { @Transient protected String businessForRule; + @Transient + protected String[] tempShop; public String getSortColumns() { if(StringUtils.isBlank(sortColumn)){ diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxBillSettle.java b/mallinkService/src/main/java/com/iformall/domain/po/WxBillSettle.java index 9ac89cb3e..f1c3e0494 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxBillSettle.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxBillSettle.java @@ -8,6 +8,7 @@ import javax.persistence.Table; import javax.persistence.Transient; import java.util.Date; import java.util.List; +import java.util.Map; /** * @author luozukai @@ -46,5 +47,7 @@ public class WxBillSettle extends BaseEntity { @io.swagger.annotations.ApiModelProperty(value="更新时间",name="updatetime") private Date updatetime; - + @Transient + @io.swagger.annotations.ApiModelProperty(value = "审批流参数", name = "flowParams") + private Map flowParams; } diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxPayOrder.java b/mallinkService/src/main/java/com/iformall/domain/po/WxPayOrder.java index 813f40045..0d01c2aee 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxPayOrder.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxPayOrder.java @@ -64,6 +64,8 @@ public class WxPayOrder extends BaseEntity { @io.swagger.annotations.ApiModelProperty(value="支付后结果来源(0:callback, 1:query)",name="payEndFrom") private Integer payEndFrom; + @io.swagger.annotations.ApiModelProperty(value="支付后结果来源(0:C端微信支付, 1:POS支付)",name="payFrom") + private Integer payFrom; @io.swagger.annotations.ApiModelProperty(value="支付订单号,来源于POS",name="posPayOrderId") private Long posPayOrderId; @io.swagger.annotations.ApiModelProperty(value="支付订单创建时间,来源于POS",name="posPayOrderTime") diff --git a/mallinkService/src/main/java/com/iformall/domain/po/msg/FmInsideCouponVerifyMsg.java b/mallinkService/src/main/java/com/iformall/domain/po/msg/FmInsideCouponVerifyMsg.java index 8d49a8bdd..880fd5c81 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/msg/FmInsideCouponVerifyMsg.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/msg/FmInsideCouponVerifyMsg.java @@ -16,6 +16,4 @@ public class FmInsideCouponVerifyMsg extends BaseMsg{ private Long couponOrderId; @io.swagger.annotations.ApiModelProperty(value = "B端用户ID", name = "bUserId") private Long bUserId; - @io.swagger.annotations.ApiModelProperty(value = "核销类型()", name = "verifyType") - private Integer verifyType; } diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumPayEndFrom.java b/mallinkService/src/main/java/com/iformall/enums/EnumPayEndFrom.java new file mode 100644 index 000000000..4aa58f79e --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumPayEndFrom.java @@ -0,0 +1,35 @@ +package com.iformall.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumPayEndFrom { + + CALLBACK(0, "callback"), + QUERY(1, "查询"); + + public static EnumPayEndFrom getEnum(Integer code) { + for (EnumPayEndFrom value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumPayEndFrom(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumPayFrom.java b/mallinkService/src/main/java/com/iformall/enums/EnumPayFrom.java index c81002007..8ff2c1b05 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumPayFrom.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumPayFrom.java @@ -5,8 +5,8 @@ package com.iformall.enums; */ public enum EnumPayFrom { - CALLBACK(0, "callback"), - QUERY(1, "查询"); + INSIDE_C(0, "C端支付"), + POS(1, "POS"); public static EnumPayFrom getEnum(Integer code) { for (EnumPayFrom value : values()) { diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxRentContractMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxRentContractMapper.java index d248615da..b6cbc38a0 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxRentContractMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxRentContractMapper.java @@ -64,4 +64,7 @@ public interface WxRentContractMapper extends CommonMapper List listContractVo(WxRentPropertyContractVo record); WxRentContract getByBill(WxBillRent billRent); + + int getShopCountMax(); + } diff --git a/mallinkService/src/main/java/com/iformall/pay/WxPayConstant.java b/mallinkService/src/main/java/com/iformall/pay/WxPayConstant.java index 4bab9a5b9..1d0b4e47c 100644 --- a/mallinkService/src/main/java/com/iformall/pay/WxPayConstant.java +++ b/mallinkService/src/main/java/com/iformall/pay/WxPayConstant.java @@ -10,6 +10,7 @@ public class WxPayConstant { public final static String RETURN_CODE = "return_code"; public final static String RETURN_MSG = "return_msg"; public final static String RESULT_CODE = "result_code"; + public final static String TIMESTAMP = "timestamp"; public final static String ERR_CODE = "err_code"; public final static String ERR_CODE_DES = "err_code_des"; public final static String NONCE_STR = "nonce_str"; @@ -54,6 +55,7 @@ public class WxPayConstant { public final static String VERIFY = "verify"; public final static String PAY = "pay"; public final static String CANCEL = "cancel"; + public final static String CANCEL_JSON = "cancel_json"; public final static String CANCEL_DES = "cancel_des"; public final static String REG_QRCODE_URL = "qrcode_url"; @@ -101,6 +103,7 @@ public class WxPayConstant { public final static String NEU_ORDER_TIME = "OrderTimeOfPlatform"; // 平台订单创建时间, 格式:4位年2位月2位日2位24小时制时2位分2位秒3位毫秒 public final static String NEU_ORDER_AMOUNT = "OrderAmount"; // 订单价格 public final static String NEU_ORDER_CREATE_SN = "OrderCreateSN"; // 创建订单的POS SN号 + public final static String NEU_ORDER_SCENE_TYPE = "SceneType"; // 订单场景 1:订单支付 2:核销 public final static String NEU_ORDER_STATUS = "OrderStatus"; // 必要,订单状态: 0有效,1取消,根据订单状态处理优惠券;有效:优惠券从预核销处理为核销; public final static String NEU_PAY_DETAIL = "PaymentDetail"; public final static String NEU_PAY_DETAIL_LIST = "PaymentDetailList"; diff --git a/mallinkService/src/main/java/com/iformall/service/WxBillSettleService.java b/mallinkService/src/main/java/com/iformall/service/WxBillSettleService.java index 66caf4c8b..9aef23a10 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxBillSettleService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxBillSettleService.java @@ -2,6 +2,7 @@ package com.iformall.service; import com.github.pagehelper.PageInfo; import com.iformall.common.ResultData; +import com.iformall.domain.po.MallUserInfo; import com.iformall.domain.po.WxBillSettle; import javax.servlet.http.HttpServletRequest; @@ -33,7 +34,7 @@ public interface WxBillSettleService { * * @param record */ - ResultData saveOrUpdate(WxBillSettle record); + ResultData saveOrUpdate(WxBillSettle record, MallUserInfo userInfo); void exportBill(HttpServletRequest request, HttpServletResponse response, WxBillSettle wxBillSettle); } diff --git a/mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java index a8f059999..58a2bfbf3 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java @@ -57,7 +57,7 @@ public interface WxCouponOrderService { /** * 核销后发送消息 */ - void sendInsideCouponVerifyMsg(String tenantId, Long couponOrderId, Long buUserId, Integer verifyType); + void sendInsideCouponVerifyMsg(String tenantId, Long couponOrderId, Long buUserId); /** * 核销后处理 @@ -65,7 +65,7 @@ public interface WxCouponOrderService { * @param couponOrder * @param bUser 核销人(登录用户) */ - void actionAfterVerify(WxCouponOrder couponOrder, WxMerchantBUser bUser, Integer verifyType); + void actionAfterVerify(WxCouponOrder couponOrder, WxMerchantBUser bUser); /** * 核销发券 diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxBillAllServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxBillAllServiceImpl.java index c701f728b..ef4f440aa 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxBillAllServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxBillAllServiceImpl.java @@ -664,30 +664,30 @@ public class WxBillAllServiceImpl implements WxBillAllService { List list = wxBillAllMapper.list(wxBillAll); if (!list.isEmpty()) { //租金总额 - Long rentSum = list.parallelStream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.RENT.getCode())) + Long rentSum = list.stream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.RENT.getCode())) .collect(Collectors.summingLong(b -> status == null && filterHasPay == null ? b.getReceivePay() : b.getOwe())); //物业总额 Long propertySum = list.parallelStream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.PROPERTY.getCode())) .collect(Collectors.summingLong(b -> status == null && filterHasPay == null ? b.getReceivePay() : b.getOwe())); //押金总额 - Long depositSum = list.parallelStream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.RENT_DEPOSIT.getCode()) || + Long depositSum = list.stream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.RENT_DEPOSIT.getCode()) || b.getBillTypeValue().equals(EnumBillTypeParam.PROPERTY_DEPOSIT.getCode()) || b.getBillTypeValue().equals(EnumBillTypeParam.ATHER_DEPOSIT.getCode())) .collect(Collectors.summingLong(b -> status == null && filterHasPay == null ? b.getReceivePay() : b.getOwe())); //水费 - Long waterSum = list.parallelStream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.WATER.getCode())) + Long waterSum = list.stream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.WATER.getCode())) .collect(Collectors.summingLong(b -> status == null && filterHasPay == null ? b.getReceivePay() : b.getOwe())); //电费 - Long powerSum = list.parallelStream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.POWER.getCode())) + Long powerSum = list.stream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.POWER.getCode())) .collect(Collectors.summingLong(b -> status == null && filterHasPay == null ? b.getReceivePay() : b.getOwe())); //空调费 - Long airConditioningSum = list.parallelStream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.AIR_CONDITIONING.getCode())) + Long airConditioningSum = list.stream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.AIR_CONDITIONING.getCode())) .collect(Collectors.summingLong(b -> status == null && filterHasPay == null ? b.getReceivePay() : b.getOwe())); //其他费用 - Long otherSum = list.parallelStream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.ROUTINE.getCode())) + Long otherSum = list.stream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.ROUTINE.getCode())) .collect(Collectors.summingLong(b -> status == null && filterHasPay == null ? b.getReceivePay() : b.getOwe())); //押金明细 StringBuffer depositDetail = new StringBuffer(); - list.parallelStream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.RENT_DEPOSIT.getCode()) || + list.stream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.RENT_DEPOSIT.getCode()) || b.getBillTypeValue().equals(EnumBillTypeParam.PROPERTY_DEPOSIT.getCode()) || b.getBillTypeValue().equals(EnumBillTypeParam.ATHER_DEPOSIT.getCode())) .forEach(b -> { BigDecimal owe = new BigDecimal(status == null && filterHasPay == null ? b.getReceivePay() : b.getOwe()).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN); @@ -696,7 +696,7 @@ public class WxBillAllServiceImpl implements WxBillAllService { //其他费用明细 StringBuffer otherDetail = new StringBuffer(); - list.parallelStream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.ROUTINE.getCode())) + list.stream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.ROUTINE.getCode())) .forEach(b -> { BigDecimal owe = new BigDecimal(status == null && filterHasPay == null ? b.getReceivePay() : b.getOwe()).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN); otherDetail.append(b.getName()).append(":[").append(owe.toPlainString()).append("] "); @@ -731,7 +731,7 @@ public class WxBillAllServiceImpl implements WxBillAllService { List listCVo = wxMerchantMapper.findListCVo(wxMerchantVo); wxMerchantVo = listCVo.get(0); result.put("merchant", wxMerchantVo.getMerchantName()); - WxShopVo wxShopVo = wxMerchantVo.getShopVoList().parallelStream().filter(s -> StringUtils.isNotEmpty(s.getLinkPhone())).findAny().orElse(null); + WxShopVo wxShopVo = wxMerchantVo.getShopVoList().stream().filter(s -> StringUtils.isNotEmpty(s.getLinkPerson())).findFirst().orElse(null); if (wxShopVo != null) { String linkPerson = wxShopVo.getLinkPerson(); String linkPhone = wxShopVo.getLinkPhone(); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxBillSettleServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxBillSettleServiceImpl.java index e54487bbe..f56179f67 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxBillSettleServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxBillSettleServiceImpl.java @@ -1,12 +1,17 @@ package com.iformall.service.impl; +import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import com.iformall.common.IdWorker; import com.iformall.common.ResultData; +import com.iformall.domain.po.MallUserInfo; import com.iformall.domain.po.WxBillSettle; import com.iformall.mapper.WxBillSettleMapper; import com.iformall.service.WxBillSettleService; +import com.iformall.service.WxFlowService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -18,20 +23,35 @@ import javax.servlet.http.HttpServletResponse; public class WxBillSettleServiceImpl implements WxBillSettleService { @Autowired private WxBillSettleMapper wxBillSettleMapper; + @Autowired + private WxFlowService wxFlowService; @Override public PageInfo listAsPage(WxBillSettle record, Integer pageIndex, Integer pageSize) { - return null; + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxBillSettleMapper.findList(record)); } @Override public WxBillSettle getById(Long id) { - return null; + return wxBillSettleMapper.selectByPrimaryKey(id); } @Override - public ResultData saveOrUpdate(WxBillSettle record) { - return null; + @Transactional + public ResultData saveOrUpdate(WxBillSettle record, MallUserInfo userInfo) { + if (record.getId() == null) { + final IdWorker idWorker = IdWorker.get(); + record.setId(idWorker.nextId()); + wxBillSettleMapper.insertSelective(record); + } else { + wxBillSettleMapper.updateByPrimaryKeySelective(record); + } + //启动审批流 + record.getFlowParams().put("businessId",record.getId()); + if (record.getFlowParams() != null && record.getFlowParams().size() > 0) { + wxFlowService.start(record.getFlowParams(), userInfo.getId(), userInfo.getName(), record.getTenantId()); + } + return new ResultData(); } @Override diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java index 6594c3129..6d53df064 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java @@ -388,18 +388,17 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { } @Override - public void sendInsideCouponVerifyMsg(String tenantId, Long couponOrderId, Long buUserId, Integer verifyType) { + public void sendInsideCouponVerifyMsg(String tenantId, Long couponOrderId, Long buUserId) { FmInsideCouponVerifyMsg verifyMsg = new FmInsideCouponVerifyMsg(); verifyMsg.setMsgType(EnumMsgRecordType.INSIDE_COUPON_VERIFY.getCode()); verifyMsg.setTenantId(tenantId); verifyMsg.setCouponOrderId(couponOrderId); verifyMsg.setBUserId(buUserId); - verifyMsg.setVerifyType(verifyType); mqBaseProducer.sendMessage(verifyMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); } @Override - public void actionAfterVerify(WxCouponOrder couponOrder, WxMerchantBUser bUser, Integer verifyType) { + public void actionAfterVerify(WxCouponOrder couponOrder, WxMerchantBUser bUser) { try { // 核销分账 shareAfterVerify(couponOrder, bUser.getMerchantId()); @@ -417,14 +416,10 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { boolean bSentCoupon = false; // 核销发券 - // POS交易核销暂不发券 - if (verifyType.equals(EnumCouponVerifyType.VERIFY_B.getCode()) || - verifyType.equals(EnumCouponVerifyType.VERIFY_POS_INDEPENDENT.getCode())) { - try { - bSentCoupon = sendCouponAfterVerify(couponOrder, bUser); - } catch (Exception e) { - logger.error(e.getMessage()); - } + try { + bSentCoupon = sendCouponAfterVerify(couponOrder, bUser); + } catch (Exception e) { + logger.error(e.getMessage()); } // 核销发模板消息 diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java index b6dc241cd..578b45146 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -724,7 +724,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { if ("MICROPAY".equals(tradeType)) { handleMicroOrderPaySuccess(record, transactionId, openId, sub_is_subscribe); } else { - handleOrderPaySuccess(record, transactionId, EnumPayFrom.QUERY.getCode()); + handleOrderPaySuccess(record, transactionId, EnumPayEndFrom.QUERY.getCode()); } return new ResultData(Result.SUCCESS, "订单支付成功", returnMap); } else if ("REFUND".equals(trade_state)) { @@ -1125,10 +1125,10 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { timeEnd = new Date(); } payOrder.setPayTimeEnd(timeEnd); - payOrder.setPayEndFrom(EnumPayFrom.CALLBACK.getCode()); + payOrder.setPayEndFrom(EnumPayEndFrom.CALLBACK.getCode()); // 处理支付成功 - handleOrderPaySuccess(payOrder, paramMap.get("transaction_id"), EnumPayFrom.CALLBACK.getCode()); + handleOrderPaySuccess(payOrder, paramMap.get("transaction_id"), EnumPayEndFrom.CALLBACK.getCode()); logger.info("notify order, wxpay checksign success, paramMap:{}, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString()); SortedMap resultMap = new TreeMap(); resultMap.put("return_code", "SUCCESS"); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java index 852bb7f3c..062701cce 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java @@ -254,17 +254,15 @@ public class WxRentContractServiceImpl implements WxRentContractService { * @param revenueLong * @return */ - public static Long countPrice(Integer ratio,Long revenueLong,int timeType,int period){ + public static Long countPrice(Integer ratio,Long revenueLong,int timeType,int period,int from){ BigDecimal hundred = new BigDecimal(100); BigDecimal revenue = new BigDecimal(revenueLong == null ? 0 : revenueLong).divide(hundred); BigDecimal payRatio = new BigDecimal(ratio == null ? 0 : ratio).divide(new BigDecimal(10000)); BigDecimal price; - if(EnumMissTimeType.YEAR.getCode().equals(timeType)){ + if(EnumMissTimeType.YEAR.getCode().equals(timeType) && EnumGetRatioFrom.RENT.getCode().equals(from)){ price = revenue.multiply(new BigDecimal(12)).multiply(payRatio).setScale(2, RoundingMode.HALF_EVEN);;; - }else if(EnumMissTimeType.PERIOD.getCode().equals(timeType)){ + }else if(EnumMissTimeType.PERIOD.getCode().equals(timeType) && EnumGetRatioFrom.RENT.getCode().equals(from)){ price = revenue.multiply(new BigDecimal(period)).multiply(payRatio).setScale(2, RoundingMode.HALF_EVEN);; - }else if(EnumMissTimeType.MONTH.getCode().equals(timeType)){ - price = revenue.multiply(payRatio).setScale(2, RoundingMode.HALF_EVEN); }else{ price = revenue.multiply(payRatio).setScale(2, RoundingMode.HALF_EVEN); } @@ -315,7 +313,7 @@ public class WxRentContractServiceImpl implements WxRentContractService { if (revenue.compareTo(start) >= 0 && revenue.compareTo(end)<= 0){ ratioVo.setRatio(ratio); - ratioVo.setPrice(countPrice(ratioVo.getRatio(),revenueLong,timeType,period)); + ratioVo.setPrice(countPrice(ratioVo.getRatio(),revenueLong,timeType,period,from)); break; } }else if(e.indexOf(">") >= 0){ @@ -401,7 +399,7 @@ public class WxRentContractServiceImpl implements WxRentContractService { record.setPrice(0l); }else{ if(record.getPayRatio()!=null && record.getPayRatio().intValue() > 0){ - record.setPrice(countPrice(record.getPayRatio(),record.getRevenue(),EnumMissTimeType.OTHER.getCode(),record.getAdjustPeriod())); + record.setPrice(countPrice(record.getPayRatio(),record.getRevenue(),EnumMissTimeType.OTHER.getCode(),record.getAdjustPeriod(),EnumGetRatioFrom.RENT.getCode())); }else{ int dayCount = record.getReceivePeriod() * 30; RatioVo ratioVo = getPayRatio(EnumGetRatioFrom.RENT.getCode(),record.getRevenue(),record.getBusDiscountRatio(),record.getBusDiscountTime(),dayCount,record.getReceivePeriod()); @@ -634,7 +632,7 @@ public class WxRentContractServiceImpl implements WxRentContractService { if(!EnumFromType.SWITCH.getCode().equals(from)){ if (record.getType().equals(EnumRentContractType.RENT_BY_JOINT.getCode())) { if(record.getPayRatio()!=null && record.getPayRatio().intValue() > 0){ - record.setPrice(countPrice(record.getPayRatio(),record.getRevenue(),EnumMissTimeType.OTHER.getCode(),record.getAdjustPeriod())); + record.setPrice(countPrice(record.getPayRatio(),record.getRevenue(),EnumMissTimeType.OTHER.getCode(),record.getAdjustPeriod(),from)); }else{ int dayCount = record.getReceivePeriod() * 30; RatioVo ratioVo = getPayRatio(EnumGetRatioFrom.RENT.getCode(),record.getRevenue(),record.getBusDiscountRatio(),record.getBusDiscountTime(),dayCount,record.getReceivePeriod()); @@ -1266,23 +1264,20 @@ public class WxRentContractServiceImpl implements WxRentContractService { }else{ Double priceD = new Double(price); - //年 除12 - if(EnumPriceUnit.Y.getCode().equals(wxRentContract.getPriceUnit())){ - priceD = new Double(price)/12; - } - if (wxRentContract.getType().equals(EnumRentContractType.RENT_BY_JOINT.getCode())) { + if (EnumRentContractType.RENT_BY_JOINT.getCode().equals(wxRentContract.getType())) { //设置跳点率为年周期 price不变 if(EnumMissTimeType.PERIOD.getCode().equals(wxRentContract.getBusDiscountTime())){ - if(i == billTimeVoListSize - 1){ - priceD = new Double(price); - }else { - return priceD.longValue(); - } + return priceD.longValue(); } //年或者设置跳点率为年周期 除12 if(EnumMissTimeType.YEAR.getCode().equals(wxRentContract.getBusDiscountTime())){ priceD = new Double(price)/12; } + }else{ + //年 除12 + if(EnumPriceUnit.Y.getCode().equals(wxRentContract.getPriceUnit())){ + priceD = new Double(price)/12; + } } //生成金额直接计算 @@ -1293,7 +1288,6 @@ public class WxRentContractServiceImpl implements WxRentContractService { SimpleDateFormat sdM = new SimpleDateFormat("yyyy-MM"); SimpleDateFormat sdD = new SimpleDateFormat("d"); - SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd"); if(i == billTimeVoListSize - 1){//最后 //判断是否满足整月 diff --git a/mallinkService/src/main/java/com/iformall/service/msg/impl/FmInsideCouponVerifyMsgServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/msg/impl/FmInsideCouponVerifyMsgServiceImpl.java index cb27390a4..22698983c 100644 --- a/mallinkService/src/main/java/com/iformall/service/msg/impl/FmInsideCouponVerifyMsgServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/msg/impl/FmInsideCouponVerifyMsgServiceImpl.java @@ -44,11 +44,6 @@ public class FmInsideCouponVerifyMsgServiceImpl implements MsgSendService { throw new MallinkException(ErrorCode.USER_IS_EMPTY.getCode(), "用户未找到" + msg.getBUserId()); } - Integer verifyType = msg.getVerifyType(); - if (verifyType == null) { - verifyType = EnumCouponVerifyType.VERIFY_B.getCode(); - } - - couponOrderService.actionAfterVerify(couponOrder, user, verifyType); + couponOrderService.actionAfterVerify(couponOrder, user); } } diff --git a/mallinkService/src/main/resources/mapper/WxPropertyContractMapper.xml b/mallinkService/src/main/resources/mapper/WxPropertyContractMapper.xml index 8dec54644..39ec448e1 100644 --- a/mallinkService/src/main/resources/mapper/WxPropertyContractMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxPropertyContractMapper.xml @@ -143,19 +143,19 @@ and b.id = #{building} and f.id = #{floor} and `operation_type` = #{operationType} - - and rc.merchant_id in( - select ms.merchant_id from (select merchant_id,shop_id from wx_merchant_shop where is_del=0) ms - inner join wx_merchant m on ms.merchant_id = m.id - inner join wx_shop s on s.id=ms.shop_id - where m.tenant_id=#{tenantId} and s.is_del=0 - - and m.business_id in (${businessForRule}) - - - and s.`floor` in (${floorForRule}) - - ) + + and rc.business_id in (${businessForRule}) + + + and rc.`id` in + + select id from wx_rent_contract where tenant_id=#{tenantId} and + json_unquote(json_extract(json_extract(rent_info,'$[*].shopId'),concat('$[',#{idx},']'))) in(select + id from wx_shop where tenant_id=#{tenantId} and floor in (${floorForRule})) + + + + and rc.shop_id in (select id from wx_shop where tenant_id=#{tenantId} and floor in (${floorForRule})) diff --git a/mallinkService/src/main/resources/mapper/WxRentContractMapper.xml b/mallinkService/src/main/resources/mapper/WxRentContractMapper.xml index 04d155c0f..89fc3a452 100644 --- a/mallinkService/src/main/resources/mapper/WxRentContractMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxRentContractMapper.xml @@ -171,19 +171,19 @@ and b.id = #{building} and f.id = #{floor} and `operation_type` = #{operationType} - - and rc.merchant_id in( - select ms.merchant_id from (select merchant_id,shop_id from wx_merchant_shop where is_del=0) ms - inner join wx_merchant m on ms.merchant_id = m.id - inner join wx_shop s on s.id=ms.shop_id - where m.tenant_id=#{tenantId} and s.is_del=0 - - and m.business_id in (${businessForRule}) - - - and s.`floor` in (${floorForRule}) - - ) + + and rc.business_id in (${businessForRule}) + + + and rc.`id` in + + select id from wx_rent_contract where tenant_id=#{tenantId} and + json_unquote(json_extract(json_extract(rent_info,'$[*].shopId'),concat('$[',#{idx},']'))) in(select + id from wx_shop where tenant_id=#{tenantId} and floor in (${floorForRule})) + + + + and rc.shop_id in (select id from wx_shop where tenant_id=#{tenantId} and floor in (${floorForRule})) order by ${sortColumns} @@ -379,23 +379,25 @@ and rc.`status` = #{status} and rc.`type` = #{type} - and rc.`rent_shop_type` = #{rentShopType} + + and rc.`rent_shop_type` = #{rentShopType} + and rc.`apply_status` = #{applyStatus} and rc.`operation_type` = #{operationType} + + and rc.business_id in (${businessForRule}) + - - and rc.merchant_id in( - select ms.merchant_id from (select merchant_id,shop_id from wx_merchant_shop where is_del=0) ms - inner join wx_merchant m on ms.merchant_id = m.id - inner join wx_shop s on s.id=ms.shop_id - where m.tenant_id=#{tenantId} and s.is_del=0 - - and m.business_id in (${businessForRule}) - - - and s.`floor` in (${floorForRule}) - - ) + + and rc.`id` in + + select id from wx_rent_contract where tenant_id=#{tenantId} and + json_unquote(json_extract(json_extract(rent_info,'$[*].shopId'),concat('$[',#{idx},']'))) in(select + id from wx_shop where tenant_id=#{tenantId} and floor in (${floorForRule})) + + + + and rc.shop_id in (select id from wx_shop where tenant_id=#{tenantId} and floor in (${floorForRule})) @@ -408,5 +410,10 @@ select rent_contract_id from wx_bill_rent id = #{id} ) + + + diff --git a/mallinkService/src/main/resources/mapper/WxShopMapper.xml b/mallinkService/src/main/resources/mapper/WxShopMapper.xml index bd66f39f4..a7ce9be39 100644 --- a/mallinkService/src/main/resources/mapper/WxShopMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxShopMapper.xml @@ -529,6 +529,7 @@ + @@ -538,7 +539,7 @@