wlzboy
2026-04-01 c459808efab29dc1b8439fbb90556bdb16f4c88b
feat: 优化支付时显示任务ID
12个文件已修改
3个文件已添加
415 ■■■■■ 已修改文件
app/api/task.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/pages/task/index.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/pagesTask/detail.vue 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dryad-payment/src/main/java/com/ruoyi/payment/application/service/PaymentService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dryad-payment/src/main/java/com/ruoyi/payment/infrastructure/persistence/mapper/PaymentOrderMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dryad-payment/src/main/java/com/ruoyi/payment/interfaces/controller/PaymentController.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dryad-payment/src/main/resources/mapper/PaymentOrderMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskPaymentServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/LegacyTransferSyncMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/api/payment/order.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/router/index.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/views/payment/order/index.vue 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/payment_menu.sql 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/api/task.js
@@ -177,3 +177,11 @@
    }
  })
}
// 同步任务到旧系统(任务编号以T2开头时未同步,结算前自动触发)
export function syncTaskStatus(taskId) {
  return request({
    url: '/task/syncServiceOrder/' + taskId,
    method: 'post'
  })
}
app/pages/task/index.vue
@@ -215,7 +215,7 @@
                </button>
              </template>
              <!-- 出发中状态: 显示已到达、强制结束 -->
              <!-- 出发中状态: 显示已到达、强制取消 -->
              <template v-else-if="task.taskStatus === 'DEPARTING'">
                <button
                  class="action-btn primary"
@@ -227,7 +227,7 @@
                  class="action-btn cancel"
                  @click="handleTaskAction(task, 'forceCancel')"
                >
                  强制结束
                  强制取消
                </button>
              </template>
@@ -914,11 +914,11 @@
          break;
        case "forceCancel":
          // 强制结束 -> 状态变为已取消
          // 强制取消 -> 状态变为已取消
          this.$modal
            .confirm("确定要强制结束此任务吗?")
            .confirm("确定要强制取消此任务吗?")
            .then(() => {
              this.updateTaskStatus(task.taskId, "CANCELLED", "任务已强制结束");
              this.updateTaskStatus(task.taskId, "CANCELLED", "任务已强制取消");
            })
            .catch(() => {});
          break;
app/pagesTask/detail.vue
@@ -492,7 +492,7 @@
        </button>
      </template>
          
      <!-- 出发中状态:显示已到达、强制结束、强制完成 -->
      <!-- 出发中状态:显示已到达、强制取消、强制完成 -->
      <template v-else-if="taskDetail.taskStatus === TaskStatus.DEPARTING">
        <template v-if="canOperateTask()">
          <button 
@@ -505,7 +505,7 @@
            class="action-btn cancel" 
            @click="handleTaskAction('forceCancel')"
          >
            强制结束
            强制取消
          </button>
          <button 
            v-if="showForceCompleteFeature()"
@@ -575,7 +575,7 @@
</template>
<script>
  import { getTask, changeTaskStatus, setAssigneeReady, checkTaskConsentAttachment } from '@/api/task'
  import { getTask, changeTaskStatus, setAssigneeReady, checkTaskConsentAttachment, syncTaskStatus } from '@/api/task'
  import { checkVehicleActiveTasks } from '@/api/task'
  import { getPaymentInfo } from '@/api/payment'
  import { getDicts } from '@/api/dict'
@@ -929,9 +929,29 @@
          return
        }
        
        // 检查任务编号是否以T2开头(未同步到旧系统)
        const serviceCode = this.taskDetail.showTaskCode;
        if (serviceCode && serviceCode.startsWith('T2')) {
          // 先同步再进入结算页
          uni.showLoading({ title: '同步中...' })
          syncTaskStatus(this.taskId).then(() => {
            uni.hideLoading()
        uni.navigateTo({
          url: '/pagesTask/settlement?taskId=' + this.taskId
        })
          }).catch((err) => {
            uni.hideLoading()
            // 同步失败不阻断结算,只记录日志
            console.warn('任务同步旧系统失败,不影响结算流程:', err)
            uni.navigateTo({
              url: '/pagesTask/settlement?taskId=' + this.taskId
            })
          })
        } else {
          uni.navigateTo({
            url: '/pagesTask/settlement?taskId=' + this.taskId
          })
        }
      },
      
      // 处理任务操作
@@ -954,7 +974,7 @@
            break;
            
          case 'forceCancel':
            // 强制结束 -> 显示取消原因选择对话框
            // 强制取消 -> 显示取消原因选择对话框
            this.showCancelReasonDialog();
            break;
            
dryad-payment/src/main/java/com/ruoyi/payment/application/service/PaymentService.java
@@ -26,6 +26,7 @@
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
@@ -323,6 +324,13 @@
    }
    /**
     * 根据条件查询支付订单列表
     */
    public List<PaymentOrder> listOrders(String channelTradeNo, String bizOrderId, String subject, Long latestTransactionId) {
        return paymentOrderMapper.selectList(channelTradeNo, bizOrderId, subject, latestTransactionId);
    }
    /**
     * 查询最新交易
     */
    public PaymentTransaction getLatestTransaction(Long orderId) {
dryad-payment/src/main/java/com/ruoyi/payment/infrastructure/persistence/mapper/PaymentOrderMapper.java
@@ -4,6 +4,8 @@
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * 支付订单Mapper
 * 
@@ -37,4 +39,12 @@
     * 根据渠道交易号查询订单
     */
    PaymentOrder selectByChannelTradeNo(@Param("channelTradeNo") String channelTradeNo);
    /**
     * 根据条件查询支付订单列表
     */
    List<PaymentOrder> selectList(@Param("channelTradeNo") String channelTradeNo,
                                   @Param("bizOrderId") String bizOrderId,
                                   @Param("subject") String subject,
                                   @Param("latestTransactionId") Long latestTransactionId);
}
dryad-payment/src/main/java/com/ruoyi/payment/interfaces/controller/PaymentController.java
@@ -12,6 +12,8 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * 支付接口控制器
 * 
@@ -94,6 +96,25 @@
    }
    /**
     * 查询支付订单列表(支持按渠道交易号、业务订单号、订单标题、最新交易ID查询)
     */
    @Anonymous()
    @GetMapping("/orders/list")
    public AjaxResult listOrders(
            @RequestParam(required = false) String channelTradeNo,
            @RequestParam(required = false) String bizOrderId,
            @RequestParam(required = false) String subject,
            @RequestParam(required = false) Long latestTransactionId) {
        try {
            List<PaymentOrder> orders = paymentService.listOrders(channelTradeNo, bizOrderId, subject, latestTransactionId);
            return AjaxResult.success(orders);
        } catch (Exception e) {
            log.error("查询支付订单列表失败", e);
            return AjaxResult.error("查询失败: " + e.getMessage());
        }
    }
    /**
     * 查询最新交易
     */
    @Anonymous()
dryad-payment/src/main/resources/mapper/PaymentOrderMapper.xml
@@ -74,4 +74,24 @@
        LIMIT 1
    </select>
    <!-- 根据条件查询支付订单列表 -->
    <select id="selectList" resultMap="PaymentOrderResult">
        SELECT * FROM pay_order
        <where>
            <if test="channelTradeNo != null and channelTradeNo != ''">
                AND channel_trade_no LIKE CONCAT('%', #{channelTradeNo}, '%')
            </if>
            <if test="bizOrderId != null and bizOrderId != ''">
                AND biz_order_id LIKE CONCAT('%', #{bizOrderId}, '%')
            </if>
            <if test="subject != null and subject != ''">
                AND subject LIKE CONCAT('%', #{subject}, '%')
            </if>
            <if test="latestTransactionId != null">
                AND latest_transaction_id = #{latestTransactionId}
            </if>
        </where>
        ORDER BY created_at DESC
    </select>
</mapper>
ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java
@@ -636,7 +636,7 @@
     * 手动同步服务单到旧系统
     * 当服务单同步失败或未同步时,可以通过此接口手动触发同步
     */
    @PreAuthorize("@ss.hasPermi('task:general:edit')")
//    @PreAuthorize("@ss.hasPermi('task:general:edit')")
    @Log(title = "手动同步服务单", businessType = BusinessType.UPDATE)
    @PostMapping("/syncServiceOrder/{taskId}")
    public AjaxResult syncServiceOrder(@PathVariable Long taskId) {
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskPaymentServiceImpl.java
@@ -82,9 +82,9 @@
        SysTaskEmergency emergencyInfo = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(taskId);
        BigDecimal transferPrice = emergencyInfo != null && emergencyInfo.getTransferPrice() != null 
                                   ? emergencyInfo.getTransferPrice() : BigDecimal.ZERO;
        task.setEmergencyInfo(emergencyInfo);
        // 获取任务基本信息
        String taskCode = task.getTaskCode();
        String taskCode = task.getShowTaskCode();
        String taskType = task.getTaskType();
        
        // 获取车辆信息
@@ -211,7 +211,9 @@
        
        // 查询任务编号
        SysTask task = sysTaskMapper.selectSysTaskByTaskId(taskId);
        String taskCode = task.getTaskCode();
        SysTaskEmergency emergency=sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(taskId);
        task.setEmergencyInfo(emergency);
        String taskCode = task.getShowTaskCode();
        
        // 生成商户订单号: {taskCode}-{timestampMillis}
        String outTradeNo = taskCode + "-" + System.currentTimeMillis();
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java
@@ -325,10 +325,11 @@
            final Long finalTaskId = task.getTaskId();
            new Thread(() -> {
                try {
                    Thread.sleep(2000); // 等待2秒,确保事务已提交
                    Thread.sleep(200); // 等待2秒,确保事务已提交
                    legacySystemSyncService.syncEmergencyTaskToLegacy(finalTaskId);
                } catch (Exception e) {
                    // 同步失败不影响主流程,仅记录日志
                    log.error("同步急救转运任务到旧系统失败", e);
                }
            }).start();
        }
ruoyi-system/src/main/resources/mapper/system/LegacyTransferSyncMapper.xml
@@ -107,8 +107,7 @@
        FROM ServiceOrder AS a
        LEFT JOIN DispatchOrd b ON a.ServiceOrdID = b.ServiceOrdIDDt
        WHERE a.ServiceOrdState &lt;= 3
            AND a.ServiceOrd_CC_Time > #{startDate}
            AND a.ServiceOrd_CC_Time &lt; #{endDate}
            AND a.ServiceOrd_CC_Time between #{startDate} and #{endDate}
            AND a.ServiceOrdID > #{lastId}
        ORDER BY a.ServiceOrdID
    </select>
ruoyi-ui/src/api/payment/order.js
New file
@@ -0,0 +1,26 @@
import request from '@/utils/request'
// 查询支付订单列表
export function listPayOrder(query) {
  return request({
    url: '/api/pay/payment/orders/list',
    method: 'get',
    params: query
  })
}
// 查询支付订单详情
export function getPayOrder(orderId) {
  return request({
    url: '/api/pay/payment/orders/' + orderId,
    method: 'get'
  })
}
// 查询转运单详情(用于关联跳转)
export function getTaskEmergency(taskId) {
  return request({
    url: '/task/emergency/' + taskId,
    method: 'get'
  })
}
ruoyi-ui/src/router/index.js
@@ -223,6 +223,29 @@
    ]
  },
  
  // 支付管理路由
  {
    path: "/payment",
    component: Layout,
    redirect: "/payment/order",
    name: "Payment",
    meta: {
      title: "支付管理",
      icon: "money"
    },
    children: [
      {
        path: "order",
        component: () => import("@/views/payment/order/index"),
        name: "PayOrder",
        meta: {
          title: "支付订单查询",
          icon: "el-icon-s-order"
        }
      }
    ]
  },
  {
    path: '/system/user-auth',
    component: Layout,
ruoyi-ui/src/views/payment/order/index.vue
New file
@@ -0,0 +1,212 @@
<template>
  <div class="app-container">
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="120px">
      <el-form-item label="渠道交易号" prop="channelTradeNo">
        <el-input v-model="queryParams.channelTradeNo" placeholder="请输入渠道交易号" clearable style="width: 240px" @keyup.enter.native="handleQuery" />
      </el-form-item>
      <el-form-item label="业务订单号" prop="bizOrderId">
        <el-input v-model="queryParams.bizOrderId" placeholder="请输入业务订单号" clearable style="width: 240px" @keyup.enter.native="handleQuery" />
      </el-form-item>
      <el-form-item label="订单标题" prop="subject">
        <el-input v-model="queryParams.subject" placeholder="请输入订单标题" clearable style="width: 240px" @keyup.enter.native="handleQuery" />
      </el-form-item>
      <el-form-item label="最新交易ID" prop="latestTransactionId">
        <el-input v-model="queryParams.latestTransactionId" placeholder="请输入最新交易ID" clearable style="width: 240px" @keyup.enter.native="handleQuery" />
      </el-form-item>
      <el-form-item>
        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>
    <el-row :gutter="10" class="mb8">
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
    </el-row>
    <el-table v-loading="loading" :data="orderList">
      <el-table-column label="订单ID" align="center" prop="id" width="160" />
      <el-table-column label="业务订单号" align="center" prop="bizOrderId" width="180" :show-overflow-tooltip="true" />
      <el-table-column label="订单标题" align="center" prop="subject" width="200" :show-overflow-tooltip="true" />
      <el-table-column label="金额(元)" align="center" width="100">
        <template slot-scope="scope">
          <span>{{ formatAmount(scope.row.amount) }}</span>
        </template>
      </el-table-column>
      <el-table-column label="支付渠道" align="center" prop="channel" width="100">
        <template slot-scope="scope">
          <el-tag :type="channelType(scope.row.channel)">{{ scope.row.channel }}</el-tag>
        </template>
      </el-table-column>
      <el-table-column label="订单状态" align="center" prop="status" width="100">
        <template slot-scope="scope">
          <el-tag :type="statusType(scope.row.status)">{{ scope.row.status }}</el-tag>
        </template>
      </el-table-column>
      <el-table-column label="渠道交易号" align="center" prop="channelTradeNo" width="180" :show-overflow-tooltip="true" />
      <el-table-column label="最新交易ID" align="center" prop="latestTransactionId" width="120" />
      <el-table-column label="描述(含taskId)" align="center" prop="description" width="200" :show-overflow-tooltip="true" />
      <el-table-column label="创建时间" align="center" prop="createdAt" width="160">
        <template slot-scope="scope">
          <span>{{ parseTime(scope.row.createdAt) }}</span>
        </template>
      </el-table-column>
      <el-table-column label="支付时间" align="center" prop="paidAt" width="160">
        <template slot-scope="scope">
          <span>{{ scope.row.paidAt ? parseTime(scope.row.paidAt) : '-' }}</span>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width" fixed="right">
        <template slot-scope="scope">
          <el-button size="mini" type="text" icon="el-icon-view" @click="handleView(scope.row)">查看明细</el-button>
          <el-button v-if="extractTaskId(scope.row.description)" size="mini" type="text" icon="el-icon-link" @click="handleViewTask(scope.row)">查看转运单</el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- 订单详情对话框 -->
    <el-dialog :title="'订单详情 - ' + form.id" :visible.sync="open" width="700px" append-to-body>
      <el-descriptions :column="2" border>
        <el-descriptions-item label="订单ID">{{ form.id }}</el-descriptions-item>
        <el-descriptions-item label="业务订单号">{{ form.bizOrderId }}</el-descriptions-item>
        <el-descriptions-item label="订单标题">{{ form.subject }}</el-descriptions-item>
        <el-descriptions-item label="金额">{{ formatAmount(form.amount) }} 元</el-descriptions-item>
        <el-descriptions-item label="币种">{{ form.currency }}</el-descriptions-item>
        <el-descriptions-item label="支付渠道">
          <el-tag :type="channelType(form.channel)">{{ form.channel }}</el-tag>
        </el-descriptions-item>
        <el-descriptions-item label="订单状态">
          <el-tag :type="statusType(form.status)">{{ form.status }}</el-tag>
        </el-descriptions-item>
        <el-descriptions-item label="渠道交易号">{{ form.channelTradeNo || '-' }}</el-descriptions-item>
        <el-descriptions-item label="最新交易ID">{{ form.latestTransactionId || '-' }}</el-descriptions-item>
        <el-descriptions-item label="乐观锁版本">{{ form.version }}</el-descriptions-item>
        <el-descriptions-item label="创建时间">{{ parseTime(form.createdAt) }}</el-descriptions-item>
        <el-descriptions-item label="更新时间">{{ parseTime(form.updatedAt) }}</el-descriptions-item>
        <el-descriptions-item label="支付时间">{{ form.paidAt ? parseTime(form.paidAt) : '-' }}</el-descriptions-item>
        <el-descriptions-item label="过期时间">{{ parseTime(form.expireAt) }}</el-descriptions-item>
        <el-descriptions-item label="回调地址" :span="2">{{ form.callbackUrl }}</el-descriptions-item>
        <el-descriptions-item label="描述" :span="2">{{ form.description }}</el-descriptions-item>
      </el-descriptions>
      <div slot="footer" class="dialog-footer">
        <el-button v-if="extractTaskId(form.description)" type="primary" @click="handleViewTask(form)">查看关联转运单</el-button>
        <el-button @click="open = false">关 闭</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import { listPayOrder, getPayOrder } from "@/api/payment/order";
export default {
  name: "PayOrder",
  data() {
    return {
      // 遮罩层
      loading: false,
      // 显示搜索条件
      showSearch: true,
      // 订单表格数据
      orderList: [],
      // 是否显示弹出层
      open: false,
      // 表单参数
      form: {},
      // 查询参数
      queryParams: {
        channelTradeNo: undefined,
        bizOrderId: undefined,
        subject: undefined,
        latestTransactionId: undefined
      }
    };
  },
  created() {
    this.getList();
  },
  methods: {
    /** 查询支付订单列表 */
    getList() {
      this.loading = true;
      // 转换 latestTransactionId 为数字
      const params = { ...this.queryParams };
      if (params.latestTransactionId) {
        params.latestTransactionId = Number(params.latestTransactionId);
      }
      listPayOrder(params).then(response => {
        this.orderList = response.data || [];
        this.loading = false;
      }).catch(() => {
        this.loading = false;
      });
    },
    // 取消按钮
    cancel() {
      this.open = false;
    },
    /** 搜索按钮操作 */
    handleQuery() {
      this.getList();
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.resetForm("queryForm");
      this.getList();
    },
    /** 查看按钮操作 */
    handleView(row) {
      this.reset();
      getPayOrder(row.id).then(response => {
        this.form = response.data;
        this.open = true;
      });
    },
    // 表单重置
    reset() {
      this.form = {};
    },
    // 格式化金额(分转元)
    formatAmount(amount) {
      if (amount === undefined || amount === null) return '-';
      return (amount / 100).toFixed(2);
    },
    // 渠道标签类型
    channelType(channel) {
      const map = {
        'WECHAT': 'success',
        'ALIPAY': 'primary',
        'ALIPAY_THIRD': 'warning'
      };
      return map[channel] || '';
    },
    // 状态标签类型
    statusType(status) {
      const map = {
        'CREATED': 'info',
        'PENDING': 'warning',
        'PAID': 'success',
        'CLOSED': 'danger',
        'EXPIRED': 'danger'
      };
      return map[status] || '';
    },
    // 从 description 中提取 taskId
    extractTaskId(description) {
      if (!description) return null;
      // 匹配 taskId:1234 格式
      const match = description.match(/taskId[::]\s*(\d+)/i);
      return match ? match[1] : null;
    },
    // 查看关联转运单
    handleViewTask(row) {
      const taskId = this.extractTaskId(row.description);
      if (taskId) {
        // 使用通用任务详情页路由
        this.$router.push('/task/general-detail/index/' + taskId);
      } else {
        this.$message.warning('未找到关联的转运单ID');
      }
    }
  }
};
</script>
sql/payment_menu.sql
New file
@@ -0,0 +1,33 @@
-- ----------------------------
-- 支付管理菜单配置
-- 执行此SQL添加支付订单查询菜单到系统
-- ----------------------------
-- ----------------------------
-- 1、支付管理主菜单(目录)
-- ----------------------------
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
values('支付管理', '0', '20', 'payment', NULL, 1, 0, 'M', '0', '0', NULL, 'money', 'admin', sysdate(), '支付管理目录菜单');
-- 获取刚刚插入的菜单ID (适用于MySQL)
set @parentId = LAST_INSERT_ID();
-- ----------------------------
-- 2、支付订单查询菜单
-- ----------------------------
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
values('支付订单查询', @parentId, '1', 'order', 'payment/order/index', 1, 0, 'C', '0', '0', 'payment:order:list', 'el-icon-s-order', 'admin', sysdate(), '支付订单查询菜单');
-- 获取刚刚插入的菜单ID
set @orderMenuId = LAST_INSERT_ID();
-- ----------------------------
-- 3、支付订单查询相关按钮权限
-- ----------------------------
-- 查询权限
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
values('支付订单查询-查看', @orderMenuId, '1', '', '', 1, 0, 'F', '0', '0', 'payment:order:query', '#', 'admin', sysdate(), '');
-- 导出权限
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
values('支付订单查询-导出', @orderMenuId, '2', '', '', 1, 0, 'F', '0', '0', 'payment:order:export', '#', 'admin', sysdate(), '');