po_document_action_pvt.do_approve p_approval_path_id
时间: 2023-08-19 22:02:10 浏览: 335
po_document_action_pvt.do_approve是一个在采购订单文档中执行“批准”操作的函数。它用于将特定的采购订单文档状态从“待批准”变为“已批准”。
p_approval_path_id是一个参数,用于指定批准路径的唯一标识符。批准路径是在采购订单文档中定义的一系列批准步骤和相应的批准人。
使用po_document_action_pvt.do_approve函数时,我们需要传递p_approval_path_id作为参数,以告知系统我们要执行哪个特定的批准路径。
该函数执行以下操作:
1. 首先,它将检查当前用户是否有权限执行“批准”操作,并验证该用户是否属于指定批准路径中的批准人之一。
2. 接下来,它将更新采购订单文档的状态为“已批准”,并将相应的日期和时间戳记录下来。
3. 最后,它会触发任何接下来需要执行的自动动作或工作流程,以确保采购订单在批准后继续流转到下一个步骤。
总之,这个函数是用来执行采购订单文档的“批准”操作的。它通过传递p_approval_path_id参数,指定要使用的特定批准路径,然后更新文档状态并触发后续的流程动作。
相关问题
代码解释:void CopleyAmplifier::SetNewPVTMotionStartTime(boost::posix_time::ptime time,CouchTrjType pvt_point) { //Record the time stamp and data. m_bool_pvt_started = true; m_start_motion_time_us = PosixTime2Integer<unsigned long long>(time); m_last_pvt_data.p = m_start_pos; //Send the last dummy data calculated by the motion start time. ptime current_time = microsec_clock::universal_time(); ptime couch_time = Integer2PosixTime<unsigned long long>(pvt_point.t, current_time); ptime couch_to_L1_time = Integer2PosixTime<unsigned long long>(pvt_point.timeReachToBuffer, current_time); unsigned char next_point_time = round((pvt_point.t-m_start_motion_time_us)/1000.0)-m_total_motion_time_ms; if(next_point_time<4) { GcLogInfo(m_log_id, __FUNCTION__, "<CopleyStartPVT>Motion start time:%s. First couch time:%s.First couch to L1 time:%s.", boost::posix_time::to_simple_string(time).c_str(), boost::posix_time::to_simple_string(couch_time).c_str(), boost::posix_time::to_simple_string(couch_to_L1_time).c_str()); GcLogInfo(m_log_id, __FUNCTION__, "next_point_time: %d.",next_point_time); BOOST_THROW_EXCEPTION(AxisException() <<Axis_Error_Msg("Start PVT time failed! No enough time for First PVT data!")); } AmpPVTData dummy_data = {next_point_time,0,0}; //Send the left dummy data. dummy_data.time = next_point_time; Gantry::Array seg_cmd = ComposePVTRawData(dummy_data,m_next_pvt_index,1); GcLogDebugExpect(m_need_trace, m_log_id, __FUNCTION__, "<CopleyStartPVT>The %dth PVT dummy data.", m_next_pvt_index); WriteSDO(Gantry::ODAddress(COPLEY_PVT_DATA, 0), (unsigned long long)seg_cmd.GetValue<unsigned long long>()); GcLogInfo(m_log_id, __FUNCTION__, "<CopleyStartPVT>Motion start time:%s. First couch time:%s.First couch to L1 time:%s.", boost::posix_time::to_simple_string(time).c_str(), boost::posix_time::to_simple_string(couch_time).c_str(), boost::posix_time::to_simple_string(couch_to_L1_time).c_str()); m_total_motion_time_ms += dummy_data.time; m_lasttrj_segments.push_back(seg_cmd.GetValue<unsigned long long>()); ++m_next_pvt_index; GcLogInfo(m_log_id, __FUNCTION__, "<CopleyStartPVT>Motion Started. Start position %f mm.", pvt_point.p); }
这段代码是一个函数 `CopleyAmplifier::SetNewPVTMotionStartTime` 的实现。下面是对每一行代码的解释:
1. `m_bool_pvt_started = true;`:将成员变量 `m_bool_pvt_started` 的值设置为 `true`,表示 PVT(位置-速度-时间)运动已经开始。
2. `m_start_motion_time_us = PosixTime2Integer<unsigned long long>(time);`:将传入的时间戳 `time` 转换为一个无符号长长整型,并将其赋值给成员变量 `m_start_motion_time_us`,表示运动的起始时间。
3. `m_last_pvt_data.p = m_start_pos;`:将成员变量 `m_last_pvt_data` 的位置成员 `p` 设置为起始位置 `m_start_pos`。
4. 获取当前时间和计算时间差:通过 `microsec_clock::universal_time()` 获取当前时间,然后使用 `Integer2PosixTime<unsigned long long>` 将 `pvt_point.t` 和 `pvt_point.timeReachToBuffer` 转换为时间戳,并与当前时间进行计算。
5. 计算下一个点的时间:通过 `(pvt_point.t - m_start_motion_time_us) / 1000.0` 计算出下一个点与运动起始时间的时间差,并将结果四舍五入为整数,并减去 `m_total_motion_time_ms` 得到 `next_point_time`。
6. 检查下一个点的时间是否足够:如果 `next_point_time` 小于 4,表示没有足够的时间来发送第一个 PVT 数据,将抛出 `AxisException` 异常。
7. 创建一个 `AmpPVTData` 结构体 `dummy_data`,并初始化其中的字段。
8. 调用 `ComposePVTRawData` 函数将 `dummy_data`、`m_next_pvt_index` 和 1 组合成一个 `Gantry::Array` 类型的数据 `seg_cmd`。
9. 使用 `WriteSDO` 函数将 `seg_cmd.GetValue<unsigned long long>()` 写入到 `COPLEY_PVT_DATA` 的地址中。
10. 更新一些日志信息和计算总运动时间。
11. 将 `seg_cmd.GetValue<unsigned long long>()` 添加到 `m_lasttrj_segments` 容器中,并递增 `m_next_pvt_index`。
12. 更新一些日志信息,表示运动已经开始,并输出起始位置。
总体来说,这段代码的作用是设置 PVT 运动的起始时间,并发送第一个 PVT 数据。具体的逻辑和功能可能需要结合上下文和相关的函数来理解。
代码解释:if(pvt_data.vel<0){pvt_data.vel &= 0x00FFFFFF; // cppcheck-suppress unreadVariable pvt_data.vel |= 0x00800000; // cppcheck-suppress unreadVariable} command += pvt_data.time; command <<= 16; command += pvt_data.vel; command <<= 32; command += pvt_data.pos;
这段代码是对变量 `pvt_data` 中的 `vel` 进行处理,并将其拼接到 `command` 中。让我逐行解释这段代码的作用:
1. `if(pvt_data.vel<0){`:如果 `pvt_data.vel` 的值小于 0,进入条件判断语句块。
2. `pvt_data.vel &= 0x00FFFFFF;`:通过按位与操作符 `&`,将 `pvt_data.vel` 的值与 `0x00FFFFFF` 进行按位与操作,将高8位的数据清零。这里使用了 cppcheck-suppress 注释,可能是为了忽略某个静态分析工具的未使用变量警告。
3. `pvt_data.vel |= 0x00800000;`:通过按位或操作符 `|`,将 `pvt_data.vel` 的值与 `0x00800000` 进行按位或操作,将最高位置为 1。
4. `command += pvt_data.time;`:将 `pvt_data.time` 的值加到 `command` 中。
5. `command <<= 16;`:将 `command` 左移 16 位,相当于乘以 2^16。
6. `command += pvt_data.vel;`:将 `pvt_data.vel` 的值加到 `command` 中。
7. `command <<= 32;`:将 `command` 左移 32 位,相当于乘以 2^32。
8. `command += pvt_data.pos;`:将 `pvt_data.pos` 的值加到 `command` 中。
最终,这段代码将经过处理的 `pvt_data` 中的 `time`、`vel` 和 `pos` 拼接到 `command` 变量中。具体的目的和上下文可能需要进一步分析才能确定。
阅读全文