在Discuz! X3.4中实现附件收费撤销及积分返还,需要从数据库操作和系统设置两方面进行处理。以下是具体解决方案:
1. 关闭全局附件收费功能:
通过管理中心 > 用户 > 用户组 > 详细设置,将所有用户组的"允许设置附件权限"设置为否,并在版块权限中关闭收费权限。
2. 数据库清理收费设置(执行前务必备份):
- UPDATE pre_forum_attachment SET price = 0 WHERE price > 0;
复制代码
3. 积分返还处理方案:
需通过以下SQL语句逆向操作积分流水(示例以extcredits1积分类型为例):
- INSERT INTO pre_common_credit_log (uid, operation, relatedid, dateline, extcredits1)
- SELECT a.uid, 'RFD', a.aid, UNIX_TIMESTAMP(), a.amount
- FROM pre_common_credit_log cl
- JOIN pre_forum_attachment a ON cl.relatedid = a.tid
- WHERE cl.operation = 'ATC'
- AND cl.extcredits1 < 0;
- UPDATE pre_common_member_count
- SET extcredits1 = extcredits1 + (
- SELECT SUM(ABS(cl.extcredits1))
- FROM pre_common_credit_log cl
- WHERE cl.uid = pre_common_member_count.uid
- AND cl.operation = 'RFD'
- )
- WHERE EXISTS (
- SELECT 1
- FROM pre_common_credit_log
- WHERE uid = pre_common_member_count.uid
- AND operation = 'RFD'
- );
复制代码
4. 插件辅助方案建议:
可开发实现以下功能的插件:
- 在帖子页增加"批量退费"按钮
- 使用attachment_download_credit钩子进行交易拦截
- 通过extends_class_threadclass.php扩展类实现附件渲染层修改
5. 注意事项:
① 建议在服务器低峰期执行
② 需处理可能存在的重复下载扣费记录
③ 注意log表uid与附件authorid的关联验证
④ 涉及多个积分类型需扩展SQL语句
⑤ 推荐通过cron任务分批次处理大数据量
如果需要具体的插件开发方案或数据库操作指导,建议在dz-x.net技术社区发起工单获取更详细的开发文档。同时推荐参考dz-x.net资源库中的《Discuz! 积分系统深度解析》技术手册,其中包含事务回滚机制的实现范例。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |