Browse Source

Merge branch 'develop' of https://git.youlane.cn/server/formallProject into develop

release_toaliyun_real
Burce 6 years ago
parent
commit
3768c9ea5b
17 changed files with 692 additions and 575 deletions
  1. +8
    -8
      mallinkBApi/src/main/java/com/iformall/controller/PosController.java
  2. +1
    -1
      mallinkBApi/src/main/java/com/iformall/service/PosBrunService.java
  3. +7
    -7
      mallinkBApi/src/main/java/com/iformall/utils/PosUtil.java
  4. +81
    -310
      mallinkPosApi/src/main/java/com/iformall/controller/PosController.java
  5. +2
    -1
      mallinkPosApi/src/main/java/com/iformall/service/PosService.java
  6. +378
    -162
      mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java
  7. +63
    -19
      mallinkPosApi/src/test/java/com/iformall/pos/test/PosAppTest.java
  8. +2
    -1
      mallinkService/src/main/java/com/iformall/common/ErrorCode.java
  9. +17
    -0
      mallinkService/src/main/java/com/iformall/domain/vo/PromotionCalc.java
  10. +31
    -0
      mallinkService/src/main/java/com/iformall/domain/vo/WxCouponOrderCVo.java
  11. +2
    -2
      mallinkService/src/main/java/com/iformall/enums/EnumPosSceneType.java
  12. +38
    -0
      mallinkService/src/main/java/com/iformall/enums/EnumPosSelect.java
  13. +1
    -1
      mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java
  14. +33
    -13
      mallinkService/src/main/java/com/iformall/pay/WxPayConstant.java
  15. +0
    -7
      mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java
  16. +0
    -5
      mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java
  17. +28
    -38
      mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml

+ 8
- 8
mallinkBApi/src/main/java/com/iformall/controller/PosController.java View File

@@ -93,13 +93,13 @@ public class PosController extends BaseController {
String memIdStr = params.get(WxPayConstant.MEM_ID); // 会员ID
String memPhoneStr = params.get(WxPayConstant.MEM_PHONE); // 会员手机
String posOrderIdStr = params.get(WxPayConstant.POS_ORDER_ID); // POS订单ID
String posAmountStr = params.get(WxPayConstant.POS_AMOUNT); // POS订单金额(单位:分)
String posAmountStr = params.get(WxPayConstant.ORDER_AMOUNT); // POS订单金额(单位:分)

if (StringUtils.isBlank(posOrderIdStr)) {
return errParam(WxPayConstant.POS_ORDER_ID);
}
if (StringUtils.isBlank(posAmountStr)) {
return errParam(WxPayConstant.POS_AMOUNT);
return errParam(WxPayConstant.ORDER_AMOUNT);
}

if (StringUtils.isBlank(memIdStr) && StringUtils.isBlank(memPhoneStr)) {
@@ -116,7 +116,7 @@ public class PosController extends BaseController {
WxMerchantBUser user = getUser();
String couponOrderIdStr = params.get(WxPayConstant.COUPON_ORDER_ID); // 券包ID
String posOrderIdStr = params.get(WxPayConstant.POS_ORDER_ID); // POS订单ID
String posAmountStr = params.get(WxPayConstant.POS_AMOUNT); // POS订单金额
String posAmountStr = params.get(WxPayConstant.ORDER_AMOUNT); // POS订单金额

if (StringUtils.isBlank(couponOrderIdStr)) {
return errParam(WxPayConstant.COUPON_ORDER_ID);
@@ -125,7 +125,7 @@ public class PosController extends BaseController {
return errParam(WxPayConstant.POS_ORDER_ID);
}
if (StringUtils.isBlank(posAmountStr)) {
return errParam(WxPayConstant.POS_AMOUNT);
return errParam(WxPayConstant.ORDER_AMOUNT);
}
String verifyType = WxPayConstant.SCENE_PAY;
return posService.checkCouponOrderForPayVerify(user, verifyType, couponOrderIdStr, posOrderIdStr, posAmountStr);
@@ -138,7 +138,7 @@ public class PosController extends BaseController {
String couponOrderIdStr = params.get(WxPayConstant.COUPON_ORDER_ID); // 券包ID
String deductAmountStr = params.get(WxPayConstant.DEDUCT_AMOUNT); // 扣减金额
String posOrderIdStr = params.get(WxPayConstant.POS_ORDER_ID); // POS订单ID
String posAmountStr = params.get(WxPayConstant.POS_AMOUNT); // POS订单金额(单位:分)
String posAmountStr = params.get(WxPayConstant.ORDER_AMOUNT); // POS订单金额(单位:分)

if (StringUtils.isBlank(couponOrderIdStr)) {
return errParam(WxPayConstant.COUPON_ORDER_ID);
@@ -150,7 +150,7 @@ public class PosController extends BaseController {
return errParam(WxPayConstant.POS_ORDER_ID);
}
if (StringUtils.isBlank(posAmountStr)) {
return errParam(WxPayConstant.POS_AMOUNT);
return errParam(WxPayConstant.ORDER_AMOUNT);
}
return posService.couponOrderPreVerify(user, couponOrderIdStr, deductAmountStr, posOrderIdStr, posAmountStr);
}
@@ -177,7 +177,7 @@ public class PosController extends BaseController {
WxMerchantBUser user = getUser();
String couponOrderIdStr = params.get(WxPayConstant.COUPON_ORDER_ID); // 券包ID
String posOrderIdStr = params.get(WxPayConstant.POS_ORDER_ID); // POS订单ID
String posAmountStr = params.get(WxPayConstant.POS_AMOUNT); // POS订单金额(单位:分)
String posAmountStr = params.get(WxPayConstant.ORDER_AMOUNT); // POS订单金额(单位:分)

if (StringUtils.isBlank(couponOrderIdStr)) {
return errParam(WxPayConstant.COUPON_ORDER_ID);
@@ -186,7 +186,7 @@ public class PosController extends BaseController {
return errParam(WxPayConstant.POS_ORDER_ID);
}
if (StringUtils.isBlank(posAmountStr)) {
return errParam(WxPayConstant.POS_AMOUNT);
return errParam(WxPayConstant.ORDER_AMOUNT);
}
return posService.couponOrderPreVerifyCancel(user, couponOrderIdStr, posOrderIdStr, posAmountStr);
}


+ 1
- 1
mallinkBApi/src/main/java/com/iformall/service/PosBrunService.java View File

@@ -377,7 +377,7 @@ public class PosBrunService {
return new ResultData(JSON.toJSONString(retObj));
} else {
logger.error(resStr);
return new ResultData(Result.ERROR, retObj.getString(WxPayConstant.ERR_CODE_DES));
return new ResultData(Result.ERROR, retObj.getString(WxPayConstant.RESULT_DATA));
}
}
} else {


+ 7
- 7
mallinkBApi/src/main/java/com/iformall/utils/PosUtil.java View File

@@ -233,7 +233,7 @@ public class PosUtil {
paramMap.put(WxPayConstant.MEM_PHONE, memPhone);
}
paramMap.put(WxPayConstant.POS_ORDER_ID, posOrderId);
paramMap.put(WxPayConstant.POS_AMOUNT, posAmount);
paramMap.put(WxPayConstant.ORDER_AMOUNT, posAmount);
paramMap = WxPayment.buildSignAfterParasMapForHMAC(paramMap, reqKey);

String respStr = doPost(baseUrl + URL_CheckMem, paramMap);
@@ -275,7 +275,7 @@ public class PosUtil {
paramMap.put(WxPayConstant.POS_ORDER_ID, posOrderId);
}
if (StringUtils.isNotBlank(posAmount)) {
paramMap.put(WxPayConstant.POS_AMOUNT, posAmount);
paramMap.put(WxPayConstant.ORDER_AMOUNT, posAmount);
}
paramMap = WxPayment.buildSignAfterParasMapForHMAC(paramMap, reqKey);

@@ -313,7 +313,7 @@ public class PosUtil {
paramMap.put(WxPayConstant.BUSER_ID, buUserId);
paramMap.put(WxPayConstant.COUPON_ORDER_ID, couponOrderId);
paramMap.put(WxPayConstant.POS_ORDER_ID, posOrderId);
paramMap.put(WxPayConstant.POS_AMOUNT, posAmount);
paramMap.put(WxPayConstant.ORDER_AMOUNT, posAmount);
paramMap = WxPayment.buildSignAfterParasMapForHMAC(paramMap, reqKey);

String respStr = doPost(baseUrl + URL_CouponOrderPreVerify, paramMap);
@@ -350,7 +350,7 @@ public class PosUtil {
paramMap.put(WxPayConstant.BUSER_ID, buUserId);
paramMap.put(WxPayConstant.COUPON_ORDER_ID, couponOrderId);
paramMap.put(WxPayConstant.POS_ORDER_ID, posOrderId);
paramMap.put(WxPayConstant.POS_AMOUNT, posAmount);
paramMap.put(WxPayConstant.ORDER_AMOUNT, posAmount);
paramMap = WxPayment.buildSignAfterParasMapForHMAC(paramMap, reqKey);

String respStr = doPost(baseUrl + URL_CouponOrderPreVerifyCancel, paramMap);
@@ -422,7 +422,7 @@ public class PosUtil {
paramMap.put(WxPayConstant.BUSER_ID, buUserId);
paramMap.put(WxPayConstant.COUPON_ORDER_ID, couponOrderId);
paramMap.put(WxPayConstant.POS_ORDER_ID, posOrderId);
paramMap.put(WxPayConstant.POS_AMOUNT, posAmount);
paramMap.put(WxPayConstant.ORDER_AMOUNT, posAmount);
paramMap = WxPayment.buildSignAfterParasMapForHMAC(paramMap, reqKey);

String respStr = doPost(baseUrl + URL_CouponOrderPayVerifyOne, paramMap);
@@ -457,9 +457,9 @@ public class PosUtil {
paramMap.put(WxPayConstant.TENANT_ID, tenantId);
paramMap.put(WxPayConstant.MERCHANT_ID, merchantId);
paramMap.put(WxPayConstant.BUSER_ID, buUserId);
paramMap.put(WxPayConstant.SELECTED_COUPON_ORDER_LIST, JSON.toJSONString(couponOrderIdList));
paramMap.put(WxPayConstant.COUPON_ORDER_LIST, JSON.toJSONString(couponOrderIdList));
paramMap.put(WxPayConstant.POS_ORDER_ID, posOrderId);
paramMap.put(WxPayConstant.POS_AMOUNT, posAmount);
paramMap.put(WxPayConstant.ORDER_AMOUNT, posAmount);
paramMap = WxPayment.buildSignAfterParasMapForHMAC(paramMap, reqKey);

String respStr = doPost(baseUrl + URL_CouponOrderPayVerifyList, paramMap);


+ 81
- 310
mallinkPosApi/src/main/java/com/iformall/controller/PosController.java View File

@@ -72,189 +72,28 @@ public class PosController extends BaseController {

try {
retMap = posService.checkUserPassword(params);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", WxPayConstant.RET_SUCCESS, null);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", null);
} catch (MallinkException e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", WxPayConstant.RET_FAIL,
e.getErrorCode(),
e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", e.getErrorCode(), e.getMessage());
} catch (Exception e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", WxPayConstant.RET_FAIL,
500,
e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", 500, e.getMessage());
}
}

@ApiOperation(value = "获取会员折扣/优惠券/消费卡是否启用, 同时返回注册二维码及小票二维码规则", notes = "request: \n{" +
"\"dev_id\":\"string(必填)\"," +
"\"nonce_str\":\"string(必填)\"," +
"\"tenant_id\":\"string(必填)\"}\n" +
"\"response: \n{" +
"\"return_code\":\"SUCCESS\",\"return_msg\":\"\",\"result_code\":\"SUCCESS\"," +
"\"tenant_id\":\"456\",\"mall_name\":\"富茂中心\"," +
"\"qrcode_url\":\"https://s3.cn-northwest-1.amazonaws.com.cn/iformall-net/456/formall_c.png\"," +
"\"pos_qrcode_rule\":\"https://ctest.malls.iformall.com/order/(二维码规则: url + POS订单ID)\"," +
"\"discount\":\"false(是否支持会员折扣,false:禁用,true:可用)\"," +
"\"coupon\":\"0(会员优惠券是否开启,0-禁用,1-单选可用,2-多选可用)\",\"coupon_desc\":\"禁用(会员优惠券是否开启描述)\"," +
"\"card\":\"false(是否支持卡支付,false:禁用,true:可用)\"" +
"\"nonce_str\":\"eea09381622540868d22dee631054b30\"," +
"\"sign\":\"0EADC3B7D4B77D0AC923C095B6172955D462366FB4BF142467B4935FA7833A91\"}")
@PostMapping("/getPosMemConfig")
@SystemControllerLog(description = "获取会员折扣/优惠券/消费卡是否启用")
public Map<String, String> getMemStatus(@RequestBody Map<String, String> params) {
JSONObject payContent = new JSONObject();

// 1. check sign
Map<String, String> 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.getPosMemConfig(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());
}
}

@ApiOperation(value = "获取注册二维码及小票二维码规则", notes = "request: \n{" +
"\"dev_id\":\"string(必填)\"," +
"\"nonce_str\":\"string(必填)\"," +
"\"tenant_id\":\"string(必填)\"}\n" +
"\"response: \n{" +
"\"return_code\":\"SUCCESS\",\"return_msg\":\"\",\"result_code\":\"SUCCESS\"," +
"\"tenant_id\":\"456\",\"mall_name\":\"富茂中心\"," +
"\"qrcode_url\":\"https://s3.cn-northwest-1.amazonaws.com.cn/iformall-net/456/formall_c.png\"," +
"\"pos_qrcode_rule\":\"https://ctest.malls.iformall.com/order/(二维码规则: url + POS订单ID)\"," +
"\"nonce_str\":\"5604985305904f35bc9eeeda94346f8d\"," +
"\"sign\":\"5760C5989C3DD2F99CB3506EDBA0FB84A77BC60313F65206EB774A203108AA82\"}")
@PostMapping("/getQrCode")
@SystemControllerLog(description = "获取注册二维码及小票二维码规则")
public Map<String, String> getQrCode(@RequestBody Map<String, String> params) {
JSONObject payContent = new JSONObject();

// 1. check sign
Map<String, String> 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.doGetQrCode(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());
}
}


@ApiOperation(value = "会员识别", notes = "request: \n{" +
@ApiOperation(value = "查询及试算接口", notes = "{" +
"\"dev_id\":\"string(必填)\"," +
"\"nonce_str\":\"string(必填)\"," +
"\"tenant_id\":\"string(必填)\"," +
"\"merchant_id\":\"string(必填)\"," +
"\"order_operator_id\":\"string(必填)\"," +
"\"mem_id\":\"string(选填)\"," +
"\"mem_phone\":\"string(选填)\"," +
"\"pos_order_id\":\"string(必填)\"," +
"\"pos_amount\":\"string(单位:分)(必填)\"}")
@PostMapping("/checkMem")
@SystemControllerLog(description = "会员识别")
public Map<String, String> checkMem(@RequestBody Map<String, String> params) {
JSONObject payContent = new JSONObject();

// 1. check sign
Map<String, String> 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.checkMember(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());
}
}

@ApiOperation(value = "券检查是否可用-场景(核销/支付)", notes = "{" +
"\"dev_id\":\"string(必填)\"," +
"\"nonce_str\":\"string(必填)\"," +
"\"tenant_id\":\"string(必填)\"," +
"\"merchant_id\":\"string(必填)\"," +
"\"bu_user_id\":\"string(必填)\"," +
"\"coupon_order_id\":\"string(必填)\"," +
"\"scene_type\":\"string(1支付2:核销)(必填)\"," +
"\"pos_order_id\":\"string(选填)\"," +
"\"pos_amount\":\"string单位(分)(选填)\"}")
@PostMapping("/checkCouponOrder")
@SystemControllerLog(description = "券检查是否可用-场景(核销/支付)")
public Map<String, String> checkCouponOrder(@RequestBody Map<String, String> params) {
JSONObject payContent = new JSONObject();

// 1. check sign
Map<String, String> 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.couponOrderVerifyDo(params, EnumPosActionType.CHECK);
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());
}
}

@ApiOperation(value = "支付计算接口", notes = "{" +
"\"dev_id\":\"string(必填)\"," +
"\"nonce_str\":\"string(必填)\"," +
"\"tenant_id\":\"string(必填)\"," +
"\"merchant_id\":\"string(必填)\"," +
"\"bu_user_id\":\"string(必填)\"," +
"\"mem_id\":\"string(选填)\"," +
"\"mem_phone\":\"string(选填)\"," +
"\"sel_co_list\":\"json array[券包ID list](必填),例[\"1\",\"2\",\"3\"]\"" +
"\"pos_order_id\":\"string(选填)\"," +
"\"pos_amount\":\"string单位(分)(必填)\"}")
@PostMapping("/calcMem")
"\"mem_phone_number\":\"string(选填)\"," +
"\"business_type\":\"string(0:核销1支付(必填)\"," +
"\"order_amount\":\"string单位(分)(必填)\"," +
"\"order_amount_left\":\"string单位(分)(必填)\"," +
"\"order_create_sn\":\"string单位(分)(必填)\"," +
"\"coupon_list\":\"json array[券包ID list](必填),例[\"1\",\"2\",\"3\"]\"}")
@PostMapping("/queryAndCalc")
@SystemControllerLog(description = "支付计算接口")
public Map<String, String> calcForMem(@RequestBody Map<String, String> params) {
JSONObject payContent = new JSONObject();
@@ -269,17 +108,12 @@ public class PosController extends BaseController {
logger.info(WxPayConstant.RES_KEY + ": " + resKey);

try {
retMap = posService.calcMem(params);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_SUCCESS, null);
retMap = posService.queryAndCalcMem(params);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",null);
} catch (MallinkException e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
e.getErrorCode(), e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", e.getErrorCode(), e.getMessage());
} catch (Exception e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
500, e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", 500, e.getMessage());
}
}

@@ -308,16 +142,11 @@ public class PosController extends BaseController {
try {
retMap = posService.couponOrderVerifyDo(params, EnumPosActionType.VERIFY_INDEPENT);
} catch (MallinkException e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
e.getErrorCode(), e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", e.getErrorCode(), e.getMessage());
} catch (Exception e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
500, e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", 500, e.getMessage());
}
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_SUCCESS, null);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",null);
}

private void doActionAfterVerify(Map<String, String> params, Map<String, String> retMap) {
@@ -333,8 +162,8 @@ public class PosController extends BaseController {
throw new MallinkException(ErrorCode.SYS_PARAMETER_CAST_ERROR.getCode(), e.getMessage());
}

String errCode = retMap.get(WxPayConstant.ERR_CODE);
if(StringUtils.isBlank(errCode)) {
String errCode = retMap.get(WxPayConstant.RESULT_CODE);
if(StringUtils.isBlank(errCode)||errCode.equals(WxPayConstant.RESULT_SUCCESS)) {
// 无异常信息,核销成功
couponOrderService.sendInsideCouponVerifyMsg(tenantId, couponOrderId, buUserId);
}
@@ -364,16 +193,11 @@ public class PosController extends BaseController {

try {
retMap = posService.couponOrderVerifyCancel(params, EnumPosActionType.VERIFY_CANCEL);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_SUCCESS, null);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",null);
} catch (MallinkException e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
e.getErrorCode(), e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", e.getErrorCode(), e.getMessage());
} catch (Exception e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
500, e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",500, e.getMessage());
}
}

@@ -402,16 +226,11 @@ public class PosController extends BaseController {

try {
retMap = posService.couponOrderVerifyDo(params, EnumPosActionType.PAY_VERIFY_PRE);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_SUCCESS, null);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",null);
} catch (MallinkException e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
e.getErrorCode(), e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", e.getErrorCode(), e.getMessage());
} catch (Exception e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
500, e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",500, e.getMessage());
}
}

@@ -439,16 +258,11 @@ public class PosController extends BaseController {

try {
retMap = posService.couponOrderVerifyCancel(params, EnumPosActionType.PAY_VERIFY_PRE_CANCEL);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_SUCCESS, null);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",null);
} catch (MallinkException e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
e.getErrorCode(), e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", e.getErrorCode(), e.getMessage());
} catch (Exception e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
500, e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",500, e.getMessage());
}
}

@@ -470,16 +284,11 @@ public class PosController extends BaseController {

try {
retMap = posService.posOrderSync(params);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_SUCCESS, null);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",null);
} catch (MallinkException e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
e.getErrorCode(), e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", e.getErrorCode(), e.getMessage());
} catch (Exception e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
500, e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", 500, e.getMessage());
}
}

@@ -498,18 +307,13 @@ public class PosController extends BaseController {
try {
retMap = posService.couponOrderVerifyDo(params, EnumPosActionType.VERIFY_PAY);
} catch (MallinkException e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
e.getErrorCode(), e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", e.getErrorCode(), e.getMessage());
} catch (Exception e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
500, e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",500, e.getMessage());
}

doActionAfterVerify(params, retMap);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_SUCCESS, null);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",null);
}

private Map<String, String> couponOrderPayVerifyList(@RequestBody Map<String, String> params) {
@@ -527,13 +331,9 @@ public class PosController extends BaseController {
try {
retMap = posService.couponOrderVerifyListDo(params, EnumPosActionType.VERIFY_PAY);
} catch (MallinkException e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
e.getErrorCode(), e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", e.getErrorCode(), e.getMessage());
} catch (Exception e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
500, e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",500, e.getMessage());
}

String tenantId = params.get(WxPayConstant.TENANT_ID); // 租户ID
@@ -544,9 +344,7 @@ public class PosController extends BaseController {
buUserId = Long.valueOf(buUserIdStr);
} catch (NumberFormatException e) {
logger.error(e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
ErrorCode.SYS_PARAMETER_CAST_ERROR);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", ErrorCode.SYS_PARAMETER_CAST_ERROR);
}

JSONArray couponArr = JSON.parseArray(arrString);
@@ -557,9 +355,7 @@ public class PosController extends BaseController {
couponOrderId = Long.valueOf(id);
} catch (NumberFormatException e) {
logger.error(e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
ErrorCode.SYS_PARAMETER_CAST_ERROR);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", ErrorCode.SYS_PARAMETER_CAST_ERROR);
}
String errCode = retMap.get(WxPayConstant.VERIFY);
if(errCode.equalsIgnoreCase(WxPayConstant.TRUE)) {
@@ -568,8 +364,7 @@ public class PosController extends BaseController {
}
}

return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_SUCCESS, null);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",null);
}

@ApiOperation(value = "消费卡预支付", notes = "{" +
@@ -597,16 +392,11 @@ public class PosController extends BaseController {

try {
retMap = posService.cardPayPre(params);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_SUCCESS, null);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",null);
} catch (MallinkException e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
e.getErrorCode(), e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", e.getErrorCode(), e.getMessage());
} catch (Exception e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
500, e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", 500, e.getMessage());
}
}

@@ -636,16 +426,11 @@ public class PosController extends BaseController {

try {
retMap = posService.cardPayPreCancel(params);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_SUCCESS, null);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",null);
} catch (MallinkException e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
e.getErrorCode(), e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", e.getErrorCode(), e.getMessage());
} catch (Exception e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
500, e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",500, e.getMessage());
}
}

@@ -663,16 +448,11 @@ public class PosController extends BaseController {

try {
retMap = posService.cardPay(params);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_SUCCESS, null);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", null);
} catch (MallinkException e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
e.getErrorCode(), e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", e.getErrorCode(), e.getMessage());
} catch (Exception e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
500, e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", 500, e.getMessage());
}
}

@@ -690,16 +470,11 @@ public class PosController extends BaseController {

try {
retMap = posService.cardPayCancel(params);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_SUCCESS, null);
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",null);
} catch (MallinkException e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
e.getErrorCode(), e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", e.getErrorCode(), e.getMessage());
} catch (Exception e) {
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "",
WxPayConstant.RET_FAIL,
500, e.getMessage());
return buildReturnMap(retMap, resKey, WxPayConstant.RET_SUCCESS, "", 500, e.getMessage());
}
}

@@ -708,69 +483,65 @@ public class PosController extends BaseController {
* 构造返回map,无签名, 有错误
* @param retCode
* @param retMsg
* @param resCode
* @param errCode
* @param errMsg
* @return
*/
private Map<String, String> buildReturnMap(String retCode, String retMsg, String resCode, Integer errCode, String errMsg) {
private Map<String, String> buildReturnMap(String retCode, String retMsg, Integer errCode, String errMsg) {
Map<String, String> retMap = new HashMap<>();
retMap.put(WxPayConstant.RETURN_CODE, retCode);
retMap.put(WxPayConstant.RETURN_MSG, retMsg);
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()));
retMap.put(WxPayConstant.RESULT_CODE, "" + errCode);
retMap.put(WxPayConstant.RESULT_MSG, errMsg);
return retMap;
}

/**
* 构造返回map,带签名, 有错误
* @param retMap
* @param dataMap
* @param resKey
* @param retCode
* @param retMsg
* @param resCode
* @param err
* @return
*/
private Map<String, String> buildReturnMap(Map<String, String> retMap, String resKey, String retCode, String retMsg, String resCode, ErrorCode err) {
if(retMap == null) {
retMap = new HashMap<>();
}
private Map<String, String> buildReturnMap(Map<String, String> dataMap, String resKey, String retCode, String retMsg, ErrorCode err) {
Map<String, String> retMap = new HashMap<>();
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());
retMap.put(WxPayConstant.RESULT_CODE, "" + err.getCode());
retMap.put(WxPayConstant.RESULT_MSG, err.getMessage());
} else {
retMap.put(WxPayConstant.RESULT_CODE, "0");
retMap.put(WxPayConstant.RESULT_MSG, "");
}
if (dataMap != null) {
retMap.put(WxPayConstant.RESULT_DATA, JSON.toJSONString(dataMap));
}
return WxPayment.buildSignAfterParasMapForHMAC(retMap, resKey);
}

/**
* 构造返回map,带签名, 有错误
* @param retMap
* @param dataMap
* @param resKey
* @param retCode
* @param retMsg
* @param resCode
* @param errCode
* @param errMsg
* @return
*/
private Map<String, String> buildReturnMap(Map<String, String> retMap, String resKey, String retCode, String retMsg, String resCode, Integer errCode, String errMsg) {
private Map<String, String> buildReturnMap(Map<String, String> dataMap, String resKey, String retCode, String retMsg, Integer errCode, String errMsg) {
Map<String, String> retMap = new HashMap<>();
if(retMap == null) {
retMap = new HashMap<>();
}
retMap.put(WxPayConstant.RETURN_CODE, retCode);
retMap.put(WxPayConstant.RETURN_MSG, retMsg);
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()));
retMap.put(WxPayConstant.RESULT_CODE, "" + errCode);
retMap.put(WxPayConstant.RESULT_MSG, errMsg);
retMap.put(WxPayConstant.RESULT_DATA, JSON.toJSONString(dataMap));
return WxPayment.buildSignAfterParasMapForHMAC(retMap, resKey);
}

@@ -787,39 +558,39 @@ public class PosController extends BaseController {
String sign = params.get(WxPayConstant.SIGN); // 签名
if (StringUtils.isBlank(devId)) {
String errorMessage = String.format("request params[%s] error.", WxPayConstant.DEV_ID);
return buildReturnMap(WxPayConstant.RET_FAIL, "参数错误", WxPayConstant.RET_FAIL, ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), errorMessage);
return buildReturnMap(WxPayConstant.RET_FAIL, "参数错误", ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), errorMessage);
}
if (StringUtils.isBlank(sign)) {
String errorMessage = String.format("request params[%s] error.", WxPayConstant.SIGN);
return buildReturnMap(WxPayConstant.RET_FAIL, "参数错误", WxPayConstant.RET_FAIL, ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), errorMessage);
return buildReturnMap(WxPayConstant.RET_FAIL, "参数错误", ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), errorMessage);
}

// 查询开发者信息
ThDevInfo devInfo = thDevInfoService.getByDevId(devId);
if (devInfo == null) {
String errorMessage = String.format("Can't found devInfo[%s=%s] record in db.", WxPayConstant.DEV_ID, devId);
return buildReturnMap(WxPayConstant.RET_FAIL, "参数错误", WxPayConstant.RET_FAIL, ErrorCode.DEV_ID_NOT_FOUND.getCode(), errorMessage);
return buildReturnMap(WxPayConstant.RET_FAIL, "参数错误", ErrorCode.DEV_ID_NOT_FOUND.getCode(), errorMessage);
}
if (devInfo.getState().equals(EnumEnableType.Disable.getCode())) {
String errorMessage = String.format("devInfo not available [%s=%s] record in db.", WxPayConstant.DEV_ID, devId);
return buildReturnMap(WxPayConstant.RET_FAIL, "参数错误", WxPayConstant.RET_FAIL, ErrorCode.DEV_ID_IS_DISABLED.getCode(), errorMessage);
return buildReturnMap(WxPayConstant.RET_FAIL, "参数错误", ErrorCode.DEV_ID_IS_DISABLED.getCode(), errorMessage);
}

if (StringUtils.isBlank(devInfo.getReqKey())) {
String errorMessage = String.format("%s is null[%s=%s] record in db.", WxPayConstant.REQ_KEY, WxPayConstant.DEV_ID, devId);
return buildReturnMap(WxPayConstant.RET_FAIL, "参数错误", WxPayConstant.RET_FAIL, ErrorCode.DEV_ID_REQ_KEY_IS_NULL.getCode(), errorMessage);
return buildReturnMap(WxPayConstant.RET_FAIL, "参数错误", ErrorCode.DEV_ID_REQ_KEY_IS_NULL.getCode(), errorMessage);
}
if (StringUtils.isBlank(devInfo.getResKey())) {
String errorMessage = String.format("%s is null[%s=%s] record in db.", WxPayConstant.RES_KEY, WxPayConstant.DEV_ID, devId);
return buildReturnMap(WxPayConstant.RET_FAIL, "参数错误", WxPayConstant.RET_FAIL, ErrorCode.DEV_ID_RES_KEY_IS_NULL.getCode(), errorMessage);
return buildReturnMap(WxPayConstant.RET_FAIL, "参数错误", ErrorCode.DEV_ID_RES_KEY_IS_NULL.getCode(), errorMessage);
}
payContent.put(WxPayConstant.RES_KEY, devInfo.getResKey());

boolean signVerified = WxPayment.verifyNotifyHMAC(params, devInfo.getReqKey());
if (!signVerified) {
String errorMessage = "签名错误";
String errorMessage = ErrorCode.DEV_ID_SIGN_ERR.getMessage();
logger.error(errorMessage + ": " + params.toString());
return buildReturnMap(WxPayConstant.RET_FAIL, errorMessage, WxPayConstant.RET_FAIL, ErrorCode.DEV_ID_RES_KEY_IS_NULL.getCode(), errorMessage);
return buildReturnMap(WxPayConstant.RET_FAIL, errorMessage, ErrorCode.DEV_ID_SIGN_ERR.getCode(), errorMessage + ": " + params.toString());
}
return null;
}


+ 2
- 1
mallinkPosApi/src/main/java/com/iformall/service/PosService.java View File

@@ -1,5 +1,6 @@
package com.iformall.service;

import com.alibaba.fastjson.JSONObject;
import com.iformall.enums.EnumPosActionType;
import com.iformall.exception.MallinkException;

@@ -39,7 +40,7 @@ public interface PosService {
* @param params
* @return
*/
Map<String, String> calcMem(Map<String, String> params) throws MallinkException;
Map<String, String> queryAndCalcMem(Map<String, String> params) throws MallinkException;

/**
* 核销动作(check, pre_verify, verify)


+ 378
- 162
mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java View File

@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject;
import com.iformall.common.ErrorCode;
import com.iformall.common.IdWorker;
import com.iformall.domain.po.*;
import com.iformall.domain.vo.PromotionCalc;
import com.iformall.domain.vo.WxCouponOrderCVo;
import com.iformall.domain.vo.WxLevelMerchantCVo;
import com.iformall.enums.*;
@@ -23,10 +24,7 @@ import org.springframework.web.bind.annotation.RequestBody;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;

@Service
@AllArgsConstructor
@@ -119,10 +117,10 @@ public class PosServiceImpl implements PosService {
retMap.put(WxPayConstant.REG_QRCODE_URL, mall.getImgQrcodeWeapp());
retMap.put(WxPayConstant.POS_QRCODE_RULE, mall.getPosQrcodeRule());

retMap.put(WxPayConstant.MEM_DISCOUNT, String.valueOf(config.getDiscount().equals(EnumPosEnableType.Enable.getCode())));
retMap.put(WxPayConstant.MEM_COUPON, String.valueOf(config.getCoupon()));
retMap.put(WxPayConstant.MEM_COUPON_DES, EnumPosCouponEnableType.getEnum(config.getCoupon()).getMessage());
retMap.put(WxPayConstant.MEM_CARD, String.valueOf(config.getCard().equals(EnumPosEnableType.Enable.getCode())));
retMap.put(WxPayConstant.DISCOUNT, String.valueOf(config.getDiscount().equals(EnumPosEnableType.Enable.getCode())));
retMap.put(WxPayConstant.COUPON, String.valueOf(config.getCoupon()));
retMap.put(WxPayConstant.COUPON_DES, EnumPosCouponEnableType.getEnum(config.getCoupon()).getMessage());
retMap.put(WxPayConstant.CARD, String.valueOf(config.getCard().equals(EnumPosEnableType.Enable.getCode())));
return retMap;
} else {
logger.error(ErrorCode.PASSWORD_ERROR.getMessage());
@@ -163,10 +161,10 @@ public class PosServiceImpl implements PosService {
retMap.put(WxPayConstant.REG_QRCODE_URL, mall.getImgQrcodeWeapp());
retMap.put(WxPayConstant.POS_QRCODE_RULE, mall.getPosQrcodeRule());

retMap.put(WxPayConstant.MEM_DISCOUNT, String.valueOf(config.getDiscount().equals(EnumPosEnableType.Enable.getCode())));
retMap.put(WxPayConstant.MEM_COUPON, String.valueOf(config.getCoupon()));
retMap.put(WxPayConstant.MEM_COUPON_DES, EnumPosCouponEnableType.getEnum(config.getCoupon()).getMessage());
retMap.put(WxPayConstant.MEM_CARD, String.valueOf(config.getCard().equals(EnumPosEnableType.Enable.getCode())));
retMap.put(WxPayConstant.DISCOUNT, String.valueOf(config.getDiscount().equals(EnumPosEnableType.Enable.getCode())));
retMap.put(WxPayConstant.COUPON, String.valueOf(config.getCoupon()));
retMap.put(WxPayConstant.COUPON_DES, EnumPosCouponEnableType.getEnum(config.getCoupon()).getMessage());
retMap.put(WxPayConstant.CARD, String.valueOf(config.getCard().equals(EnumPosEnableType.Enable.getCode())));
return retMap;
}

@@ -211,7 +209,7 @@ public class PosServiceImpl implements PosService {
String memIdStr = params.get(WxPayConstant.MEM_ID); // 会员ID
String memPhoneStr = params.get(WxPayConstant.MEM_PHONE); // 会员手机
String posOrderIdStr = params.get(WxPayConstant.POS_ORDER_ID); // POS订单ID
String posAmountStr = params.get(WxPayConstant.POS_AMOUNT); // POS订单金额(单位:分)
String posAmountStr = params.get(WxPayConstant.ORDER_AMOUNT); // POS订单金额(单位:分)

if (StringUtils.isBlank(tenantId)) {
errParam(WxPayConstant.TENANT_ID);
@@ -230,7 +228,7 @@ public class PosServiceImpl implements PosService {
errParam(WxPayConstant.POS_ORDER_ID);
}
if (StringUtils.isBlank(posAmountStr)) {
errParam(WxPayConstant.POS_AMOUNT);
errParam(WxPayConstant.ORDER_AMOUNT);
}

// 1. 商户ID, B端用户ID
@@ -261,24 +259,13 @@ public class PosServiceImpl implements PosService {
logger.error(ErrorCode.USER_NOT_MEMBER.getMessage());
throw new MallinkException(ErrorCode.USER_NOT_MEMBER);
}
/*
// 5. 会员level及折扣
Integer discount = 100;
if (config.getDiscount().equals(EnumEnableType.Enable.getCode())) {
discount = getMemLevelDiscount(retMap, tenantId, user, merchantId);
} else {
retMap.put(WxPayConstant.MEM_DISCOUNT_RATE, discount.toString());
}

Double remainAmountD = posAmount * 1.0D * discount / 100;
Long remainAmount = Math.round(remainAmountD);
Long discountAmount = posAmount - remainAmount;
JSONObject discountObj = new JSONObject();
posAmount = getMemLevelDiscount(discountObj, config.getDiscount(), tenantId, user, merchantId, posAmount.intValue());

retMap.put(WxPayConstant.MEM_ID, user.getId().toString());
retMap.put(WxPayConstant.MEM_PHONE, user.getPhone());
retMap.put(WxPayConstant.ORG_AMOUNT, posAmountStr);
retMap.put(WxPayConstant.DISCOUNT_AMOUNT, String.valueOf(discountAmount));
retMap.put(WxPayConstant.REMAIN_AMOUNT, String.valueOf(remainAmount));

// 6. 优惠券列表
if (config.getCoupon().equals(EnumEnableType.Enable.getCode())) {
@@ -310,133 +297,334 @@ public class PosServiceImpl implements PosService {
} else {
retMap.put(WxPayConstant.AVAIL_CO_LIST, "[]");
}
*/
return retMap;
}



@Override
@Transactional(rollbackFor = Exception.class)
public Map<String, String> calcMem(Map<String, String> params) throws MallinkException {
Map<String, String> retMap = new HashMap<>();
public Map<String, String> queryAndCalcMem(Map<String, String> params) throws MallinkException {
Map<String, String> dataMap = new HashMap<>();

String tenantId = params.get(WxPayConstant.TENANT_ID); // 租户ID
String merchantIdStr = params.get(WxPayConstant.MERCHANT_ID); // 商户ID
String buUserIdStr = params.get(WxPayConstant.BUSER_ID); // POS操作员ID
String memIdStr = params.get(WxPayConstant.MEM_ID); // 会员ID
String memPhoneStr = params.get(WxPayConstant.MEM_PHONE); // 会员手机
String posAmountStr = params.get(WxPayConstant.POS_AMOUNT); // POS订单金额(单位:分)
String selCoListStr = params.get(WxPayConstant.SELECTED_COUPON_ORDER_LIST); // 选中的优惠券列表
String sceneTypeStr = params.get(WxPayConstant.SCENE_TYPE); // 交易场景
String orderCreateSN = params.get(WxPayConstant.ORDER_CREATE_SN); // POS SN号
String coListStr = params.get(WxPayConstant.COUPON_ORDER_LIST); // 优惠券列表

if (StringUtils.isBlank(tenantId)) {
errParam(WxPayConstant.TENANT_ID);
} else {
dataMap.put(WxPayConstant.TENANT_ID, tenantId);
}
if (StringUtils.isBlank(merchantIdStr)) {
errParam(WxPayConstant.MERCHANT_ID);
} else {
dataMap.put(WxPayConstant.MERCHANT_ID, merchantIdStr);
}
if (StringUtils.isBlank(buUserIdStr)) {
errParam(WxPayConstant.BUSER_ID);
} else {
dataMap.put(WxPayConstant.BUSER_ID, buUserIdStr);
}
if (StringUtils.isBlank(sceneTypeStr)) {
errParam(WxPayConstant.SCENE_TYPE);
} else {
dataMap.put(WxPayConstant.SCENE_TYPE, sceneTypeStr);
}
if (StringUtils.isBlank(orderCreateSN)) {
errParam(WxPayConstant.ORDER_CREATE_SN);
} else {
dataMap.put(WxPayConstant.ORDER_CREATE_SN, orderCreateSN);
}

Integer iSceneType;
try {
iSceneType = Integer.valueOf(sceneTypeStr);
} catch (NumberFormatException e) {
logger.error(e.getMessage());
throw new MallinkException(ErrorCode.SYS_PARAMETER_CAST_ERROR);
}

// 1. POS 支持 配置
PosMallConfig config = posMallConfigService.getByTenantId(tenantId);
if (config == null) {
logger.error(ErrorCode.POS_CONFIG_NOT_FOUND.getMessage());
throw new MallinkException(ErrorCode.POS_CONFIG_NOT_FOUND);
}

if (StringUtils.isBlank(merchantIdStr)) {
errParam(WxPayConstant.MERCHANT_ID);
}
if (StringUtils.isBlank(posAmountStr)) {
errParam(WxPayConstant.POS_AMOUNT);
}
if (StringUtils.isBlank(selCoListStr)) {
errParam(WxPayConstant.SELECTED_COUPON_ORDER_LIST);
}
if (StringUtils.isBlank(memIdStr) && StringUtils.isBlank(memPhoneStr)) {
errParam2(WxPayConstant.MEM_ID, WxPayConstant.MEM_PHONE);
}
// 1. 商户ID, B端用户ID
Long merchantId, buUserId, posOrderId;
Long posAmount = 0L;
// 2. 商户ID, B端用户ID
Long merchantId, buUserId;
try {
merchantId = Long.valueOf(merchantIdStr);
buUserId = Long.valueOf(buUserIdStr);
posAmount = Long.valueOf(posAmountStr);
} catch (NumberFormatException e) {
logger.error(e.getMessage());
throw new MallinkException(ErrorCode.SYS_PARAMETER_CAST_ERROR);
}

// 2. check merchant
// 3. check merchant
WxMerchant merchant = checkAndGetMerchant(merchantId);
// 3. check buUser
// 4. check buUser
WxMerchantBUser buUser = checkAndGetMerchantUser(buUserId, merchantId);

// 4. 获取会员信息
WxCUser user = getMemUser(tenantId, memIdStr, memPhoneStr);
if (user == null) {
logger.error(ErrorCode.USER_NOT_MEMBER.getMessage());
throw new MallinkException(ErrorCode.USER_NOT_MEMBER);
}

// 5. 获取折扣率
Integer discount = 100;
if (config.getDiscount().equals(EnumEnableType.Enable.getCode())) {
discount = getMemLevelDiscount(retMap, tenantId, user, merchantId);
} else {
retMap.put(WxPayConstant.MEM_DISCOUNT_RATE, discount.toString());
}
// 6. 计算折扣及剩余支付金额(四舍五入)
Double remainAmountD = posAmount * 1.0D * discount / 100;
Long remainAmount = Math.round(remainAmountD);
Long discountAmount = posAmount - remainAmount;

retMap.put(WxPayConstant.MEM_ID, user.getId().toString());
retMap.put(WxPayConstant.MEM_PHONE, user.getPhone());
retMap.put(WxPayConstant.ORG_AMOUNT, posAmountStr);
retMap.put(WxPayConstant.DISCOUNT_AMOUNT, String.valueOf(discountAmount));

// 7. 计算券抵扣及剩余支付金额(四舍五入)
JSONArray selCoArr = JSONObject.parseArray(selCoListStr);
if (selCoArr.size() <= 0) {
errParam(WxPayConstant.SELECTED_COUPON_ORDER_LIST);
}
JSONArray coRetArr = new JSONArray();
for(int i=0;i<selCoArr.size();i++) {
String couponOrderIdStr = selCoArr.getString(i);
EnumPosSceneType sceneType = EnumPosSceneType.getEnum(iSceneType);
JSONObject promotionData = new JSONObject();
JSONObject promotionInfo = new JSONObject();
JSONObject promotionPayment = new JSONObject();
PromotionCalc promotionCalc = new PromotionCalc();
if (sceneType.equals(EnumPosSceneType.VERIFY)) {
if (config.getCoupon().equals(EnumPosCouponEnableType.Disable.getCode())) {
logger.error(ErrorCode.POS_CONFIG_MEM_COUPON_DISABLE.getMessage());
throw new MallinkException(ErrorCode.POS_CONFIG_MEM_COUPON_DISABLE);
}
JSONObject promotionCoupon = new JSONObject();
JSONArray couponList = new JSONArray();
if (StringUtils.isBlank(coListStr)) {
errParam(WxPayConstant.COUPON_ORDER_LIST);
}
JSONArray couponOrderArr = JSON.parseArray(coListStr);
if (couponOrderArr.size() > 1) {
String errMessage = "核销只能使用一张券";
logger.error(errMessage);
throw new MallinkException(ErrorCode.VERIFY_ERROR.getCode(), errMessage);
}
String couponOrderIdStr = couponOrderArr.getString(0);
if (couponOrderIdStr != null) {
try {
Map<String, String> oneRetMap = calcOneCouponVerify(merchantId, posAmount, couponOrderIdStr);
coRetArr.add(oneRetMap);
posAmount = Long.valueOf(oneRetMap.get(WxPayConstant.REMAIN_AMOUNT));
if (posAmount.equals(0L)) {
break;
}
JSONObject couponPromoMap = calcOneCouponVerify(promotionCalc, couponOrderIdStr, merchantId);
couponList.add(couponPromoMap);
} catch (MallinkException e) {
throw new MallinkException(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
throw new MallinkException(500, e.getMessage());
}
}
promotionCoupon.put(WxPayConstant.COUPON_ORDER_LIST, couponList);
// 券优惠总信息
promotionCoupon.put(WxPayConstant.COUPON_PROMOTION_AMOUNT, promotionCalc.getPromotionAmount());
promotionInfo.put(WxPayConstant.COUPON, promotionCoupon);
} else if(sceneType.equals(EnumPosSceneType.PAY)) {
JSONObject promotionCoupon = new JSONObject();
JSONArray couponList = new JSONArray();

String memIdStr = params.get(WxPayConstant.MEM_ID); // 会员ID
String memPhoneStr = params.get(WxPayConstant.MEM_PHONE); // 会员手机
String orderAmountStr = params.get(WxPayConstant.ORDER_AMOUNT); // POS订单金额(单位:分)
String orderAmountLeftStr = params.get(WxPayConstant.ORDER_AMOUNT_LEFT); // POS订单金额(单位:分)
if (StringUtils.isBlank(orderAmountStr)) {
errParam(WxPayConstant.ORDER_AMOUNT);
} else {
dataMap.put(WxPayConstant.ORDER_AMOUNT, orderAmountStr);
}
if (StringUtils.isBlank(orderAmountLeftStr)) {
errParam(WxPayConstant.ORDER_AMOUNT_LEFT);
} else {
dataMap.put(WxPayConstant.ORDER_AMOUNT_LEFT, orderAmountLeftStr);
}
if (StringUtils.isBlank(memIdStr) && StringUtils.isBlank(memPhoneStr)) {
errParam2(WxPayConstant.MEM_ID, WxPayConstant.MEM_PHONE);
}
// 10. 获取会员信息
WxCUser user = getMemUser(tenantId, memIdStr, memPhoneStr);
if (user == null) {
logger.error(ErrorCode.USER_NOT_MEMBER.getMessage());
throw new MallinkException(ErrorCode.USER_NOT_MEMBER);
}
if (user != null) {
dataMap.put(WxPayConstant.MEM_ID, user.getId().toString());
dataMap.put(WxPayConstant.MEM_PHONE, user.getPhone());
}
// 11. 订单金额
Integer orderAmount, orderAmountLeft;
try {
orderAmount = Integer.valueOf(orderAmountStr);
orderAmountLeft = Integer.valueOf(orderAmountLeftStr);
} catch (NumberFormatException e) {
logger.error(e.getMessage());
throw new MallinkException(ErrorCode.SYS_PARAMETER_CAST_ERROR);
}
promotionCalc.setOrderAmount(orderAmount);
promotionCalc.setOrderAmountLeft(orderAmountLeft);
promotionCalc.setPromotionAmount(0);
promotionCalc.setAmountLeftAfterPay(orderAmountLeft);
// 12. 会员折扣
JSONObject discountObj = getMemLevelDiscount(promotionCalc, config.getDiscount(), tenantId, user, merchantId);
promotionInfo.put(WxPayConstant.MEMBER_DISCOUNT, discountObj);
// 14. 获取用户可用券列表
if (!config.getCoupon().equals(EnumPosCouponEnableType.Disable.getCode())) {
Map<String, Object> coQ = new HashMap<>();
coQ.put("tenantId", tenantId);
coQ.put("cUserId", user.getId());
coQ.put("merchantId", merchantId);
List<WxCouponOrderCVo> avaCoList = couponOrderMapper.findAvailCouponOrder(coQ);
JSONArray selCoArr = JSONObject.parseArray(coListStr);
if (config.getCoupon().equals(EnumPosCouponEnableType.SingleEnable.getCode())) {
if (selCoArr.size() > 1) {
String errMessage = "支付只能使用一张券";
logger.error(errMessage);
throw new MallinkException(ErrorCode.POS_COUPON_PAY_ERROR.getCode(), errMessage);
}
for (int i = 0; i < avaCoList.size(); i++) {
WxCouponOrderCVo couponOrderCVo = avaCoList.get(i);
boolean selCoupon = isSelCoupon(selCoArr, couponOrderCVo.getId());
try {
JSONObject couponObj = calcOneCouponPay(promotionCalc, couponOrderCVo, selCoupon);
couponList.add(couponObj);
} catch (MallinkException e) {
throw new MallinkException(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
throw new MallinkException(500, e.getMessage());
}
}
} else if (config.getCoupon().equals(EnumPosCouponEnableType.MultiEnable.getCode())) {
for (int i = 0; i < avaCoList.size(); i++) {
WxCouponOrderCVo couponOrderCVo = avaCoList.get(i);
boolean selCoupon = isSelCoupon(selCoArr, couponOrderCVo.getId());
try {
JSONObject couponObj = calcOneCouponPay(promotionCalc, couponOrderCVo, selCoupon);
couponList.add(couponObj);
} catch (MallinkException e) {
throw new MallinkException(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
throw new MallinkException(500, e.getMessage());
}
}
}
}
promotionCoupon.put(WxPayConstant.COUPON_ORDER_LIST, couponList);
// 券优惠总信息
promotionCoupon.put(WxPayConstant.COUPON_PROMOTION_AMOUNT, promotionCalc.getPromotionAmount());
promotionInfo.put(WxPayConstant.COUPON, promotionCoupon);
}
// 构造支付信息
promotionPayment.put(WxPayConstant.ORDER_AMOUNT, promotionCalc.getOrderAmount());
promotionPayment.put(WxPayConstant.ORDER_AMOUNT_LEFT, promotionCalc.getOrderAmountLeft());
promotionPayment.put(WxPayConstant.PROMOTION_AMOUNT, promotionCalc.getPromotionAmount());
promotionPayment.put(WxPayConstant.AMOUNT_LEFT_AFTER_PAY, promotionCalc.getAmountLeftAfterPay());
promotionData.put(WxPayConstant.PAYMENT_PREDICTION, promotionPayment);
promotionData.put(WxPayConstant.PROMOTION_INFO, promotionInfo);
dataMap.put(WxPayConstant.PROMOTION_DATA, JSON.toJSONString(promotionData));
return dataMap;
}

private boolean isSelCoupon(JSONArray selCoArr, Long couponOrderId) {
boolean selCoupon = false;
for (int j=0;j<selCoArr.size();j++) {
String selCouponOrderStr = selCoArr.getString(j);
if (couponOrderId.toString().equals(selCouponOrderStr)) {
selCoupon = true;
break;
}
}
retMap.put(WxPayConstant.MEM_COUPONS, coRetArr.toJSONString());
retMap.put(WxPayConstant.REMAIN_AMOUNT, String.valueOf(posAmount));
return retMap;
return selCoupon;
}

private Map<String, String> calcOneCouponVerify(Long merchantId, Long posAmount, String couponOrderIdStr) {
Map<String, String> retMap = new HashMap<>();
/**
* 券核销计算
* @param promotionCalc
* @param merchantId
* @param couponOrderIdStr
* @return
*/
private JSONObject calcOneCouponVerify(PromotionCalc promotionCalc, String couponOrderIdStr, Long merchantId) {
JSONObject retObj = new JSONObject();
Date now = new Date();
// 1. 获取券包信息
WxCouponOrderCVo couponOrderCVo = couponOrderService.detailCUserVo(couponOrderIdStr);
if (couponOrderCVo == null) {
logger.error(ErrorCode.COUPON_ORDER_IS_NULL.getMessage() + ": " + couponOrderIdStr);
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_NULL);
WxCouponOrderCVo couponOrderCVo = checkAndGetCouponOrder(couponOrderIdStr, merchantId, now);

// 2. 检查券类型 核销可用(4, 6, 8, 9)
EnumCouponType couponType = EnumCouponType.getEnum(couponOrderCVo.getCouponType());
if (!(couponType.getCode().equals(EnumCouponType.COUPON_MULTIMCH.getCode()) ||
couponType.getCode().equals(EnumCouponType.COUPON_LIPIN.getCode()) ||
couponType.getCode().equals(EnumCouponType.COUPON_PRESS.getCode()) ||
couponType.getCode().equals(EnumCouponType.COUPON_GROUP.getCode()))
) {
logger.error(ErrorCode.VERIFY_COUPON_TYPE_NOT_SUPPORT.getMessage());
throw new MallinkException(ErrorCode.VERIFY_COUPON_TYPE_NOT_SUPPORT);
}
// 2. 检查券类型
if (!(couponOrderCVo.getCouponType().equals(EnumCouponType.COUPON_MULTIMCH.getCode()) ||
couponOrderCVo.getCouponType().equals(EnumCouponType.COUPON_MANJIAN.getCode()) ||
couponOrderCVo.getCouponType().equals(EnumCouponType.COUPON_DAIJIN.getCode())
)) {
retObj.put(WxPayConstant.COUPON_ID, couponOrderIdStr);
retObj.put(WxPayConstant.IS_SELECTED, EnumPosSelect.SELECTED.getCode());
retObj.put(WxPayConstant.TITLE, couponOrderCVo.getTitle());
retObj.put(WxPayConstant.COUPON_TYPE, couponType.getMessage());
retObj.put(WxPayConstant.COVER_IMG, couponOrderCVo.getCoverImg());
retObj.put(WxPayConstant.PRICE, couponOrderCVo.getPrice());
retObj.put(WxPayConstant.SALE_PRICE, couponOrderCVo.getSalePrice());
retObj.put(WxPayConstant.COUPON_DES, String.format("过期时间: %s", mydateFormat.format(couponOrderCVo.getExpiredTime())));
promotionCalc.setOrderAmount(couponOrderCVo.getPrice());
promotionCalc.setOrderAmountLeft(couponOrderCVo.getPrice());
promotionCalc.setPromotionAmount(couponOrderCVo.getPrice());
promotionCalc.setAmountLeftAfterPay(0);
return retObj;
}

/**
* 券支付计算
* @param promotionCalc
* @return
*/
private JSONObject calcOneCouponPay(PromotionCalc promotionCalc, WxCouponOrderCVo couponOrderCVo, boolean couponSelected) {
JSONObject retObj = new JSONObject();
Date now = new Date();

// 2. 检查券类型 支付可用(1, 2, 6),
EnumCouponType couponType = EnumCouponType.getEnum(couponOrderCVo.getCouponType());
if (!(couponType.getCode().equals(EnumCouponType.COUPON_MULTIMCH.getCode()) ||
couponType.getCode().equals(EnumCouponType.COUPON_MANJIAN.getCode()) ||
couponType.getCode().equals(EnumCouponType.COUPON_DAIJIN.getCode()))) {
logger.error(ErrorCode.VERIFY_COUPON_TYPE_NOT_SUPPORT.getMessage());
throw new MallinkException(ErrorCode.VERIFY_COUPON_TYPE_NOT_SUPPORT);
}

// 3. 券包状态检查
// 3. 满减券检查使用金额
if (couponType.equals(EnumCouponType.COUPON_MANJIAN)) {
if (promotionCalc.getOrderAmount() < couponOrderCVo.getUsePrice()) {
logger.error(ErrorCode.VERIFY_MANJIAN_USER_PRICE_NOT_TOUCH.getMessage());
throw new MallinkException(ErrorCode.VERIFY_MANJIAN_USER_PRICE_NOT_TOUCH);
}
}

// 4. 生成优惠券抵扣信息
retObj.put(WxPayConstant.COUPON_ID, couponOrderCVo.getId().toString());
retObj.put(WxPayConstant.TITLE, couponOrderCVo.getTitle());
retObj.put(WxPayConstant.COUPON_TYPE, couponType.getMessage());
retObj.put(WxPayConstant.COVER_IMG, couponOrderCVo.getCoverImg());
retObj.put(WxPayConstant.PRICE, couponOrderCVo.getPrice());
retObj.put(WxPayConstant.SALE_PRICE, couponOrderCVo.getSalePrice());
if (couponType.equals(EnumCouponType.COUPON_MANJIAN)) {
retObj.put(WxPayConstant.USE_PRICE, couponOrderCVo.getSalePrice());
String des = String.format("%s-满%s元可用,可抵%s元, 过期时间: %s",
couponType.getMessage(), couponOrderCVo.getUsePriceStr(), couponOrderCVo.getPriceStr(),
mydateFormat.format(couponOrderCVo.getExpiredTime()));
retObj.put(WxPayConstant.COUPON_DES, des);
} else {
String des = String.format("%s-可抵%s元, 过期时间: %s",
couponType.getMessage(), couponOrderCVo.getPriceStr(),
mydateFormat.format(couponOrderCVo.getExpiredTime()));
retObj.put(WxPayConstant.COUPON_DES, des);
}
if (couponSelected) {
retObj.put(WxPayConstant.IS_SELECTED, String.valueOf(EnumPosSelect.SELECTED.getCode()));
Integer remainAmount = promotionCalc.getAmountLeftAfterPay() - couponOrderCVo.getPrice();
if (remainAmount < 0) {
remainAmount = 0;
}
Integer discountAmount = promotionCalc.getAmountLeftAfterPay() - remainAmount;
promotionCalc.setPromotionAmount(discountAmount);
promotionCalc.setAmountLeftAfterPay(remainAmount);
}
return retObj;
}

private WxCouponOrderCVo checkAndGetCouponOrder(String couponOrderIdStr, Long merchantId, Date currDate) {
// 1, 获取券包信息
WxCouponOrderCVo couponOrderCVo = couponOrderService.detailCUserVo(couponOrderIdStr);
if (couponOrderCVo == null) {
logger.error(ErrorCode.COUPON_ORDER_IS_NULL.getMessage() + ": " + couponOrderIdStr);
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_NULL);
}
// 2. 券包状态检查
if (couponOrderCVo.getCouponOrderStatus() == EnumCouponOrderStatus.COUPON_ORDER_OVER_TIME.getCode()) {
logger.error("已过期: couponOrder-" + couponOrderIdStr);
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_OVER_TIME);
@@ -449,28 +637,26 @@ public class PosServiceImpl implements PosService {
logger.error("已经核销过的券: couponOrder-" + couponOrderIdStr);
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_USED);
}

Date now = new Date();
// 4. 检查有效期
// 3. 检查有效期
if (couponOrderCVo.getValidStartDate() != null && couponOrderCVo.getValidEndDate() != null) {
if (couponOrderCVo.getValidStartDate().getTime() > now.getTime()) {
if (couponOrderCVo.getValidStartDate().getTime() > currDate.getTime()) {
logger.error("此券有效期未开始:" + couponOrderIdStr);
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_EARLIER_THAN_VALIDDATE);
}
if (couponOrderCVo.getValidEndDate().getTime() < now.getTime()) {
if (couponOrderCVo.getValidEndDate().getTime() < currDate.getTime()) {
logger.error("此券有效期已结束:" + couponOrderIdStr);
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_EARLIER_THAN_VALIDDATE);
}
}
// 5 券已过期
if (couponOrderCVo.getExpiredTime().before(now)) {
// 4 券已过期
if (couponOrderCVo.getExpiredTime().before(currDate)) {
logger.error("此券已过期:" + couponOrderIdStr);
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_EARLIER_THAN_VALIDDATE);
}

Long couponOrderId = couponOrderCVo.getId();

// 6. 检查适用门店
// 5. 检查适用门店
WxCouponMerchant wxCouponMerchant = new WxCouponMerchant();
wxCouponMerchant.setProductId(couponOrderCVo.getCouponId());
wxCouponMerchant.setStatus(EnumCouponMerchantStatus.COUPON_MERCHANT_STATUS_VALID.getCode());
@@ -479,17 +665,7 @@ public class PosServiceImpl implements PosService {
logger.error("券: coupon-" + couponOrderCVo.getCouponId() + "核销: couponMerchantId-" + merchantId + " 门店不适用");
throw new MallinkException(ErrorCode.VERIFY_COUPON_ORDER_MERCHANT_IS_NULL);
}

Long remainAmount = posAmount - couponOrderCVo.getPrice();
if (remainAmount < 0L) {
remainAmount = 0L;
}
Long discountAmount = posAmount - remainAmount;
retMap.put(WxPayConstant.ID, couponOrderIdStr);
retMap.put(WxPayConstant.PRICE, String.valueOf(couponOrderCVo.getPrice()));
retMap.put(WxPayConstant.DEDUCT_AMOUNT, String.valueOf(discountAmount));
retMap.put(WxPayConstant.REMAIN_AMOUNT, String.valueOf(remainAmount));
return retMap;
return couponOrderCVo;
}

private WxCUser getMemUser(String tenantId, String memIdStr, String memPhoneStr) {
@@ -514,35 +690,64 @@ public class PosServiceImpl implements PosService {
return user;
}

private Integer getMemLevelDiscount(Map<String, String> retMap, String tenantId, WxCUser user, Long merchantId) {
/**
* 会员折扣
* @param promotionCalc
* @param discountConfig
* @param tenantId
* @param user
* @param merchantId
* @return
*/
private JSONObject getMemLevelDiscount(PromotionCalc promotionCalc, Integer discountConfig, String tenantId, WxCUser user, Long merchantId) {
JSONObject discountObj = new JSONObject();
Integer discount = 100;
String level = WxLevelConfigService.DEFAULT_LEVEL;
// Level, 折扣
List<WxLevelConfig> levelList = levelConfigService.getByTenantId(tenantId);
Long levelId = 0L;
for (WxLevelConfig levelConfig : levelList) {
if (user.getScore() >= levelConfig.getPoints()) {
if (levelConfig.getDiscountEnable().equals(EnumLevelConfigDiscountStatus.ENABLE.getCode()))
levelId = levelConfig.getId();
level = levelConfig.getLevel();
if (discountConfig.equals(EnumEnableType.Enable.getCode())) {
String level = WxLevelConfigService.DEFAULT_LEVEL;
// 1. 会员级别Level
List<WxLevelConfig> levelList = levelConfigService.getByTenantId(tenantId);
Long levelId = 0L;
for (WxLevelConfig levelConfig : levelList) {
if (user.getScore() >= levelConfig.getPoints()) {
if (levelConfig.getDiscountEnable().equals(EnumLevelConfigDiscountStatus.ENABLE.getCode()))
levelId = levelConfig.getId();
level = levelConfig.getLevel();
}
}
}

WxLevelMerchant levelMerchant = new WxLevelMerchant();
levelMerchant.setTenantId(tenantId);
levelMerchant.setLevelId(levelId);
levelMerchant.setMerchantId(merchantId);
List<WxLevelMerchantCVo> levelMerchantList = levelConfigService.findListCVo(levelMerchant);
if (levelMerchantList.size() >= 1) {
WxLevelMerchantCVo levelMerchantCVo = levelMerchantList.get(0);
if (levelMerchantCVo != null) {
discount = levelMerchantCVo.getDiscount();
// 2. 会员级别对应折扣discount
WxLevelMerchant levelMerchant = new WxLevelMerchant();
levelMerchant.setTenantId(tenantId);
levelMerchant.setLevelId(levelId);
levelMerchant.setMerchantId(merchantId);
List<WxLevelMerchantCVo> levelMerchantList = levelConfigService.findListCVo(levelMerchant);
if (levelMerchantList.size() >= 1) {
WxLevelMerchantCVo levelMerchantCVo = levelMerchantList.get(0);
if (levelMerchantCVo != null) {
discount = levelMerchantCVo.getDiscount();
}
}
}

retMap.put(WxPayConstant.MEM_LEVEL, level);
retMap.put(WxPayConstant.MEM_DISCOUNT_RATE, discount.toString());
return discount;
discountObj.put(WxPayConstant.LEVEL, level);
discountObj.put(WxPayConstant.DISCOUNT_DES, level);
discountObj.put(WxPayConstant.DISCOUNT, discount);
} else {
discountObj.put(WxPayConstant.DISCOUNT, discount);
discountObj.put(WxPayConstant.DISCOUNT_DES, "不支持会员折扣");
}

// 13. 计算折扣及剩余支付金额(四舍五入)
Double remainAmountD = promotionCalc.getAmountLeftAfterPay() * 1.0D * discount / 100;
Integer remainAmount = Long.valueOf(Math.round(remainAmountD)).intValue();
Integer discountAmount = promotionCalc.getAmountLeftAfterPay() - remainAmount;

discountObj.put(WxPayConstant.ORDER_AMOUNT, promotionCalc.getOrderAmount());
discountObj.put(WxPayConstant.ORDER_AMOUNT_LEFT, promotionCalc.getOrderAmountLeft());
discountObj.put(WxPayConstant.DISCOUNT_AMOUNT, String.valueOf(discountAmount));
discountObj.put(WxPayConstant.REMAIN_AMOUNT, String.valueOf(remainAmount));
promotionCalc.setPromotionAmount(discountAmount);
promotionCalc.setAmountLeftAfterPay(remainAmount);
return discountObj;
}

@Override
@@ -556,7 +761,7 @@ public class PosServiceImpl implements PosService {
String sceneTypeStr = params.get(WxPayConstant.SCENE_TYPE); // 场景类型
String couponOrderIdStr = params.get(WxPayConstant.COUPON_ORDER_ID); // 券ID
String posOrderIdStr = params.get(WxPayConstant.POS_ORDER_ID); // POS订单ID
String posAmountStr = params.get(WxPayConstant.POS_AMOUNT); // POS订单总额(单位:分)
String posAmountStr = params.get(WxPayConstant.ORDER_AMOUNT); // POS订单总额(单位:分)

Integer sceneType = null;
if (StringUtils.isBlank(tenantId)) {
@@ -605,7 +810,7 @@ public class PosServiceImpl implements PosService {
if (actionType.equals(EnumPosActionType.PAY_VERIFY_PRE) ||
actionType.equals(EnumPosActionType.VERIFY_PAY)) {
if (StringUtils.isBlank(posAmountStr)) {
errParam(WxPayConstant.POS_AMOUNT);
errParam(WxPayConstant.ORDER_AMOUNT);
}
}

@@ -659,8 +864,8 @@ public class PosServiceImpl implements PosService {
String merchantIdStr = params.get(WxPayConstant.MERCHANT_ID); // 商户ID
String buUserIdStr = params.get(WxPayConstant.BUSER_ID); // POS操作员ID
String posOrderIdStr = params.get(WxPayConstant.POS_ORDER_ID); // POS订单ID
String posAmountStr = params.get(WxPayConstant.POS_AMOUNT); // POS订单总额(单位:分)
String selCoListStr = params.get(WxPayConstant.SELECTED_COUPON_ORDER_LIST); // 选中的优惠券列表
String posAmountStr = params.get(WxPayConstant.ORDER_AMOUNT); // POS订单总额(单位:分)
String selCoListStr = params.get(WxPayConstant.COUPON_ORDER_LIST); // 选中的优惠券列表
Integer sceneType = EnumPosSceneType.PAY.getCode(); // 此接口只有支付使用

if (StringUtils.isBlank(tenantId)) {
@@ -682,14 +887,14 @@ public class PosServiceImpl implements PosService {
errParam(WxPayConstant.BUSER_ID);
}
if (StringUtils.isBlank(selCoListStr)) {
errParam(WxPayConstant.SELECTED_COUPON_ORDER_LIST);
errParam(WxPayConstant.COUPON_ORDER_LIST);
}
if (actionType.equals(EnumPosActionType.PAY_VERIFY_PRE) || actionType.equals(EnumPosActionType.VERIFY_INDEPENT)) {
if (StringUtils.isBlank(posOrderIdStr)) {
errParam(WxPayConstant.POS_ORDER_ID);
}
if (StringUtils.isBlank(posAmountStr)) {
errParam(WxPayConstant.POS_AMOUNT);
errParam(WxPayConstant.ORDER_AMOUNT);
}
}

@@ -1416,7 +1621,7 @@ public class PosServiceImpl implements PosService {
String merchantIdStr = params.get(WxPayConstant.MERCHANT_ID); // 商户ID
String buUserIdStr = params.get(WxPayConstant.BUSER_ID); // POS操作员ID
String posOrderIdStr = params.get(WxPayConstant.POS_ORDER_ID); // POS订单ID
String posAmountStr = params.get(WxPayConstant.POS_AMOUNT); // POS订单总额(单位:分)
String posAmountStr = params.get(WxPayConstant.ORDER_AMOUNT); // POS订单总额(单位:分)
String cardIdStr = params.get(WxPayConstant.CARD_ID); // 消费卡ID

if (StringUtils.isBlank(tenantId)) {
@@ -1441,7 +1646,7 @@ public class PosServiceImpl implements PosService {
errParam(WxPayConstant.POS_ORDER_ID);
}
if (StringUtils.isBlank(posAmountStr)) {
errParam(WxPayConstant.POS_AMOUNT);
errParam(WxPayConstant.ORDER_AMOUNT);
}
if (StringUtils.isBlank(cardIdStr)) {
errParam(WxPayConstant.CARD_ID);
@@ -1539,7 +1744,7 @@ public class PosServiceImpl implements PosService {
String merchantIdStr = params.get(WxPayConstant.MERCHANT_ID); // 商户ID
String buUserIdStr = params.get(WxPayConstant.BUSER_ID); // POS操作员ID
String posOrderIdStr = params.get(WxPayConstant.POS_ORDER_ID); // POS订单ID
String posAmountStr = params.get(WxPayConstant.POS_AMOUNT); // POS订单总额(单位:分)
String posAmountStr = params.get(WxPayConstant.ORDER_AMOUNT); // POS订单总额(单位:分)
String cardIdStr = params.get(WxPayConstant.CARD_ID); // 消费卡ID
String cardSpendIdStr = params.get(WxPayConstant.CARD_SPEND_ID); // 消费卡花费ID

@@ -1565,7 +1770,7 @@ public class PosServiceImpl implements PosService {
errParam(WxPayConstant.POS_ORDER_ID);
}
if (StringUtils.isBlank(posAmountStr)) {
errParam(WxPayConstant.POS_AMOUNT);
errParam(WxPayConstant.ORDER_AMOUNT);
}
if (StringUtils.isBlank(cardIdStr)) {
errParam(WxPayConstant.CARD_ID);
@@ -1654,7 +1859,7 @@ public class PosServiceImpl implements PosService {
String merchantIdStr = params.get(WxPayConstant.MERCHANT_ID); // 商户ID
String buUserIdStr = params.get(WxPayConstant.BUSER_ID); // POS操作员ID
String posOrderIdStr = params.get(WxPayConstant.POS_ORDER_ID); // POS订单ID
String posAmountStr = params.get(WxPayConstant.POS_AMOUNT); // POS订单总额(单位:分)
String posAmountStr = params.get(WxPayConstant.ORDER_AMOUNT); // POS订单总额(单位:分)
String cardIdStr = params.get(WxPayConstant.CARD_ID); // 消费卡ID
String cardSpendIdStr = params.get(WxPayConstant.CARD_SPEND_ID); // 消费卡花费ID

@@ -1680,7 +1885,7 @@ public class PosServiceImpl implements PosService {
errParam(WxPayConstant.POS_ORDER_ID);
}
if (StringUtils.isBlank(posAmountStr)) {
errParam(WxPayConstant.POS_AMOUNT);
errParam(WxPayConstant.ORDER_AMOUNT);
}
if (StringUtils.isBlank(cardIdStr)) {
errParam(WxPayConstant.CARD_ID);
@@ -2160,6 +2365,17 @@ public class PosServiceImpl implements PosService {
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), errMessage);
}

/**
* 输入参数错误
* @param paramStr
* @throws MallinkException
*/
private void errParamCast(String paramStr, String valStr) throws MallinkException {
String errMessage = String.format("request params[%s] error: %s", paramStr, valStr);
logger.error(errMessage);
throw new MallinkException(ErrorCode.SYS_PARAMETER_CAST_ERROR.getCode(), errMessage);
}

/**
* POS订单添加
* @return


+ 63
- 19
mallinkPosApi/src/test/java/com/iformall/pos/test/PosAppTest.java View File

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.iformall.PosApplication;
import com.iformall.enums.EnumPosSceneType;
import com.iformall.pay.WxPayConstant;
import com.iformall.pay.WxPayment;
import org.apache.commons.lang3.StringUtils;
@@ -156,32 +157,75 @@ public class PosAppTest {
reqObj.put(WxPayConstant.MEM_PHONE, phone);
}
reqObj.put(WxPayConstant.POS_ORDER_ID, posOrderId);
reqObj.put(WxPayConstant.POS_AMOUNT, posAmount);
reqObj.put(WxPayConstant.ORDER_AMOUNT, posAmount);
boolean resSigned = sendAndRes("/checkMem", reqObj);
Assert.assertEquals(resSigned, true);
}

@Test
public void checkCalcTest() throws Exception {
public void checkVerifyCalcTest() throws Exception {
String selCoList = "[\"321872988134408192\"]";
String sceneType = String.valueOf(EnumPosSceneType.VERIFY.getCode());
Map<String, String> 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.SCENE_TYPE, sceneType);
reqObj.put(WxPayConstant.ORDER_CREATE_SN, posSN);
reqObj.put(WxPayConstant.COUPON_ORDER_LIST, selCoList);
boolean resSigned = sendAndRes("/queryAndCalc", reqObj);
Assert.assertEquals(resSigned, true);
}

@Test
public void checkPayCalcTest() throws Exception {
String memId = "321178010928119808";
String phone = "13910154397";
String posAmount = "20000";
String selCoList = "[\"321877927162249216\"]";
String orderAmount = "2000";
String orderAmountLeft = "2000";
String selCoList = "[]";
String sceneType = String.valueOf(EnumPosSceneType.PAY.getCode());
Map<String, String> 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);
reqObj.put(WxPayConstant.MEM_ID, memId);
reqObj.put(WxPayConstant.MEM_PHONE, phone);
reqObj.put(WxPayConstant.SCENE_TYPE, sceneType);
reqObj.put(WxPayConstant.ORDER_AMOUNT, orderAmount);
reqObj.put(WxPayConstant.ORDER_AMOUNT_LEFT, orderAmountLeft);
reqObj.put(WxPayConstant.ORDER_CREATE_SN, posSN);
reqObj.put(WxPayConstant.COUPON_ORDER_LIST, selCoList);
boolean resSigned = sendAndRes("/queryAndCalc", reqObj);
Assert.assertEquals(resSigned, true);
}

@Test
public void checkPayCalc1Test() throws Exception {
String memId = "321178010928119808";
String phone = "13910154397";
String orderAmount = "20000";
String orderAmountLeft = "20000";
String selCoList = "[\"321878185355214848\"]";
String sceneType = String.valueOf(EnumPosSceneType.PAY.getCode());
Map<String, String> 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.MEM_ID, memId);
reqObj.put(WxPayConstant.MEM_PHONE, phone);
reqObj.put(WxPayConstant.SCENE_TYPE, sceneType);
reqObj.put(WxPayConstant.ORDER_AMOUNT, orderAmount);
reqObj.put(WxPayConstant.ORDER_AMOUNT_LEFT, orderAmountLeft);
reqObj.put(WxPayConstant.ORDER_CREATE_SN, posSN);
reqObj.put(WxPayConstant.COUPON_ORDER_LIST, selCoList);
boolean resSigned = sendAndRes("/queryAndCalc", reqObj);
Assert.assertEquals(resSigned, true);
}

@@ -327,7 +371,7 @@ public class PosAppTest {
reqObj.put(WxPayConstant.COUPON_ORDER_ID, couponOrderId);
reqObj.put(WxPayConstant.SCENE_TYPE, sceneType);
reqObj.put(WxPayConstant.POS_ORDER_ID, posOrderId);
reqObj.put(WxPayConstant.POS_AMOUNT, posAmount);
reqObj.put(WxPayConstant.ORDER_AMOUNT, posAmount);
boolean resSigned = sendAndRes("/checkCouponOrder", reqObj);
Assert.assertEquals(resSigned, true);
}
@@ -367,7 +411,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.POS_AMOUNT, posAmount);
reqObj.put(WxPayConstant.ORDER_AMOUNT, posAmount);
boolean resSigned = sendAndRes("/couponOrderPreVerify", reqObj);
Assert.assertEquals(resSigned, true);
}
@@ -395,7 +439,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.POS_AMOUNT, posAmount);
reqObj.put(WxPayConstant.ORDER_AMOUNT, posAmount);
boolean resSigned = sendAndRes("/couponOrderPayVerifyOne", reqObj);
Assert.assertEquals(resSigned, true);
}
@@ -407,9 +451,9 @@ public class PosAppTest {
reqObj.put(WxPayConstant.TENANT_ID, tenantId);
reqObj.put(WxPayConstant.MERCHANT_ID, merchantId);
reqObj.put(WxPayConstant.BUSER_ID, buUserId);
reqObj.put(WxPayConstant.SELECTED_COUPON_ORDER_LIST, couponOrderIdList);
reqObj.put(WxPayConstant.COUPON_ORDER_LIST, couponOrderIdList);
reqObj.put(WxPayConstant.POS_ORDER_ID, posOrderId);
reqObj.put(WxPayConstant.POS_AMOUNT, posAmount);
reqObj.put(WxPayConstant.ORDER_AMOUNT, posAmount);
boolean resSigned = sendAndRes("/couponOrderPayVerifyList", reqObj);
Assert.assertEquals(resSigned, true);
}
@@ -422,7 +466,7 @@ public class PosAppTest {
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.ORDER_AMOUNT, posAmount);
reqObj.put(WxPayConstant.CARD_ID, cardId);
boolean resSigned = sendAndRes("/cardPayPre", reqObj);
Assert.assertEquals(resSigned, true);


+ 2
- 1
mallinkService/src/main/java/com/iformall/common/ErrorCode.java View File

@@ -244,7 +244,8 @@ public enum ErrorCode{
POS_CONFIG_MEM_COUPON_DISABLE(11102, "POS会员优惠券未启用"),
POS_COUPON_ORDER_NOT_VERIFY(11103, "此券未核销"),
POS_COUPON_ORDER_VERIFY_NOT_CANCEL(11104, "此券核销无法取消"),
POS_CAR_PAY_NOT_CANCEL(11105, "卡支付无法取消"),
POS_COUPON_PAY_ERROR(11105, "POS券包支付异常"),
POS_CAR_PAY_NOT_CANCEL(11106, "卡支付无法取消"),

POS_CMD_FAIL(11200, "POS命令错误"),



+ 17
- 0
mallinkService/src/main/java/com/iformall/domain/vo/PromotionCalc.java View File

@@ -0,0 +1,17 @@
package com.iformall.domain.vo;

import com.iformall.domain.po.BaseEntity;
import lombok.Data;

@Data
public class PromotionCalc extends BaseEntity {
@io.swagger.annotations.ApiModelProperty(value="订单总金额",name="orderAmount")
Integer orderAmount;
@io.swagger.annotations.ApiModelProperty(value="订单剩余金额",name="orderAmountLeft")
Integer orderAmountLeft;
@io.swagger.annotations.ApiModelProperty(value="优惠金额",name="promotionAmount")
Integer promotionAmount;
@io.swagger.annotations.ApiModelProperty(value="优惠后剩余金额",name="amountLeftAfterPay")
Integer amountLeftAfterPay;

}

+ 31
- 0
mallinkService/src/main/java/com/iformall/domain/vo/WxCouponOrderCVo.java View File

@@ -8,6 +8,7 @@ import lombok.ToString;

import javax.persistence.Id;
import javax.persistence.Transient;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

@@ -82,4 +83,34 @@ public class WxCouponOrderCVo extends WxCouponOrder {

@io.swagger.annotations.ApiModelProperty(value="商户列表",name="merchantVoList")
private List<WxMerchantVo> merchantVoList;

@Transient
private String salePriceStr;

@Transient
private String usePriceStr;

@Transient
private String priceStr;

public String getSalePriceStr() {
if(salePrice!=null) {
salePriceStr = new BigDecimal(salePrice).divide(new BigDecimal(100)).toString();
}
return salePriceStr;
}

public String getUsePriceStr() {
if(usePrice!=null) {
usePriceStr = new BigDecimal(usePrice).divide(new BigDecimal(100)).toString();
}
return usePriceStr;
}

public String getPriceStr() {
if(price!=null) {
priceStr = new BigDecimal(price).divide(new BigDecimal(100)).toString();
}
return priceStr;
}
}

+ 2
- 2
mallinkService/src/main/java/com/iformall/enums/EnumPosSceneType.java View File

@@ -7,8 +7,8 @@ package com.iformall.enums;

public enum EnumPosSceneType {

PAY(1,"支付"),
VERIFY(2,"核销")
VERIFY(0,"核销"),
PAY(1,"支付")
;

public static EnumPosSceneType getEnum(Integer code) {


+ 38
- 0
mallinkService/src/main/java/com/iformall/enums/EnumPosSelect.java View File

@@ -0,0 +1,38 @@
package com.iformall.enums;

/**
* Created by Stormeye on 2018/08/09.
*/
public enum EnumPosSelect {

// 0:不使用 1:使用

NOT_SEL(0, "不使用"),
SELECTED(1, "使用")
;

public static EnumPosSelect getEnum(Integer code) {
for (EnumPosSelect value : values()) {
if (value.getCode().equals(code)) {
return value;
}
}
return null;
}

private Integer code;
private String message;

EnumPosSelect(Integer code, String message) {
this.code = code;
this.message = message;
}

public Integer getCode() {
return code;
}

public String getMessage() {
return message;
}
}

+ 1
- 1
mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java View File

@@ -74,5 +74,5 @@ public interface WxCouponOrderMapper extends CommonMapper<WxCouponOrder, Long> {


/// POS接口
List<Map> findAvailCouponOrder(Map<String,Object> params);
List<WxCouponOrderCVo> findAvailCouponOrder(Map<String,Object> params);
}

+ 33
- 13
mallinkService/src/main/java/com/iformall/pay/WxPayConstant.java View File

@@ -6,13 +6,15 @@ public class WxPayConstant {

public final static String RET_SUCCESS = "SUCCESS";
public final static String RET_FAIL = "FAIL";
public final static String RESULT_SUCCESS = "0";

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 RESULT_MSG = "result_msg";
public final static String RESULT_DATA = "result_data";
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";
public final static String DEV_ID = "dev_id";
public final static String SIGN = "sign";
@@ -24,24 +26,31 @@ public class WxPayConstant {
public final static String MERCHANT_ID = "merchant_id";
public final static String MERCHANT_NAME = "merchant_name";
public final static String MERCHANT_IMG = "merchant_img";
public final static String BUSER_ID = "bu_user_id";
public final static String BUSER_ID = "order_operation_id";
public final static String COUPON_ORDER_ID = "coupon_order_id";
public final static String SELECTED_COUPON_ORDER_LIST = "sel_co_list";
public final static String COUPON_ORDER_LIST = "coupon_list";
public final static String POS_ORDER_ID = "pos_order_id";
public final static String POS_AMOUNT = "pos_amount";
public final static String ORDER_CREATE_SN = "order_create_sn";
public final static String ORDER_AMOUNT = "order_amount";
public final static String ORDER_AMOUNT_LEFT = "order_amount_left";
public final static String MEM_ID = "mem_id";
public final static String MEM_PHONE = "mem_phone";
public final static String MEM_PHONE = "mem_phone_number";
public final static String CARD_ID = "card_id";
public final static String CARD_SPEND_ID = "card_spend_id";
public final static String PHONE = "phone";
public final static String PASSWORD = "password";

public final static String PROMOTION_AMOUNT = "promotion_amount";
public final static String AMOUNT_LEFT_AFTER_PAY = "amount_left_after_pay";

public final static String TITLE = "title";
public final static String COVER_IMG = "cover_img";
public final static String EXPIRE_TIME = "expire_time";
public final static String VALID_START_DATE = "valid_start_date";
public final static String VALID_END_DATE = "valid_end_date";
public final static String PRICE = "price";
public final static String SALE_PRICE = "sale_price";
public final static String USE_PRICE = "use_price";
public final static String STATUS = "status";
public final static String STATUS_DES = "status_des";

@@ -62,15 +71,26 @@ public class WxPayConstant {
public final static String POS_QRCODE_RULE = "pos_qrcode_rule";


public final static String MEM_DISCOUNT = "discount";
public final static String MEM_DISCOUNT_RATE = "discount_rate";
public final static String MEM_COUPON = "coupon";
public final static String DISCOUNT = "discount";
public final static String DISCOUNT_DES = "discount_description";
public final static String DISCOUNT_RATE = "discount_rate";
public final static String COUPON = "coupon";
public final static String MEM_COUPONS = "coupons";
public final static String MEM_COUPON_DES = "coupon_des";
public final static String MEM_CARD = "card";
public final static String MEM_LEVEL = "level";
public final static String COUPON_DES = "coupon_description";
public final static String CARD = "card";
public final static String LEVEL = "level";
public final static String AVAIL_CO_LIST = "avail_co_list";
public final static String ID = "id";
public final static String COUPON_ID = "coupon_id";
public final static String COUPON_TYPE = "coupon_type";
public final static String IS_SELECTED = "is_selected";

public final static String COUPON_PROMOTION_AMOUNT = "coupon_promotion_amount";

public final static String MEMBER_DISCOUNT = "member_discount";
public final static String PROMOTION_INFO = "promotion_info";
public final static String PROMOTION_DATA = "promotion_data";
public final static String PAYMENT_PREDICTION = "payment_prediction";

public final static String DEDUCT_AMOUNT = "deduct_amount";
public final static String REMAIN_AMOUNT = "remain_amount";
@@ -80,7 +100,7 @@ public class WxPayConstant {
public final static String CREDIT = "credit";

public final static String REAL_AMOUNT = "real_amount";
public final static String SALE_PRICE = "sale_price";
public final static String SALE_FEE = "sale_fee";

public final static String ORG_AMOUNT = "org_amount";


+ 0
- 7
mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java View File

@@ -189,11 +189,4 @@ public interface WxCouponOrderService {
ResultData queryCardStatus(WxCouponOrder wxCouponOrder);

void exportData(WxCouponOrderBVo wxCouponOrder, HttpServletRequest request, HttpServletResponse response);


/**
* POS相关接口
*/
List<Map> findAvailCouponOrder(Map<String, Object> params);

}

+ 0
- 5
mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java View File

@@ -981,9 +981,4 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService {
wxCardTransferInfoMapper.insertSelective(wxCardTransferInfo);
}

@Override
public List<Map> findAvailCouponOrder(Map<String, Object> params) {
return wxCouponOrderMapper.findAvailCouponOrder(params);
}

}

+ 28
- 38
mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml View File

@@ -876,6 +876,34 @@
and co.id = #{id}
</select>

<select id="findAvailCouponOrder" parameterType="java.util.Map" resultMap="CVoResultMap">
select <include refid="allCUserCouponOrderListColumns" />
from wx_coupon_order co
left join wx_coupon_merchant cm on cm.product_id = co.coupon_id
left join wx_coupon c on c.id = co.coupon_id
left join wx_coupon_action_log cal on cal.coupon_order_id = co.id
where co.tenant_id = #{tenantId} and co.c_user_id = #{cUserId}
and co.coupon_order_status = 0
and cm.merchant_id = #{merchantId}
and co.expired_time > now()
and c.type in (1, 2, 6)
union
select <include refid="allCUserCouponOrderListColumns" />
from wx_coupon_order co
left join wx_coupon_merchant cm on cm.product_id = co.coupon_id
left join wx_coupon c on c.id = co.coupon_id
left join wx_coupon_action_log cal on cal.coupon_order_id = co.id
left join pos_coupon_order_verify pco on pco.coupon_order_id = co.id
where co.tenant_id = #{tenantId} and co.c_user_id = #{cUserId}
and co.coupon_order_status = 100
and cm.merchant_id = #{merchantId}
and co.expired_time > now()
<if test="posOrderId != null">
and pco.pos_order_id = #{posOrderId}
</if>
and c.type in (1, 2, 6)
</select>

<sql id="allCUserCouponOrderCarListColumns">
co.id,co.coupon_id,co.expired_time,co.coupon_order_status,co.create_date,co.update_date,co.coupon_price,co.verify_type,
c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.unit,
@@ -1049,42 +1077,4 @@
and co.id = #{id}
</select>

<select id="findAvailCouponOrder" parameterType="java.util.Map" resultType="hashmap">
select co.id, c.title, c.type, co.create_date, co.expired_time, c.price,
if((co.coupon_price > 0 or (c.subsidy_type>0 and c.subsidy_num >0)), 'NO', 'YES') as cancellable
from wx_coupon_order co
left join wx_coupon_merchant cm on cm.product_id = co.coupon_id
left join wx_coupon c on c.id = co.coupon_id
where co.tenant_id = #{tenantId} and co.c_user_id = #{cUserId}
and co.coupon_order_status = 0
and cm.merchant_id = #{merchantId}
and co.expired_time > now()
<if test="posPayVerify != null">
and c.type in (1, 2, 6)
</if>
<if test="posIndepVerify != null">
and c.type in (4, 6, 8, 9)
</if>
union
select co.id, c.title, c.type, co.create_date, co.expired_time, c.price,
if((co.coupon_price > 0 or (c.subsidy_type>0 and c.subsidy_num >0)), 'NO', 'YES') as cancellable
from wx_coupon_order co
left join wx_coupon_merchant cm on cm.product_id = co.coupon_id
left join wx_coupon c on c.id = co.coupon_id
left join pos_coupon_order_verify pco on pco.coupon_order_id = co.id
where co.tenant_id = #{tenantId} and co.c_user_id = #{cUserId}
and co.coupon_order_status = 100
and cm.merchant_id = #{merchantId}
and co.expired_time > now()
and pco.pos_order_id = #{posOrderId}
<if test="posPayVerify != null">
and c.type in (1, 2, 6)
</if>
<if test="posIndepVerify != null">
and c.type in (4, 6, 8, 9)
</if>
</select>



</mapper>

Loading…
Cancel
Save