MrShi
7 小时以前 59bfd0b8bbbf0ee94ec68e4a3a1a6e536d0ad8fd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package com.doumee.biz.system.impl;
 
import com.doumee.biz.system.OperationConfigBiz;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.dao.dto.OperationConfigDTO;
import com.doumee.dao.system.model.SystemDictData;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
 
import java.math.BigDecimal;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
/**
 * 运营配置业务实现
 * @author rk
 * @date 2026/04/13
 */
@Service
public class OperationConfigBizImpl implements OperationConfigBiz {
 
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
 
    @Override
    public OperationConfigDTO getConfig() {
        OperationConfigDTO dto = new OperationConfigDTO();
        dto.setDriverDailyCancelLimit(getValue(Constants.OP_DRIVER_DAILY_CANCEL_LIMIT));
        dto.setUnpickedDiscount(getValue(Constants.OP_UNPICKED_DISCOUNT));
        dto.setSettlementDate(getValue(Constants.OP_SETTLEMENT_DATE));
        dto.setUrgentCoefficient(getValue(Constants.OP_URGENT_COEFFICIENT));
        dto.setAutoCancelTime(getValue(Constants.OP_AUTO_CANCEL_TIME));
        dto.setInsuranceRate(getValue(Constants.OP_INSURANCE_RATE));
        dto.setOrderAcceptLimit(getValue(Constants.OP_ORDER_ACCEPT_LIMIT));
        dto.setAutoConfirmReceipt(getValue(Constants.OP_AUTO_CONFIRM_RECEIPT));
        dto.setNoGrabNotifyTime(getValue(Constants.OP_NO_GRAB_NOTIFY_TIME));
        dto.setNoGrabNotifyUsers(getValue(Constants.OP_NO_GRAB_NOTIFY_USERS));
        dto.setDefaultDeliveryRange(getValue(Constants.OP_DEFAULT_DELIVERY_RANGE));
        dto.setArrivalPickUpTime(getValue(Constants.OP_ARRIVAL_PICK_UP_TIME));
        dto.setOperationRadius(getValue(Constants.OP_OPERATION_RADIUS));
        dto.setOrderCouponOrderCount(getValue(Constants.OP_ORDER_COUPON_ORDER_COUNT));
        dto.setOrderCouponGiftCount(getValue(Constants.OP_ORDER_COUPON_GIFT_COUNT));
        dto.setOrderCouponId(getValue(Constants.OP_ORDER_COUPON_ID));
        dto.setRegisterCouponYears(getValue(Constants.OP_REGISTER_COUPON_YEARS));
        dto.setRegisterCouponGiftCount(getValue(Constants.OP_REGISTER_COUPON_GIFT_COUNT));
        dto.setRegisterCouponId(getValue(Constants.OP_REGISTER_COUPON_ID));
        dto.setRegisterGiftCouponIds(getValue(Constants.OP_REGISTER_GIFT_COUPON_IDS));
        dto.setRegisterRewardOrderCount(getValue(Constants.OP_REGISTER_REWARD_ORDER_COUNT));
        dto.setRegisterRewardAmount(getValue(Constants.OP_REGISTER_REWARD_AMOUNT));
        dto.setPlatformRewardOrderCount(getValue(Constants.OP_PLATFORM_REWARD_ORDER_COUNT));
        dto.setPlatformRewardAmount(getValue(Constants.OP_PLATFORM_REWARD_AMOUNT));
        dto.setInvoiceMonthLimit(getValue(Constants.OP_INVOICE_MONTH_LIMIT));
        return dto;
    }
 
    @Override
    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
    public void saveConfig(OperationConfigDTO dto) {
        validate(dto);
        saveOrUpdate(Constants.OP_DRIVER_DAILY_CANCEL_LIMIT, "司机每日取消次数", dto.getDriverDailyCancelLimit());
        saveOrUpdate(Constants.OP_UNPICKED_DISCOUNT, "未取件折扣", dto.getUnpickedDiscount());
        saveOrUpdate(Constants.OP_SETTLEMENT_DATE, "订单结算日期", dto.getSettlementDate());
        saveOrUpdate(Constants.OP_URGENT_COEFFICIENT, "加急系数", dto.getUrgentCoefficient());
        saveOrUpdate(Constants.OP_AUTO_CANCEL_TIME, "超时未支付自动取消时间", dto.getAutoCancelTime());
        saveOrUpdate(Constants.OP_INSURANCE_RATE, "保费比率", dto.getInsuranceRate());
        saveOrUpdate(Constants.OP_ORDER_ACCEPT_LIMIT, "接单数量", dto.getOrderAcceptLimit());
        saveOrUpdate(Constants.OP_AUTO_CONFIRM_RECEIPT, "自动确认收货", dto.getAutoConfirmReceipt());
        saveOrUpdate(Constants.OP_NO_GRAB_NOTIFY_TIME, "无人抢单通知时间", dto.getNoGrabNotifyTime());
        saveOrUpdate(Constants.OP_NO_GRAB_NOTIFY_USERS, "无人抢单短信通知人员", dto.getNoGrabNotifyUsers());
        saveOrUpdate(Constants.OP_DEFAULT_DELIVERY_RANGE, "默认配送范围", dto.getDefaultDeliveryRange());
        saveOrUpdate(Constants.OP_ARRIVAL_PICK_UP_TIME, "即将到达取件时间通知", dto.getArrivalPickUpTime());
//        saveOrUpdate(Constants.OP_OPERATION_RADIUS, "允许操作半径", dto.getOperationRadius());
        saveOrUpdate(Constants.OP_ORDER_COUPON_ORDER_COUNT, "下单赠送-订单次数", dto.getOrderCouponOrderCount());
        saveOrUpdate(Constants.OP_ORDER_COUPON_GIFT_COUNT, "下单赠送-至多赠送次数", dto.getOrderCouponGiftCount());
        saveOrUpdate(Constants.OP_ORDER_COUPON_ID, "下单赠送-优惠券ID", dto.getOrderCouponId());
        saveOrUpdate(Constants.OP_REGISTER_COUPON_YEARS, "注册赠送-注册年数", dto.getRegisterCouponYears());
        saveOrUpdate(Constants.OP_REGISTER_COUPON_GIFT_COUNT, "注册赠送-至多赠送次数", dto.getRegisterCouponGiftCount());
        saveOrUpdate(Constants.OP_REGISTER_COUPON_ID, "注册赠送-优惠券ID", dto.getRegisterCouponId());
        saveOrUpdate(Constants.OP_REGISTER_GIFT_COUPON_IDS, "新注册赠送-优惠券IDs", dto.getRegisterGiftCouponIds());
        saveOrUpdate(Constants.OP_REGISTER_REWARD_ORDER_COUNT, "注册完成订单奖励单数", dto.getRegisterRewardOrderCount());
        saveOrUpdate(Constants.OP_REGISTER_REWARD_AMOUNT, "注册完成订单奖励金额(分)", yuanToFen(dto.getRegisterRewardAmount()));
        saveOrUpdate(Constants.OP_PLATFORM_REWARD_ORDER_COUNT, "平台完成订单奖励单数", dto.getPlatformRewardOrderCount());
        saveOrUpdate(Constants.OP_PLATFORM_REWARD_AMOUNT, "平台完成订单奖励金额(分)", yuanToFen(dto.getPlatformRewardAmount()));
        saveOrUpdate(Constants.OP_INVOICE_MONTH_LIMIT, "发票开具月份限制(月)", dto.getInvoiceMonthLimit());
    }
 
    private String getValue(String label) {
        SystemDictData data = systemDictDataBiz.queryByCode(Constants.OPERATION_CONFIG, label);
        return data != null ? data.getCode() : null;
    }
 
    private void saveOrUpdate(String label, String name, String value) {
        SystemDictData existing = systemDictDataBiz.queryByCode(Constants.OPERATION_CONFIG, label);
        if (existing != null && existing.getId() != null) {
            existing.setCode(value);
            systemDictDataBiz.updateById(existing);
        } else {
            SystemDictData newData = new SystemDictData();
            newData.setDictId(105);
            newData.setLabel(label);
            newData.setRemark(name);
            newData.setCode(value);
            newData.setDisabled(false);
            newData.setDeleted(false);
            systemDictDataBiz.create(newData);
        }
    }
 
    private String fenToYuan(String fen) {
        if (StringUtils.isBlank(fen)) {
            return null;
        }
        return new BigDecimal(fen).divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_UP).toPlainString();
    }
 
    private String yuanToFen(String yuan) {
        if (StringUtils.isBlank(yuan)) {
            return null;
        }
        return new BigDecimal(yuan).multiply(new BigDecimal("100")).setScale(0, BigDecimal.ROUND_HALF_UP).toPlainString();
    }
 
    private void validate(OperationConfigDTO dto) {
        if (dto == null
                || StringUtils.isBlank(dto.getDriverDailyCancelLimit())
                || StringUtils.isBlank(dto.getUnpickedDiscount())
                || StringUtils.isBlank(dto.getSettlementDate())
                || StringUtils.isBlank(dto.getUrgentCoefficient())
                || StringUtils.isBlank(dto.getAutoCancelTime())
                || StringUtils.isBlank(dto.getInsuranceRate())
                || StringUtils.isBlank(dto.getOrderAcceptLimit())
                || StringUtils.isBlank(dto.getAutoConfirmReceipt())
                || StringUtils.isBlank(dto.getNoGrabNotifyTime())
                || StringUtils.isBlank(dto.getNoGrabNotifyUsers())
                || StringUtils.isBlank(dto.getDefaultDeliveryRange())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "所有配置项均为必填");
        }
    }
}