fanli/src/main/java/com/yeshi/fanli/controller/admin/OrderAdminController.java
@@ -1,6 +1,7 @@ package com.yeshi.fanli.controller.admin; import java.io.PrintWriter; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -17,16 +18,21 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.yeshi.fanli.controller.admin.utils.AdminUtils; import com.yeshi.fanli.entity.money.UserMoneyDebt.UserMoneyDebtTypeEnum; import com.yeshi.fanli.entity.money.UserMoneyDebt; import com.yeshi.fanli.entity.money.UserMoneyDetail; import com.yeshi.fanli.entity.money.UserMoneyDetail.UserMoneyDetailTypeEnum; import com.yeshi.fanli.entity.order.CommonOrder; import com.yeshi.fanli.entity.order.HongBaoOrder; import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanDrawBack; import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanOrder; import com.yeshi.fanli.exception.order.CommonOrderException; import com.yeshi.fanli.service.inter.count.HongBaoV2CountService; import com.yeshi.fanli.service.inter.count.TaoBaoOrderCountService; import com.yeshi.fanli.service.inter.money.UserMoneyDebtService; import com.yeshi.fanli.service.inter.order.CommonOrderCountService; import com.yeshi.fanli.service.inter.order.CommonOrderService; import com.yeshi.fanli.service.inter.order.HongBaoOrderService; import com.yeshi.fanli.service.inter.order.OrderProcessService; import com.yeshi.fanli.service.inter.order.OrderService; import com.yeshi.fanli.service.inter.taobao.TaoBaoOrderService; @@ -75,6 +81,12 @@ @Resource private OrderProcessService orderProcessService; @Resource private HongBaoOrderService hongBaoOrderService; @Resource private UserMoneyDebtService userMoneyDebtService; /** * 统计历史订单-淘宝订单 @@ -200,7 +212,22 @@ // 退款成功 order.setWeiQuanBackMoney(detail.getMoney().abs().toString()); } else {// 尚未退款 order.setWeiQuanBackMoney("-" + order.getHongBao()); order.setWeiQuanBackMoney(drawBack.getDrawBackMoney().toString()); // 查询出对应的hongBaoId CommonOrder commonOrder = commonOrderService.selectBySourceTypeAndTradeId( Constant.SOURCE_TYPE_TAOBAO, drawBack.getOrderItemId()); if (commonOrder != null) { HongBaoOrder hongBaoOrder = hongBaoOrderService .selectDetailByCommonOrderId(commonOrder.getId()); if (hongBaoOrder != null) { UserMoneyDebt debt = userMoneyDebtService.selectByTypeAndSourceId( UserMoneyDebtTypeEnum.order, hongBaoOrder.getHongBaoV2().getId()); if (debt != null && debt.getLeftMoney().compareTo(new BigDecimal(0)) > 0) { order.setWeiQuanBackMoney( new BigDecimal(0).subtract(debt.getLeftMoney()).toString());//未扣除 } } } } } else {// 尚未退款 fanli/src/main/java/com/yeshi/fanli/controller/admin/order/TaoBaoOrderController.java
@@ -21,9 +21,11 @@ import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import com.yeshi.fanli.entity.taobao.TaoBaoOrder; import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanOrder; import com.yeshi.fanli.job.UpdateOrderJob; import com.yeshi.fanli.job.UpdateRelationAndSpecialOrderJob; import com.yeshi.fanli.service.inter.taobao.TaoBaoOrderService; import com.yeshi.fanli.service.inter.taobao.TaoBaoWeiQuanOrderService; import com.yeshi.fanli.tag.PageEntity; import com.yeshi.fanli.util.Constant; import com.yeshi.fanli.util.StringUtil; @@ -37,6 +39,9 @@ @Resource private TaoBaoOrderService taoBaoOrderService; @Resource private TaoBaoWeiQuanOrderService taoBaoWeiQuanOrderService; @Resource private UpdateRelationAndSpecialOrderJob updateRelationAndSpecialOrderJob; @@ -140,4 +145,48 @@ } } @RequestMapping(value = "listTaoBaoWQOrder") public void listTaoBaoWeiQuanOrder(String callback, String key, Integer pageIndex, PrintWriter out) { try { if (pageIndex == null || pageIndex < 0) { pageIndex = 1; } List<TaoBaoWeiQuanOrder> orderList = null; Long count = null; if (!StringUtil.isNullOrEmpty(key)) { orderList = taoBaoWeiQuanOrderService.listByOrderId(key); count = (long) orderList.size(); } else { orderList = taoBaoWeiQuanOrderService.listByState(null, pageIndex, Constant.PAGE_SIZE); count = taoBaoWeiQuanOrderService.countByState(null); } int pageSize = Constant.PAGE_SIZE; int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1); PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage); Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new JsonSerializer<Date>() { @Override public JsonElement serialize(Date value, Type theType, JsonSerializationContext context) { if (value == null) { return new JsonPrimitive(""); } else { return new JsonPrimitive(TimeUtil.getGernalTime(value.getTime(), "yyyy-MM-dd HH:mm:ss")); } } }).create(); JSONObject data = new JSONObject(); data.put("pe", pe); data.put("result_list", gson.toJson(orderList)); JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data)); } catch (Exception e) { JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("查询失败")); e.printStackTrace(); } } } fanli/src/main/java/com/yeshi/fanli/dao/mybatis/taobao/TaoBaoWeiQuanOrderMapper.java
@@ -66,4 +66,26 @@ List<TaoBaoWeiQuanOrder> listByState(@Param("state") String state, @Param("start") long start, @Param("count") int count); /** * 根据状态统计数量 * * @param state * @return */ long countByState(@Param("state") String state); /** * 根据订单号检索 * @param orderId * @return */ List<TaoBaoWeiQuanOrder> listByOrderId(String orderId); /** * 根据子订单号检索 * @param tradeId * @return */ TaoBaoWeiQuanOrder selectByOrderItem(String tradeId); } fanli/src/main/java/com/yeshi/fanli/entity/taobao/TaoBaoWeiQuanOrder.java
@@ -41,11 +41,11 @@ private Date createTime;// 创建时间 @Column(name = "tmo_updatetime") private Date updateTime;// 本地更新时间 @Column(name = "tmo_settlement") private BigDecimal settlement;// 结算金额 @Transient private int mate; // 是否已匹配 public Long getId() { return id; } @@ -54,6 +54,14 @@ this.id = id; } public BigDecimal getSettlement() { return settlement; } public void setSettlement(BigDecimal settlement) { this.settlement = settlement; } public Date getCreateTime() { return createTime; } fanli/src/main/java/com/yeshi/fanli/mapping/taobao/TaoBaoWeiQuanOrderMapper.xml
@@ -20,8 +20,9 @@ jdbcType="TIMESTAMP" /> <result column="tmo_createtime" property="createTime" jdbcType="TIMESTAMP" /> <result column="tmo_updatetime" property="updateTime" jdbcType="TIMESTAMP" /> <result column="tmo_settlement" property="settlement" jdbcType="DECIMAL" /> </resultMap> <sql id="Base_Column_List">tmo_id,tmo_order_id,tmo_order_item_id,tmo_goods_name,tmo_money,tmo_fan_money,tmo_state,tmo_jiesuan_time,tmo_weiquan_time,tmo_weiquan_finish_time,tmo_createtime,tmo_updatetime <sql id="Base_Column_List">tmo_id,tmo_order_id,tmo_order_item_id,tmo_goods_name,tmo_money,tmo_fan_money,tmo_state,tmo_jiesuan_time,tmo_weiquan_time,tmo_weiquan_finish_time,tmo_createtime,tmo_updatetime,tmo_settlement </sql> <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long"> @@ -30,23 +31,18 @@ from yeshi_ec_taobao_weiqaun_order where tmo_id = #{id,jdbcType=BIGINT} </select> <select id="selectByOrderIdAndOrderItemId" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from yeshi_ec_taobao_weiqaun_order where tmo_order_id =#{orderId} and tmo_order_item_id=#{orderItemId} </select> <select id="selectListByOrderIdAndState" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from yeshi_ec_taobao_weiqaun_order where tmo_order_id =#{orderId} and tmo_state=#{state} </select> <select id="selectByOrderItemId" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> @@ -54,16 +50,37 @@ </select> <select id="listByOrderId" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from yeshi_ec_taobao_weiqaun_order where tmo_order_id=#{0} </select> <select id="listByState" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from yeshi_ec_taobao_weiqaun_order <if test="state!=null"> where tmo_state like '${state}%' </if> <if test="state!=null">where tmo_state like '${state}%'</if> order by tmo_createtime desc limit #{start},#{count} </select> <select id="countByState" resultType="java.lang.Long" parameterType="java.lang.String"> select count(*) from yeshi_ec_taobao_weiqaun_order <if test="state!=null">where tmo_state like '${state}%'</if> </select> <select id="selectByOrderItem" resultMap="BaseResultMap" parameterType="java.lang.String"> select <include refid="Base_Column_List" /> from yeshi_ec_taobao_weiqaun_order where tmo_order_item_id=#{0} </select> <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">delete from @@ -72,9 +89,9 @@ <insert id="insert" parameterType="com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanOrder" useGeneratedKeys="true" keyProperty="id">insert into yeshi_ec_taobao_weiqaun_order (tmo_id,tmo_order_id,tmo_order_item_id,tmo_goods_name,tmo_money,tmo_fan_money,tmo_state,tmo_jiesuan_time,tmo_weiquan_time,tmo_weiquan_finish_time,tmo_createtime,tmo_updatetime) (tmo_id,tmo_order_id,tmo_order_item_id,tmo_goods_name,tmo_money,tmo_fan_money,tmo_state,tmo_jiesuan_time,tmo_weiquan_time,tmo_weiquan_finish_time,tmo_createtime,tmo_updatetime,tmo_settlement) values (#{id,jdbcType=BIGINT},#{orderId,jdbcType=VARCHAR},#{orderItemId,jdbcType=VARCHAR},#{goodsName,jdbcType=VARCHAR},#{money,jdbcType=DECIMAL},#{fanMoney,jdbcType=DECIMAL},#{state,jdbcType=VARCHAR},#{jieSuanTime,jdbcType=TIMESTAMP},#{weiQuanTime,jdbcType=TIMESTAMP},#{weiQuanFinishTime,jdbcType=TIMESTAMP},#{createTime,jdbcType=TIMESTAMP},#{updateTime,jdbcType=TIMESTAMP}) (#{id,jdbcType=BIGINT},#{orderId,jdbcType=VARCHAR},#{orderItemId,jdbcType=VARCHAR},#{goodsName,jdbcType=VARCHAR},#{money,jdbcType=DECIMAL},#{fanMoney,jdbcType=DECIMAL},#{state,jdbcType=VARCHAR},#{jieSuanTime,jdbcType=TIMESTAMP},#{weiQuanTime,jdbcType=TIMESTAMP},#{weiQuanFinishTime,jdbcType=TIMESTAMP},#{createTime,jdbcType=TIMESTAMP},#{updateTime,jdbcType=TIMESTAMP},#{settlement,jdbcType=DECIMAL}) </insert> <insert id="insertSelective" parameterType="com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanOrder" useGeneratedKeys="true" keyProperty="id"> @@ -92,6 +109,7 @@ <if test="weiQuanFinishTime != null">tmo_weiquan_finish_time,</if> <if test="createTime != null">tmo_createtime,</if> <if test="updateTime != null">tmo_updatetime,</if> <if test="settlement != null">tmo_settlement,</if> </trim> values <trim prefix="(" suffix=")" suffixOverrides=","> @@ -107,6 +125,7 @@ <if test="weiQuanFinishTime != null">#{weiQuanFinishTime,jdbcType=TIMESTAMP},</if> <if test="createTime != null">#{createTime,jdbcType=TIMESTAMP},</if> <if test="updateTime != null">#{updateTime,jdbcType=TIMESTAMP},</if> <if test="settlement != null">#{settlement,jdbcType=DECIMAL}</if> </trim> </insert> <update id="updateByPrimaryKey" parameterType="com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanOrder">update @@ -121,7 +140,8 @@ #{weiQuanTime,jdbcType=TIMESTAMP},tmo_weiquan_finish_time = #{weiQuanFinishTime,jdbcType=TIMESTAMP},tmo_createtime = #{createTime,jdbcType=TIMESTAMP},tmo_updatetime = #{updateTime,jdbcType=TIMESTAMP} where tmo_id = #{id,jdbcType=BIGINT} #{updateTime,jdbcType=TIMESTAMP} ,tmo_settlement =#{settlement,jdbcType=DECIMAL} where tmo_id = #{id,jdbcType=BIGINT} </update> <update id="updateByPrimaryKeySelective" parameterType="com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanOrder"> update yeshi_ec_taobao_weiqaun_order @@ -138,23 +158,16 @@ </if> <if test="createTime != null">tmo_createtime=#{createTime,jdbcType=TIMESTAMP},</if> <if test="updateTime != null">tmo_updatetime=#{updateTime,jdbcType=TIMESTAMP},</if> <if test="settlement !=null">tmo_settlement =#{settlement,jdbcType=DECIMAL},</if> </set> where tmo_id = #{id,jdbcType=BIGINT} </update> <sql id="Column_DateType"> <if test="dateType == 1"> DATE_FORMAT(t.`tmo_weiquan_time`,'%Y-%m-%d') AS 'showDate' <if test="dateType == 1">DATE_FORMAT(t.`tmo_weiquan_time`,'%Y-%m-%d') AS 'showDate' </if> <if test="dateType == 2"> DATE_FORMAT(t.`tmo_weiquan_time`,'%m') AS 'showDate' </if> <if test="dateType == 3"> DATE_FORMAT(t.`tmo_weiquan_time`,'%Y') AS 'showDate' </if> <if test="dateType == 2">DATE_FORMAT(t.`tmo_weiquan_time`,'%m') AS 'showDate'</if> <if test="dateType == 3">DATE_FORMAT(t.`tmo_weiquan_time`,'%Y') AS 'showDate'</if> </sql> <sql id="Count_Select_DateType"> <if test="startTime != null and startTime != '' "> AND DATE_FORMAT(t.`tmo_weiquan_time`,'%Y-%m-%d')<![CDATA[ >= ]]>'${startTime}' @@ -162,38 +175,27 @@ <if test="endTime != null and endTime != '' "> AND DATE_FORMAT(t.`tmo_weiquan_time`,'%Y-%m-%d') <![CDATA[ <= ]]>'${endTime}' </if> <if test="year != null and year != '' "> AND DATE_FORMAT(t.`tmo_weiquan_time`,'%Y') = '${year}' <if test="year != null and year != '' ">AND DATE_FORMAT(t.`tmo_weiquan_time`,'%Y') = '${year}' </if> </sql> <sql id="Count_Group_DateType"> <if test="dateType == 1"> GROUP BY DATE_FORMAT(t.`tmo_weiquan_time`,'%Y-%m-%d') </if> <if test="dateType == 2"> GROUP BY DATE_FORMAT(t.`tmo_weiquan_time`,'%Y-%m') </if> <if test="dateType == 3"> GROUP BY DATE_FORMAT(t.`tmo_weiquan_time`,'%Y') </if> <if test="dateType == 1">GROUP BY DATE_FORMAT(t.`tmo_weiquan_time`,'%Y-%m-%d')</if> <if test="dateType == 2">GROUP BY DATE_FORMAT(t.`tmo_weiquan_time`,'%Y-%m')</if> <if test="dateType == 3">GROUP BY DATE_FORMAT(t.`tmo_weiquan_time`,'%Y')</if> </sql> <select id="countWeiQaunOrderNumber" resultType="java.util.HashMap"> SELECT IFNULL(COUNT(t.`tmo_id`),0) AS showValue, <include refid="Column_DateType" /> FROM yeshi_ec_taobao_weiqaun_order t WHERE t.`tmo_createtime`IS NOT FROM yeshi_ec_taobao_weiqaun_order t WHERE t.`tmo_createtime`IS NOT NULL <include refid="Count_Select_DateType" /> <include refid="Count_Group_DateType" /> ORDER BY t.`tmo_weiquan_time` </select> <select id="countWeiQaunOrderMoney" resultType="java.util.HashMap"> SELECT CAST(SUM(t.`tmo_fan_money`)AS DECIMAL(19,2)) AS showValue, <include refid="Column_DateType" /> FROM yeshi_ec_taobao_weiqaun_order t WHERE t.`tmo_createtime` IS NOT FROM yeshi_ec_taobao_weiqaun_order t WHERE t.`tmo_createtime` IS NOT NULL <include refid="Count_Select_DateType" /> <include refid="Count_Group_DateType" /> fanli/src/main/java/com/yeshi/fanli/service/impl/taobao/TaoBaoWeiQuanDrawBackServiceImpl.java
@@ -103,6 +103,21 @@ userMoneyDebtService.addUserMoneyDebt(debt); } /** * 计算退款金额 * * @param settlement * @param wqMoney * @param hongBaoMoney * @return */ private BigDecimal computeDrawBackMoney(BigDecimal settlement, BigDecimal wqMoney, BigDecimal hongBaoMoney) { BigDecimal money = (hongBaoMoney.multiply(wqMoney)).divide(settlement, 2, BigDecimal.ROUND_UP); if (money.compareTo(hongBaoMoney) > 0) money = hongBaoMoney; return money; } @Transactional @Override public void doWeiQuanFanli(String orderId) throws TaoBaoWeiQuanException { @@ -112,19 +127,6 @@ List<TaoBaoWeiQuanOrder> list = taoBaoWeiQuanOrderService.getWeiQuanSuccessOrders(orderId); if (list == null || list.size() == 0) return; // 查询订单库 List<TaoBaoOrder> orderList = taoBaoOrderMapper.selectTaoBaoOrderByOrderId(orderId); // 计算淘宝联盟返给平台的资金 BigDecimal sumFee = new BigDecimal("0"); for (TaoBaoOrder order : orderList) if (order.getOrderState().equalsIgnoreCase("订单结算")) { sumFee = sumFee.add(order.geteIncome()); if (order.getSubsidy() != null) sumFee = sumFee.add(order.getSubsidy()); } if (new BigDecimal(0).compareTo(sumFee) == 0) throw new TaoBaoWeiQuanException(TaoBaoWeiQuanException.CODE_NEDD_UPDATE_ORDER, "需要更新订单"); // 获取和该订单号有关联的用户 // 获取主红包(同一个订单号的单只会对应同一个用户) List<CommonOrderVO> typeList = new ArrayList<>(); @@ -144,7 +146,16 @@ commonOrderMapper.updateByPrimaryKeySelective(co); HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(vo.getId()); mainHongBaoList.add(hongBaoOrder.getHongBaoV2()); if (hongBaoOrder.getCommonOrder() != null && !StringUtil.isNullOrEmpty(hongBaoOrder.getCommonOrder().getTradeId())) // 查询是否已经维权 { TaoBaoWeiQuanDrawBack drawBack = taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid( hongBaoOrder.getCommonOrder().getTradeId(), hongBaoOrder.getHongBaoV2().getUserInfo().getId()); if (drawBack == null)// 添加还未扣款的子订单 mainHongBaoList.add(hongBaoOrder.getHongBaoV2()); } } if (mainHongBaoList == null || mainHongBaoList.size() == 0) return; @@ -166,7 +177,7 @@ if (mainHongBaoList != null) for (HongBaoV2 hongBao : mainHongBaoList) { if (hongBao.getState() == HongBaoV2.STATE_SHIXIAO) if (hongBao.getState() != HongBaoV2.STATE_YILINGQU) continue; // 累计主红包的金额 if (fanMoneyMap.get(hongBao.getUserInfo().getId()) == null) { @@ -181,28 +192,48 @@ while (its.hasNext()) { Long uid = its.next(); BigDecimal userGetMoney = fanMoneyMap.get(uid); BigDecimal fanMoney = new BigDecimal("0"); BigDecimal wqMoney = new BigDecimal("0"); // 统计用户在这个单中需要扣除的资金 TaoBaoWeiQuanDrawBack weiQuanDrawBack = null; List<TaoBaoWeiQuanDrawBack> newWeiQuanDrawBackList = new ArrayList<>(); BigDecimal settleMent = new BigDecimal(0); for (TaoBaoWeiQuanOrder weiQuanOrder : list) { weiQuanDrawBack = taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(weiQuanOrder.getOrderItemId(), uid); if (weiQuanDrawBack != null) continue; // 计算结算金额 TaoBaoOrder taoBaoOrder = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(weiQuanOrder.getOrderItemId()); if (taoBaoOrder == null) throw new TaoBaoWeiQuanException(101, "未找到子订单相关数据"); if (taoBaoOrder.getSettlement() == null) throw new TaoBaoWeiQuanException(102, "淘宝结算金额为空"); settleMent = settleMent.add(taoBaoOrder.getSettlement()); // 退款的资金 fanMoney = fanMoney.add(weiQuanOrder.getFanMoney()); wqMoney = wqMoney.add(weiQuanOrder.getMoney()); weiQuanDrawBack = new TaoBaoWeiQuanDrawBack(); weiQuanDrawBack.setCreateTime(new Date()); // 暂时设为0 weiQuanDrawBack.setDrawBackMoney(new BigDecimal(0)); CommonOrder commonOrder = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO, weiQuanOrder.getOrderItemId()); HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId()); // 计算退款的资金 BigDecimal drawBack = null; if (hongBaoOrder != null && hongBaoOrder.getHongBaoV2() != null) drawBack = computeDrawBackMoney(commonOrder.getSettlement(), weiQuanOrder.getMoney(), hongBaoOrder.getHongBaoV2().getMoney()); weiQuanDrawBack.setDrawBackMoney(drawBack); weiQuanDrawBack.setOrderId(weiQuanOrder.getOrderId()); weiQuanDrawBack.setOrderItemId(weiQuanOrder.getOrderItemId()); weiQuanDrawBack.setUser(new UserInfo(uid)); newWeiQuanDrawBackList.add(weiQuanDrawBack); } if (fanMoney.compareTo(new BigDecimal("0")) <= 0) if (wqMoney.compareTo(new BigDecimal("0")) <= 0) continue; // 插入记录 @@ -211,30 +242,25 @@ } // 退款金额 BigDecimal drawBackMoney = MoneyBigDecimalUtil.div(userGetMoney.multiply(fanMoney), sumFee); if (drawBackMoney.compareTo(userGetMoney) > 0) drawBackMoney = userGetMoney;// 退款金额不能比获得的金额大 BigDecimal drawBackMoney = computeDrawBackMoney(settleMent, wqMoney, userGetMoney); // 计算资金是否充足 UserInfo user = userInfoMapper.selectByPKey(uid); if (user != null && user.getMyHongBao().compareTo(drawBackMoney) < 0)// 资金不足 { // 添加债务 for (TaoBaoWeiQuanOrder weiQuanOrder : list) { TaoBaoOrder taoBaoOrder = taoBaoOrderMapper .selectTaoBaoOrderByTradeId(weiQuanOrder.getOrderItemId()); for (TaoBaoWeiQuanDrawBack drawBack : newWeiQuanDrawBackList) { TaoBaoOrder taoBaoOrder = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(drawBack.getOrderItemId()); if (taoBaoOrder != null) { BigDecimal totalFee = taoBaoOrder.geteIncome(); if (taoBaoOrder.getSubsidy() != null) totalFee = totalFee.add(taoBaoOrder.getSubsidy()); // TaoBaoWeiQuanOrder weiQuanOrder = taoBaoWeiQuanOrderService .selectByTradeId(drawBack.getOrderItemId()); CommonOrder co = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO, weiQuanOrder.getOrderItemId()); drawBack.getOrderItemId()); if (co != null) { HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(co.getId()); if (hongBaoOrder != null && hongBaoOrder.getHongBaoV2() != null) { BigDecimal drawback = MoneyBigDecimalUtil.div( hongBaoOrder.getHongBaoV2().getMoney().multiply(weiQuanOrder.getFanMoney()), totalFee); BigDecimal drawback = computeDrawBackMoney(taoBaoOrder.getSettlement(), weiQuanOrder.getMoney(), hongBaoOrder.getHongBaoV2().getMoney()); try { addDebt(uid, hongBaoOrder.getHongBaoV2().getId(), drawback); } catch (UserMoneyDebtException e) { @@ -277,19 +303,8 @@ List<TaoBaoWeiQuanOrder> list = taoBaoWeiQuanOrderService.getWeiQuanSuccessOrders(orderId); if (list == null || list.size() == 0) return; // 查询订单库 List<TaoBaoOrder> orderList = taoBaoOrderMapper.selectTaoBaoOrderByOrderId(orderId); // 计算淘宝联盟返给平台的资金 BigDecimal sumFee = new BigDecimal("0"); for (TaoBaoOrder order : orderList) if (order.getOrderState().equalsIgnoreCase("订单结算")) { sumFee = sumFee.add(order.geteIncome()); if (order.getSubsidy() != null) sumFee = sumFee.add(order.getSubsidy()); } // 获取和该订单号有关联的用户 // 获取主红包(同一个订单号的单只会对应同一个用户) List<CommonOrderVO> typeList = new ArrayList<>(); CommonOrderVO cv = new CommonOrderVO(); cv.setSourceType(Constant.SOURCE_TYPE_TAOBAO); @@ -305,9 +320,17 @@ co.setState(CommonOrder.STATE_WQ); co.setUpdateTime(new Date()); commonOrderMapper.updateByPrimaryKeySelective(co); HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(vo.getId()); mainHongBaoList.add(hongBaoOrder.getHongBaoV2()); if (hongBaoOrder.getCommonOrder() != null && !StringUtil.isNullOrEmpty(hongBaoOrder.getCommonOrder().getTradeId())) // 查询是否已经维权 { TaoBaoWeiQuanDrawBack drawBack = taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid( hongBaoOrder.getCommonOrder().getTradeId(), hongBaoOrder.getHongBaoV2().getUserInfo().getId()); if (drawBack == null)// 添加还未扣款的子订单 mainHongBaoList.add(hongBaoOrder.getHongBaoV2()); } } if (mainHongBaoList == null || mainHongBaoList.size() == 0) @@ -317,9 +340,9 @@ Map<Long, BigDecimal> fanMoneyMap = new HashMap<>(); if (mainHongBaoList != null) for (HongBaoV2 hongBao : mainHongBaoList) { for (HongBaoV2 hongBao : mainHongBaoList) {// 统计订单下的所有主红包 hongBao = hongBaoV2Mapper.selectByPrimaryKey(hongBao.getId()); if (hongBao.getState() == HongBaoV2.STATE_SHIXIAO) if (hongBao.getState() != HongBaoV2.STATE_YILINGQU) continue; // 只计入分享赚的红包 @@ -333,12 +356,13 @@ } } // 计算每个用户的返利比例 Iterator<Long> its = fanMoneyMap.keySet().iterator(); // 查询和这个订单有关的用户(主订单) while (its.hasNext()) { Long uid = its.next(); BigDecimal userGetMoney = fanMoneyMap.get(uid); BigDecimal fanMoney = new BigDecimal("0"); BigDecimal wqMoney = new BigDecimal("0"); BigDecimal settleMent = new BigDecimal("0"); // 统计用户在这个单中需要扣除的资金 TaoBaoWeiQuanDrawBack weiQuanDrawBack = null; @@ -348,24 +372,44 @@ uid); if (weiQuanDrawBack != null) continue; // 计算结算金额 TaoBaoOrder taoBaoOrder = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(weiQuanOrder.getOrderItemId()); if (taoBaoOrder == null) throw new TaoBaoWeiQuanException(101, "未找到子订单相关数据"); if (taoBaoOrder.getSettlement() == null) throw new TaoBaoWeiQuanException(102, "淘宝结算金额为空"); settleMent = settleMent.add(taoBaoOrder.getSettlement()); // 退款的资金 fanMoney = fanMoney.add(weiQuanOrder.getFanMoney()); wqMoney = wqMoney.add(weiQuanOrder.getMoney()); // 插入记录 weiQuanDrawBack = new TaoBaoWeiQuanDrawBack(); weiQuanDrawBack.setCreateTime(new Date()); // TODO 暂时设为0 weiQuanDrawBack.setDrawBackMoney(new BigDecimal(0)); // 计算退款资金 CommonOrder commonOrder = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO, weiQuanOrder.getOrderItemId()); HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId()); // 计算退款的资金 BigDecimal drawBack = null; if (hongBaoOrder != null && hongBaoOrder.getHongBaoV2() != null) drawBack = computeDrawBackMoney(commonOrder.getSettlement(), weiQuanOrder.getMoney(), hongBaoOrder.getHongBaoV2().getMoney()); weiQuanDrawBack.setDrawBackMoney(drawBack); weiQuanDrawBack.setOrderId(weiQuanOrder.getOrderId()); weiQuanDrawBack.setOrderItemId(weiQuanOrder.getOrderItemId()); weiQuanDrawBack.setUser(new UserInfo(uid)); newWeiQuanDrawBackList.add(weiQuanDrawBack); } if (fanMoney.compareTo(new BigDecimal("0")) <= 0) if (wqMoney.compareTo(new BigDecimal("0")) <= 0) continue; // 退款金额 BigDecimal drawBackMoney = MoneyBigDecimalUtil.div(userGetMoney.multiply(fanMoney), sumFee); BigDecimal drawBackMoney = computeDrawBackMoney(settleMent, wqMoney, userGetMoney); if (drawBackMoney.compareTo(userGetMoney) > 0) drawBackMoney = userGetMoney; @@ -376,46 +420,22 @@ if (user != null && user.getMyHongBao().compareTo(drawBackMoney) < 0)// 资金不足 { // 添加债务 for (TaoBaoWeiQuanOrder weiQuanOrder : list) { TaoBaoOrder taoBaoOrder = taoBaoOrderMapper .selectTaoBaoOrderByTradeId(weiQuanOrder.getOrderItemId()); for (TaoBaoWeiQuanDrawBack drawBack : newWeiQuanDrawBackList) { TaoBaoOrder taoBaoOrder = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(drawBack.getOrderItemId()); if (taoBaoOrder != null) { BigDecimal totalFee = taoBaoOrder.geteIncome(); if (taoBaoOrder.getSubsidy() != null) totalFee = totalFee.add(taoBaoOrder.getSubsidy()); // TaoBaoWeiQuanOrder weiQuanOrder = taoBaoWeiQuanOrderService .selectByTradeId(drawBack.getOrderItemId()); BigDecimal settleMentMoney = taoBaoOrder.getSettlement(); CommonOrder co = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO, weiQuanOrder.getOrderItemId()); if (co != null) { HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(co.getId()); BigDecimal drawback = MoneyBigDecimalUtil.div( hongBaoOrder.getHongBaoV2().getMoney().multiply(weiQuanOrder.getFanMoney()), totalFee); BigDecimal drawback = computeDrawBackMoney(settleMentMoney, weiQuanOrder.getMoney(), hongBaoOrder.getHongBaoV2().getMoney()); try { addDebt(uid, hongBaoOrder.getHongBaoV2().getId(), drawback); } catch (UserMoneyDebtException e) { throw new TaoBaoWeiQuanException(101, "资金借贷异常"); } if (hongBaoOrder != null && hongBaoOrder.getHongBaoV2() != null) { List<HongBaoV2> hongBaoList = hongBaoV2Mapper .listChildrenById(hongBaoOrder.getHongBaoV2().getId()); for (int i = 0; i < hongBaoList.size(); i++) { if (hongBaoList.get(i).getUserInfo().getId().longValue() != uid) { hongBaoList.remove(i); i--; } } for (HongBaoV2 hb : hongBaoList) { drawback = MoneyBigDecimalUtil .div(hb.getMoney().multiply(weiQuanOrder.getFanMoney()), totalFee); try { addDebt(hb.getUserInfo().getId(), hb.getId(), drawback); } catch (UserMoneyDebtException e) { throw new TaoBaoWeiQuanException(101, "资金借贷异常"); } } } } } @@ -435,11 +455,8 @@ } } userMoneyService.subUserMoney(uid, drawBackMoney, userMoneyDetail); userMoneyMsgNotificationService.shareOrderWeiQuan(uid, orderId, drawBackMoney, userInfoMapper.selectByPrimaryKey(uid).getMyHongBao()); userNotificationService.weiQuanTiCheng(uid, orderId, drawBackMoney); } } @@ -455,14 +472,12 @@ // 查询订单库 for (TaoBaoWeiQuanOrder weiQuanOrder : list) { TaoBaoOrder taoBaoOrder = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(weiQuanOrder.getOrderItemId()); BigDecimal fanMoney = weiQuanOrder.getFanMoney(); BigDecimal wqMoney = weiQuanOrder.getMoney(); if (taoBaoOrder == null) throw new TaoBaoWeiQuanException(1, "来源交易ID有误"); BigDecimal sumFee = new BigDecimal("0"); BigDecimal settleMent = new BigDecimal("0"); if (taoBaoOrder.getOrderState().equalsIgnoreCase("订单结算")) { sumFee = sumFee.add(taoBaoOrder.geteIncome()); if (taoBaoOrder.getSubsidy() != null) sumFee = sumFee.add(taoBaoOrder.getSubsidy()); settleMent = settleMent.add(taoBaoOrder.getSettlement()); } // 查询下级子用户 @@ -487,9 +502,7 @@ .selectByOrderItemIdAndUid(weiQuanOrder.getOrderItemId(), child.getUserInfo().getId()); if (weiQuanDrawBack != null) continue; BigDecimal drawBackMoney = MoneyBigDecimalUtil.div(child.getMoney().multiply(fanMoney), sumFee); if (drawBackMoney.compareTo(child.getMoney()) > 0) drawBackMoney = child.getMoney(); BigDecimal drawBackMoney = computeDrawBackMoney(settleMent, wqMoney, child.getMoney()); weiQuanDrawBack = new TaoBaoWeiQuanDrawBack(); weiQuanDrawBack.setCreateTime(new Date()); weiQuanDrawBack.setDrawBackMoney(drawBackMoney); fanli/src/main/java/com/yeshi/fanli/service/impl/taobao/TaoBaoWeiQuanOrderServiceImpl.java
@@ -90,4 +90,19 @@ return taoBaoWeiQuanOrderMapper.listByState(state, (page - 1) * pageSize, pageSize); } @Override public long countByState(String state) { return taoBaoWeiQuanOrderMapper.countByState(state); } @Override public List<TaoBaoWeiQuanOrder> listByOrderId(String orderId) { return taoBaoWeiQuanOrderMapper.listByOrderId(orderId); } @Override public TaoBaoWeiQuanOrder selectByTradeId(String tradeId) { return taoBaoWeiQuanOrderMapper.selectByOrderItem(tradeId); } } fanli/src/main/java/com/yeshi/fanli/service/inter/taobao/TaoBaoWeiQuanOrderService.java
@@ -20,23 +20,46 @@ * @return */ public List<TaoBaoWeiQuanOrder> getWeiQuanSuccessOrders(String orderId); /** * 根据订单检索 * * @param orderId * @return */ public List<TaoBaoWeiQuanOrder> listByOrderId(String orderId); /** * 根据交易ID查询维权状态 * * @param tradeId * @return */ public TaoBaoWeiQuanOrder listByorderItemId(String tradeId); /** * 根据状态检索 * * @param state * @param page * @param pageSize * @return */ public List<TaoBaoWeiQuanOrder> listByState(String state,int page,int pageSize); public List<TaoBaoWeiQuanOrder> listByState(String state, int page, int pageSize); /** * 根据状态统计数据 * * @param state * @return */ public long countByState(String state); /** * * @param tradeId * @return */ public TaoBaoWeiQuanOrder selectByTradeId(String tradeId); }