商城系统 订单批量删除工具附源代码 最近风大,清清记录更健康[5P]
大家好,我是沧海跨云药神 前段时间做的一个小工具, 根据时间线或者某个订单截断数据! 正经行业是不需要这个工具的 不太正经的行业,嗯哼,或许对您有用 ![]() ![]() ![]() ![]() 控制方法 - public function index()
- {
- if (request()->isPost()) {
- $action = input('post.action', '');
- if ($action === 'search') {
- return $this->search();
- } elseif ($action === 'delete') {
- return $this->delete();
- }
- }
- return MyView();
- }
- private function search()
- {
- $params = [
- 'date' => input('post.date', ''),
- 'order_id' => input('post.order_id', 0, 'intval'),
- 'page' => input('post.page', 1, 'intval'),
- ];
- $ret = 自定义名称Service::SearchOrders($params);
- return ApiService::ApiDataReturn($ret);
- }
- private function delete()
- {
- $params = [
- 'date' => input('post.date', ''),
- 'order_id' => input('post.order_id', 0, 'intval'),
- ];
- $ret = 自定义名称Service::DeleteOrders($params);
- return ApiService::ApiDataReturn($ret);
- }
服务文件 - class 自定义名称Service
- {
- /**
- * 搜索订单(预览列表)
- */
- public static function SearchOrders($params)
- {
- $where = self::BuildWhere($params);
- if (empty($where)) {
- return DataReturn('请选择日期或输入订单ID', -1);
- }
- $page = isset($params['page']) ? intval($params['page']) : 1;
- $limit = 20;
- $total = Db::name('Order')->where($where)->count();
- $list = Db::name('Order')
- ->where($where)
- ->field('id, order_no, user_id, total_price, status, pay_status, add_time')
- ->order('id', 'desc')
- ->page($page, $limit)
- ->select()
- ->toArray();
- if (!empty($list)) {
- $order_ids = array_column($list, 'id');
- $user_ids = array_column($list, 'user_id');
- // 用户信息
- $users = Db::name('User')
- ->whereIn('id', $user_ids)
- ->field('id, username, email')
- ->select()
- ->toArray();
- $userMap = [];
- foreach ($users as $u) {
- $userMap[$u['id']] = !empty($u['email']) ? $u['email'] : $u['username'];
- }
- // 收货地址
- $addresses = Db::name('OrderAddress')
- ->whereIn('order_id', $order_ids)
- ->field('order_id, name, tel, province_name, city_name, county_name, address')
- ->select()
- ->toArray();
- $addrMap = [];
- foreach ($addresses as $addr) {
- $addrMap[$addr['order_id']] = $addr['name'] . ' ' . $addr['tel'] . ','
- . $addr['province_name'] . $addr['city_name'] . $addr['county_name'] . ' ' . $addr['address'];
- }
- // 商品信息(含规格)
- $goods = Db::name('OrderDetail')
- ->whereIn('order_id', $order_ids)
- ->field('order_id, title, spec')
- ->select()
- ->toArray();
- $goodsMap = [];
- foreach ($goods as $g) {
- $spec_text = '';
- if (!empty($g['spec'])) {
- $spec_arr = json_decode($g['spec'], true);
- if (is_array($spec_arr)) {
- $spec_text = implode(' ', array_map(function($v) {
- return $v['type'] . ':' . $v['value'];
- }, $spec_arr));
- }
- }
- $goodsMap[$g['order_id']][] = [
- 'title' => $g['title'],
- 'spec' => $spec_text,
- ];
- }
- foreach ($list as &$item) {
- $item['user_display'] = $userMap[$item['user_id']] ?? '未知用户';
- $item['address'] = $addrMap[$item['id']] ?? '无地址';
- $item['goods_list'] = $goodsMap[$item['id']] ?? [];
- }
- }
- $totalPrice = Db::name('Order')->where($where)->sum('total_price');
- return DataReturn('success', 0, [
- 'list' => $list,
- 'total' => $total,
- 'totalPrice' => $totalPrice ?: 0,
- 'page' => $page,
- 'limit' => $limit,
- ]);
- }
- /**
- * 删除订单及关联数据(按时间线清理所有支付记录,不限业务类型)
- */
- public static function DeleteOrders($params)
- {
- $where = self::BuildWhere($params);
- if (empty($where)) {
- return DataReturn('请选择日期或输入订单ID', -1);
- }
- $order_ids = Db::name('Order')->where($where)->column('id');
- if (empty($order_ids)) {
- return DataReturn('没有符合条件的订单', -1);
- }
- $total = count($order_ids);
- $max_order_id = max($order_ids);
- $max_order_time = Db::name('Order')
- ->whereIn('id', $order_ids)
- ->max('add_time');
- Db::startTrans();
- try {
- // 1. 删除消息(所有历史订单消息,业务类型为'订单'或'order')
- Db::name('Message')
- ->whereIn('business_type', ['订单', 'order'])
- ->where('business_id', '>', 1)
- ->where('business_id', '<=', $max_order_id)
- ->delete();
- // 2. 删除订单关联的子表(除支付相关外)
- $chunks = array_chunk($order_ids, 200);
- foreach ($chunks as $chunk) {
- Db::name('OrderDetail')->whereIn('order_id', $chunk)->delete();
- Db::name('OrderAddress')->whereIn('order_id', $chunk)->delete();
- Db::name('OrderAftersale')->whereIn('order_id', $chunk)->delete();
- Db::name('OrderCurrency')->whereIn('order_id', $chunk)->delete();
- Db::name('OrderGoodsInventoryLog')->whereIn('order_id', $chunk)->delete();
- Db::name('OrderStatusHistory')->whereIn('order_id', $chunk)->delete();
- Db::name('OrderExtractionCode')->whereIn('order_id', $chunk)->delete();
- Db::name('OrderFictitiousValue')->whereIn('order_id', $chunk)->delete();
- // 删除订单主表
- Db::name('Order')->whereIn('id', $chunk)->delete();
- }
- // 3. 按时间线删除支付日志关联表(不限业务类型)
- if (!empty($max_order_time)) {
- Db::name('PayLogValue')
- ->where('add_time', '<=', $max_order_time)
- ->delete();
- }
- // 4. 按时间线删除支付日志主表(不限业务类型)
- if (!empty($max_order_time)) {
- Db::name('PayLog')
- ->where('add_time', '<=', $max_order_time)
- ->delete();
- }
- // 5. 按时间线删除支付请求日志(不限业务类型)
- if (!empty($max_order_time)) {
- Db::name('PayRequestLog')
- ->where('add_time', '<=', $max_order_time)
- ->delete();
- }
- Db::commit();
- return DataReturn("成功删除 {$total} 条订单及其关联数据;支付记录清理至时间线:".date('Y-m-d H:i:s', $max_order_time)."(不限业务类型)", 0);
- } catch (\Exception $e) {
- Db::rollback();
- return DataReturn('删除失败:' . $e->getMessage(), -1);
- }
- }
- /**
- * 构建查询条件
- */
- private static function BuildWhere($params)
- {
- $where = [];
- if (!empty($params['date'])) {
- $timestamp = strtotime($params['date']);
- if ($timestamp !== false) {
- $where[] = ['add_time', '<=', $timestamp + 86399];
- }
- } elseif (!empty($params['order_id'])) {
- $where[] = ['id', '<=', intval($params['order_id'])];
- }
- return $where;
- }
- }
视图文件 - <div class="content-right">
- <div class="content">
- <div class="am-panel am-panel-default">
- <div class="am-panel-hd am-cf">
- <h3 class="am-fl"><i class="am-icon-trash-o"></i> 批量删除订单</h3>
- </div>
- <div class="am-panel-bd">
- <div class="am-alert am-alert-danger">
- <strong>⚠️ 谨慎操作</strong> 此操作将永久删除符合条件的订单及其所有关联数据,不可恢复!
- </div>
- <!-- 搜索表单 -->
- <div class="am-form am-form-inline" id="searchForm">
- <div class="am-form-group">
- <label class="am-margin-right-sm">截止日期</label>
- <input type="date" name="date" id="date" class="am-form-field" style="width:160px;" />
- <button type="button" class="am-btn am-btn-default am-btn-sm am-margin-left-xs" id="clearDateBtn" style="height:34px;line-height:34px;padding:0 10px;">清除</button>
- </div>
- <div class="am-form-group am-margin-left">
- <label class="am-margin-right-sm">截止订单</label>
- <input type="number" name="order_id" id="order_id" placeholder="输入订单ID" class="am-form-field" style="width:150px;" min="1" />
- </div>
- <button type="button" class="am-btn am-btn-primary" id="searchBtn">查询</button>
- <button type="button" class="am-btn am-btn-danger" id="deleteBtn">删除</button>
- <span class="am-text-muted am-margin-left-sm">(填日期则忽略ID)</span>
- </div>
- <div class="am-margin-top-sm">
- <span>共 <strong id="totalCount">0</strong> 条订单,合计金额:<strong id="totalPrice">0.00</strong> 元</span>
- </div>
- <!-- 卡片式订单列表 -->
- <div id="orderList" class="am-margin-top-sm">
- <div class="am-text-center am-padding-vertical-lg" style="color:#999;">请点击「查询」预览订单</div>
- </div>
- <!-- 分页 -->
- <div class="am-cf">
- <ul class="am-pagination am-fr" id="pageList"></ul>
- </div>
- </div>
- </div>
- </div>
- </div>
视觉样式代码 略 事件点击代码 略 防水图不能略 ![]() 最近风大,清清记录更健康 随手一赞 手留余香! 此貼由沧海跨云药神重新編輯:2026-09-17 03:00
赞(35)
|