1. 添加搬运数据到数据库
2. 添加秒级的时间戳(毫秒级使用time_t可能是负数,因为有符号),防止使用strftime闪退
3. 实时更新搬运记录界面
已修改7个文件
113 ■■■■ 文件已修改
SourceCode/Bond/Servo/CMaster.cpp 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CRobotTask.cpp 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Common.h 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Model.cpp 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/PageTransferLog.cpp 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ToolUnits.cpp 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ToolUnits.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.cpp
@@ -589,12 +589,12 @@
                    lock();
                    delete m_pActiveRobotTask;
                    m_pActiveRobotTask = nullptr;
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 1);
                    }
                    delete m_pActiveRobotTask;
                    m_pActiveRobotTask = nullptr;
                }
                unlock();
            }
SourceCode/Bond/Servo/CRobotTask.cpp
@@ -8,7 +8,7 @@
    {
        generateId(m_strId);
        m_state = ROBOT_TASK_STATE::Ready;
        m_timeCreate = CToolUnits::getTimestamp();
        m_timeCreate = CToolUnits::getUnixTimestamp();
        m_timeFetchOut = 0;
        m_timeStored = 0;
        m_timeFinish = 0;
@@ -176,11 +176,11 @@
    void CRobotTask::fetchOut()
    {
        m_timeFetchOut = CToolUnits::getTimestamp();;
        m_timeFetchOut = CToolUnits::getUnixTimestamp();;
    }
    void CRobotTask::stored()
    {
        m_timeStored = CToolUnits::getTimestamp();;
        m_timeStored = CToolUnits::getUnixTimestamp();;
    }
}
SourceCode/Bond/Servo/Common.h
@@ -483,3 +483,8 @@
#define RT_REQUEST_FROM_EAS        4
 /* Robot Task Status */
#define ROBOT_EVENT_CREATE        0   // 新任务创建
#define ROBOT_EVENT_FINISH        1   // 正常完成
#define ROBOT_EVENT_ERROR        2   // 出现错误
#define ROBOT_EVENT_ABORT        3   // 人为中止
SourceCode/Bond/Servo/Model.cpp
@@ -6,6 +6,7 @@
#include "CEqAlarmStep.h"
#include "AlarmManager.h"
#include "CGlassPool.h"
#include "TransferManager.h"
CModel::CModel()
@@ -171,7 +172,84 @@
        notifyPtr(RX_CODE_EQ_DATA_CHANGED, pEquipment);
    };
    masterListener.onRobotTaskEvent = [&](void* pMaster, SERVO::CRobotTask* pTask, int code) {
        if (pTask == nullptr) {
            LOGE("<CModel>onRobotTaskEvent: 空任务指针,忽略事件 code=%d", code);
            return;
        }
        // 任务描述与 ID 用于日志
        const std::string& strDesc = pTask->getDescription();
        const std::string& strClassID = pTask->getId();
        // 日志输出与状态处理
        switch (code) {
        case ROBOT_EVENT_CREATE:
            LOGI("<CModel>onRobotTaskEvent: 新任务创建(%s, ClassID=%s).", strDesc.c_str(), strClassID.c_str());
            break;
        case ROBOT_EVENT_FINISH:
            LOGI("<CModel>onRobotTaskEvent: 任务完成(%s, ClassID=%s).", strDesc.c_str(), strClassID.c_str());
            pTask->completed();
            break;
        case ROBOT_EVENT_ERROR:
            LOGE("<CModel>onRobotTaskEvent: 任务错误(%s, ClassID=%s).", strDesc.c_str(), strClassID.c_str());
            pTask->error();
            break;
        case ROBOT_EVENT_ABORT:
            LOGE("<CModel>onRobotTaskEvent: 任务停止(%s, ClassID=%s).", strDesc.c_str(), strClassID.c_str());
            pTask->abort();
            break;
        default:
            LOGE("<CModel>onRobotTaskEvent: 未知事件 code=%d, 任务=%s", code, strDesc.c_str());
            break;
        }
        // 安全格式化时间
        auto format_time = [](time_t t) -> std::string {
            if (t < 0 || t == _I64_MIN || t == _I64_MAX) {
                return "";
            }
            // 使用 localtime_s 确保线程安全
            tm tmBuf{};
            errno_t err = localtime_s(&tmBuf, &t);
            if (err != 0 || tmBuf.tm_mon < 0 || tmBuf.tm_mon > 11) {
                return "";
            }
            // 格式化时间字符串
            char buf[64] = {};
            strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tmBuf);
            return std::string(buf);
        };
        // 构造 TransferData 数据结构
        TransferData data;
        data.strClassID = strClassID;
        data.strCreateTime = format_time(pTask->getCreateTime());
        data.strPickTime = format_time(pTask->getFetchoutTime());
        data.strPlaceTime = format_time(pTask->getStoredTime());
        data.strEndTime = format_time(pTask->getFinishTime());
        data.strDescription = pTask->getSimpleDescription();
        // 状态映射
        static const char* STATUS_STR[] = {
            "Unknown", "Ready", "Running", "Error", "Abort", "Completed"
        };
        auto state = pTask->getState();
        int index = static_cast<int>(state);
        if (index > 0 && index < static_cast<int>(std::size(STATUS_STR))) {
            data.strStatus = STATUS_STR[index];
        }
        else {
            data.strStatus = STATUS_STR[0];
        }
        // 写入数据库
        int nRecordId = 0;
        TransferManager::getInstance().addTransferRecord(data, nRecordId);
        notifyPtr(RX_CODE_EQ_ROBOT_TASK, pTask);
        LOGI("<CModel>onRobotTaskEvent: 任务记录已保存,RecordID=%d", nRecordId);
    };
    m_master.setListener(masterListener);
SourceCode/Bond/Servo/PageTransferLog.cpp
@@ -63,12 +63,9 @@
            pAny->addRef();
            int code = pAny->getCode();
            //if (RX_CODE_ALARM_SET == code) {
            //    UpdatePageData();
            //}
            //else if (RX_CODE_ALARM_CLEAR == code) {
            //    UpdatePageData();
            //}
            if (RX_CODE_EQ_ROBOT_TASK == code) {
                UpdatePageData();
            }
            pAny->release();
            }, [&]() -> void {
SourceCode/Bond/Servo/ToolUnits.cpp
@@ -74,11 +74,19 @@
ULONGLONG CToolUnits::getTimestamp()
{
    // 返回毫秒数的版本
    auto now = std::chrono::system_clock::now();
    auto ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now);
    return static_cast<ULONGLONG>(ms.time_since_epoch().count());
}
time_t CToolUnits::getUnixTimestamp()
{
    // 返回秒数的版本
    auto now = std::chrono::system_clock::now();
    return std::chrono::system_clock::to_time_t(now);
}
void CToolUnits::createDir(const char* pszDir)
{
    if (isDirectory(std::string(pszDir))) {
SourceCode/Bond/Servo/ToolUnits.h
@@ -15,6 +15,7 @@
    static CString& floatToString1(float value, CString& strOut);
    static CString& floatToString3(float value, CString& strOut);
    static ULONGLONG getTimestamp();
    static time_t getUnixTimestamp();
    static void createDir(const char* pszDir);
    static BOOL copyTextToClipboard(CWnd* pWnd, const CString& strText);
    static std::string getCurrentExePath();