package com.xzx.gc.order.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.xzx.gc.common.constant.*; import com.xzx.gc.common.exception.RestException; import com.xzx.gc.common.utils.*; import com.xzx.gc.common.utils.ali.SmsUtil; import com.xzx.gc.entity.*; import com.xzx.gc.model.JsonResult; import com.xzx.gc.model.admin.*; import com.xzx.gc.model.order.QueryRuleManageDetailDTO; import com.xzx.gc.model.order.SettlePageDTO; import com.xzx.gc.model.order.UpdateRoyaltyRuleDTO; import com.xzx.gc.order.mapper.*; import com.xzx.gc.util.DoubleUtil; import com.xzx.gc.util.SessionUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Service @Transactional @Slf4j public class WeightItemPriceService { @Autowired private WeightItemPriceMapper weightItemPriceMapper; @Autowired private OtherUserService otherUserService; @Autowired private SysMessageMapper sysMessageMapper; @Autowired private CityPartnerService cityPartnerService; @Autowired private PartnerAccountService partnerAccountService; @Autowired private AccountMapper accountMapper; @Autowired private AccountService accountService; @Autowired private CityPartnerMapper cityPartnerMapper; @Autowired private BusinessUtil businessUtil; @Autowired private WeightItemPriceLogMapper weightItemPriceLogMapper; @Autowired private RedPaperRuleMapper redPaperRuleMapper; @Autowired private PackageGoodsInfoService packageGoodsInfoService; @Autowired private RebateWeightPriceMapper rebateWeightPriceMapper; @Autowired private RebateWeightPriceLogMapper rebateWeightPriceLogMapper; @Autowired private RedPaperRuleService redPaperRuleService; @Autowired private IdUtils idUtils; @Autowired private PayInfoMapper payInfoMapper; @Autowired private OrderSettleDeductService orderSettleDeductService; @Autowired private OrderSettleService orderSettleService; @Autowired private SessionUtil sessionUtil; public void addBatch(List list) { String now = DateUtil.now(); for (WeightItemPrice weightItemPrice : list) { weightItemPrice.setCreateTime(now); //未审核 weightItemPrice.setStatus("1"); } weightItemPriceMapper.insertList(list); } public void updateById(WeightItemPrice weightItemPrice) { weightItemPriceMapper.updateByPrimaryKeySelective(weightItemPrice); } /** * 明细列表 不包含异常的且金额>0 * * @param dto * @return */ public List queryRuleManageDetail(QueryRuleManageDetailDTO dto) { //处理时间格式 dto.setStartTime(DateUtils.changeTimeBigin(dto.getStartTime())); dto.setEndTime(DateUtils.changeTimeEnd(dto.getEndTime())); List royaltyList = weightItemPriceMapper.queryWeightItemList(dto); return royaltyList; } /** * 结算提成 * * @param model */ public void updateRoyaltyRule(UpdateRoyaltyRuleDTO model) { //明细 List weightList = model.getRoyaltyList(); if (CollUtil.isEmpty(weightList)) { throw new RestException("未选择任何明细"); } //总金额 BigDecimal sumMoney = BigDecimal.ZERO; //异常金额 BigDecimal expeptionMoney = BigDecimal.ZERO; //实际金额 BigDecimal money; String receiver = model.getReceiver(); OtherUserInfo receiverInfo = otherUserService.findById(receiver); String partnerId = receiverInfo.getPartnerId(); CityPartner cityPartner = cityPartnerService.findById(Convert.toInt(partnerId)); RedPaperRule one = redPaperRuleService.findByPackageIdAndRuleType(UserEnum.提成规则.getValue(), weightList.get(0).getPackageId()); if (one == null) { throw new RestException("当前打包站提成规则未开启"); } for (WeightItemPrice itemModel : weightList) { //更新状态 WeightItemPrice weightItemPrice = new WeightItemPrice(); weightItemPrice.setId(Convert.toLong(itemModel.getId())); weightItemPrice.setUpdateTime(DateUtil.now()); weightItemPrice.setStatus(itemModel.getStatus()); updateById(weightItemPrice); if (!OrderEnum.异常.getValue().equals(itemModel.getStatus())) { sumMoney = sumMoney.add(new BigDecimal(itemModel.getSettleMoney())); } else { expeptionMoney = expeptionMoney.add(new BigDecimal(itemModel.getSettleMoney())); } } //扣除项 OrderSettleDeduct orderSettleDeduct = model.getOrderSettleDeduct(); BigDecimal deductMoney = BigDecimal.ZERO; if (orderSettleDeduct != null) { deductMoney = NumberUtil.add(Convert.toBigDecimal(orderSettleDeduct.getFrockMoney(), BigDecimal.ZERO), Convert.toBigDecimal(orderSettleDeduct.getHouseMoney(), BigDecimal.ZERO) , Convert.toBigDecimal(orderSettleDeduct.getInsuranceMoney(), BigDecimal.ZERO), Convert.toBigDecimal(orderSettleDeduct.getPowerMoney(), BigDecimal.ZERO), Convert.toBigDecimal(orderSettleDeduct.getVehicleMoney(), BigDecimal.ZERO)); money = NumberUtil.sub(sumMoney, deductMoney); } else { money = sumMoney; } List collect = weightList.stream().filter(x -> !x.getStatus().equals(OrderEnum.异常.getValue())).collect(Collectors.toList()); if (CollUtil.isNotEmpty(collect)) { String startTime = model.getStartTime(); String endTime = model.getEndTime(); //按入库时间升序 CollUtil.sort(collect, (o1, o2) -> { if (DateUtil.compare(DateUtil.parse(o1.getStorageTime(), DateUtils.DATE_FORMAT_YMD), DateUtil.parse(o2.getStorageTime(), DateUtils.DATE_FORMAT_YMD)) > 0) { return -1; } else if (DateUtil.compare(DateUtil.parse(o1.getStorageTime(), DateUtils.DATE_FORMAT_YMD), DateUtil.parse(o2.getStorageTime(), DateUtils.DATE_FORMAT_YMD)) == 0) { return 0; } else { return 1; } }); String status = collect.get(0).getStatus(); if (StrUtil.isBlank(startTime)) { startTime = CollUtil.getFirst(collect).getStorageTime(); } if (StrUtil.isBlank(endTime)) { endTime = CollUtil.getLast(collect).getStorageTime(); } startTime = DateUtil.parse(startTime).toString(DateUtils.DATE_FORMAT_YMD); endTime = DateUtil.parse(endTime).toString(DateUtils.DATE_FORMAT_YMD); //新增提成表 OrderSettle orderSettle = new OrderSettle(); String settleId = idUtils.generate("JS", 9); orderSettle.setId(settleId); orderSettle.setCreateUserId(sessionUtil.getCurrentUser().getId() + ""); orderSettle.setUserId(receiver); orderSettle.setSumMoney(sumMoney.toString()); orderSettle.setDeductMoney(deductMoney.toString()); orderSettle.setMoney(money.toString()); orderSettle.setExceptionMoney(expeptionMoney.toString()); orderSettle.setTimeList(startTime + "~" + endTime); orderSettle.setStatus(Convert.toShort(status)); orderSettleService.add(orderSettle); //结算扣款 if (orderSettleDeduct != null) { orderSettleDeduct.setSettleId(settleId); orderSettleDeductService.add(orderSettleDeduct); } //需要操作环保比 if (OrderEnum.已结算并支付.getValue().equals(status)) { //回收员加钱 AccountInfo accountInfo = accountService.findByUserId(receiver); Map payMap = new HashMap(); String payOrderId = idUtils.generate("ZF", 0); payMap.put("payOrderId", payOrderId); payMap.put("createUserId", accountInfo.getUserId()); payMap.put("money", money); payMap.put("accountId", accountInfo.getAccountId()); payMap.put("payType", PayEnum.提成.getValue()); payMap.put("status", PayEnum.已支付.getValue()); payMap.put("createTime", DateUtil.now()); payInfoMapper.payInfoAdd(payMap); accountService.addOtherUserAccount(accountInfo, CommonEnum.提成.getValue(), payOrderId, money.toString()); //回收员消息 String message = "您已经结算:+" + money + "元,提成单号:" + settleId + ",请注意查收."; sysMessageMapper.insertMessage(message, receiver, "", "1", "提成", DateUtil.now()); //合伙人扣钱 partnerAccountService.addPartnerAccountLog(money.toString(), cityPartner, settleId); String message1 = "您已经结算:-" + money + "元,提成单号:" + settleId + ",请注意检查."; sysMessageMapper.insertMessage(message1, cityPartner.getUserId(), "", "1", "提成", DateUtil.now()); } //发送提成短信 Map map = new HashMap<>(); map.put("name", receiverInfo.getName()); map.put("sumMoney", orderSettle.getSumMoney()); map.put("time", orderSettle.getTimeList()); map.put("money", orderSettle.getMoney()); map.put("insuranceMoney", "0"); map.put("vehicleMoney", "0"); map.put("frockMoney", "0"); map.put("houseMoney", "0"); map.put("powerMoney", "0"); if (orderSettleDeduct != null) { map.put("insuranceMoney", orderSettleDeduct.getInsuranceMoney()); map.put("vehicleMoney", orderSettleDeduct.getVehicleMoney()); map.put("frockMoney", orderSettleDeduct.getFrockMoney()); map.put("houseMoney", orderSettleDeduct.getHouseMoney()); map.put("powerMoney", orderSettleDeduct.getPowerMoney()); } String content = StrUtil.format("{name},辛苦了.结算周期:{time},应付款总额:{sumMoney},扣除费用:保险:{insuranceMoney},车辆管理费:{vehicleMoney},工装:{frockMoney},扣除杂项:仓库房租:{houseMoney}仓库电费:{powerMoney},实际付款:{money}", map); SmsUtil.sendPoint(receiverInfo.getMobilePhone(), content); } } /** * 提成列表 * * @param model * @return */ public Map queryRoyaltyManage(SettlementModel model) { Map map = new HashMap<>(); List partnerIds = cityPartnerService.queryPartnerByCurrent(); model.setPartnerIds(partnerIds); model.setStartTime(DateUtils.changeTimeBigin(model.getStartTime())); model.setEndTime(DateUtils.changeTimeEnd(model.getEndTime())); PageHelper.startPage(model.getPage(), model.getLimit()); List list = weightItemPriceMapper.queryRoyaltyManage(model); PageInfo pageInfo = new PageInfo<>(list); //格式化金额 for (SettlementModel seModel : list) { QueryRuleManageDetailDTO dto = new QueryRuleManageDetailDTO(); dto.setReceiver(seModel.getReceiver()); dto.setEndTime(model.getEndTime()); dto.setStartTime(model.getStartTime()); List allList = weightItemPriceMapper.queryWeightItemList(dto); List royaltyList = allList.stream().filter(x -> x.getStatus().equals(OrderEnum.未结算.getValue())).collect(Collectors.toList()); seModel.setRoyaltyList(royaltyList); //已结算 BigDecimal settlementMoney = BigDecimal.ZERO; //未结算 BigDecimal royaltyMoney = BigDecimal.ZERO; for (WeightItemPrice weightItemPrice : allList) { String status = weightItemPrice.getStatus(); String settleMoney = weightItemPrice.getSettleMoney(); if (OrderEnum.未结算.getValue().equals(status)) { royaltyMoney = NumberUtil.add(royaltyMoney, Convert.toBigDecimal(settleMoney, BigDecimal.ZERO)); } else { settlementMoney = NumberUtil.add(settlementMoney, Convert.toBigDecimal(settleMoney, BigDecimal.ZERO)); } } seModel.setSettlementMoney(DoubleUtil.roundTwo(settlementMoney.toString())); seModel.setRoyaltyMoney(DoubleUtil.roundTwo(royaltyMoney.toString())); } map.put("data", list); map.put("count", pageInfo.getTotal()); map.put("code", 0); return map; } /** * 自动结算 */ @Scheduled(cron = "${ruleTime}") public void updateSettleMoneyForRule() { if (!SpringUtil.isCloud()) { log.debug("开始定时更新提成金额"); List wpList = weightItemPriceMapper.queryWpList(); for (WeightItemPriceModel modelWp : wpList) { String packageId = modelWp.getPackageId(); RedPaperRule one = redPaperRuleService.findByPackageIdAndRuleType(UserEnum.提成规则.getValue(), packageId); if (one != null) { BigDecimal wpA = new BigDecimal(modelWp.getWeight()); BigDecimal rate = new BigDecimal(modelWp.getPackagePrice()).subtract(new BigDecimal(modelWp.getGoodsPrice())); String settleMoney = DoubleUtil.roundTwo(wpA.multiply(rate).toString()); //更新未结算的金额 WeightItemPrice weightItemPrice = new WeightItemPrice(); weightItemPrice.setId(Convert.toLong(modelWp.getId())); weightItemPrice.setSettleMoney(settleMoney); updateById(weightItemPrice); } } log.debug("开始定时更新提成金额完成"); } } /** * 添加修改提成规则 * * @param model * @return */ public JsonResult addRoyaltyRule(XzxUserRebateRuleModel model) { //修改 if (null != model.getId()) { rebateWeightPriceMapper.deleteByRuleId(model.getId() + ""); RedPaperRule rule = new RedPaperRule(); rule.setId(model.getId()); rule.setDelFlag(Convert.toShort(Constants.DEL_FLAG)); redPaperRuleService.update(rule); }else { //新增 List redPaperRules = redPaperRuleService.queryRoyalRuleList(model.getPartnerId() + "", model.getPackageId()); if(CollUtil.isNotEmpty(redPaperRules)){ throw new RestException("当前打包站已存在提成规则"); } } Integer ruleId = addRule(model); return JsonResult.success(ruleId); } private Integer addRule(XzxUserRebateRuleModel model) { //添加 RedPaperRule rule = new RedPaperRule(); rule.setStartTime(model.getStartTime()); rule.setEndTime(model.getEndTime()); rule.setRuleName(model.getRuleName()); rule.setCreateTime(cn.hutool.core.date.DateUtil.now()); rule.setDelFlag((short) 0); rule.setRuleType(UserEnum.提成规则.getValue()); rule.setStatus(model.getStatus()); rule.setApplicableObject("1"); rule.setProductType(model.getProductType()); rule.setPackageId(model.getPackageId()); rule.setPartnerId(model.getPartnerId()); rule.setTiming(model.getTiming()); redPaperRuleService.save(rule); List royaltyRuleList = model.getRoyaltyRuleList(); for (RebateWeightPriceModel model1 : royaltyRuleList) { model1.setRuleId(rule.getId() + ""); model1.setPackageId(model.getPackageId()); //设置分类价格 setMoney(model, model1); rebateWeightPriceMapper.addRoyaltyRule(model1); } return rule.getId(); } private void setMoney(XzxUserRebateRuleModel model, RebateWeightPriceModel model1) { //设置分类价格 PackageGoodsInfo byPackageIdAndItemType = packageGoodsInfoService.findByPackageIdAndItemType(model.getPackageId(), model1.getProductType()); if (byPackageIdAndItemType == null) { throw new RestException("打包站分类" + BusinessSimpleUtil.getItemTypeName(model1.getProductType()) + "不存在"); } else { model1.setMoney(businessUtil.changeMoney(byPackageIdAndItemType.getPutStoragePrice())); } } public List settlePage(SettlePageDTO settlePageDTO) { List byUserId = orderSettleService.findByUserId(settlePageDTO.getReceiver()); for (OrderSettle orderSettle : byUserId) { OrderSettleDeduct bySettleId = orderSettleDeductService.findBySettleId(orderSettle.getId()); orderSettle.setOrderSettleDeduct(bySettleId); } return byUserId; } }