package com.szwl.controller; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; import com.szwl.constant.AirwallexConstant; import com.szwl.constant.HuifuConstant; import com.szwl.feign.bean.SzwlFeign; import com.szwl.mapper.TCoinOrderMapper; import com.szwl.model.bo.R; import com.szwl.model.bo.ResponseModel; import com.szwl.model.entity.*; import com.szwl.service.TAirwallexMchService; import com.szwl.service.TAirwallexWalletService; import com.szwl.service.TCoinOrderService; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang.StringUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Iterator; import java.util.List; import java.util.Objects; /** *

* 前端控制器 *

* * @author wuhs * @since 2023-08-29 */ @RestController @RequestMapping("/tCoinOrder") public class TCoinOrderController { TCoinOrderService coinOrderService; SzwlFeign szwlFeign; TAirwallexWalletService airwallexWalletService; @Resource TCoinOrderMapper coinOrderMapper; public TCoinOrderController(TCoinOrderService coinOrderService, SzwlFeign szwlFeign, TAirwallexWalletService airwallexWalletService) { this.coinOrderService = coinOrderService; this.szwlFeign = szwlFeign; this.airwallexWalletService = airwallexWalletService; } @ApiOperation(value = "查询某范围内的设备的订单总和") @GetMapping("/sumPriceLatLon") public ResponseModel sumPriceLatLon(String latitude1, String latitude2, String longitude1, String longitude2){ if (StringUtils.isEmpty(latitude1) || StringUtils.isEmpty(latitude2) || StringUtils.isEmpty(longitude1) || StringUtils.isEmpty(longitude2)) { return R.fail("参数不能为空"); } // 根据经纬度查设备信息 List equipmentsByLatLon = R.getDataIfSuccess(szwlFeign.getEquipmentByLatLon(latitude1, latitude2, longitude1, longitude2)); if (equipmentsByLatLon.isEmpty()) { return R.ok(0); } BigDecimal sumPrice = new BigDecimal(0); for (TEquipment equipment : equipmentsByLatLon) { String clientId = equipment.getClientId(); // 根据clientId查订单总额 BigDecimal priceByClientId = coinOrderMapper.sumPriceByClientId(clientId); if (Objects.nonNull(priceByClientId)) { sumPrice = sumPrice.add(priceByClientId); } } return R.ok(equipmentsByLatLon.size() + "台设备的总销售额是:" + sumPrice); } @ApiOperation(value = "添加海外订单") @PostMapping("/addCoinOrder") public ResponseModel addCoinOrder(@RequestBody TCoinOrder coinOrder) { boolean save = coinOrderService.save(coinOrder); return R.ok(save); } /** * 获取 Airwallex 分销明细 * * @param proportion * @param price * @return */ public ObjectNode getDistributionDetails(TProportion proportion, BigDecimal price) { // 获取分账有几方:0:分账方2个,1:分账方3个,2:分账方4个,3:分账方超4个 Integer type = proportion.getType(); // 空中云汇 分账明细参数 // ArrayNode altInfos = new ObjectMapper().createArrayNode(); ArrayNode altInfos = JsonNodeFactory.instance.arrayNode(); ObjectNode distributionDetails = JsonNodeFactory.instance.objectNode(); BigDecimal airProportion = null, // 空中云汇平台分销百分比,假设是0 selfProportion = null, // 商家自己的分销百分比 agencyProportion = null, // 一级分销商分销百分比 merchantProportion = null; // 二级分销商分销百分比 BigDecimal airAmount = null, // 空中云汇的钱,假设是0 selfAmount = null, // 商家自己所得的钱 agencyAmount = null, // 一级分销商所得的钱 merchantAmount = null; // 二级分销商所得的钱 TAirwallexWallet selfAirWallet = null, // 商家收款信息 agencyAirWallet = null, // 一级分销商收款信息 merchantAirWallet = null; // 二级分销商收款信息 ObjectNode airJson = null, // 空中云汇 selfJson = null, // 商家 agencyJson = null, // 一级 merchantJson = null; // 二级 // 取消平台扣手续费,将price四舍五入保留2位小数 BigDecimal cutPrice = price.setScale(2, RoundingMode.HALF_UP); BigDecimal refuseAmount = new BigDecimal(0.00); switch (type) { case 0: // 分账方有2个:申泽admin + 商家proportion // 目前都暂定空中云汇平台分销为 0 // airProportion = proportion.getAdminProportion(); // 申泽的分销 eg.1% 不显示 // adminProportion = proportion.getAdminProportion(); // 商家自己的分销 selfProportion = proportion.getProportion(); // 平台分销获得利润 // airAmount = cutPrice.multiply(airProportion.divide(new BigDecimal(100))).setScale(2, RoundingMode.HALF_UP); // 商家分销获得利润,五舍六入 selfAmount = cutPrice.multiply(selfProportion.divide(new BigDecimal(100))).setScale(2, RoundingMode.HALF_DOWN); // Airwallex 平台收款信息表 // Long adminId = proportion.getAdminId(); LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.eq(TAirwallexWallet::getAdminId, proportion.getAdminId()); selfAirWallet = airwallexWalletService.getOne(wrapper); // 平台分销 // airJson = JsonNodeFactory.instance.objectNode(); // // 分账方受益人编号 // airJson.put("altMchId", selfAirMch.getBeneficiaryId()); // // 受益人所分金额,单位美元$ // airJson.put("altAirAmount", airAmount.toString()); // altInfos.add(airJson); // 商家分销 selfJson = JsonNodeFactory.instance.objectNode(); selfJson.put("airBeneId", selfAirWallet.getAdminId()); selfJson.put("airAmount", selfAmount.toString()); altInfos.add(selfJson); break; case 1: // 分账方有3个:申泽admin + 商家proportion + 商家一级agency // 商家自己的分销 selfProportion = proportion.getProportion(); // 一级代理的分销 agencyProportion = proportion.getAgencyProportion(); // 商家分销获得利润 selfAmount = cutPrice.multiply(selfProportion.divide(new BigDecimal(100))).setScale(2, RoundingMode.HALF_DOWN); // Airwallex 平台收款信息表 agencyAirWallet = airwallexWalletService.getAirWallet(proportion.getAgencyId()); selfAirWallet = airwallexWalletService.getAirWallet(proportion.getAdminId()); if (!(agencyProportion.compareTo(refuseAmount) == 0 || agencyProportion == null)) { // 一级代理获得利润 agencyAmount = cutPrice.multiply(agencyProportion.divide(new BigDecimal(100))).setScale(2, RoundingMode.HALF_DOWN); agencyJson = JsonNodeFactory.instance.objectNode(); agencyJson.put("airBeneId", agencyAirWallet.getAdminId()); agencyJson.put("airAmount", agencyAmount.toString()); altInfos.add(agencyJson); } // 商家自己获得利润 selfJson = JsonNodeFactory.instance.objectNode(); selfJson.put("airBeneId", selfAirWallet.getAdminId()); selfJson.put("airAmount", selfAmount.toString()); altInfos.add(selfJson); break; case 2: // 分账方有4个:申泽admin + 商家self + 商家一级agency + 商家二级merchant // 商家自己的分销 selfProportion = proportion.getProportion(); // 一级代理的分销 agencyProportion = proportion.getAgencyProportion(); // 二级代理的分销 merchantProportion = proportion.getMerchantProportion(); // 商家分销获得利润,五舍六入 selfAmount = cutPrice.multiply(selfProportion.divide(new BigDecimal(100))).setScale(2, RoundingMode.HALF_DOWN); // Airwallex 平台收款信息表 selfAirWallet = airwallexWalletService.getAirWallet(proportion.getAdminId()); agencyAirWallet = airwallexWalletService.getAirWallet(proportion.getAgencyId()); merchantAirWallet = airwallexWalletService.getAirWallet(proportion.getMerchantId()); if (!(agencyProportion.compareTo(refuseAmount) == 0 || agencyProportion == null)) { // 一级代理获得利润 agencyAmount = cutPrice.multiply(agencyProportion.divide(new BigDecimal(100))).setScale(2, RoundingMode.HALF_DOWN); agencyJson = JsonNodeFactory.instance.objectNode(); agencyJson.put("airBeneId", agencyAirWallet.getAdminId()); agencyJson.put("airAmount", agencyAmount.toString()); altInfos.add(agencyJson); } if (!(merchantProportion.compareTo(refuseAmount) == 0 || merchantProportion == null)) { // 二级经销商获得利润 merchantAmount = cutPrice.multiply(merchantProportion.divide(new BigDecimal(100))).setScale(2, RoundingMode.HALF_DOWN); merchantJson = JsonNodeFactory.instance.objectNode(); merchantJson.put("airBeneId", merchantAirWallet.getAdminId()); merchantJson.put("airAmount", merchantAmount.toString()); altInfos.add(merchantJson); } // 商家自己获得利润 selfJson = JsonNodeFactory.instance.objectNode(); selfJson.put("airBeneId", selfAirWallet.getAdminId()); selfJson.put("airAmount", selfAmount.toString()); altInfos.add(selfJson); break; case 3: // 分账方超过4个:申泽admin + 商家self + 商家一级agency + 商家二级merchant + 商家三级personage // personageProportion = proportion.getPersonageProportion(); break; } // 计算airAmount的总和 BigDecimal sumAmount = BigDecimal.ZERO; Iterator iterator = altInfos.iterator(); while (iterator.hasNext()) { JsonNode jsonNode = iterator.next(); String airAmounts = jsonNode.get("airAmount").asText(); if (airAmounts.equals("0.00")) { iterator.remove(); } if (jsonNode.has("airAmount")) { BigDecimal airAmountSum = new BigDecimal(jsonNode.get("airAmount").asText()); sumAmount = sumAmount.add(airAmountSum); } } // 如果sumAmount大于原本price if (sumAmount.compareTo(price) > 0) { BigDecimal subtract = sumAmount.subtract(price); Iterator iterator1 = altInfos.iterator(); while (iterator1.hasNext()) { JsonNode jsonNode = iterator1.next(); String airBeneId = jsonNode.get("airBeneId").asText(); // String airBeneId1 = jsonNode.get("airBeneId").toString(); if (airBeneId.equals(AirwallexConstant.clientid)) { BigDecimal airAmount1 = new BigDecimal(jsonNode.get("airAmount").asText()); BigDecimal fixAirAmount = airAmount1.subtract(subtract).max(BigDecimal.ZERO); // ObjectMapper objectMapper = new ObjectMapper(); // ObjectNode objectNode = objectMapper.convertValue(jsonNode, ObjectNode.class); // objectNode.put("airAmount", fixAirAmount.toString()); ((ObjectNode) jsonNode).put("airAmount", fixAirAmount.toString()); break; } } } distributionDetails.put("alt_infos", altInfos); return distributionDetails; } }