| 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<WeightItemPrice> 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<WeightItemPrice> queryRuleManageDetail(QueryRuleManageDetailDTO dto) {  | 
|         //处理时间格式  | 
|         dto.setStartTime(DateUtils.changeTimeBigin(dto.getStartTime()));  | 
|         dto.setEndTime(DateUtils.changeTimeEnd(dto.getEndTime()));  | 
|         List<WeightItemPrice> royaltyList = weightItemPriceMapper.queryWeightItemList(dto);  | 
|         return royaltyList;  | 
|     }  | 
|   | 
|     /**  | 
|      * 结算提成  | 
|      *  | 
|      * @param model  | 
|      */  | 
|     public void updateRoyaltyRule(UpdateRoyaltyRuleDTO model) {  | 
|         //明细  | 
|         List<WeightItemPrice> 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<WeightItemPrice> 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<String, String> 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<String, Object> queryRoyaltyManage(SettlementModel model) {  | 
|         Map<String, Object> map = new HashMap<>();  | 
|         List<String> 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<SettlementModel> list = weightItemPriceMapper.queryRoyaltyManage(model);  | 
|         PageInfo<SettlementModel> 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<WeightItemPrice> allList = weightItemPriceMapper.queryWeightItemList(dto);  | 
|             List<WeightItemPrice> 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<WeightItemPriceModel> 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<RedPaperRule> 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<RebateWeightPriceModel> 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<OrderSettle> settlePage(SettlePageDTO settlePageDTO) {  | 
|         List<OrderSettle> byUserId = orderSettleService.findByUserId(settlePageDTO.getReceiver());  | 
|         for (OrderSettle orderSettle : byUserId) {  | 
|             OrderSettleDeduct bySettleId = orderSettleDeductService.findBySettleId(orderSettle.getId());  | 
|             orderSettle.setOrderSettleDeduct(bySettleId);  | 
|         }  | 
|   | 
|         return byUserId;  | 
|     }  | 
| }  |