package com.matrix.system.hive.service.imp; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import com.google.common.collect.Lists; import com.matrix.component.asyncmessage.AsyncMessageManager; import com.matrix.core.constance.MatrixConstance; import com.matrix.core.exception.GlobleException; import com.matrix.core.pojo.PaginationVO; import com.matrix.core.tools.DateUtil; import com.matrix.core.tools.LogUtil; import com.matrix.core.tools.StringUtils; import com.matrix.core.tools.WebUtil; import com.matrix.system.app.dto.OrderListDto; import com.matrix.system.app.mapper.SysProjUseMapper; import com.matrix.system.app.vo.OrderDetailAchieveItemVo; import com.matrix.system.app.vo.OrderDetailItemVo; import com.matrix.system.app.vo.OrderDetailVo; import com.matrix.system.app.vo.RankingVo; import com.matrix.system.common.bean.BusParameterSettings; import com.matrix.system.common.bean.SysUsers; import com.matrix.system.common.constance.AppConstance; import com.matrix.system.common.dao.BusParameterSettingsDao; import com.matrix.system.common.dao.SysUsersDao; import com.matrix.system.common.service.OperationLogService; import com.matrix.system.constance.Dictionary; import com.matrix.system.enums.BooleanEnum; import com.matrix.system.enums.OperationButtonEnum; import com.matrix.system.enums.OperationFunctionEnum; import com.matrix.system.hive.bean.*; import com.matrix.system.hive.dao.*; import com.matrix.system.hive.dto.GoodsSealLimitDto; import com.matrix.system.hive.dto.SysOrderItemDto; import com.matrix.system.hive.plugin.util.CollectionUtils; import com.matrix.system.hive.plugin.util.MoneyUtil; import com.matrix.system.hive.pojo.CzXkVo; import com.matrix.system.hive.pojo.ShoppingCarItem; import com.matrix.system.hive.pojo.ShoppingCarItemsVo; import com.matrix.system.hive.service.*; import com.matrix.system.score.constant.ScoreSettingConstant; import com.matrix.system.score.entity.ScoreVipDetail; import com.matrix.system.score.service.ScoreVipDetailService; import com.matrix.system.shopXcx.mqTask.AsyncMessageRouting; import com.matrix.system.wechart.templateMsg.UniformMsgParam; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpSession; import javax.validation.constraints.NotEmpty; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** * @date 2016-07-03 20:53 */ @Service("sysOrderService") public class SysOrderServiceImpl implements SysOrderService { @Autowired private SysOrderDao sysOrderDao; @Autowired private SysOrderItemDao orderItemDao; @Autowired private SysProjUseDao sysProjUseDao; @Autowired private SysStoreInfoDao storeInfoDao; @Autowired private CodeService codeService; @Autowired SysVipInfoDao sysVipInfoDao; @Autowired SysOutStoreDao sysOutStoreDao; @Autowired SysOutStoreItemDao sysOutStoreItemDao; @Autowired MoneyCardUseFlowDao moneyCardUseFlowDao; @Autowired ScoreVipDetailService scoreVipDetailService; @Autowired BusParameterSettingsDao busParameterSettingsDao; @Autowired SysVipLevelDao sysVipLevelDao; @Autowired ShoppingGoodsDao shoppingGoodsDao; @Autowired ShoppingGoodsAssembleDao shoppingGoodsAssembleDao; @Autowired MoneyCardUseDao moneyCardUseDao; @Autowired MoneyCardAssembleDao moneyCardAssembleDao; @Autowired SysUsersDao shopStaffInfoDao; @Autowired private AchieveNewService achieveNewService; @Autowired private AchieveNewDao achieveNewDao; @Autowired private WarehouseDao warehouseDao; @Autowired private ShoppingGoodsService shoppingGoodsService; @Autowired private SysOrderFlowDao sysOrderFlowDao; @Autowired private SysSupplierInfoDao sysSupplierInfoDao; @Autowired private SysInstoreInfoDao sysInstoreInfoDao; @Autowired private SysInstoreDetailDao sysInstoreDetailDao; @Autowired private SysInstoreInfoService sysInstoreInfoService; @Autowired BusParameterSettingsDao parameterSettingsDao; @Autowired private AsyncMessageManager asyncMessageManager; @Autowired private OperationLogService operationLogService; @Autowired private SysVipInfoService sysVipInfoService; @Autowired private SysOrderServiceHelper sysOrderServiceHelper; @Autowired MoneyCardUseService moneyCardUseService; //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓业务代码区↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ @Override @Transactional(rollbackFor = Exception.class) public SysOrder checkAndSaveOrder(SysOrder sysOrder) { // 计算订单折扣金额,收款情况下 计算订单总额 double zkTotal = 0.0; // 判断是否为退款 String orderStatus = Dictionary.ORDER_STATU_DFK; if (Dictionary.ORDER_STATU_TK.equals(sysOrder.getStatu())) { orderStatus = Dictionary.ORDER_STATU_TK; } // 页面的pageOrder 参数只包含支付金额信息,不带有购买商品 for (SysOrderItem item : sysOrder.getItems()) { // 若为退款,则先更新原有数量 if (orderStatus.equals(Dictionary.ORDER_STATU_TK)) { SysOrderItem sysOrderItem = new SysOrderItem(); sysOrderItem.setId(item.getId()); sysOrderItem.setCount(item.getPreCount() - item.getCount()); orderItemDao.update(sysOrderItem); } item.setId(null); ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(item.getGoodsId()); item.setType(shoppingGoods.getGoodType()); if (item.getZkPrice() == 0) { item.setIsFree(Dictionary.FLAG_YES); } // 订单欠款减去支付金额 设置实际欠款 Double itemZkTotal = MoneyUtil.mul(item.getZkPrice(), Double.valueOf(item.getCount())); zkTotal = MoneyUtil.add(zkTotal, itemZkTotal); item.setStatus(orderStatus); } SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); sysOrder.setZkTotal(zkTotal); sysOrder.setStatu(orderStatus); SysOrder source = null; if (sysOrder.getId() != null) { source = sysOrderDao.selectById(sysOrder.getId()); } sysOrder.setStaffId(source != null ? source.getStaffId() : user.getSuId()); sysOrder.setCompanyId(source != null ? source.getCompanyId() : user.getCompanyId()); if (sysOrder.getId() == null) { //新增订单 sysOrder.setOrderNo(codeService.getOrderCode()); sysOrderDao.insert(sysOrder); //保存单据日志 operationLogService.saveOperation(sysOrder.getCompanyId(), sysOrder.getShopId(), user.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.CREATE, sysOrder.getId(), sysOrder.getOrderNo(), sysOrder.getVipId()); } else { //更新订单 sysOrderDao.update(sysOrder); //删除原有订单明细 orderItemDao.deleteByOrderId(sysOrder.getId()); //保存单据日志 operationLogService.saveOperation(sysOrder.getCompanyId(), sysOrder.getShopId(), user.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.UPDATE, sysOrder.getId(), sysOrder.getOrderNo(), sysOrder.getVipId(), "修改订单内容"); } sysOrder.getItems().forEach(sysOrderItem -> { sysOrderItem.setOrderId(sysOrder.getId()); if (sysOrder.getStatu().equals(Dictionary.ORDER_STATU_TK)) { // 取负数 sysOrderItem.setCount(-sysOrderItem.getCount()); orderItemDao.insert(sysOrderItem); // 调整回来 sysOrderItem.setCount(-sysOrderItem.getCount()); } else { orderItemDao.insert(sysOrderItem); } }); return sysOrder; } /** * 取消订单 * * @param id * @return */ @Override @Transactional(rollbackFor = Exception.class) public void cancelOrder(Long id) { SysOrder order = sysOrderDao.selectById(id); SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); if (order.getStatu().equals(Dictionary.ORDER_STATU_DFK)) { order.setStatu(Dictionary.ORDER_STATU_YQX); order.setArrears(0D); //发送微信公众号提醒 UniformMsgParam uniformMsgParam = new UniformMsgParam(order.getCompanyId(), UniformMsgParam.GZH_DDQX); uniformMsgParam.put("orderId", order.getId()); asyncMessageManager.sendMsg(AsyncMessageRouting.SEND_UNIFORM_TEMPLATE_MSG, uniformMsgParam); sysOrderDao.update(order); //保存单据日志 operationLogService.saveOperation(order.getCompanyId(), order.getShopId(), sysUsers.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.CANCEL, order.getId(), order.getOrderNo(), order.getVipId(), "未付款取消订单"); } else { //一个订单只能被取消一次 if (Dictionary.ORDER_STATU_YQX.equals(order.getStatu())) { throw new GlobleException("订单已取消"); } List flows = sysOrderFlowDao.selectByOrderId(id); // 非现金收款退回扣卡余额 for (SysOrderFlow flow : flows) { if (SysOrderFlow.PAY_METHOD_CARD.equals(flow.getPayMethod())) { MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(flow.getCardId()); MoneyCardUseFlow moneyCardUseFlow = new MoneyCardUseFlow(); if (moneyCardUse != null) { // 根据订单明细判断是赠送金额购买还是本金购买 moneyCardUseFlow.setTotal(flow.getAmount().doubleValue()); if (SysOrderFlow.IS_GIFT_Y.equals(flow.getIsGift())) { moneyCardUse.setGiftMoney(MoneyUtil.add(moneyCardUse.getGiftMoney(), flow.getAmount().doubleValue())); } else { moneyCardUse.setRealMoney(MoneyUtil.add(moneyCardUse.getRealMoney(), flow.getAmount().doubleValue())); } if (!moneyCardUse.getIsVipCar().equals(Dictionary.FLAG_YES_Y)) { if (moneyCardUse.getLastCount() != null) { moneyCardUse.setLastCount(moneyCardUse.getLastCount() + 1); moneyCardUseFlow.setTimes(1); } } moneyCardUseDao.update(moneyCardUse); //插入充值卡变动流水 SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); moneyCardUseFlow.setOrderNo(order.getOrderNo()); moneyCardUseFlow.setCarUseId(moneyCardUse.getId()); moneyCardUseFlow.setVipId(order.getVipId()); moneyCardUseFlow.setType(MoneyCardUseFlow.USE_TYPE_ORDRE_CANCEL); moneyCardUseFlow.setCreateTime(new Date()); moneyCardUseFlow.setOperationId(user.getSuId()); moneyCardUseFlow.setContent(moneyCardUse.getChangeRemark()); moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney() + moneyCardUse.getRealMoney()); moneyCardUseFlowDao.insert(moneyCardUseFlow); } } } List sysOrderItems = orderItemDao.selectByOrderId(id); for (SysOrderItem orderItem : sysOrderItems) { // 充值卡类型退款 if (Dictionary.SHOPPING_GOODS_TYPE_CZK.equals(orderItem.getType())) { ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(orderItem.getGoodsId()); //删除购买的充值卡 moneyCardUseDao.deleteByOrderItemId(orderItem.getId()); } else if (Dictionary.SHOPPING_GOODS_TYPE_XM.equals(orderItem.getType()) || Dictionary.SHOPPING_GOODS_TYPE_TC.equals(orderItem.getType())) { // 项目套餐退款 // 删除套餐项目使用情况 sysProjUseDao.deleteByOrderItemId(orderItem.getId()); } else if (Dictionary.SHOPPING_GOODS_TYPE_ZHK.equals(orderItem.getType())) { // 综合卡 // 删除套餐项目使用情况 sysProjUseDao.deleteByOrderItemId(orderItem.getId()); // 删除充值卡 moneyCardUseDao.deleteByOrderItemId(orderItem.getId()); } } //删除出库单,恢复库存 SysOutStore sysOutStore = new SysOutStore(); sysOutStore.setOrderId(order.getId()); List sysOutStores = sysOutStoreDao.selectByModel(sysOutStore); if (sysOutStores.size() == 1) { sysOutStore = sysOutStores.get(0); List outStoreItemList = sysOutStoreItemDao.selectByOrderId(sysOutStore.getId()); for (SysOutStoreItem item : outStoreItemList) { SysStoreInfo sysStoreInfo = storeInfoDao.selectById(item.getStoreId()); sysStoreInfo.setStoreTotal(sysStoreInfo.getStoreTotal() + item.getAmount()); //更新库存 storeInfoDao.update(sysStoreInfo); } sysOutStoreDao.deleteById(sysOutStore.getId()); sysOutStoreItemDao.deleteByOrderId(sysOutStore.getId()); } // 删除业绩 AchieveNew achieveNew = new AchieveNew(); achieveNew.setOrderId(id); achieveNewService.removeByModel(achieveNew); // 删除收款记录 sysOrderFlowDao.deleteByOrderId(id); //删除积分 scoreVipDetailService.removeByBusinessId(order.getVipId(), order.getId()); // 取消订单 order.setStatu(Dictionary.ORDER_STATU_YQX); sysOrderDao.update(order); //保存单据日志 operationLogService.saveOperation(order.getCompanyId(), order.getShopId(), sysUsers.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.CANCEL, order.getId(), order.getOrderNo(), order.getVipId(), "已付款取消订单"); } } /** * 创建订单 lk */ @Override @Transactional(rollbackFor = Exception.class) public int createOrder(HttpSession session, ShoppingCarItemsVo car) { if (car.getCarItems().size() < 1) { throw new GlobleException("没用选择购买产品"); } // 获取会员信息,判断等级 获取相应家居折扣 SysVipInfo info = sysVipInfoDao.selectById(car.getVipId()); //获取折扣----- Double zk = zk = 1.0; SysOrder order = new SysOrder(); SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); order.setShopId(user.getShopId()); order.setOrderNo(codeService.getOrderCode()); order.setVipId(info.getId()); order.setOrderTime(new Date()); order.setRemark(car.getRemark()); order.setStaffId(user.getSuId()); order.setIsCross(2 + ""); order.setChangeId(car.getChangeId()); order.setStatu(Dictionary.ORDER_STATU_DFK); order.setCardPay(0.00); order.setCashPay(0.00); order.setCompanyId(user.getCompanyId()); order.setBeatuyId(car.getBeatuyId() + ""); // 根据美疗师id查询美疗师姓名 if (car.getBeatuyId() != null) { String beatuyName = shopStaffInfoDao.selectById(car.getBeatuyId()).getSuName(); System.out.println("美疗师:" + beatuyName); order.setBeatuyName(beatuyName); } int i = sysOrderDao.insert(order); // 创建订单明细,并计算总价与折扣总价 // 总价 double total = 0; double zkTotal = 0; int count = 0; // 设置订单条目 for (ShoppingCarItem carItem : car.getCarItems()) { SysOrderItem orderItem = new SysOrderItem(); orderItem.setOrderId(order.getId()); orderItem.setCount(carItem.getCount()); orderItem.setIsFree(carItem.getIsFree()); orderItem.setType(carItem.getType()); orderItem.setStatus(Dictionary.ORDER_STATU_DFK); // 新增明细 // 设置商品id orderItem.setGoodsId(carItem.getGoodsId()); // 设置assembleId orderItem.setAssembleId(carItem.getAssembleId()); // 如果是家居产品的话,要取出组合sku中的价格 double p = carItem.getShoppingGoods().getSealPice(); orderItem.setPrice(p); if (carItem.getIsFree().equals(Dictionary.FLAG_NO)) { orderItem.setZkPrice(MoneyUtil.mul(p, zk)); } else { // 如果是免费,则设置为0.0 orderItem.setZkPrice(0.0); } orderItemDao.insert(orderItem); total = MoneyUtil.add(total, MoneyUtil.mul(orderItem.getPrice(), Double.parseDouble(carItem.getCount() + ""))); zkTotal = MoneyUtil.add(zkTotal, MoneyUtil.mul(orderItem.getZkPrice(), Double.parseDouble(carItem.getCount() + ""))); } // 设置订单总价与折后价 order.setTotal(total); order.setZkTotal(zkTotal); sysOrderDao.update(order); return i; } /** * jyy 收款 */ @Override @Transactional(rollbackFor = Exception.class) public void updateReceiptMoney(SysOrder pageOrder) throws GlobleException { //校验订单是否满足收款条件 checkOrder(pageOrder); // 更新订单主表信息 updateOrderInfo(pageOrder); // 设置用户为成交客户 sysVipInfoService.updateDealStatus(pageOrder.getVipId(), BooleanEnum.TRUE.getValue()); //添加支付流水 sysOrderServiceHelper.addOrderFlow(pageOrder,false); //扣除储值卡余额 sysOrderServiceHelper.cardPaySk(pageOrder); // 设置会员充值卡使用情况 sysOrderServiceHelper.addMoneyCardUse(pageOrder); // 改变客户项目套餐使用情况 sysOrderServiceHelper.addTaocanProj(pageOrder); // 新增出库单 sysOrderServiceHelper.addOutStore(pageOrder); // 设置业绩 achieveNewService.addAchaeveByOrder(pageOrder); //设置会员积分 sysOrderServiceHelper.addVipScore(pageOrder); //保存订单收款日志 saveOrderSkLog(pageOrder); } /** * 保存订单收款日志 * * @param pageOrder */ private void saveOrderSkLog(SysOrder pageOrder) { SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); operationLogService.saveOperation(pageOrder.getCompanyId(), pageOrder.getShopId(), user.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.ORDER_SK, pageOrder.getId(), pageOrder.getOrderNo(), pageOrder.getVipId()); } /** * 付款后更新订单信息 * * @param pageOrder */ private void updateOrderInfo(SysOrder pageOrder) { LogUtil.info("付款更新订单信息 id={}",pageOrder.getId()); SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); pageOrder.setCashierId(user.getSuId()); pageOrder.setPayTime(new Date()); pageOrder.setStatu(Dictionary.ORDER_STATU_YFK); List flows = pageOrder.getFlows(); BigDecimal cashPayAmount = flows.stream() .filter(item -> (!item.getPayMethod().equals("储值卡")) && (!item.getPayMethod().equals("欠款"))) .map(SysOrderFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal cardPayAmount = flows.stream() .filter(item -> item.getPayMethod().equals("储值卡")) .map(SysOrderFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); pageOrder.setCardPay(cardPayAmount.doubleValue()); pageOrder.setCashPay(cashPayAmount.doubleValue()); for (SysOrderFlow flow : pageOrder.getFlows()) { //欠款处理 if (SysOrderFlow.PAY_METHOD_ARREARS.equals(flow.getPayMethod())) { pageOrder.setStatu(Dictionary.ORDER_STATU_QK); pageOrder.setArrears(flow.getAmount().doubleValue()); } } double sum = flows.stream().mapToDouble(item -> item.getAmount().doubleValue()).sum(); if (sum > 0 && cardPayAmount.doubleValue() == 0 && cashPayAmount.doubleValue() == 0) { throw new GlobleException("订单更新失败,支付金额计算错误,请联系管理员"); } sysOrderDao.update(pageOrder); } private void checkOrder(SysOrder pageOrder) { SysOrder checkOrder = sysOrderDao.selectById(pageOrder.getId()); //状态校验 if (!Dictionary.ORDER_STATU_DFK.equals(checkOrder.getStatu())) { throw new GlobleException("该订单已经收过款,请刷新页面再试!"); } //检查交易限制调整 GoodsSealLimitDto goodsSealLimitDto = new GoodsSealLimitDto(); goodsSealLimitDto.setVipId(pageOrder.getVipId()); goodsSealLimitDto.setSysOrderItemDtoList(Lists.newArrayList()); pageOrder.getItems().forEach(e -> { goodsSealLimitDto.getSysOrderItemDtoList().add(BeanUtil.copyProperties(e, SysOrderItemDto.class)); }); shoppingGoodsService.checkGoodsSealLimit(goodsSealLimitDto); //检查业绩设置 checkOrderAchieve(pageOrder); LogUtil.info("订单满足支付条件 id={}",pageOrder.getId()); } /** * 检查业绩设置是否合理 * 1、每个订单明细都要有至少一个对应的业绩 * 2、每个订单明细的同类型业绩金额之和不能大于明细支付金额 * * @param pageOrder */ private void checkOrderAchieve(SysOrder pageOrder) { pageOrder.getItems().forEach(item -> { if (CollectionUtil.isEmpty(item.getAchieveList())) { ShoppingGoods shopGoods = shoppingGoodsDao.selectById(item.getGoodsId()); throw GlobleException.instance(shopGoods.getName() + "缺少设置业绩"); } //按业绩类型分组后比较支付金额与业绩金额是否相等 Map> achieveTypeMap = item.getAchieveList().stream().collect(Collectors.groupingBy(AchieveNew::getAchieveType)); Set>> entries = achieveTypeMap.entrySet(); entries.forEach(entrie -> { double sum = entrie.getValue().stream().mapToDouble(AchieveNew::getGoodsCash).sum(); //todo 目前使用js计算金额可能存在精度的误差展示用0.1屏蔽 if (Math.abs(sum - (item.getZkPrice() * item.getCount())) > 0.1) { ShoppingGoods shopGoods = shoppingGoodsDao.selectById(item.getGoodsId()); throw GlobleException.instance(shopGoods.getName() + "," + entrie.getKey() + "业绩金额与收款金额不一致"); } }); }); } /** * 补交 * @author:姜友瑶 * @date 2016年9月19日 */ @Transactional(rollbackFor = Exception.class) @Override public void updateAfterMoney(SysOrder pageOrder) { SysOrder sourceOrder = sysOrderDao.selectById(pageOrder.getId()); //添加支付流水 sysOrderServiceHelper.addOrderFlow(pageOrder,true); //扣除储值卡余额 sysOrderServiceHelper.cardPaySk(pageOrder); double refundTotal = 0D; double cardPayTotal = 0D; double cashPayTotal = 0D; for (SysOrderFlow flow : pageOrder.getFlows()) { // 若使用储值卡付款 if (SysOrderFlow.PAY_METHOD_CARD.equals(flow.getPayMethod())) { cardPayTotal += flow.getAmount().doubleValue(); } else { cashPayTotal += flow.getAmount().doubleValue(); } refundTotal += flow.getAmount().doubleValue(); } if (refundTotal == pageOrder.getArrears()) { sourceOrder.setStatu(Dictionary.ORDER_STATU_YFK); }else{ sourceOrder.setStatu(Dictionary.ORDER_STATU_QK); } sourceOrder.setArrears(sourceOrder.getArrears() - refundTotal); sourceOrder.setCardPay(sourceOrder.getCardPay() == null ? 0 : sourceOrder.getCardPay() + cardPayTotal); sourceOrder.setCashPay(sourceOrder.getCashPay() == null ? 0 : sourceOrder.getCashPay() + cashPayTotal); sysOrderDao.update(sourceOrder); } /** * 会员卡充值 * * @param czVo */ @Override @Transactional(rollbackFor = Exception.class) public SysOrder updateAddCardMoney(CzXkVo czVo) { SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); // SysVipInfo vip = (SysVipInfo) WebUtil.getSession().getAttribute(SystemConstance.CURRENT_CUSTOMER); // czVo.setVipId(vip.getId()); //更新会员会员卡金额 MoneyCardUse cardUser = moneyCardUseDao.selectVipCard(czVo.getVipId()); cardUser.setRealMoney(MoneyUtil.add(cardUser.getRealMoney(), czVo.getBjmoney())); cardUser.setGiftMoney(MoneyUtil.add(cardUser.getGiftMoney(), czVo.getGiftMoney())); moneyCardUseDao.update(cardUser); // 为会员新增积分 SysVipInfo vipInfo = sysVipInfoDao.selectById(cardUser.getVipId()); vipInfo.setPointAll(vipInfo.getPointAll() == null ? 0 : vipInfo.getPointAll() + czVo.getJf()); sysVipInfoDao.update(vipInfo); // 新增一个充值订单 SysOrder order = new SysOrder(); order.setArrears(0D); order.setTotal(czVo.getBjmoney()); order.setZkTotal(czVo.getBjmoney()); order.setCashPay(czVo.getBjmoney()); order.setShopId(user.getShopId()); order.setOrderNo(codeService.getOrderCode()); order.setVipId(czVo.getVipId()); Date orderTime = new Date(); if (StringUtils.isNotBlank(czVo.getDateTime())) { orderTime = DateUtil.stringToDateNew(czVo.getDateTime(), DateUtil.DATE_FORMAT_DD); } order.setOrderTime(orderTime); order.setPayTime(orderTime); order.setRemark(cardUser.getCardName()); order.setStaffId(user.getSuId()); order.setIsCross(2 + ""); order.setOrderType(SysOrder.ORDER_TYPE_SEAL); order.setStatu(Dictionary.ORDER_STATU_YFK); order.setCompanyId(user.getCompanyId()); sysOrderDao.insert(order); SysOrderItem orderItem = new SysOrderItem(); orderItem.setOrderId(order.getId()); orderItem.setOrderNo(order.getOrderNo()); orderItem.setArrears(0D); ShoppingGoods shoppingGoods = shoppingGoodsDao.selectVipCzGoods(); orderItem.setGoodsId(shoppingGoods.getId()); orderItem.setPayMethod(Dictionary.PAY_TYPE_MOENY); orderItem.setCashPay(czVo.getBjmoney()); orderItem.setZkPrice(czVo.getBjmoney()); orderItem.setCardPay(0D); orderItem.setType(Dictionary.SHOPPING_GOODS_TYPE_CZK); orderItem.setCount(1); orderItem.setIsFree(Dictionary.FLAG_NO); orderItem.setPrice(czVo.getBjmoney()); orderItem.setStatus(Dictionary.ORDER_STATU_YFK); orderItem.setAchieveList(czVo.getAchaeveList()); orderItem.setShoppingGoods(shoppingGoods); orderItemDao.insert(orderItem); List items = new ArrayList<>(); items.add(orderItem); order.setItems(items); //设置卡项使用流水 MoneyCardUseFlow moneyCardUseFlow = new MoneyCardUseFlow(); moneyCardUseFlow.setTotal(czVo.getBjmoney()); moneyCardUseFlow.setGiftMoney(czVo.getGiftMoney()); moneyCardUseFlow.setCarUseId(czVo.getCardId()); moneyCardUseFlow.setVipId(czVo.getVipId()); moneyCardUseFlow.setType(MoneyCardUseFlow.USE_TYPE_CZ); moneyCardUseFlow.setOrderNo(order.getOrderNo()); moneyCardUseFlow.setCreateTime(new Date()); moneyCardUseFlow.setOperationId(user.getSuId()); moneyCardUseFlow.setBalance(cardUser.getGiftMoney() + cardUser.getRealMoney()); moneyCardUseFlow.setCarUseId(cardUser.getId()); moneyCardUseFlowDao.insert(moneyCardUseFlow); order.setFlows(czVo.getFlows()); sysOrderServiceHelper.addOrderFlow(order,false); // 添加员工业绩 achieveNewService.addAchaeveByOrder(order); return order; } @Override public SysOrder findSysOrderTjByVipId(Long vipId) { return sysOrderDao.selectVipOrderInfoTotal(vipId); } @Override public List findApiOrderListInPage(OrderListDto orderListDto, PaginationVO pageVo) { return sysOrderDao.selectApiOrderListInPage(orderListDto, pageVo); } @Override public int findApiOrderListTotal(OrderListDto orderListDto) { return sysOrderDao.selectApiOrderListTotal(orderListDto); } @Override public OrderDetailVo findApiOrderDetailByOrderId(Long orderId) { OrderDetailVo orderDetail = sysOrderDao.selectApiOrderDetailById(orderId); if (orderDetail == null) { throw new GlobleException("该订单不存在"); } List items = orderItemDao.selectApiOrderDetailItemsByOrderId(orderId); if (CollectionUtils.isNotEmpty(items)) { for (OrderDetailItemVo item : items) { List achieveItems = achieveNewDao.selectApiOrderItemAchieve(item.getId()); item.setAchieves(achieveItems); } } orderDetail.setItems(items); return orderDetail; } @Override public List findApiShopAchieveRanking(SysOrder sysOrder) { return sysOrderDao.selectShopAchieveRanking(sysOrder); } @Transactional(rollbackFor = Exception.class) @Override public void refundOrderMoney(SysOrder sysOrder) { SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); //原订单设置为退款状态 SysOrder sourceOrder = new SysOrder(); sourceOrder.setId(sysOrder.getOldOrderId()); sourceOrder.setIsHasRefund(SysOrder.IS_HAS_REFUND_Y); // sourceOrder.setStatu(Dictionary.ORDER_STATU_TK); sysOrderDao.update(sourceOrder); SysOrder oldOrder = sysOrderDao.selectById(sysOrder.getOldOrderId()); sysOrder.setId(null); sysOrder.setStaffId(user.getSuId()); sysOrder.setCompanyId(user.getCompanyId()); sysOrder.setShopId(user.getShopId()); sysOrder.setOrderType(SysOrder.ORDER_TYPE_REFUND); sysOrder.setStatu(Dictionary.ORDER_STATU_YFK); Date now = new Date(); sysOrder.setOrderTime(now); sysOrder.setPayTime(now); sysOrder.setOrderNo(codeService.getRefundOrderNo()); sysOrder.setZkTotal(-sysOrder.getZkTotal()); //新增订单 sysOrderDao.insert(sysOrder); //插入明细 for (SysOrderItem item : sysOrder.getItems()) { //更新原订单明细的可退数量 SysOrderItem oldItem = new SysOrderItem(); oldItem.setId(item.getId()); oldItem.setRefundCount(item.getCount()); orderItemDao.update(oldItem); //插入新的订单明细 item.setId(null); item.setCount(-item.getCount()); item.setOrderId(sysOrder.getId()); orderItemDao.insert(item); } // 添加订单收款流水 sysOrderServiceHelper.addOrderFlow(sysOrder,false); //退款退套餐退项目 refundProjUse(sysOrder); //删除积分 scoreVipDetailService.removeByBusinessId(oldOrder.getVipId(), oldOrder.getId()); // 设置业绩 achieveNewService.addAchaeveByOrder(sysOrder); //保存单据日志 operationLogService.saveOperation(sysOrder.getCompanyId(), sysOrder.getShopId(), user.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.ORDER_TK, sysOrder.getId(), sysOrder.getOrderNo(), sysOrder.getVipId()); } private void refundCard(MoneyCardUse moneyCardUse, SysOrder sourceOrder, SysOrderFlow flow) { SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); MoneyCardUseFlow moneyCardUseFlow = new MoneyCardUseFlow(); if (SysOrderFlow.IS_GIFT_Y.equals(flow.getIsGift())) { if (moneyCardUse.getGiftMoney() >= flow.getAmount().doubleValue()) { double surplus = MoneyUtil.sub(moneyCardUse.getGiftMoney(), flow.getAmount().doubleValue()); moneyCardUse.setGiftMoney(surplus); moneyCardUseFlow.setGiftMoney(0D - flow.getAmount().doubleValue()); } else { throw new GlobleException(moneyCardUse.getCardName() + "余额不足"); } } else { if (moneyCardUse.getRealMoney() >= flow.getAmount().doubleValue()) { double surplus = MoneyUtil.sub(moneyCardUse.getRealMoney(), flow.getAmount().doubleValue()); moneyCardUse.setRealMoney(surplus); moneyCardUseFlow.setTotal(0 - flow.getAmount().doubleValue()); } else { throw new GlobleException(moneyCardUse.getCardName() + "余额不足"); } } if (moneyCardUse.getIsVipCar().equals(Dictionary.FLAG_NO_N)) { //余额为0时充值卡变为无效 if (moneyCardUse.getRealMoney().equals(0D) && moneyCardUse.getGiftMoney().equals(0D)) { moneyCardUse.setIsOver(Dictionary.FLAG_YES_Y); moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_WX); } } ShoppingGoods shoppingGoods = shoppingGoodsService.findById(moneyCardUse.getGoodsId()); if (shoppingGoods != null) { Date invalidTime = shoppingGoodsService.calInvalidTime(shoppingGoods, 2, moneyCardUse.getFailTime()); moneyCardUse.setFailTime(invalidTime); } // 更新充值卡信息 moneyCardUseDao.update(moneyCardUse); //设置卡项使用流水 moneyCardUseFlow.setCarUseId(moneyCardUse.getId()); moneyCardUseFlow.setOrderNo(sourceOrder.getOrderNo()); moneyCardUseFlow.setVipId(sourceOrder.getVipId()); moneyCardUseFlow.setTimes(-1); moneyCardUseFlow.setType(MoneyCardUseFlow.USE_TYPE_CONSUMER); moneyCardUseFlow.setCreateTime(new Date()); moneyCardUseFlow.setOperationId(user.getSuId()); moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney() + moneyCardUse.getRealMoney()); moneyCardUseFlowDao.insert(moneyCardUseFlow); } /** * 退款退项目,套餐,卡项 * * @param sysOrder */ private void refundProjUse(SysOrder sysOrder) { SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); //记录需要退库存的产品 List returnGoodsList = new ArrayList<>(); for (SysOrderItem item : sysOrder.getItems()) { SysProjUse queryProjUse = new SysProjUse(); queryProjUse.setOrderItemId(item.getOldItemId()); // 修改项目信息 if (Dictionary.SHOPPING_GOODS_TYPE_XM.equals(item.getType()) || Dictionary.SHOPPING_GOODS_TYPE_JJCP.equals(item.getType())) { if (Dictionary.SHOPPING_GOODS_TYPE_JJCP.equals(item.getType())) { if (Dictionary.FLAG_YES_Y.equals(item.getIsReturnStore())) { returnGoodsList.add(item); } } else { SysProjUse sysProjUse = sysProjUseDao.selectByModel(queryProjUse).get(0); int sub = sysProjUse.getSurplusCount() - item.getCount(); if (sub < 0) { throw new GlobleException("项目余次不足"); } else if (sub == 0) { sysProjUse.setIsOver(Dictionary.FLAG_YES_Y); sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_WX); } sysProjUse.setSurplusCount(sub); sysProjUseDao.update(sysProjUse); SysProjUseFlow sysProjUseFlow = SysProjUseMapper.INSTANCE.projUseToFlow(sysProjUse); sysProjUseFlow.setOptionType("退款修改"); sysProjUseFlow.setId(null); sysProjUseFlow.setUpdateBy(user.getSuName()); sysProjUseFlow.setCreateBy(user.getSuName()); sysProjUseDao.insertFlow(sysProjUseFlow); } } if (Dictionary.SHOPPING_GOODS_TYPE_TC.equals(item.getType())) { queryProjUse.setTaocanId(-1L); List sysProjUses = sysProjUseDao.selectByModel(queryProjUse); for (int i = 0; i < sysProjUses.size(); i++) { SysProjUse sysProjUse = sysProjUses.get(i); sysProjUse.setIsOver(Dictionary.FLAG_YES_Y); sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_WX); sysProjUseDao.update(sysProjUse); SysProjUseFlow sysProjUseFlow = SysProjUseMapper.INSTANCE.projUseToFlow(sysProjUse); sysProjUseFlow.setOptionType("退款修改"); sysProjUseFlow.setId(null); sysProjUseFlow.setUpdateBy(user.getSuName()); sysProjUseFlow.setCreateBy(user.getSuName()); sysProjUseDao.insertFlow(sysProjUseFlow); } } if (Dictionary.SHOPPING_GOODS_TYPE_CZK.equals(item.getType())) { MoneyCardUse queryCardUse = new MoneyCardUse(); queryCardUse.setStatus(Dictionary.TAOCAN_STATUS_YX); queryCardUse.setOrderItemId(item.getOldItemId()); List moneyCardUses = moneyCardUseDao.selectByModel(queryCardUse); for (int i = 0; i < item.getCount(); i++) { MoneyCardUse moneyCardUse = moneyCardUses.get(i); moneyCardUse.setIsOver(Dictionary.FLAG_YES_Y); moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_WX); moneyCardUseDao.update(moneyCardUse); } } // TODO 综合卡退款 if (Dictionary.SHOPPING_GOODS_TYPE_ZHK.equals(item.getType())) { } ShoppingGoods goods = shoppingGoodsDao.selectById(item.getGoodsId()); goods.setRealSealCount(goods.getRealSealCount() - item.getCount()); shoppingGoodsDao.update(goods); } BusParameterSettings manageStockSetting = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WAREHOUSE_MANAGE_STOCK, sysOrder.getCompanyId()); if (AppConstance.IS_Y.equals(manageStockSetting.getParamValue())) { // 家居产品退库存 if (CollectionUtils.isNotEmpty(returnGoodsList)) { refundInstore(returnGoodsList); } } } /** * 退款入库 */ private void refundInstore(@NotEmpty List items) { SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); SysSupplierInfo supplierInfo = new SysSupplierInfo(); supplierInfo.setShopId(user.getShopId()); supplierInfo = sysSupplierInfoDao.selectByModel(supplierInfo).get(0); Warehouse warehouse = warehouseDao.findShopWarehouse(user.getShopId()).get(0); SysInstoreInfo instoreInfo = new SysInstoreInfo(); instoreInfo.setInstoreType(SysInstoreInfo.INSTORE_TYPE_RETURN); instoreInfo.setInstoreDate(new Date()); instoreInfo.setSupplierId(supplierInfo.getId().toString()); instoreInfo.setStoreId(warehouse.getId()); instoreInfo.setCheckStatus(Dictionary.CHECK_STATUS_DSH); // 设置入库单编号 instoreInfo.setInstoreId(DateUtil.getTimeMark()); instoreInfo.setShopId(user.getShopId()); instoreInfo.setCompanyId(user.getCompanyId()); sysInstoreInfoDao.insert(instoreInfo); Double total = 0.0; List instoreDetails = new ArrayList<>(); for (SysOrderItem item : items) { ShoppingGoods goods = shoppingGoodsDao.selectById(item.getGoodsId()); SysInstoreDetail sysInstoreDetail = new SysInstoreDetail(); sysInstoreDetail.setAmount(item.getCount().doubleValue()); sysInstoreDetail.setPrice(item.getZkPrice()); sysInstoreDetail.setSkuId(goods.getId()); total = MoneyUtil.add(MoneyUtil.mul(Double.parseDouble(sysInstoreDetail.getAmount() + ""), sysInstoreDetail.getPrice()), total); sysInstoreDetail.setInstoreId(instoreInfo.getId()); // 设置小计 sysInstoreDetail.setPriceTotal(MoneyUtil.mul(Double.parseDouble(sysInstoreDetail.getAmount() + ""), sysInstoreDetail.getPrice())); instoreDetails.add(sysInstoreDetail); } instoreInfo.setSumall(total); sysInstoreInfoDao.update(instoreInfo); sysInstoreDetailDao.batchInsert(instoreDetails); sysInstoreInfoService.check(instoreInfo); } @Override public BigDecimal findVipArrearsByVipId(Long vipId) { return sysOrderDao.selectArrearsByVipId(vipId); } //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓===增删改查代码区↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ @Override public int add(SysOrder sysOrder) { return sysOrderDao.insert(sysOrder); } @Override public int modify(SysOrder sysOrder) { return sysOrderDao.update(sysOrder); } @Override public int remove(List list) { return sysOrderDao.deleteByIds(list); } @Override @Transactional public int removeById(Long id) { orderItemDao.deleteByOrderId(id); return sysOrderDao.deleteById(id); } @Override public List findInPage(SysOrder sysOrder, PaginationVO pageVo) { if (pageVo != null) { pageVo.setSort("desc"); pageVo.setSort("orderTime"); } return sysOrderDao.selectInPage(sysOrder, pageVo); } @Override public List findByModel(SysOrder sysOrder) { return sysOrderDao.selectByModel(sysOrder); } @Override public int findTotal(SysOrder sysOrder) { return sysOrderDao.selectInPageCount(sysOrder); } @Override public SysOrder findById(Long id) { return sysOrderDao.selectById(id); } }