From 1d6ed5bce81e78847f974ed4c189af3b1b115339 Mon Sep 17 00:00:00 2001 From: hu177768073 <177768073@qq.com> Date: Thu, 7 Aug 2025 13:56:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E8=B4=A6=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BsOrderSettleController.java | 80 +++++++++++++++++++ .../bweb/controller/SecMenuController.java | 40 +++++----- .../com/bweb/controller/TestController.java | 21 +++++ .../com/cweb/controller/TestController.java | 4 + .../controller/order/OrderPayController.java | 3 +- .../consumer/OrderProfitSharingConsumer.java | 1 - .../hfkj/schedule/OrderSettleSchedule.java | 68 +++++++++++++++- .../com/hfkj/dao/BsOrderSettleMapper.java | 19 +++-- .../com/hfkj/dao/BsOrderSettleMapperExt.java | 44 +++++++++- .../hfkj/dao/BsOrderSettleSqlProvider.java | 14 ++++ .../java/com/hfkj/entity/BsOrderSettle.java | 18 ++++- .../com/hfkj/entity/BsOrderSettleExample.java | 70 ++++++++++++++++ .../main/java/com/hfkj/pay/HuiPayService.java | 32 +++++++- .../service/order/BsOrderSettleService.java | 6 ++ .../order/impl/BsOrderRefundServiceImpl.java | 18 ++++- .../order/impl/BsOrderSettleServiceImpl.java | 63 ++++++++++++--- .../order/OrderSettleLedgerStatusEnum.java | 12 +++ 17 files changed, 463 insertions(+), 50 deletions(-) create mode 100644 bweb/src/main/java/com/bweb/controller/BsOrderSettleController.java diff --git a/bweb/src/main/java/com/bweb/controller/BsOrderSettleController.java b/bweb/src/main/java/com/bweb/controller/BsOrderSettleController.java new file mode 100644 index 0000000..a159c12 --- /dev/null +++ b/bweb/src/main/java/com/bweb/controller/BsOrderSettleController.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 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); + } + } + +} diff --git a/bweb/src/main/java/com/bweb/controller/SecMenuController.java b/bweb/src/main/java/com/bweb/controller/SecMenuController.java index 89d1fd0..f5aa22e 100644 --- a/bweb/src/main/java/com/bweb/controller/SecMenuController.java +++ b/bweb/src/main/java/com/bweb/controller/SecMenuController.java @@ -168,7 +168,7 @@ public class SecMenuController { try { // 查询角色菜单权限 - Map roleMenu = secMenuService.queryRoleMenu(roleId, SecMenuTypeEnum.type1).stream() + Map 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> 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> 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; } diff --git a/bweb/src/main/java/com/bweb/controller/TestController.java b/bweb/src/main/java/com/bweb/controller/TestController.java index 0498edc..c50b51b 100644 --- a/bweb/src/main/java/com/bweb/controller/TestController.java +++ b/bweb/src/main/java/com/bweb/controller/TestController.java @@ -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); + } + } + } diff --git a/cweb/src/main/java/com/cweb/controller/TestController.java b/cweb/src/main/java/com/cweb/controller/TestController.java index 11e2550..237e2ac 100644 --- a/cweb/src/main/java/com/cweb/controller/TestController.java +++ b/cweb/src/main/java/com/cweb/controller/TestController.java @@ -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; diff --git a/cweb/src/main/java/com/cweb/controller/order/OrderPayController.java b/cweb/src/main/java/com/cweb/controller/order/OrderPayController.java index 7a0d707..51601a9 100644 --- a/cweb/src/main/java/com/cweb/controller/order/OrderPayController.java +++ b/cweb/src/main/java/com/cweb/controller/order/OrderPayController.java @@ -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()); } diff --git a/schedule/src/main/java/com/hfkj/consumer/OrderProfitSharingConsumer.java b/schedule/src/main/java/com/hfkj/consumer/OrderProfitSharingConsumer.java index 1146d12..a0497a6 100644 --- a/schedule/src/main/java/com/hfkj/consumer/OrderProfitSharingConsumer.java +++ b/schedule/src/main/java/com/hfkj/consumer/OrderProfitSharingConsumer.java @@ -21,6 +21,5 @@ public class OrderProfitSharingConsumer implements RocketMQListener @Override public void onMessage(OrderModel order) { orderSettleService.separate(orderSettleService.getData(order.getOrderNo())); - } } diff --git a/schedule/src/main/java/com/hfkj/schedule/OrderSettleSchedule.java b/schedule/src/main/java/com/hfkj/schedule/OrderSettleSchedule.java index a7e1ab0..cc10894 100644 --- a/schedule/src/main/java/com/hfkj/schedule/OrderSettleSchedule.java +++ b/schedule/src/main/java/com/hfkj/schedule/OrderSettleSchedule.java @@ -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 param = new HashMap<>(); + param.put("ledgerStatus", OrderSettleLedgerStatusEnum.status0.getCode()); + param.put("orderStatus", OrderStatusEnum.status3.getCode()); + param.put("createTimeE", createTimeE.getTime()); + List 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 param = new HashMap<>(); param.put("ledgerStatus", OrderSettleLedgerStatusEnum.status2.getCode()); List 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 param = new HashMap<>(); + param.put("ledgerStatus", OrderSettleLedgerStatusEnum.status5.getCode()); + List 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); } diff --git a/service/src/main/java/com/hfkj/dao/BsOrderSettleMapper.java b/service/src/main/java/com/hfkj/dao/BsOrderSettleMapper.java index a81e121..bfaab02 100644 --- a/service/src/main/java/com/hfkj/dao/BsOrderSettleMapper.java +++ b/service/src/main/java/com/hfkj/dao/BsOrderSettleMapper.java @@ -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},", diff --git a/service/src/main/java/com/hfkj/dao/BsOrderSettleMapperExt.java b/service/src/main/java/com/hfkj/dao/BsOrderSettleMapperExt.java index 91f0a81..27f6a8d 100644 --- a/service/src/main/java/com/hfkj/dao/BsOrderSettleMapperExt.java +++ b/service/src/main/java/com/hfkj/dao/BsOrderSettleMapperExt.java @@ -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 { -} \ No newline at end of file + + @Select(" ") + @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 queryList(@Param("param") Map param); +} diff --git a/service/src/main/java/com/hfkj/dao/BsOrderSettleSqlProvider.java b/service/src/main/java/com/hfkj/dao/BsOrderSettleSqlProvider.java index 7b4e648..1868882 100644 --- a/service/src/main/java/com/hfkj/dao/BsOrderSettleSqlProvider.java +++ b/service/src/main/java/com/hfkj/dao/BsOrderSettleSqlProvider.java @@ -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}"); } diff --git a/service/src/main/java/com/hfkj/entity/BsOrderSettle.java b/service/src/main/java/com/hfkj/entity/BsOrderSettle.java index e7e071d..42b2693 100644 --- a/service/src/main/java/com/hfkj/entity/BsOrderSettle.java +++ b/service/src/main/java/com/hfkj/entity/BsOrderSettle.java @@ -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); diff --git a/service/src/main/java/com/hfkj/entity/BsOrderSettleExample.java b/service/src/main/java/com/hfkj/entity/BsOrderSettleExample.java index a3fb3f8..0ede581 100644 --- a/service/src/main/java/com/hfkj/entity/BsOrderSettleExample.java +++ b/service/src/main/java/com/hfkj/entity/BsOrderSettleExample.java @@ -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 values) { + addCriterion("revoke_order_no in", values, "revokeOrderNo"); + return (Criteria) this; + } + + public Criteria andRevokeOrderNoNotIn(List 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; diff --git a/service/src/main/java/com/hfkj/pay/HuiPayService.java b/service/src/main/java/com/hfkj/pay/HuiPayService.java index ad557df..3a61ff6 100644 --- a/service/src/main/java/com/hfkj/pay/HuiPayService.java +++ b/service/src/main/java/com/hfkj/pay/HuiPayService.java @@ -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 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 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 =================="); + } + } + } diff --git a/service/src/main/java/com/hfkj/service/order/BsOrderSettleService.java b/service/src/main/java/com/hfkj/service/order/BsOrderSettleService.java index 773e48b..168119c 100644 --- a/service/src/main/java/com/hfkj/service/order/BsOrderSettleService.java +++ b/service/src/main/java/com/hfkj/service/order/BsOrderSettleService.java @@ -32,6 +32,12 @@ public interface BsOrderSettleService { */ void separate(BsOrderSettle orderSettle); + /** + * 撤销分账 + * @param orderSettle + */ + void revokeLedger(BsOrderSettle orderSettle); + /** * 查询列表 * @param param diff --git a/service/src/main/java/com/hfkj/service/order/impl/BsOrderRefundServiceImpl.java b/service/src/main/java/com/hfkj/service/order/impl/BsOrderRefundServiceImpl.java index 31c3d23..e21b7ec 100644 --- a/service/src/main/java/com/hfkj/service/order/impl/BsOrderRefundServiceImpl.java +++ b/service/src/main/java/com/hfkj/service/order/impl/BsOrderRefundServiceImpl.java @@ -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, "退款失败"); + } } } diff --git a/service/src/main/java/com/hfkj/service/order/impl/BsOrderSettleServiceImpl.java b/service/src/main/java/com/hfkj/service/order/impl/BsOrderSettleServiceImpl.java index b691a42..03ea604 100644 --- a/service/src/main/java/com/hfkj/service/order/impl/BsOrderSettleServiceImpl.java +++ b/service/src/main/java/com/hfkj/service/order/impl/BsOrderSettleServiceImpl.java @@ -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 getList(Map 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); } } diff --git a/service/src/main/java/com/hfkj/sysenum/order/OrderSettleLedgerStatusEnum.java b/service/src/main/java/com/hfkj/sysenum/order/OrderSettleLedgerStatusEnum.java index ac60985..7746bee 100644 --- a/service/src/main/java/com/hfkj/sysenum/order/OrderSettleLedgerStatusEnum.java +++ b/service/src/main/java/com/hfkj/sysenum/order/OrderSettleLedgerStatusEnum.java @@ -29,6 +29,18 @@ public enum OrderSettleLedgerStatusEnum { * 失败 */ status4(4, "失败"), + /** + * 撤销中 + */ + status5(5, "撤销中"), + /** + * 撤销成功 + */ + status6(6, "撤销成功"), + /** + * 撤销失败 + */ + status7(7, "撤销失败"), ; private final int code;