分账功能

dev
胡锐 7 days ago
parent 604a476e74
commit 1d6ed5bce8
  1. 80
      bweb/src/main/java/com/bweb/controller/BsOrderSettleController.java
  2. 40
      bweb/src/main/java/com/bweb/controller/SecMenuController.java
  3. 21
      bweb/src/main/java/com/bweb/controller/TestController.java
  4. 4
      cweb/src/main/java/com/cweb/controller/TestController.java
  5. 3
      cweb/src/main/java/com/cweb/controller/order/OrderPayController.java
  6. 1
      schedule/src/main/java/com/hfkj/consumer/OrderProfitSharingConsumer.java
  7. 68
      schedule/src/main/java/com/hfkj/schedule/OrderSettleSchedule.java
  8. 19
      service/src/main/java/com/hfkj/dao/BsOrderSettleMapper.java
  9. 44
      service/src/main/java/com/hfkj/dao/BsOrderSettleMapperExt.java
  10. 14
      service/src/main/java/com/hfkj/dao/BsOrderSettleSqlProvider.java
  11. 18
      service/src/main/java/com/hfkj/entity/BsOrderSettle.java
  12. 70
      service/src/main/java/com/hfkj/entity/BsOrderSettleExample.java
  13. 32
      service/src/main/java/com/hfkj/pay/HuiPayService.java
  14. 6
      service/src/main/java/com/hfkj/service/order/BsOrderSettleService.java
  15. 18
      service/src/main/java/com/hfkj/service/order/impl/BsOrderRefundServiceImpl.java
  16. 63
      service/src/main/java/com/hfkj/service/order/impl/BsOrderSettleServiceImpl.java
  17. 12
      service/src/main/java/com/hfkj/sysenum/order/OrderSettleLedgerStatusEnum.java

@ -0,0 +1,80 @@
package com.bweb.controller;
import com.alibaba.fastjson.JSONObject;
import com.hfkj.common.exception.ErrorCode;
import com.hfkj.common.exception.ErrorHelp;
import com.hfkj.common.exception.SysCode;
import com.hfkj.common.security.UserCenter;
import com.hfkj.common.utils.ResponseMsgUtil;
import com.hfkj.entity.BsOrderSettle;
import com.hfkj.model.ResponseData;
import com.hfkj.service.order.BsOrderSettleLedgerService;
import com.hfkj.service.order.BsOrderSettleService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@Controller
@RequestMapping(value="/orderSettle")
@Api(value="订单退款业务")
public class BsOrderSettleController {
Logger log = LoggerFactory.getLogger(BsOrderSettleController.class);
@Resource
private BsOrderSettleService orderSettleService;
@Resource
private BsOrderSettleLedgerService orderSettleLedgerService;
@RequestMapping(value="/getDetailByOrderNo",method = RequestMethod.GET)
@ResponseBody
@ApiOperation(value = "查询交易详情")
public ResponseData getDetailByOrderNo(@RequestParam(name = "orderNo", required = true) String orderNo) {
try {
// 查询结算信息
BsOrderSettle orderSettle = orderSettleService.getData(orderNo);
if (orderSettle == null) {
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到数据");
}
Map<String,Object> map = new HashMap<>();
map.put("orderSettle", orderSettle);
map.put("orderSettleLedger", orderSettleLedgerService.getListBySettleId(orderSettle.getId()));
return ResponseMsgUtil.success(map);
} catch (Exception e) {
log.error("error!",e);
return ResponseMsgUtil.exception(e);
}
}
@RequestMapping(value="/revokeLedger",method = RequestMethod.POST)
@ResponseBody
@ApiOperation(value = "撤销分账")
public ResponseData revokeLedger(@RequestBody JSONObject body) {
try {
if (body == null || StringUtils.isBlank(body.getString("orderNo"))) {
throw ErrorHelp.genException(SysCode.System, ErrorCode.REQ_PARAMS_ERROR, "");
}
// 查询结算信息
BsOrderSettle orderSettle = orderSettleService.getData(body.getString("orderNo"));
if (orderSettle == null) {
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到数据");
}
orderSettleService.revokeLedger(orderSettle);
return ResponseMsgUtil.success("操作成功");
} catch (Exception e) {
log.error("error!",e);
return ResponseMsgUtil.exception(e);
}
}
}

@ -168,7 +168,7 @@ public class SecMenuController {
try {
// 查询角色菜单权限
Map<Long, SecMenu> roleMenu = secMenuService.queryRoleMenu(roleId, SecMenuTypeEnum.type1).stream()
Map<Long, SecMenu> roleMenu = secMenuService.queryRoleMenu(roleId,null).stream()
.collect(Collectors.toMap(SecMenu::getId, Function.identity()));
// 系统菜单叶节点
@ -187,9 +187,9 @@ public class SecMenuController {
.collect(Collectors.toList());
// 递归获取系统菜单叶子节点
for (SecMenu topLevelMenu : topLevelMenuList) {
if (topLevelMenu.getMenuType().equals(SecMenuTypeEnum.type1.getCode())) {
//if (topLevelMenu.getMenuType().equals(SecMenuTypeEnum.type1.getCode())) {
recursionMenu(menuList, topLevelMenu.getId(), menuLeafList);
}
//}
}
// 筛选角色菜单叶节点
@ -240,14 +240,16 @@ public class SecMenuController {
.collect(Collectors.toList());
for (SecMenu topLevelMenu : topLevelMenuList) {
map = new LinkedHashMap<>();
map.put("key", ""+topLevelMenu.getId());
if (topLevelMenu.getMenuType().equals(SecMenuTypeEnum.type1.getCode())) {
map = new LinkedHashMap<>();
map.put("key", ""+topLevelMenu.getId());
map.put("title", topLevelMenu.getMenuName());
// 获取下级菜单
map.put("children", recursionMenu(menuList, topLevelMenu.getId(), new ArrayList<>()));
mapList.add(map);
} else {
map.put("title", "【按钮】"+topLevelMenu.getMenuName());
}
// 获取下级菜单
map.put("children", recursionMenu(menuList, topLevelMenu.getId(), new ArrayList<>()));
mapList.add(map);
}
return ResponseMsgUtil.success(mapList);
@ -273,20 +275,22 @@ public class SecMenuController {
.sorted(Comparator.comparing(SecMenu::getMenuSort))
.collect(Collectors.toList());
for (SecMenu menu : collect) {
map = new LinkedHashMap<>();
map.put("key", ""+menu.getId());
if (menu.getMenuType().equals(SecMenuTypeEnum.type1.getCode())) {
map = new LinkedHashMap<>();
map.put("key", ""+menu.getId());
map.put("title", menu.getMenuName());
} else {
map.put("title", "【按钮】"+menu.getMenuName());
}
// 获取下级菜单
List<Map<String, Object>> recursioned = recursionMenu(dataSource, menu.getId(), leaf);
if (recursioned.isEmpty()) {
leaf.add(""+menu.getId());
map.put("isLeaf", true);
} else {
map.put("children", recursioned);
}
mapList.add(map);
List<Map<String, Object>> recursioned = recursionMenu(dataSource, menu.getId(), leaf);
if (recursioned.isEmpty()) {
leaf.add(""+menu.getId());
map.put("isLeaf", true);
} else {
map.put("children", recursioned);
}
mapList.add(map);
}
return mapList;
}

@ -23,12 +23,14 @@ import com.hfkj.device.sanmisen.PrinterTemplate;
import com.hfkj.entity.*;
import com.hfkj.model.GasClassGroupTaskDataCount;
import com.hfkj.model.ResponseData;
import com.hfkj.pay.HuiPayService;
import com.hfkj.service.BsDeviceService;
import com.hfkj.service.CommonService;
import com.hfkj.service.gas.BsGasClassGroupTaskService;
import com.hfkj.service.gas.BsGasOrderService;
import com.hfkj.service.gas.BsGasService;
import com.hfkj.service.merchant.BsMerchantService;
import com.hfkj.service.order.BsOrderSettleService;
import com.hfkj.service.sec.SecUserLoginLogService;
import com.hfkj.service.sec.SecUserService;
import com.hfkj.sysenum.SecUserObjectTypeEnum;
@ -239,6 +241,25 @@ public class TestController {
}
}
@Resource
private BsOrderSettleService orderSettleService;
@RequestMapping(value="separate",method = RequestMethod.GET)
@ResponseBody
@ApiOperation(value = "分账")
public ResponseData separate(@RequestParam(name = "orderNo", required = true) String orderNo) {
try {
//orderSettleService.separate(orderSettleService.getData("250731141540888578"));
orderSettleService.separate(orderSettleService.getData(orderNo));
//return ResponseMsgUtil.success(HuiPayService.profitSharingCancel(orderSettleService.getData("250731141540888578")));
return ResponseMsgUtil.success(null);
} catch (Exception e) {
log.error("error!",e);
return ResponseMsgUtil.exception(e);
}
}
}

@ -5,10 +5,13 @@ import com.alibaba.fastjson.JSONObject;
import com.hfkj.common.security.UserCenter;
import com.hfkj.common.utils.ResponseMsgUtil;
import com.hfkj.common.utils.WxUtils;
import com.hfkj.entity.BsOrderSettle;
import com.hfkj.entity.BsUserSpreadAccount;
import com.hfkj.model.ResponseData;
import com.hfkj.model.UserSessionObject;
import com.hfkj.pay.HuiPayService;
import com.hfkj.service.gas.BsGasOrderSpreadService;
import com.hfkj.service.order.BsOrderSettleService;
import com.hfkj.service.spread.BsUserSpreadAccountRecordService;
import com.hfkj.service.spread.BsUserSpreadAccountService;
import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
@ -24,6 +27,7 @@ import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@ -36,6 +36,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
@ -135,7 +136,7 @@ public class OrderPayController {
orderSettle.setSettleAmount(order.getPayRealPrice());
orderSettle.setLedgerFlag(ledgerAccountFlag);
if (orderSettle.getLedgerFlag()) {
orderSettle.setLedgerAmount(order.getPayRealPrice());
orderSettle.setLedgerAmount(new BigDecimal("0"));
orderSettle.setLedgerOrderNo("L"+ DateUtil.date2String(new Date(), "yyMMddHHmmss") + RandomUtils.number(3, false));
orderSettle.setLedgerStatus(OrderSettleLedgerStatusEnum.status0.getCode());
}

@ -21,6 +21,5 @@ public class OrderProfitSharingConsumer implements RocketMQListener<OrderModel>
@Override
public void onMessage(OrderModel order) {
orderSettleService.separate(orderSettleService.getData(order.getOrderNo()));
}
}

@ -1,6 +1,7 @@
package com.hfkj.schedule;
import com.alibaba.fastjson.JSONObject;
import com.hfkj.common.utils.DateUtil;
import com.hfkj.entity.BsOrderSettle;
import com.hfkj.entity.BsOrderSettleLedger;
import com.hfkj.entity.BsUserSpreadAccount;
@ -10,10 +11,12 @@ import com.hfkj.service.order.BsOrderSettleLedgerService;
import com.hfkj.service.order.BsOrderSettleService;
import com.hfkj.service.spread.BsUserSpreadAccountService;
import com.hfkj.sysenum.order.OrderSettleLedgerStatusEnum;
import com.hfkj.sysenum.order.OrderStatusEnum;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -47,8 +50,36 @@ public class OrderSettleSchedule {
}
}
@Scheduled(cron="0 0/3 * * * ?") //每3分钟执行一次
public void getBlxCoupon() {
/**
* 发起分账补偿
* 默认支付回调后发起MQ分账消费端不一定100%能消费到
*/
@Scheduled(cron="0 0/1 * * * ?") //每1分钟执行一次
public void startSeparate() {
Calendar createTimeE = Calendar.getInstance();
createTimeE.add(Calendar.MINUTE,-3);
Map<String,Object> param = new HashMap<>();
param.put("ledgerStatus", OrderSettleLedgerStatusEnum.status0.getCode());
param.put("orderStatus", OrderStatusEnum.status3.getCode());
param.put("createTimeE", createTimeE.getTime());
List<BsOrderSettle> orderSettleList = orderSettleService.getList(param);
for (BsOrderSettle orderSettle : orderSettleList) {
try {
orderSettleService.separate(orderSettle);
} catch (Exception e){
}
}
}
/**
* 分账结果
*/
@Scheduled(cron="0 0/1 * * * ?") //每1分钟执行一次
public void separateResult() {
Map<String,Object> param = new HashMap<>();
param.put("ledgerStatus", OrderSettleLedgerStatusEnum.status2.getCode());
List<BsOrderSettle> orderSettleList = orderSettleService.getList(param);
@ -56,8 +87,9 @@ public class OrderSettleSchedule {
// 查询分账处理结果
JSONObject obj = HuiPayService.profitSharingQuery(orderSettle);
if (obj.getString("return_code").equals("000000")) {
JSONObject data = obj.getJSONObject("return_data");
// 1:已完成 2:处理中 3:已受理 4:失败
if (obj.getInteger("status") == 1) {
if (data.getInteger("status") == 1) {
orderSettle.setLedgerStatus(OrderSettleLedgerStatusEnum.status1.getCode());
orderSettleService.editData(orderSettle);
// 分账接收方
@ -67,7 +99,35 @@ public class OrderSettleSchedule {
orderSettleLedgerService.editData(ledger);
}
} else if (obj.getInteger("status") == 4) {
} else if (data.getInteger("status") == 4) {
orderSettle.setLedgerStatus(OrderSettleLedgerStatusEnum.status4.getCode());
orderSettleService.editData(orderSettle);
}
}
}
}
/**
* 分账撤销结果
*/
@Scheduled(cron="0 0/1 * * * ?") //每1分钟执行一次
public void revokeLedgerResult() {
Map<String,Object> param = new HashMap<>();
param.put("ledgerStatus", OrderSettleLedgerStatusEnum.status5.getCode());
List<BsOrderSettle> orderSettleList = orderSettleService.getList(param);
for (BsOrderSettle orderSettle : orderSettleList) {
// 查询分账处理结果
// 重新设置请求单号
orderSettle.setLedgerOrderNo(orderSettle.getRevokeOrderNo());
JSONObject obj = HuiPayService.profitSharingQuery(orderSettle);
if (obj.getString("return_code").equals("000000")) {
JSONObject data = obj.getJSONObject("return_data");
// 1:已完成 2:处理中 3:已受理 4:失败
if (data.getInteger("status") == 1) {
orderSettle.setLedgerStatus(OrderSettleLedgerStatusEnum.status6.getCode());
orderSettleService.editData(orderSettle);
} else if (data.getInteger("status") == 4) {
orderSettle.setLedgerStatus(OrderSettleLedgerStatusEnum.status4.getCode());
orderSettleService.editData(orderSettle);
}

@ -43,16 +43,16 @@ public interface BsOrderSettleMapper extends BsOrderSettleMapperExt {
"settle_mer_no, settle_mer_key, ",
"settle_amount, ledger_flag, ",
"ledger_order_no, ledger_amount, ",
"ledger_status, create_time, ",
"update_time, ext_1, ",
"ext_2, ext_3)",
"ledger_status, revoke_order_no, ",
"create_time, update_time, ",
"ext_1, ext_2, ext_3)",
"values (#{merNo,jdbcType=VARCHAR}, #{orderNo,jdbcType=VARCHAR}, ",
"#{settleMerNo,jdbcType=VARCHAR}, #{settleMerKey,jdbcType=VARCHAR}, ",
"#{settleAmount,jdbcType=DECIMAL}, #{ledgerFlag,jdbcType=BIT}, ",
"#{ledgerOrderNo,jdbcType=VARCHAR}, #{ledgerAmount,jdbcType=DECIMAL}, ",
"#{ledgerStatus,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP}, ",
"#{updateTime,jdbcType=TIMESTAMP}, #{ext1,jdbcType=VARCHAR}, ",
"#{ext2,jdbcType=VARCHAR}, #{ext3,jdbcType=VARCHAR})"
"#{ledgerStatus,jdbcType=INTEGER}, #{revokeOrderNo,jdbcType=VARCHAR}, ",
"#{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, ",
"#{ext1,jdbcType=VARCHAR}, #{ext2,jdbcType=VARCHAR}, #{ext3,jdbcType=VARCHAR})"
})
@Options(useGeneratedKeys=true,keyProperty="id")
int insert(BsOrderSettle record);
@ -73,6 +73,7 @@ public interface BsOrderSettleMapper extends BsOrderSettleMapperExt {
@Result(column="ledger_order_no", property="ledgerOrderNo", jdbcType=JdbcType.VARCHAR),
@Result(column="ledger_amount", property="ledgerAmount", jdbcType=JdbcType.DECIMAL),
@Result(column="ledger_status", property="ledgerStatus", jdbcType=JdbcType.INTEGER),
@Result(column="revoke_order_no", property="revokeOrderNo", jdbcType=JdbcType.VARCHAR),
@Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="update_time", property="updateTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="ext_1", property="ext1", jdbcType=JdbcType.VARCHAR),
@ -84,8 +85,8 @@ public interface BsOrderSettleMapper extends BsOrderSettleMapperExt {
@Select({
"select",
"id, mer_no, order_no, settle_mer_no, settle_mer_key, settle_amount, ledger_flag, ",
"ledger_order_no, ledger_amount, ledger_status, create_time, update_time, ext_1, ",
"ext_2, ext_3",
"ledger_order_no, ledger_amount, ledger_status, revoke_order_no, create_time, ",
"update_time, ext_1, ext_2, ext_3",
"from bs_order_settle",
"where id = #{id,jdbcType=BIGINT}"
})
@ -100,6 +101,7 @@ public interface BsOrderSettleMapper extends BsOrderSettleMapperExt {
@Result(column="ledger_order_no", property="ledgerOrderNo", jdbcType=JdbcType.VARCHAR),
@Result(column="ledger_amount", property="ledgerAmount", jdbcType=JdbcType.DECIMAL),
@Result(column="ledger_status", property="ledgerStatus", jdbcType=JdbcType.INTEGER),
@Result(column="revoke_order_no", property="revokeOrderNo", jdbcType=JdbcType.VARCHAR),
@Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="update_time", property="updateTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="ext_1", property="ext1", jdbcType=JdbcType.VARCHAR),
@ -128,6 +130,7 @@ public interface BsOrderSettleMapper extends BsOrderSettleMapperExt {
"ledger_order_no = #{ledgerOrderNo,jdbcType=VARCHAR},",
"ledger_amount = #{ledgerAmount,jdbcType=DECIMAL},",
"ledger_status = #{ledgerStatus,jdbcType=INTEGER},",
"revoke_order_no = #{revokeOrderNo,jdbcType=VARCHAR},",
"create_time = #{createTime,jdbcType=TIMESTAMP},",
"update_time = #{updateTime,jdbcType=TIMESTAMP},",
"ext_1 = #{ext1,jdbcType=VARCHAR},",

@ -1,7 +1,49 @@
package com.hfkj.dao;
import com.hfkj.entity.BsOrderSettle;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.type.JdbcType;
import java.util.List;
import java.util.Map;
/**
* mapper扩展类
*/
public interface BsOrderSettleMapperExt {
}
@Select(" <script>" +
" SELECT a.* " +
" FROM `bs_order_settle` a " +
" LEFT JOIN bs_order b on b.order_no = a.order_no " +
" where 1 = 1 " +
" <if test='param.ledgerFlag != null'> and a.ledger_flag = #{param.ledgerFlag} </if>" +
" <if test='param.ledgerStatus != null'> and a.ledger_status = #{param.ledgerStatus} </if>" +
" <if test='param.orderStatus != null'> and b.order_status = #{param.orderStatus} </if>" +
" <if test='param.createTimeS != null'> <![CDATA[ and a.create_time >= #{param.createTimeS} ]]></if>" +
" <if test='param.createTimeE != null'> <![CDATA[ and a.create_time <= #{param.createTimeE} ]]></if>" +
"ORDER BY a.create_time desc" +
" </script>")
@Results({
@Result(column="id", property="id", jdbcType=JdbcType.BIGINT, id=true),
@Result(column="mer_no", property="merNo", jdbcType=JdbcType.VARCHAR),
@Result(column="order_no", property="orderNo", jdbcType=JdbcType.VARCHAR),
@Result(column="settle_mer_no", property="settleMerNo", jdbcType=JdbcType.VARCHAR),
@Result(column="settle_mer_key", property="settleMerKey", jdbcType=JdbcType.VARCHAR),
@Result(column="settle_amount", property="settleAmount", jdbcType=JdbcType.DECIMAL),
@Result(column="ledger_flag", property="ledgerFlag", jdbcType=JdbcType.BIT),
@Result(column="ledger_order_no", property="ledgerOrderNo", jdbcType=JdbcType.VARCHAR),
@Result(column="ledger_amount", property="ledgerAmount", jdbcType=JdbcType.DECIMAL),
@Result(column="ledger_status", property="ledgerStatus", jdbcType=JdbcType.INTEGER),
@Result(column="revoke_order_no", property="revokeOrderNo", jdbcType=JdbcType.VARCHAR),
@Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="update_time", property="updateTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="ext_1", property="ext1", jdbcType=JdbcType.VARCHAR),
@Result(column="ext_2", property="ext2", jdbcType=JdbcType.VARCHAR),
@Result(column="ext_3", property="ext3", jdbcType=JdbcType.VARCHAR)
})
List<BsOrderSettle> queryList(@Param("param") Map<String,Object> param);
}

@ -64,6 +64,10 @@ public class BsOrderSettleSqlProvider {
sql.VALUES("ledger_status", "#{ledgerStatus,jdbcType=INTEGER}");
}
if (record.getRevokeOrderNo() != null) {
sql.VALUES("revoke_order_no", "#{revokeOrderNo,jdbcType=VARCHAR}");
}
if (record.getCreateTime() != null) {
sql.VALUES("create_time", "#{createTime,jdbcType=TIMESTAMP}");
}
@ -103,6 +107,7 @@ public class BsOrderSettleSqlProvider {
sql.SELECT("ledger_order_no");
sql.SELECT("ledger_amount");
sql.SELECT("ledger_status");
sql.SELECT("revoke_order_no");
sql.SELECT("create_time");
sql.SELECT("update_time");
sql.SELECT("ext_1");
@ -165,6 +170,10 @@ public class BsOrderSettleSqlProvider {
sql.SET("ledger_status = #{record.ledgerStatus,jdbcType=INTEGER}");
}
if (record.getRevokeOrderNo() != null) {
sql.SET("revoke_order_no = #{record.revokeOrderNo,jdbcType=VARCHAR}");
}
if (record.getCreateTime() != null) {
sql.SET("create_time = #{record.createTime,jdbcType=TIMESTAMP}");
}
@ -203,6 +212,7 @@ public class BsOrderSettleSqlProvider {
sql.SET("ledger_order_no = #{record.ledgerOrderNo,jdbcType=VARCHAR}");
sql.SET("ledger_amount = #{record.ledgerAmount,jdbcType=DECIMAL}");
sql.SET("ledger_status = #{record.ledgerStatus,jdbcType=INTEGER}");
sql.SET("revoke_order_no = #{record.revokeOrderNo,jdbcType=VARCHAR}");
sql.SET("create_time = #{record.createTime,jdbcType=TIMESTAMP}");
sql.SET("update_time = #{record.updateTime,jdbcType=TIMESTAMP}");
sql.SET("ext_1 = #{record.ext1,jdbcType=VARCHAR}");
@ -254,6 +264,10 @@ public class BsOrderSettleSqlProvider {
sql.SET("ledger_status = #{ledgerStatus,jdbcType=INTEGER}");
}
if (record.getRevokeOrderNo() != null) {
sql.SET("revoke_order_no = #{revokeOrderNo,jdbcType=VARCHAR}");
}
if (record.getCreateTime() != null) {
sql.SET("create_time = #{createTime,jdbcType=TIMESTAMP}");
}

@ -60,10 +60,15 @@ public class BsOrderSettle implements Serializable {
private BigDecimal ledgerAmount;
/**
* 分账状态 0待处理 1已完成 2处理中 3已受理 4失败
* 分账状态 0待处理 1已完成 2处理中 3已受理 4失败 5撤销中 6撤销成功 7撤销失败
*/
private Integer ledgerStatus;
/**
* 撤销单号
*/
private String revokeOrderNo;
/**
* 创建时间
*/
@ -162,6 +167,14 @@ public class BsOrderSettle implements Serializable {
this.ledgerStatus = ledgerStatus;
}
public String getRevokeOrderNo() {
return revokeOrderNo;
}
public void setRevokeOrderNo(String revokeOrderNo) {
this.revokeOrderNo = revokeOrderNo;
}
public Date getCreateTime() {
return createTime;
}
@ -224,6 +237,7 @@ public class BsOrderSettle implements Serializable {
&& (this.getLedgerOrderNo() == null ? other.getLedgerOrderNo() == null : this.getLedgerOrderNo().equals(other.getLedgerOrderNo()))
&& (this.getLedgerAmount() == null ? other.getLedgerAmount() == null : this.getLedgerAmount().equals(other.getLedgerAmount()))
&& (this.getLedgerStatus() == null ? other.getLedgerStatus() == null : this.getLedgerStatus().equals(other.getLedgerStatus()))
&& (this.getRevokeOrderNo() == null ? other.getRevokeOrderNo() == null : this.getRevokeOrderNo().equals(other.getRevokeOrderNo()))
&& (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()))
&& (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime()))
&& (this.getExt1() == null ? other.getExt1() == null : this.getExt1().equals(other.getExt1()))
@ -245,6 +259,7 @@ public class BsOrderSettle implements Serializable {
result = prime * result + ((getLedgerOrderNo() == null) ? 0 : getLedgerOrderNo().hashCode());
result = prime * result + ((getLedgerAmount() == null) ? 0 : getLedgerAmount().hashCode());
result = prime * result + ((getLedgerStatus() == null) ? 0 : getLedgerStatus().hashCode());
result = prime * result + ((getRevokeOrderNo() == null) ? 0 : getRevokeOrderNo().hashCode());
result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());
result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode());
result = prime * result + ((getExt1() == null) ? 0 : getExt1().hashCode());
@ -269,6 +284,7 @@ public class BsOrderSettle implements Serializable {
sb.append(", ledgerOrderNo=").append(ledgerOrderNo);
sb.append(", ledgerAmount=").append(ledgerAmount);
sb.append(", ledgerStatus=").append(ledgerStatus);
sb.append(", revokeOrderNo=").append(revokeOrderNo);
sb.append(", createTime=").append(createTime);
sb.append(", updateTime=").append(updateTime);
sb.append(", ext1=").append(ext1);

@ -776,6 +776,76 @@ public class BsOrderSettleExample {
return (Criteria) this;
}
public Criteria andRevokeOrderNoIsNull() {
addCriterion("revoke_order_no is null");
return (Criteria) this;
}
public Criteria andRevokeOrderNoIsNotNull() {
addCriterion("revoke_order_no is not null");
return (Criteria) this;
}
public Criteria andRevokeOrderNoEqualTo(String value) {
addCriterion("revoke_order_no =", value, "revokeOrderNo");
return (Criteria) this;
}
public Criteria andRevokeOrderNoNotEqualTo(String value) {
addCriterion("revoke_order_no <>", value, "revokeOrderNo");
return (Criteria) this;
}
public Criteria andRevokeOrderNoGreaterThan(String value) {
addCriterion("revoke_order_no >", value, "revokeOrderNo");
return (Criteria) this;
}
public Criteria andRevokeOrderNoGreaterThanOrEqualTo(String value) {
addCriterion("revoke_order_no >=", value, "revokeOrderNo");
return (Criteria) this;
}
public Criteria andRevokeOrderNoLessThan(String value) {
addCriterion("revoke_order_no <", value, "revokeOrderNo");
return (Criteria) this;
}
public Criteria andRevokeOrderNoLessThanOrEqualTo(String value) {
addCriterion("revoke_order_no <=", value, "revokeOrderNo");
return (Criteria) this;
}
public Criteria andRevokeOrderNoLike(String value) {
addCriterion("revoke_order_no like", value, "revokeOrderNo");
return (Criteria) this;
}
public Criteria andRevokeOrderNoNotLike(String value) {
addCriterion("revoke_order_no not like", value, "revokeOrderNo");
return (Criteria) this;
}
public Criteria andRevokeOrderNoIn(List<String> values) {
addCriterion("revoke_order_no in", values, "revokeOrderNo");
return (Criteria) this;
}
public Criteria andRevokeOrderNoNotIn(List<String> values) {
addCriterion("revoke_order_no not in", values, "revokeOrderNo");
return (Criteria) this;
}
public Criteria andRevokeOrderNoBetween(String value1, String value2) {
addCriterion("revoke_order_no between", value1, value2, "revokeOrderNo");
return (Criteria) this;
}
public Criteria andRevokeOrderNoNotBetween(String value1, String value2) {
addCriterion("revoke_order_no not between", value1, value2, "revokeOrderNo");
return (Criteria) this;
}
public Criteria andCreateTimeIsNull() {
addCriterion("create_time is null");
return (Criteria) this;

@ -134,13 +134,13 @@ public class HuiPayService {
param.put("merchantNo", orderSettle.getSettleMerNo());
param.put("outTradeNo", orderSettle.getOrderNo());
param.put("outSeparateNo", orderSettle.getLedgerOrderNo());
param.put("totalAmount", orderSettle.getLedgerAmount());
param.put("totalAmount", orderSettle.getLedgerAmount().toString());
JSONArray recvDatas = new JSONArray();
for (BsOrderSettleLedger settleLedger : settleLedgerList) {
JSONObject obj = new JSONObject();
obj.put("recvMerchantNo", settleLedger.getReceiverMerNo());
obj.put("separateAmount", settleLedger.getReceiverAmount());
obj.put("separateAmount", settleLedger.getReceiverAmount().toString());
recvDatas.add(obj);
}
param.put("recvDatas", recvDatas);
@ -197,7 +197,7 @@ public class HuiPayService {
Map<String,Object> param = new HashMap<>();
param.put("merchantNo", orderSettle.getSettleMerNo());
param.put("originOutSeparateNo", orderSettle.getLedgerOrderNo());
param.put("outSeparateNo", "LC"+ DateUtil.date2String(new Date(), "yyMMddHHmmss") + RandomUtils.number(3, false));
param.put("outSeparateNo", orderSettle.getRevokeOrderNo());
param.put("totalAmount", orderSettle.getLedgerAmount());
param.put("sign" , SignatureUtil.createSign(param, orderSettle.getSettleMerKey()));
log.info("请求地址:" + (REQUEST_URL + "profitSharing/cancel"));
@ -214,5 +214,31 @@ public class HuiPayService {
}
}
/**
* 查询可分账余额
* @param orderSettle
* @return
*/
public static JSONObject queryAmt(BsOrderSettle orderSettle) {
try {
log.info("=============== start 惠支付查询可分账余额 start ==================");
Map<String,Object> param = new HashMap<>();
param.put("merchantNo", orderSettle.getSettleMerNo());
param.put("outTradeNo", orderSettle.getOrderNo());
param.put("sign" , SignatureUtil.createSign(param, orderSettle.getSettleMerKey()));
log.info("请求地址:" + (REQUEST_URL + "profitSharing/queryAmt"));
log.info("请求参数:" + JSONObject.toJSONString(param));
JSONObject response = HttpsUtils.doPost(REQUEST_URL + "profitSharing/queryAmt", param, new HashMap<>());
log.info("响应参数:" + response.toJSONString());
return response;
} catch (Exception e) {
log.info("出现异常"+ e.getMessage());
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "查询异常");
} finally {
log.info("=============== end 惠支付查询可分账余额 end ==================");
}
}
}

@ -32,6 +32,12 @@ public interface BsOrderSettleService {
*/
void separate(BsOrderSettle orderSettle);
/**
* 撤销分账
* @param orderSettle
*/
void revokeLedger(BsOrderSettle orderSettle);
/**
* 查询列表
* @param param

@ -87,6 +87,8 @@ public class BsOrderRefundServiceImpl implements BsOrderRefundService {
orderRefund.setRefundStatus(OrderRefundStatusEnum.status3.getCode());
orderRefund.setRefundFailReason(refund.getString("return_msg"));
editData(orderRefund);
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, orderRefund.getRefundFailReason());
}
} else {
@ -97,12 +99,15 @@ public class BsOrderRefundServiceImpl implements BsOrderRefundService {
orderRefund.setRefundFailReason(e.getErrorMsg());
editData(orderRefund);
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, e.getErrorMsg());
} catch (Exception e) {
orderRefund.setRefundStatus(OrderRefundStatusEnum.status3.getCode());
orderRefund.setRefundFailReason("未知问题");
editData(orderRefund);
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "退款失败!");
}
return false;
}
@Override
@ -123,12 +128,13 @@ public class BsOrderRefundServiceImpl implements BsOrderRefundService {
try {
BsOrderRefund orderRefund = tradeOrderChildRefund(orderChild.getChildOrderNo(), true, orderChild.getProductCount(), remark);
if (orderRefund.getRefundStatus().equals(OrderRefundStatusEnum.status3.getCode())) {
refundSuccess = false;
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, orderRefund.getRefundFailReason());
}
} catch (Exception e) {
refundSuccess = false;
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "退款失败");
}
}
order.setOrderStatus(refundSuccess ? OrderStatusEnum.status4.getCode() : order.getOrderStatus());
order.setRefundTime(refundSuccess ? new Date() : null);
orderService.editData(order);
@ -250,7 +256,11 @@ public class BsOrderRefundServiceImpl implements BsOrderRefundService {
if (orderChild.getProductType().equals(OrderChildProductTypeEnum.type1.getCode())) {
try {
orderRefundBusiness.gasOrder(orderRefund);
} catch (Exception e) { }
} catch (BaseException e) {
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, e.getErrorMsg());
} catch (Exception e) {
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "退款失败");
}
}
}

@ -2,6 +2,11 @@ package com.hfkj.service.order.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hfkj.common.exception.ErrorCode;
import com.hfkj.common.exception.ErrorHelp;
import com.hfkj.common.exception.SysCode;
import com.hfkj.common.utils.DateUtil;
import com.hfkj.common.utils.RandomUtils;
import com.hfkj.dao.BsOrderSettleMapper;
import com.hfkj.entity.*;
import com.hfkj.pay.HuiPayService;
@ -65,6 +70,10 @@ public class BsOrderSettleServiceImpl implements BsOrderSettleService {
@Override
public void separate(BsOrderSettle orderSettle) {
// 可分账余额
BigDecimal canSeparateAmt = HuiPayService.queryAmt(orderSettle).getJSONObject("return_data").getBigDecimal("canSeparateAmt");
// 总分账金额
BigDecimal totalLedgerAmount = new BigDecimal("0");
// 查询商户
BsMerchant merchant = merchantService.getMerchant(orderSettle.getMerNo());
if (merchant != null) {
@ -83,17 +92,22 @@ public class BsOrderSettleServiceImpl implements BsOrderSettleService {
settleLedger.setRatio(ledgerAccount.getBigDecimal("receiverRatio"));
settleLedger.setReceiverMerNo(ledgerAccount.getString("receiverMerNo"));
settleLedger.setReceiverMerName(ledgerAccount.getString("receiverMerName"));
settleLedger.setReceiverAmount(settleLedger.getSharingAmount().multiply(settleLedger.getRatio().divide(new BigDecimal("100"))));
settleLedger.setReceiverAmount(settleLedger.getSharingAmount().multiply(settleLedger.getRatio().divide(new BigDecimal("100"))).setScale(2, BigDecimal.ROUND_DOWN));
settleLedger.setStatus(0);
orderSettleLedgerService.editData(settleLedger);
settleLedgerList.add(settleLedger);
// 累加分账金额
totalLedgerAmount = totalLedgerAmount.add(settleLedger.getReceiverAmount());
}
}
} else if (merchant.getSourceType().equals(MerchantSourceTypeEnum.type2.getNumber())) {
} else if (merchant.getSourceType().equals(MerchantSourceTypeEnum.type2.getNumber())
|| merchant.getSourceType().equals(MerchantSourceTypeEnum.type3.getNumber())) {
// 查询商户配置
BsGasChannelConfig gasChannelConfig = gasChannelConfigService.getDetail(MerchantSourceTypeEnum.type2);
BsGasChannelConfig gasChannelConfig = gasChannelConfigService.getDetail(MerchantSourceTypeEnum.getDataByType(merchant.getSourceType()));
if (gasChannelConfig != null && StringUtils.isNotBlank(gasChannelConfig.getLedgerAccountData())) {
// 分账接收方数据
JSONArray ledgerAccountData = JSONArray.parseArray(gasChannelConfig.getLedgerAccountData());
for (Object obj : ledgerAccountData) {
@ -104,13 +118,29 @@ public class BsOrderSettleServiceImpl implements BsOrderSettleService {
settleLedger.setRatio(ledgerAccount.getBigDecimal("receiverRatio"));
settleLedger.setReceiverMerNo(ledgerAccount.getString("receiverMerNo"));
settleLedger.setReceiverMerName(ledgerAccount.getString("receiverMerName"));
settleLedger.setReceiverAmount(settleLedger.getSharingAmount().multiply(settleLedger.getRatio().divide(new BigDecimal("100"))));
settleLedger.setReceiverAmount(settleLedger.getSharingAmount().multiply(settleLedger.getRatio().divide(new BigDecimal("100"))).setScale(2, BigDecimal.ROUND_DOWN));
settleLedger.setStatus(0);
orderSettleLedgerService.editData(settleLedger);
settleLedgerList.add(settleLedger);
// 累加分账金额
totalLedgerAmount = totalLedgerAmount.add(settleLedger.getReceiverAmount());
}
}
}
orderSettle.setLedgerAmount(canSeparateAmt);
editData(orderSettle);
// 收款账户也需要设置分账人
BsOrderSettleLedger settleLedger = new BsOrderSettleLedger();
settleLedger.setOrderSettleId(orderSettle.getId());
settleLedger.setSharingAmount(orderSettle.getSettleAmount());
settleLedger.setReceiverMerNo(orderSettle.getSettleMerNo());
settleLedger.setReceiverMerName(orderSettle.getSettleMerNo());
// 可分账余额 - 全部分账接收方总额 = 收款商户金额
settleLedger.setReceiverAmount(canSeparateAmt.subtract(totalLedgerAmount));
settleLedger.setStatus(0);
orderSettleLedgerService.editData(settleLedger);
settleLedgerList.add(settleLedger);
// 请求分账
JSONObject separate = HuiPayService.profitSharingSeparate(orderSettle, settleLedgerList);
@ -121,15 +151,30 @@ public class BsOrderSettleServiceImpl implements BsOrderSettleService {
}
}
@Override
public void revokeLedger(BsOrderSettle orderSettle) {
// 请求撤销分账
orderSettle.setRevokeOrderNo("LC"+ DateUtil.date2String(new Date(), "yyMMddHHmmss") + RandomUtils.number(3, false));
JSONObject separate = HuiPayService.profitSharingCancel(orderSettle);
if (separate.getString("return_code").equals("000000")) {
orderSettle.setLedgerStatus(OrderSettleLedgerStatusEnum.status5.getCode());
editData(orderSettle);
} else {
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, separate.getString("return_msg"));
}
}
@Override
public List<BsOrderSettle> getList(Map<String, Object> param) {
BsOrderSettleExample example = new BsOrderSettleExample();
BsOrderSettleExample.Criteria criteria = example.createCriteria();
if (MapUtils.getInteger(param, "ledgerStatus") != null) {
criteria.andLedgerStatusEqualTo(MapUtils.getInteger(param, "ledgerStatus"));
if (MapUtils.getLong(param, "createTimeS") != null) {
param.put("createTimeS", DateUtil.date2String(new Date(MapUtils.getLong(param, "createTimeS")), DateUtil.Y_M_D_HMS));
}
if (MapUtils.getLong(param, "createTimeE") != null) {
param.put("createTimeE", DateUtil.date2String(new Date(MapUtils.getLong(param, "createTimeE")), DateUtil.Y_M_D_HMS));
}
return orderSettleMapper.selectByExample(example);
return orderSettleMapper.queryList(param);
}
}

@ -29,6 +29,18 @@ public enum OrderSettleLedgerStatusEnum {
* 失败
*/
status4(4, "失败"),
/**
* 撤销中
*/
status5(5, "撤销中"),
/**
* 撤销成功
*/
status6(6, "撤销成功"),
/**
* 撤销失败
*/
status7(7, "撤销失败"),
;
private final int code;

Loading…
Cancel
Save