package com.caimei.modules.order.util; import com.alibaba.fastjson.JSON; import com.caimei.modules.order.constant.Constant; import com.caimei.modules.order.dao.*; import com.caimei.modules.order.entity.*; import com.caimei.modules.order.service.CmReturnedPurchaseService; import com.caimei.modules.order.service.NewOrderService; import com.caimei.utils.*; import com.caimei.utils.payUtil.MyBeanUtils; import com.caimei.utils.payUtil.RSA; import com.caimei.utils.payUtil.SettlePostFormUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; import static sun.management.snmp.jvminstr.JvmThreadInstanceEntryImpl.ThreadStateMap.Byte1.other; /** * @author zzj */ @Slf4j @Component public class OrderUtils { @Resource private OrderPayUtils orderPayUtil; @Resource private OrderUserInfoDao orderUserInfoDao; @Resource private NewOrderDao newOrderDao; @Resource private RedisService redisService; @Resource private PayShopDao payShopDao; @Resource private NewShopOrderDao shopOrderDao; @Resource private CmReturnedPurchaseDao returnDao; @Resource private NewOrderProductDao newOrderProductDao; @Resource private CmDiscernReceiptDao receiptDao; @Resource private NewOrderService newOrderService; @Resource private CmDiscernReceiptDao cmDiscernReceiptDao; /** * 计算子订单应付 * * @param shopOrder */ public NewShopOrder getShouldPay(NewShopOrder shopOrder) { setShopOrderStatus(shopOrder); List products = payShopDao.findPayOrderProducts(shopOrder.getShopOrderId()); shopOrder.setShopOrderNos(payShopDao.findShopOrderNos(shopOrder.getOrderId())); AtomicReference organizeFee = new AtomicReference<>(); AtomicReference shopFee = new AtomicReference<>(); AtomicReference totalAmount = new AtomicReference<>(); products.forEach(p -> { // 商品总价 * 供应商成本比例 - 手续费 = 应付供应商 shopFee.set(MathUtil.add(MathUtil.mul(p.getTotalAmount(), MathUtil.div(p.getShopPercent(), 100), 2), shopFee.get())); // 商品总价 * 组织佣金比例 = 应付组织 organizeFee.set(MathUtil.add(MathUtil.mul(p.getTotalAmount(), MathUtil.div(p.getOrganizePercent(), 100), 2), organizeFee.get())); // 商品总价 totalAmount.set(MathUtil.add(p.getTotalAmount(), totalAmount.get())); /** * 确认收货信息 */ if (NewOrderStatus.hasReceived(shopOrder.getShopStatus())) { Integer receivedNum = newOrderProductDao.getReceivedNum(p.getOrderProductId()); p.setReceivedNum(receivedNum); } }); shopOrder.setNewOrderProducts(products); // 子订单总额 - 付供应商成本 - 付组织 = 应付采美 Double cmFee = MathUtil.sub(totalAmount.get(), MathUtil.add(shopFee.get(), organizeFee.get())).doubleValue(); List relations = payShopDao.findOrderRelations(shopOrder.getOrderId()); // 线上手续费 AtomicReference totalCharge = new AtomicReference<>(); // 子订单总收款 AtomicReference receiptTotal = new AtomicReference<>(); // 线上标记 AtomicReference onlineFlag = new AtomicReference(false); relations.forEach(r -> { double charge = 0; // 线上手续费 if (1 == r.getPayWay()) { onlineFlag.set(true); if (12 == r.getPayType()) { // 企业网银 charge = 10; } else if (8 == r.getPayType() || 13 == r.getPayType() || 15 == r.getPayType()) { // 微信 charge = Math.max(MathUtil.mul(r.getAssociateAmount(), 0.0065, 2).doubleValue(), 0.01); } else if (29 == r.getPayType()) { // 快捷支付借记卡 charge = Math.max(MathUtil.mul(r.getAssociateAmount(), 0.003, 2).doubleValue(), 0.1); } else if (30 == r.getPayType()) { // 快捷支付贷记卡 charge = Math.max(MathUtil.mul(r.getAssociateAmount(), 0.006, 2).doubleValue(), 0.1); } else if (17 == r.getPayType()) { // 个人网银 charge = Math.max(MathUtil.mul(r.getAssociateAmount(), 0.002, 2).doubleValue(), 0.1); } else if (14 == r.getPayType()) { // 支付宝 charge = Math.max(MathUtil.mul(r.getAssociateAmount(), 0.0025, 2).doubleValue(), 0.01); } } totalCharge.set(MathUtil.add(totalCharge.get(), charge).doubleValue()); receiptTotal.set(MathUtil.add(r.getAssociateAmount(), receiptTotal.get()).doubleValue()); }); // 应付供应商 Double v = MathUtil.sub(shopFee.get(), totalCharge.get()).doubleValue(); Double shopPostFee = 0d; if (!onlineFlag.get() && shopOrder.getShopPostFee() > 0) { shopPostFee = shopOrder.getShopPostFee(); // 线下收付款,有供应商运费 付供应商 = 付供应商 + 供应商运费 v = v + shopOrder.getShopPostFee(); } // 线下已付采美 Double paidCm = shopOrder.getPayCmAmount(); // 线下已付供应商 Double paidShop = shopOrder.getPayedShopAmount(); // 线下由组织代收款,已收金额减已付采美和供应商则为已付组织 Double paidOrganize = MathUtil.sub(receiptTotal.get(), (MathUtil.add(paidCm, paidShop))).doubleValue(); Double waitSettleShop = 0d; Double waitSettleCm = 0d; Double waitSettleOrganize = 0d; Double settleShop = 0d; Double settleCm = 0d; Double settleOrganize = 0d; Double shouldSettleShop = 0d; Double shouldSettleCm = 0d; Double shouldSettleOrganize = 0d; if (onlineFlag.get()) { /** 减0.1%分账手续费 * 最低手续费 0.01,计算金额与原金额相等时 - 0.01 */ Double splitCmFee = MathUtil.div(cmFee, 1.001, 2).doubleValue(); if (cmFee.equals(splitCmFee)) { cmFee = cmFee - 0.01; } else { cmFee = splitCmFee; } Double splitShop = MathUtil.div(v, 1.001, 2).doubleValue(); if (v.equals(splitShop)) { v = v - 0.01; } else { v = splitShop; } // 线上已付采美 paidCm = payShopDao.findOnlinePayCm(shopOrder.getShopOrderId(), 3); // 线上已付供应商 paidShop = payShopDao.findOnlinePayCm(shopOrder.getShopOrderId(), 1); // 线上已付组织 paidOrganize = payShopDao.findOnlinePayCm(shopOrder.getShopOrderId(), 5); shopOrder.setPayCmAmount(paidCm); shopOrder.setPayedShopAmount(paidShop); // 未结供应商 = 应付 - 已结 settleShop = payShopDao.findSettleSum(shopOrder.getShopOrderId(), 1); waitSettleShop = MathUtil.sub(v, settleShop).doubleValue(); settleCm = payShopDao.findSettleSum(shopOrder.getShopOrderId(), 2); waitSettleCm = MathUtil.sub(cmFee, settleCm).doubleValue(); settleOrganize = payShopDao.findSettleSum(shopOrder.getShopOrderId(), 3); waitSettleOrganize = MathUtil.sub(organizeFee.get(), settleOrganize).doubleValue(); shouldSettleShop = v; shouldSettleCm = cmFee; shouldSettleOrganize = organizeFee.get().doubleValue(); } shopOrder.setWaitSettleShop(waitSettleShop); shopOrder.setWaitSettleCm(waitSettleCm); shopOrder.setWaitSettleOrganize(waitSettleOrganize); shopOrder.setSettleShopAmount(settleShop); shopOrder.setSettleCmAmount(settleCm); shopOrder.setSettleOrganizeAmount(settleOrganize); shopOrder.setShouldSettleShop(shouldSettleShop); shopOrder.setShouldSettleOrganize(shouldSettleOrganize); shopOrder.setShouldSettleCm(shouldSettleCm); // 待付组织 = 应付 - 已付 Double wait = MathUtil.sub(organizeFee.get(), paidOrganize).doubleValue(); shopOrder.setWaitPayOrganize(wait); shopOrder.setShouldPayOrganize(organizeFee.get().doubleValue()); shopOrder.setPaidOrganize(paidOrganize); shopOrder.setPayedShopAmount(paidShop); shopOrder.setPayCmAmount(paidCm); shopOrder.setBrokerage(organizeFee.get().doubleValue()); shopOrder.setWaitPayCmAmount(MathUtil.sub(cmFee, paidCm).doubleValue()); // 待付不加供应商运费 shopOrder.setWaitPayShop(MathUtil.sub(v, MathUtil.add(paidShop, shopPostFee)).doubleValue()); shopOrder.setShouldPayCmAmount(cmFee); shopOrder.setShouldPayShopAmount(v); shopOrder.setReceiptTotalFee(receiptTotal.get()); return shopOrder; } /** * @param P2_orderId 结算合利宝订单Id * @param settleAmount 结算金额 * @param P3_customerNumber 结算帐号 * @param shopOrderId 子订单Id * @param settleFlag 结算类型 * @throws Exception */ @Transactional(readOnly = false, rollbackFor = Exception.class) public void settleOrder(String P2_orderId, Double settleAmount, String P3_customerNumber, Integer shopOrderId, Integer settleFlag) throws Exception { //子订单id,结算金额 Map sPara = new HashMap(); sPara.put("P1_bizType", "MerchantSettlement"); sPara.put("P2_orderId", P2_orderId); sPara.put("P3_customerNumber", P3_customerNumber); sPara.put("P4_amount", settleAmount.toString()); sPara.put("P5_summary", "订单结算"); sPara.put("signType", "RSA"); StringBuffer sb = new StringBuffer(); sb.append(Constant.SPLIT).append("MerchantSettlement").append(Constant.SPLIT).append(P2_orderId).append(Constant.SPLIT) .append(P3_customerNumber).append(Constant.SPLIT).append(settleAmount).append(Constant.SPLIT).append("订单结算") .append(Constant.SPLIT).append("RSA"); String sign = RSA.sign(sb.toString(), RSA.getPrivateKey(Constant.signKey_setttlement)); sPara.put("sign", sign); log.info("发送结算参数-----------------------》" + sPara); SettleResult settleResult = SettlePostFormUtil.postForm(sPara, Constant.JS, sign, SettleResult.class); if (!"0000".equals(settleResult.getRt2_retCode())) { log.info("settleResult----------------->" + settleResult.toString()); throw new Exception("结算失败!"); } else { String assemblyRespOriSign = ""; assemblyRespOriSign = MyBeanUtils.getSignedByPresetParameter(settleResult, SettleResult.NEED_SIGN_PARAMS); assemblyRespOriSign += Constant.JIESUAN; String checkSign = Disguiser.disguiseMD5(assemblyRespOriSign.trim()); if (!checkSign.equals(settleResult.getSign())) { log.info("settleResult----------------->" + settleResult.toString()); throw new Exception("结算验签失败!"); } else { SettleRecord settleRecord = new SettleRecord(); //存结算表,改子订单结算状态 if (1 == settleFlag) { //成本结算 settleRecord.setSettleType(settleFlag); settleRecord.setSettleAmount(settleAmount); settleRecord.setSplitCode(P3_customerNumber); settleRecord.setShopOrderId(shopOrderId); payShopDao.insertSettleRecord(settleRecord); // 修改cm_split_account settlestatus payShopDao.updateSettleStatus(shopOrderId, 1); //计算供应商成本,结算金额,修改结算状态 Double shouldPayShopAmount = payShopDao.findShouldPayShopAmount(shopOrderId); Double settleSum = payShopDao.findSettleSum(shopOrderId, 1); if (shouldPayShopAmount > settleSum) { //成本>结算金额,部分结算 payShopDao.updateShopOrderSettleStatus(shopOrderId, 2); } else { //成本=结算金额 全部结算 payShopDao.updateShopOrderSettleStatus(shopOrderId, 3); } } else { // 佣金结算 3采美 5 联合丽格 6冷链非 Integer newFlag = 0; if (3 == settleFlag) { newFlag = 2; } else if (5 == settleFlag) { newFlag = 3; } else if (6 == settleFlag) { newFlag = 4; } settleRecord.setSettleType(newFlag); settleRecord.setSettleAmount(settleAmount); settleRecord.setSplitCode(P3_customerNumber); settleRecord.setShopOrderId(shopOrderId); payShopDao.insertSettleRecord(settleRecord); // 最后佣金结算修改cm_split_account settlestatus payShopDao.updateSettleStatus(shopOrderId, settleFlag); } } } } public NewOrder setOrderPostInfo(NewOrder order) { NewShopOrder shopOrder = shopOrderDao.findColdChain(order.getOrderId()); if (null != shopOrder) { order.setPostageInfo("2".equals(shopOrder.getShopPostFlag()) ?"到付": "0".equals(shopOrder.getShopPostFlag())?"包邮":"¥" + shopOrder.getShopPostFee()); } else { /** * 没有运费订单 */ order.setPostageInfo("¥ 0.00"); } if(null!=order.getNewShopOrders()){ for (NewShopOrder newShopOrder : order.getNewShopOrders()) { BigDecimal add = MathUtil.add(newShopOrder.getReceiptAmount(),cmDiscernReceiptDao.findShoOrderIDReceipt(newShopOrder.getShopOrderId())); double v = add.doubleValue(); newShopOrder.setReceiptAmount(v); BigDecimal sub = MathUtil.sub( // newShopOrder.getWaitPayShop() newShopOrder.getRealPay() != null ? newShopOrder.getRealPay() : newShopOrder.getNeedPayAmount() , newShopOrder.getReceiptAmount()); newShopOrder.setRestAmount(sub.doubleValue()); String shopPostFlag = newShopOrder.getShopPostFlag()!=null?newShopOrder.getShopPostFlag():"2"; String PostageInfo = shopPostFlag.equals("2") ? "到付" : shopPostFlag.equals("0") ? "包邮" : "¥" + newShopOrder.getShopPostFee(); //支付凭证 List vouchers = newOrderService.findVoucher(newShopOrder.getShopOrderId()); newShopOrder.setPostageInfo(PostageInfo); newShopOrder.setVouchers(vouchers); if ("1".equals( newShopOrder.getShopStatus() )) { if ( "1".equals(newShopOrder.getReceiptStatus()) && "1".equals( newShopOrder.getSendOutStatus())){ newShopOrder.setShopStatus("11"); } else if ( "1".equals( newShopOrder.getReceiptStatus()) && "2".equals( newShopOrder.getSendOutStatus())) { newShopOrder.setShopStatus("12"); } else if ( "1".equals( newShopOrder.getReceiptStatus()) && "3".equals( newShopOrder.getSendOutStatus())) { newShopOrder.setShopStatus("13"); } else if ( "2".equals( newShopOrder.getReceiptStatus()) && "1".equals( newShopOrder.getSendOutStatus())) { newShopOrder.setShopStatus("21"); } else if ( "2".equals( newShopOrder.getReceiptStatus()) && "2".equals( newShopOrder.getSendOutStatus())) { newShopOrder.setShopStatus("22"); } else if ( "2".equals( newShopOrder.getReceiptStatus()) && "3".equals( newShopOrder.getSendOutStatus())) { newShopOrder.setShopStatus("23"); } else if ( "3".equals( newShopOrder.getReceiptStatus()) && "1".equals( newShopOrder.getSendOutStatus())) { newShopOrder.setShopStatus("31"); } else if ( "3".equals( newShopOrder.getReceiptStatus()) && "2".equals( newShopOrder.getSendOutStatus())) { newShopOrder.setShopStatus("32"); } else if ( "3".equals( newShopOrder.getReceiptStatus()) && "3".equals( newShopOrder.getSendOutStatus())) { newShopOrder.setShopStatus("33"); } } } } return order; } public NewOrder setOrderValue(NewOrder order) { List shopOrders = shopOrderDao.findListByOrderId(order.getOrderId()); shopOrders.forEach(this::getShouldPay); order.setNewShopOrders(shopOrders); order.setAlreadyReceipt(shopOrders.get(0).getReceiptTotalFee()); Double totalPayShop = shopOrders.stream().mapToDouble(NewShopOrder::getShouldPayShopAmount).sum(); Double totalPayCm = shopOrders.stream().mapToDouble(NewShopOrder::getShouldPayCmAmount).sum(); order.setPayableAmount(MathUtil.add(totalPayShop, totalPayCm).doubleValue()); Double totalPaidShop = shopOrders.stream().mapToDouble(NewShopOrder::getPayedShopAmount).sum(); Double totalPaidCm = shopOrders.stream().mapToDouble(NewShopOrder::getPayCmAmount).sum(); order.setPaidAmount(MathUtil.add(totalPaidCm, totalPaidShop).doubleValue()); setRefundVal(order); setOrderPostInfo(order); // 设置基础信息 shopOrders.forEach(shopOrder -> { shopOrder.setReceiver(order.getReceiver()); shopOrder.setMobile(order.getMobile()); shopOrder.setAddress(order.getAddress()); }); return order; } public void splitAccount(List splitBillRules, String orderRequestNo, String mbOrderId, NewShopOrder shopOrder, List splitBillDetail) { if (null != splitBillRules && splitBillRules.size() > 0) { //第三方分账接口 try { AccountPayOrder accountPayOrder = new AccountPayOrder(); accountPayOrder.setP1_bizType("AccountPaySub"); accountPayOrder.setP2_signType("MD5"); String format1 = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss.SSS").format(new Date()); accountPayOrder.setP3_timestamp(format1); String substring = format1.substring(20); // fz+当前微秒时间+原唯一订单号 accountPayOrder.setP4_orderId("FZ" + substring + orderRequestNo); //付款账户子订单绑定商户号 accountPayOrder.setP5_customerNumber(shopOrder.getSplitCode()); AccountPayOrder.AccountPayOrderExt accountPayOrderExt = new AccountPayOrder.AccountPayOrderExt(); //收款账户商编 填写splitBillRules时候不填写MerchantNo,Amount并且即使填写这两个参数不生效!! //accountPayOrderExt.setInMerchantNo(splitMoneyVo.getName()); //accountPayOrderExt.setAmount(splitMoneyVo.getSplitMoney()); accountPayOrderExt.setOrderType(AccountPayOrderType.TRANSFER); // todo accountPayOrderExt.setServerCallbackUrl(Constant.prodSplit); accountPayOrderExt.setGoodsName("分账"); if (null != splitBillRules && splitBillRules.size() > 0) { accountPayOrderExt.setSplitBillRules(splitBillRules); } String ext = JSON.toJSONString(accountPayOrderExt); log.info("分账规则串json串:" + ext); accountPayOrder.setP6_ext(ext); // 生成签名 StringBuilder builder = new StringBuilder(); builder.append(Constant.SPLIT) .append(accountPayOrder.getP1_bizType()).append(Constant.SPLIT) .append(accountPayOrder.getP2_signType()).append(Constant.SPLIT) .append(accountPayOrder.getP3_timestamp()).append(Constant.SPLIT) .append(accountPayOrder.getP4_orderId()).append(Constant.SPLIT) .append(accountPayOrder.getP5_customerNumber()).append(Constant.SPLIT) .append(accountPayOrder.getP6_ext()).append(Constant.SPLIT) .append(Constant.XUNI); String sign = Disguiser.disguiseMD5(builder.toString().trim()); Map bean = orderPayUtil.convertBean(accountPayOrder); log.info("--------------------> 发送分账参数: " + bean); Map map = orderPayUtil.postForm(bean, Constant.FZ, sign, Map.class); log.info("----------------分账返回数据: " + map.toString()); if (map != null) { String code = map.get("rt5_retCode"); if (!"0000".equals(code)) { String msg = map.get("rt6_retMsg"); log.info("【手动分账】>>>>>>>>>>手动分账失败>>>>>>>msg:" + msg); } else { for (SplitAccountPo splitAccount : splitBillDetail) { splitAccount.setMbOrderId(mbOrderId); splitAccount.setOrderRequestNo(orderRequestNo); splitAccount.setPayStatus(1); // 保存分账详情 newOrderDao.insertSplitAccount(splitAccount); } redisService.remove("OGFZMDS"); log.info("【手动分账】>>>>>>>>>>此订单分账结束"); } } } catch (Exception e) { log.error("【手动分账】>>>>>>>>>>错误信息", e); } } } /** * 设置子订单状态 * shopStatus 0:待确认 1:已确认 2:交易完成 3:订单完成 4:已关闭 5:交易全退 * * payStatus (付款供应商)付款状态:1待付款、2部分付款、3已付款 * sendOutStatus 发货状态:1待发货、2部分发货、3已发货 * receiptStatus 收款状态:1待收款、2部分收款、3已收款 */ public void setShopOrderStatus(NewShopOrder newShopOrder) { // 11, 待付待收待发 if (("1".equals(newShopOrder.getShopStatus()) || "2".equals(newShopOrder.getShopStatus()) || "3".equals(newShopOrder.getShopStatus())) && "1".equals(newShopOrder.getOrderStatusFlag()) && "1".equals(newShopOrder.getRefundStatus())) { if ( "1".equals(newShopOrder.getReceiptStatus()) && "1".equals( newShopOrder.getSendOutStatus())){ newShopOrder.setShopStatus("11"); } else if ( "1".equals( newShopOrder.getReceiptStatus()) && "2".equals( newShopOrder.getSendOutStatus())) { newShopOrder.setShopStatus("12"); } else if ( "1".equals( newShopOrder.getReceiptStatus()) && "3".equals( newShopOrder.getSendOutStatus())) { newShopOrder.setShopStatus("13"); } else if ( "2".equals( newShopOrder.getReceiptStatus()) && "1".equals( newShopOrder.getSendOutStatus())) { newShopOrder.setShopStatus("21"); } else if ( "2".equals( newShopOrder.getReceiptStatus()) && "2".equals( newShopOrder.getSendOutStatus())) { newShopOrder.setShopStatus("22"); } else if ( "2".equals( newShopOrder.getReceiptStatus()) && "3".equals( newShopOrder.getSendOutStatus())) { newShopOrder.setShopStatus("23"); } else if ( "3".equals( newShopOrder.getReceiptStatus()) && "1".equals( newShopOrder.getSendOutStatus())) { newShopOrder.setShopStatus("31"); } else if ( "3".equals( newShopOrder.getReceiptStatus()) && "2".equals( newShopOrder.getSendOutStatus())) { newShopOrder.setShopStatus("32"); } else if ( "3".equals( newShopOrder.getReceiptStatus()) && "3".equals( newShopOrder.getSendOutStatus())) { newShopOrder.setShopStatus("33"); } } if (!"1".equals(newShopOrder.getOrderStatusFlag()) || !"1".equals(newShopOrder.getRefundStatus())) { newShopOrder.setShopStatus("5"); } } /** * 设置收货人信息 * * @param newOrder */ public void setReceiverVal(NewOrder newOrder) { List notes = newOrderDao.findNotes(newOrder.getOrderId()); if (null != notes && notes.size() > 0) { newOrder.setNotes(notes); } OrderUserInfo byOrderId = orderUserInfoDao.findByOrderId(newOrder.getOrderId()); String address = byOrderId.getProvince() + byOrderId.getCity() + byOrderId.getTown() + byOrderId.getAddress(); newOrder.setAddress(address); newOrder.setReceiver(byOrderId.getShouHuoRen()); newOrder.setMobile(byOrderId.getMobile()); } /** * 设置退款金额 * * @param newOrder */ public void setRefundVal(NewOrder newOrder) { newOrder.setRefundFee(returnDao.findSumReturn(newOrder.getOrderId())); } /** * 设置分账记录 * * @param newOrder */ public List getSplitRecord(NewOrder newOrder) { return payShopDao.findSplitRecord(newOrder.getOrderId()); } public List getReceiptRecord(NewOrder newOrder) { ReceiptVo receiptVo = new ReceiptVo(); receiptVo.setOrderId(newOrder.getShopOrderId().toString()); receiptVo.setOrganizeId(4); return receiptDao.findReceiptList(receiptVo); } public List getPayRecords(NewOrder newOrder) { return payShopDao.findPayShopRecordsByOrder(newOrder.getShopOrderId()); } public Boolean setDeliverStatus(List orderProducts) { AtomicReference flag = new AtomicReference<>(true); String orderStatus = newOrderDao.findStatus(orderProducts.get(0).getOrderProductId()); if (orderStatus.length() < 2) { return false; } Map shops = new HashMap<>(); orderProducts.forEach(o -> { boolean b = shops.containsKey(o.getShopOrderId()); if (b) { Integer num = shops.get(o.getShopOrderId()); shops.put(o.getShopOrderId(), o.getDeliveryNum() + num); } else { shops.put(o.getShopOrderId(), o.getDeliveryNum()); } }); // 统计本次发货 AtomicReference totalDeliver = new AtomicReference<>(0); AtomicReference orderId = new AtomicReference<>(); shops.forEach((key, value) -> { NewShopOrder shopOrder = shopOrderDao.get(key); Integer outStoreNum = shopOrder.getOutStoreNum(); int deliver = outStoreNum + value; int total = shopOrder.getItemCount() + shopOrder.getPresentNum(); // 已发货+本次发货 > 子订单商品总数 + 赠品数 if (deliver > total) { flag.set(false); return; } totalDeliver.set(totalDeliver.get() + value); // 2 部分发货 3全部发货 int status = deliver < total ? 2 : 3; shopOrder.setOutStoreNum(outStoreNum + value); shopOrder.setSendOutStatus(Integer.toString(status)); shopOrder.setOutStoreTimes(shopOrder.getOutStoreTimes() + 1); shopOrder.setPaying(0); shopOrderDao.update(shopOrder); orderId.set(shopOrder.getOrderId()); }); if (!flag.get()) { return flag.get(); } Integer count = newOrderDao.findCountDeliver(orderId.get()); Integer orderDeliverStatus = 3; if (count > totalDeliver.get()) { orderDeliverStatus = 2; } orderStatus = orderStatus.substring(0, 1) + orderDeliverStatus.toString(); //同步更新主订单的发货状态 newOrderDao.updateOrderStatus(orderDeliverStatus, orderStatus, orderId.get()); return true; } public ResponseJson addReceiptRecord(Double amount, Integer orderId) { Double wait = newOrderDao.findWaitPay(orderId); if (amount > wait) { return ResponseJson.error("支付金额大于待付!"); } ReceiptVo receiptVo = new ReceiptVo(); // 31 线下凭证 receiptVo.setPayType(31); receiptVo.setPayWay(2); receiptVo.setNewReceiptType(2); receiptVo.setReceiptType(1); receiptVo.setReceiptStatus(3); receiptVo.setReceiptAmount(amount.toString()); receiptDao.insertOrderReceipt(receiptVo); OrderRelationRecord record = new OrderRelationRecord(); record.setReceiptAmount(amount); record.setRelationType(2); record.setReceiptId(receiptVo.getId()); record.setOrderId(orderId); receiptDao.insertOrderRelation(record); // 根据金额修改cm_order状态 Integer status = 2; if (0 == wait - amount) { status = 3; } String orderStatus = newOrderDao.findOrderStatus(orderId); String substring = orderStatus.substring(orderStatus.length() - 1); orderStatus = status + substring; newOrderDao.updateReceiptStatus(status, orderStatus, orderId); return ResponseJson.success(); } public List getSettleRecord(NewOrder newOrder) { List settleRecord = payShopDao.findSettleRecord(newOrder.getOrderId()); settleRecord.forEach(s -> { double payCm = 0d; double payShop = 0d; double payOrg = 0d; payShop = 1 == s.getSettleType() ? s.getSettleAmount() : 0d; payCm = 2 == s.getSettleType() ? s.getSettleAmount() : 0d; payOrg = 3 == s.getSettleType() ? s.getSettleAmount() : 0d; s.setShouldSettleCm(payCm); s.setShouldSettleShop(payShop); s.setShouldSettleOrganize(payOrg); }); return settleRecord; } public void setPayShopPostInfo(OrderPayShopDetail detail) { NewOrder order = newOrderDao.get(detail.getShopOrders().get(0).getOrderId().toString()); NewShopOrder shopOrder = shopOrderDao.findColdChain(detail.getShopOrders().get(0).getOrderId()); if (null != shopOrder) { order.setPostageInfo("2".equals(shopOrder.getShopPostFlag()) ?"到付": "0".equals(shopOrder.getShopPostFlag())?"包邮":"¥" + shopOrder.getShopPostFee()); } else { /** * 没有运费订单 */ order.setPostageInfo("¥ 0.00"); } } public void setShopPostInfo(NewShopOrder s) { NewOrder order = newOrderDao.get(s.getOrderId().toString()); NewShopOrder shopOrder = shopOrderDao.findColdChain(s.getOrderId()); if (null != shopOrder) { order.setPostageInfo("2".equals(shopOrder.getShopPostFlag()) ?"到付": "0".equals(shopOrder.getShopPostFlag())?"包邮":"¥" + shopOrder.getShopPostFee()); } else { /** * 没有运费订单 */ order.setPostageInfo("¥ 0.00"); } } public void setSettleStatus(NewOrder newOrder) { List status = shopOrderDao.findSettleStatus(newOrder.getOrderId()); if (!status.contains(3) && !status.contains(2)) { newOrder.setSettleStatus(1); } if (status.contains(2) || status.contains(3)) { newOrder.setSettleStatus(2); } if (!status.contains(1) && !status.contains(2)) { newOrder.setSettleStatus(3); } } }