MiddleWares_YiHe 郑州颐和医院随访系统中间件

OperationReactor.cpp 37KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277
  1. #include "StdAfx.h"
  2. #include "OperationReactor.h"
  3. #include "DevControl.h"
  4. #include "ChanExten.h"
  5. #include "ChanTrunk.h"
  6. #include "FsProxy.h"
  7. #include "OpAnswer.h"
  8. #include "OpHangup.h"
  9. #include "OpConsult.h"
  10. #include "OpInsert.h"
  11. #include "OpInstead.h"
  12. #include "OpIntercept.h"
  13. #include "OpLeaveWord.h"
  14. #include "OpListen.h"
  15. #include "OpMakeCall.h"
  16. #include "OpTransfer.h"
  17. #include "OpTurnExten.h"
  18. #include "OpTrunk2Trunk.h"
  19. #include "OpTurnIvr.h"
  20. #include "OpMeeting.h"
  21. #include "OpHoldon.h"
  22. #include "OpMute.h"
  23. #include "OpPlayAndDtmf.h"
  24. #include "OpRecord.h"
  25. #include "OpPredictionCall.h"
  26. #include "minwinbase.h"
  27. #include "OpPlayAndDtmfExten.h"
  28. SINGLETON_IMPLEMENT(COperationReactor)
  29. COperationReactor::COperationReactor(void)
  30. {
  31. }
  32. COperationReactor::~COperationReactor(void)
  33. {
  34. }
  35. /*****************************************************************
  36. **【函数名称】 __addOperation
  37. **【函数功能】 存储一个操作
  38. **【参数】
  39. **【返回值】
  40. *****************************************************************/
  41. void COperationReactor::__addOperation( COperation* pOperation )
  42. {
  43. m_TaskLock.Lock();
  44. m_TableOperation.SetAt(pOperation->uniqueId(), pOperation);
  45. m_TaskLock.Unlock();
  46. }
  47. /*****************************************************************
  48. **【函数名称】 __delOperation
  49. **【函数功能】 删除指定操作
  50. **【参数】
  51. **【返回值】
  52. *****************************************************************/
  53. bool COperationReactor::__delOperation( COperation* pOperation )
  54. {
  55. m_TaskLock.Lock();
  56. bool b= m_TableOperation.RemoveKey(pOperation->uniqueId()) == TRUE;
  57. m_TaskLock.Unlock();
  58. return b;
  59. }
  60. /*****************************************************************
  61. **【函数名称】 __getOperation
  62. **【函数功能】 获取指定操作
  63. **【参数】
  64. **【返回值】
  65. *****************************************************************/
  66. COperation* COperationReactor::__getOperation( LONG OpId )
  67. {
  68. m_TaskLock.Lock();
  69. COperation* pOp = NULL;
  70. m_TableOperation.Lookup(OpId, pOp);
  71. m_TaskLock.Unlock();
  72. return pOp;
  73. }
  74. /*****************************************************************
  75. **【函数功能】 执行OP
  76. **【函数名称】 __execOp
  77. **【参数】 pOp 操作实体
  78. pParam 操作参数
  79. **【返回值】
  80. ****************************************************************/
  81. bool COperationReactor::__execOp( COperation* pOp, LineOpParam* pParam )
  82. {
  83. __addOperation(pOp);
  84. if(pOp->start(pParam))
  85. return true;
  86. if(__delOperation(pOp))
  87. {
  88. pOp->detachHostChan();
  89. FS_LINK_DELETE(pOp);
  90. }
  91. return false;
  92. }
  93. /*****************************************************************
  94. **【函数名称】 __procOpMakeCall
  95. **【函数功能】 坐席外呼处理
  96. **【参数】
  97. **【返回值】
  98. ****************************************************************/
  99. bool COperationReactor::__procOpMakeCall( LONG Instance, ULONG ResID, LineOpParam* pParam )
  100. {
  101. // 通过设备资源查找主控线路
  102. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  103. if(pExten == NULL)
  104. {
  105. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行分机呼叫失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  106. return false;
  107. }
  108. // 生成外呼操作类
  109. COperation* pOp = new COpMakeCall(this, Instance);
  110. if(!pOp->attachHostChan(pExten))
  111. {
  112. // 如果线路正在执行其它操作
  113. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行分机呼叫失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"), ResID,
  114. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  115. FS_LINK_DELETE(pOp);
  116. return false;
  117. }
  118. // 启动操作
  119. return __execOp(pOp, pParam);
  120. }
  121. /*****************************************************************
  122. **【函数名称】 __procPredictionCall
  123. **【函数功能】 预测外呼
  124. **【参数】
  125. **【返回值】
  126. ****************************************************************/
  127. bool COperationReactor::__procOpPCall( LONG Instance, ULONG ResID, LineOpParam* pParam )
  128. {
  129. // 生成自动呼叫操作类
  130. COperation* pOp = new COpPredictionCall(this, Instance);
  131. // 启动操作
  132. return __execOp(pOp, pParam);
  133. }
  134. /*****************************************************************
  135. **【函数名称】 __procOpAnswerCall
  136. **【函数功能】 应答呼叫
  137. **【参数】
  138. **【返回值】
  139. ****************************************************************/
  140. bool COperationReactor::__procOpAnswerCall( LONG Instance, ULONG ResID, LineOpParam* pParam )
  141. {
  142. // 查找要应答呼叫的线路
  143. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  144. if(pExten == NULL)
  145. {
  146. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行分机应答失败, 未找到分机通道[%lu]"), ResID);
  147. return false;
  148. }
  149. // 生成应答呼叫操作类
  150. COperation* pOp = new COpAnswer(this, Instance);
  151. if(!pOp->attachHostChan(pExten))
  152. {
  153. // 如果线路正在执行其它操作
  154. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行分机应答失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  155. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()));
  156. FS_LINK_DELETE(pOp);
  157. return false;
  158. }
  159. // 启动操作
  160. return __execOp(pOp, pParam);
  161. }
  162. /*****************************************************************
  163. **【函数名称】 __procOpHangUp
  164. **【函数功能】 挂机操作处理
  165. **【参数】
  166. **【返回值】
  167. ****************************************************************/
  168. bool COperationReactor::__procOpHangUp( LONG Instance, ULONG ResID, LineOpParam* pParam )
  169. {
  170. // 查找要挂机的线路
  171. CVirtualChan* pChan = CFsProxy::GetInstance().getExten(ResID);
  172. if(pChan == NULL)
  173. pChan = CFsProxy::GetInstance().getTrunk(ResID);
  174. if(pChan == NULL)
  175. {
  176. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行挂机操作失败, 未找到通道[%lu]"), ResID);
  177. return false;
  178. } // end if
  179. // 如果线路正在执行其它操作
  180. if (pChan->currOp() != NULL)
  181. {
  182. if (pChan->currOp()->type() == LINE_OP_HANG_UP)
  183. {
  184. LOGGER(LOG_LEVEL_NORMAL, _T("{OperationReactor}: 当前线路正在执行挂机"));
  185. return false; // 使任务删除
  186. }
  187. LOGGER(LOG_LEVEL_NORMAL, _T("{OperationReactor}: 执行挂机, 当前线路绑定操作, Operation = %d"), pChan->currOp()->type());
  188. return pChan->currOp()->hangup(Instance);
  189. }
  190. if (pChan->state() == CHAN_LOGIC_STATE_FREE || pChan->state() == CHAN_LOGIC_STATE_DISABLED)
  191. {
  192. LOGGER(LOG_LEVEL_NORMAL, _T("{OperationReactor}: 当前线路已挂机"));
  193. return false; // 使任务删除
  194. }
  195. // 执行挂机操作
  196. COperation* pOp = new COpHangup(this, Instance);
  197. if(!pOp->attachHostChan(pChan))
  198. {
  199. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行挂机操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  200. (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()));
  201. FS_LINK_DELETE(pOp);
  202. return false;
  203. }
  204. // 启动操作
  205. return __execOp(pOp, pParam);
  206. }
  207. /*****************************************************************
  208. **【函数名称】 __procOpTransfer
  209. **【函数功能】 座席呼叫转移
  210. **【参数】
  211. **【返回值】
  212. ****************************************************************/
  213. bool COperationReactor::__procOpTransfer( LONG Instance, ULONG ResID, LineOpParam* pParam )
  214. {
  215. // 通过设备资源查找主控线路
  216. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  217. if(pExten == NULL)
  218. {
  219. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行呼叫转移失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  220. return false;
  221. }
  222. COperation* pOp = new COpTransfer(this, Instance);
  223. if(!pOp->attachHostChan(pExten))
  224. {
  225. // 如果通道正在执行其它操作
  226. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行呼叫转移失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"), ResID,
  227. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  228. FS_LINK_DELETE(pOp);
  229. return false;
  230. }
  231. // 启动操作
  232. return __execOp(pOp, pParam);
  233. }
  234. /*****************************************************************
  235. **【函数名称】 __procOpTurnAgent
  236. **【函数功能】 外线转座席
  237. **【参数】
  238. **【返回值】
  239. ****************************************************************/
  240. //2019-09-11 颐和随访 获取ACD的相关座席状态类型并且在这里考虑转外线的操作行为
  241. bool COperationReactor::__procOpTurnAgent( LONG Instance, ULONG ResID, LineOpParam* pParam )
  242. {
  243. // 通过设备资源查找主控线路
  244. ULONG m_DestExten;
  245. sscanf_s(pParam->szParam2, _T("%u"), &m_DestExten);
  246. CChanExten* pChan = CFsProxy::GetInstance().getExten(m_DestExten);
  247. //CChanTrunk* pChan = CFsProxy::GetInstance().getTrunk(ResID);
  248. // 生成外线呼叫转移操作类,屏蔽掉了对应的转分机的事情
  249. COperation* pOp = new COpTurnExten(this, Instance);
  250. if(!pOp->attachHostChan(pChan))
  251. {
  252. // 当前线路是否正在进行其它操作
  253. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行中继转座席失败, 无法绑定通道[%lu], ChanCurTask = %d, ExtenNum = %s"), ResID,
  254. (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()), pParam->szParam2);
  255. FS_LINK_DELETE(pOp);
  256. return false;
  257. }
  258. return __execOp(pOp, pParam);
  259. }
  260. /*****************************************************************
  261. **【函数名称】 __procOpTurnOut
  262. **【函数功能】 外线呼叫跳转
  263. **【参数】
  264. **【返回值】
  265. ****************************************************************/
  266. bool COperationReactor::__procOpTurnOut( LONG Instance, ULONG ResID, LineOpParam* pParam )
  267. {
  268. // 通过设备资源查找主控线路
  269. CVirtualChan* pChan = CFsProxy::GetInstance().getTrunk(ResID);
  270. if(pChan == NULL)
  271. {
  272. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行中继呼叫跳转失败, 未找到中继通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  273. return false;
  274. }
  275. // 生成外线呼叫转移操作类
  276. COperation* pOp = new COpTrunk2Trunk(this, Instance);
  277. if(!pOp->attachHostChan(pChan))
  278. {
  279. // 当前线路是否正在进行其它操作
  280. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行中继呼叫跳转失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"), ResID,
  281. (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()), pParam->szParam2);
  282. FS_LINK_DELETE(pOp);
  283. return false;
  284. }
  285. // 启动操作
  286. return __execOp(pOp, pParam);
  287. }
  288. /*****************************************************************
  289. **【函数名称】 __procOpTurnIvr
  290. **【函数功能】 转IVR
  291. **【参数】
  292. **【返回值】
  293. ****************************************************************/
  294. bool COperationReactor::__procOpTurnIvr( LONG Instance, ULONG ResID, LineOpParam* pParam )
  295. {
  296. // 查找要转IVR的线路
  297. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  298. if(pExten == NULL)
  299. {
  300. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行跳转IVR操作失败, 未找到分机通道[%lu]"), ResID);
  301. return false;
  302. } // end if
  303. // 执行转IVR操作
  304. COperation* pOp = new COpTurnIvr(this, Instance);
  305. if(!pOp->attachHostChan(pExten))
  306. {
  307. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行跳转IVR操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  308. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()));
  309. FS_LINK_DELETE(pOp);
  310. return false;
  311. } // end if
  312. return __execOp(pOp, pParam);
  313. }
  314. /*****************************************************************
  315. **【函数名称】 __procReqMeeting
  316. **【函数功能】 单步会议
  317. **【参数】
  318. **【返回值】
  319. ****************************************************************/
  320. bool COperationReactor::__procOpMeeting( LONG Instance, ULONG ResID, LineOpParam* pParam )
  321. {
  322. // 通过设备资源查找主控线路
  323. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  324. if(pExten == NULL)
  325. {
  326. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行会议操作失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  327. return false;
  328. }
  329. COperation* pOp = new COpMeeting(this, Instance);
  330. if(!pOp->attachHostChan(pExten))
  331. {
  332. // 如果线路正在执行其它操作
  333. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行会议操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"), ResID,
  334. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  335. FS_LINK_DELETE(pOp);
  336. return false;
  337. }
  338. // 启动操作
  339. return __execOp(pOp, pParam);
  340. }
  341. /*****************************************************************
  342. **【函数名称】 __procOpHold
  343. **【函数功能】 座席通话保持操作处理
  344. **【参数】 Instance 调用标识
  345. ResID 操作的主控资源ID
  346. LineOpParam* 操作信息
  347. **【返回值】 启动操作是否成功
  348. ****************************************************************/
  349. bool COperationReactor::__procOpHold( LONG Instance, ULONG ResID, LineOpParam* pParam )
  350. {
  351. // 通过设备资源查找主控线路
  352. //CChanExten* pExten = CFsProxy::GetInstance().getExten(1017);
  353. CChanTrunk* pExten = CFsProxy::GetInstance().getTrunk(ResID);
  354. if(pExten == NULL)
  355. {
  356. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行保持操作失败, 未找到分机通道[%lu]"), ResID);
  357. return false;
  358. }
  359. // 生成保持操作类
  360. COperation* pOp = new COpHoldon(this, Instance);
  361. if(!pOp->attachHostChan(pExten))
  362. {
  363. // 如果线路正在执行其它操作
  364. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行保持操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  365. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()));
  366. FS_LINK_DELETE(pOp);
  367. return false;
  368. }
  369. // 启动操作
  370. return __execOp(pOp, pParam);
  371. }
  372. /*****************************************************************
  373. **【函数名称】 __procOpTakeBack
  374. **【函数功能】 座席通话接回操作处理
  375. **【参数】 Instance 调用标识
  376. ResID 操作的主控资源ID
  377. LineOpParam* 操作信息
  378. **【返回值】 启动操作是否成功
  379. ****************************************************************/
  380. bool COperationReactor::__procOpTakeBack( LONG Instance, ULONG ResID, LineOpParam* pParam )
  381. {
  382. // 通过设备资源查找主控线路
  383. LOGGER(LOG_LEVEL_NORMAL, _T("{OperationReactor}:开始执行保持接回操作[%lu]"), ResID);
  384. // by 屏蔽掉原来getExten中的参数为线路带过来的值
  385. //CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  386. CChanTrunk* pExten = CFsProxy::GetInstance().getTrunk(ResID);
  387. if(pExten == NULL)
  388. {
  389. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行保持接回操作失败, 未找到分机通道[%lu]"), ResID);
  390. return false;
  391. }
  392. // 如果线路正在执行其它操作
  393. // by 对方呼叫保持接回
  394. //COperation* pCurrOp = new COpHoldon(this, Instance);
  395. COperation* pCurrOp = pExten->currOp(); // 被屏蔽的原有代码
  396. //if (!pCurrOp->attachHostChan(pExten))
  397. {
  398. if (pCurrOp == NULL /*|| pCurrOp->type() != LINE_OP_HOLD*/)
  399. {
  400. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行保持接回操作失败, 分机通道[%lu]当前未保持"), ResID);
  401. return false;
  402. }
  403. }
  404. // 执行取消静音操作
  405. return pCurrOp->cancel(Instance);
  406. }
  407. /*****************************************************************
  408. **【函数名称】 __procOpMuteOn
  409. **【函数功能】 静音启动
  410. **【参数】
  411. **【返回值】
  412. ****************************************************************/
  413. bool COperationReactor::__procOpMuteOn( LONG Instance, ULONG ResID, LineOpParam* pParam )
  414. {
  415. // 通过设备资源查找主控线路
  416. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  417. if(pExten == NULL)
  418. {
  419. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行静音操作失败, 未找到分机通道[%lu]"), ResID);
  420. return false;
  421. }
  422. // 生成静音操作类
  423. COperation* pOp = new COpMute(this, Instance);
  424. if(!pOp->attachHostChan(pExten))
  425. {
  426. // 如果线路正在执行其它操作
  427. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行静音操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  428. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()));
  429. FS_LINK_DELETE(pOp);
  430. return false;
  431. }
  432. // 启动操作
  433. return __execOp(pOp, pParam);
  434. }
  435. /*****************************************************************
  436. **【函数名称】 __procOpMuteOff
  437. **【函数功能】 静音取消
  438. **【参数】
  439. **【返回值】
  440. ****************************************************************/
  441. bool COperationReactor::__procOpMuteOff( LONG Instance, ULONG ResID, LineOpParam* pParam )
  442. {
  443. // 通过设备资源查找主控线路
  444. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  445. if(pExten == NULL)
  446. {
  447. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行取消静音操作失败, 未找到分机通道[%lu]"), ResID);
  448. return false;
  449. }
  450. // 如果线路正在执行其它操作
  451. COperation* pCurrOp = pExten->currOp();
  452. if(pCurrOp == NULL || pCurrOp->type() != LINE_OP_MUTE_BEGIN)
  453. {
  454. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行取消静音操作失败, 分机通道[%lu]当前未静音"), ResID);
  455. return false;
  456. }
  457. // 执行取消静音操作
  458. return pCurrOp->cancel(Instance);
  459. }
  460. /*****************************************************************
  461. **【函数名称】 __procOpReset
  462. **【函数功能】 重置
  463. **【参数】
  464. **【返回值】
  465. ****************************************************************/
  466. bool COperationReactor::__procOpReset( LONG Instance, ULONG ResID, LineOpParam* pParam )
  467. {
  468. // 通过设备资源查找主控线路
  469. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  470. if(pExten == NULL)
  471. {
  472. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行通道重置操作失败, 未找到分机通道[%lu]"), ResID);
  473. return false;
  474. }
  475. LOGGER(LOG_LEVEL_NORMAL, _T("{OperationReactor}: 执行通道重置操作, ChanNo = %lu"), ResID);
  476. // 清除关联操作
  477. //COperation* pOp = pExten->currOp();
  478. //if(pOp != NULL)
  479. //{
  480. // pOp->hangup(FS_LINK_INSTANCE_INVALID);
  481. // if(__delOperation(pOp))
  482. // {
  483. // pOp->detachHostChan();
  484. // FS_LINK_DELETE(pOp);
  485. // }
  486. //}
  487. //else
  488. //{
  489. // if(!pExten->isFree())
  490. // CFsProxy::GetInstance().kill(FS_LINK_JOBID_INVALID, pExten);
  491. //} // end if
  492. return true;
  493. }
  494. /*****************************************************************
  495. **【函数名称】 __procOpListen
  496. **【函数功能】 监听
  497. **【参数】
  498. **【返回值】
  499. ****************************************************************/
  500. bool COperationReactor::__procOpListen( LONG Instance, ULONG ResID, LineOpParam* pParam )
  501. {
  502. // 通过设备资源查找主控线路
  503. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  504. if(pExten == NULL)
  505. {
  506. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行监听操作失败, 未找到分机通道[%lu], DestNum = %s"),
  507. ResID, pParam->szParam2);
  508. return false;
  509. }
  510. // 生成强插操作类
  511. COperation* pOp = new COpListen(this, Instance);
  512. if(!pOp->attachHostChan(pExten))
  513. {
  514. // 如果线路正在执行其它操作
  515. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行监听操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"),
  516. ResID, (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  517. FS_LINK_DELETE(pOp);
  518. return false;
  519. }
  520. // 启动操作
  521. return __execOp(pOp, pParam);
  522. }
  523. /*****************************************************************
  524. **【函数名称】 __procOpInsert
  525. **【函数功能】 强插
  526. **【参数】
  527. **【返回值】
  528. ****************************************************************/
  529. bool COperationReactor::__procOpInsert( LONG Instance, ULONG ResID, LineOpParam* pParam )
  530. {
  531. // by 屏蔽了getExten
  532. // 通过设备资源查找主控线路
  533. ResID = 1030;
  534. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  535. sscanf_s(pParam->szParam2, "%lu", /*&m_DestExten*/1030);
  536. if(pExten == NULL)
  537. {
  538. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行强插操作失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  539. return false;
  540. }
  541. // 生成强插操作类
  542. COperation* pOp = new COpInsert(this, Instance);
  543. if(!pOp->attachHostChan(pExten))
  544. {
  545. // 如果线路正在执行其它操作
  546. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行强插操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"),
  547. ResID, (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  548. FS_LINK_DELETE(pOp);
  549. return false;
  550. }
  551. // 启动操作
  552. return __execOp(pOp, pParam);
  553. }
  554. /*****************************************************************
  555. **【函数名称】 __procReqInstead
  556. **【函数功能】 代接
  557. **【参数】
  558. **【返回值】
  559. ****************************************************************/
  560. bool COperationReactor::__procOpInstead( LONG Instance, ULONG ResID, LineOpParam* pParam )
  561. {
  562. // 通过设备资源查找主控线路
  563. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  564. if(pExten == NULL)
  565. {
  566. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行代接操作失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  567. return false;
  568. }
  569. // 生成代接操作类
  570. COperation* pOp = new COpInstead(this, Instance);
  571. if(!pOp->attachHostChan(pExten))
  572. {
  573. // 如果线路正在执行其它操作
  574. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行代接操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"),
  575. ResID, (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  576. FS_LINK_DELETE(pOp);
  577. return false;
  578. }
  579. // 启动操作
  580. return __execOp(pOp, pParam);
  581. }
  582. /*****************************************************************
  583. **【函数名称】 __procReqIntercept
  584. **【函数功能】 强截
  585. **【参数】
  586. **【返回值】
  587. ****************************************************************/
  588. bool COperationReactor::__procOpIntercept( LONG Instance, ULONG ResID, LineOpParam* pParam )
  589. {
  590. // 通过设备资源查找主控线路
  591. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  592. if(pExten == NULL)
  593. {
  594. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行强截操作失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  595. return false;
  596. }
  597. // 生成强截操作类
  598. COperation* pOp = new COpIntercept(this, Instance);
  599. if(!pOp->attachHostChan(pExten))
  600. {
  601. // 如果线路正在执行其它操作
  602. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行强截操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"),
  603. ResID, (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  604. FS_LINK_DELETE(pOp);
  605. return false;
  606. }
  607. // 启动操作
  608. return __execOp(pOp, pParam);
  609. }
  610. /*****************************************************************
  611. **【函数名称】 __procOpInfoTransaction
  612. **【函数功能】 数据交互
  613. **【参数】
  614. **【返回值】 启动操作是否成功
  615. ****************************************************************/
  616. bool COperationReactor::__procOpInfoTransaction( LONG Instance, ULONG ResID, LineOpParam* pParam )
  617. {
  618. // 通过设备资源查找主控线路
  619. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  620. if(pExten == NULL)
  621. {
  622. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行数据交换操作失败, 未找到分机通道[%lu]"), ResID);
  623. return false;
  624. }
  625. // 查找线路关联的操作
  626. COperation* pCurrOp = pExten->currOp();
  627. if(pCurrOp == NULL)
  628. {
  629. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行数据交换操作失败, 分机通道[%lu]未绑定任务"), ResID);
  630. return false;
  631. }
  632. // 执行信息交互
  633. pCurrOp->setOpInstance(Instance);
  634. return true;
  635. }
  636. /*****************************************************************
  637. **【函数名称】 __procOpConsultBegin
  638. **【函数功能】 协商呼叫启动
  639. **【参数】
  640. **【返回值】
  641. ****************************************************************/
  642. bool COperationReactor::__procOpConsultBegin( LONG Instance, ULONG ResID, LineOpParam* pParam )
  643. {
  644. // 通过设备资源查找主控线路
  645. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  646. if(pExten == NULL)
  647. {
  648. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行协商呼叫操作失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  649. return false;
  650. }
  651. // 生成协商呼叫操作类
  652. COperation* pOp = new COpConsult(this, Instance);
  653. if(!pOp->attachHostChan(pExten))
  654. {
  655. // 如果线路正在执行其它操作
  656. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行协商呼叫操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"),
  657. ResID, (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  658. FS_LINK_DELETE(pOp);
  659. return false;
  660. }
  661. // 启动操作
  662. return __execOp(pOp, pParam);
  663. }
  664. /*****************************************************************
  665. **【函数名称】 __procOpConsultConfirm
  666. **【函数功能】 协商呼叫确认
  667. **【参数】
  668. **【返回值】
  669. ****************************************************************/
  670. bool COperationReactor::__procOpConsultConfirm( LONG Instance, ULONG ResID, LineOpParam* pParam )
  671. {
  672. // 通过设备资源查找主控线路
  673. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  674. if(pExten == NULL)
  675. {
  676. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行协商确认操作失败, 未找到分机通道[%lu]"), ResID);
  677. return false;
  678. }
  679. // 如果线路未执行协商呼叫操作
  680. COperation* pCurrOp = pExten->currOp();
  681. if(pCurrOp == NULL || pCurrOp->type() != LINE_OP_CONSULT_CALL_BEGIN)
  682. {
  683. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行协商确认操作失败, 分机通道[%lu]未在协商呼叫环境中"), ResID);
  684. return false;
  685. }
  686. if (pParam->nParam1==3)
  687. {
  688. // 执行操作确认
  689. if(!pCurrOp->cancel(Instance))
  690. {
  691. if(__delOperation(pCurrOp))
  692. {
  693. pCurrOp->detachHostChan();
  694. FS_LINK_DELETE(pCurrOp);
  695. }
  696. return false;
  697. } // end if
  698. }
  699. else
  700. {
  701. // 执行操作确认
  702. if(!pCurrOp->next(Instance))
  703. {
  704. if(__delOperation(pCurrOp))
  705. {
  706. pCurrOp->detachHostChan();
  707. FS_LINK_DELETE(pCurrOp);
  708. }
  709. return false;
  710. } // end if
  711. }
  712. return true;
  713. }
  714. /*****************************************************************
  715. **【函数名称】 __procOpPlayAndDtmf
  716. **【函数功能】 线路放音收号
  717. **【参数】
  718. **【返回值】
  719. ****************************************************************/
  720. bool COperationReactor::__procOpPlayAndDtmf( LONG Instance, ULONG ResID, LineOpParam* pParam )
  721. {
  722. // 通过设备资源查找主控线路
  723. //if(ResID == 1017)
  724. if(ResID>=1000)
  725. {
  726. CVirtualChan* pChan = CFsProxy::GetInstance().getExten(ResID);
  727. //2019-09-11 颐和随访
  728. COperation* pCurrOp = pChan->currOp();
  729. {
  730. // 生成放音操作类 by 注销掉日志防止外呼失败
  731. COperation* pOp = new COpPlayAndDtmf(this, Instance);
  732. if (!pOp->attachHostChan(pChan))
  733. {
  734. // 如果线路正在执行其它操作
  735. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行放音收号操作失败, 无法绑定通道[%lu], ChanCurTask = %d, AudioFile = %s"),
  736. ResID, (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()), pParam->szParam3);
  737. FS_LINK_DELETE(pOp);
  738. return false;
  739. }
  740. // 启动操作
  741. __execOp(pOp, pParam);
  742. }
  743. }
  744. else
  745. {
  746. CVirtualChan* pChan = CFsProxy::GetInstance().getTrunk(ResID);
  747. if (pChan == NULL)
  748. {
  749. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行放音收号操作失败, 未找到通道[%lu], mode = %d, AudioFile = %s"),
  750. ResID, pParam->nParam1, pParam->szParam3);
  751. return false;
  752. }
  753. //2019-09-11 颐和随访
  754. COperation* pCurrOp = pChan->currOp();
  755. if (pParam->nParam1 == PVM_STOP_PLAY) // 停止放音
  756. {
  757. // 如果线路未在执行放音操作
  758. if (pCurrOp == NULL || pCurrOp->type() != LINE_OP_PLAY_VOICE)
  759. {
  760. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行停止放音操作失败, 通道[%lu]未执行放音操作"), ResID);
  761. return false;
  762. }
  763. else
  764. return pCurrOp->cancel(Instance); // 执行取消操作
  765. }
  766. else // 启动放音
  767. {
  768. // 生成放音操作类
  769. COperation* pOp = new COpPlayAndDtmf(this, Instance);
  770. if (!pOp->attachHostChan(pChan))
  771. {
  772. // 如果线路正在执行其它操作
  773. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行放音收号操作失败, 无法绑定通道[%lu], ChanCurTask = %d, AudioFile = %s"),
  774. ResID, (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()), pParam->szParam3);
  775. FS_LINK_DELETE(pOp);
  776. return false;
  777. }
  778. // 启动操作
  779. return __execOp(pOp, pParam);
  780. }
  781. }
  782. }
  783. //2019-09-11 白阳
  784. bool COperationReactor::__procOpPlayAndDtmfExten(LONG Instance, ULONG ResID, LineOpParam* pParam)
  785. {
  786. // 通过设备资源查找主控线路
  787. CChanExten* pChan = CFsProxy::GetInstance().getExten(ResID);
  788. //CChanExten* pChan = chanExtenbp["1003"];
  789. if (pChan == NULL)
  790. {
  791. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行放音收号操作失败, 未找到通道[%lu], mode = %d, AudioFile = %s"),
  792. ResID, pParam->nParam1, pParam->szParam3);
  793. return false;
  794. }
  795. COperation* pCurrOp = pChan->currOp();
  796. //if (pParam->nParam1 == PVM_STOP_PLAY) // 停止放音
  797. //{
  798. // // 如果线路未在执行放音操作
  799. // if (pCurrOp == NULL || pCurrOp->type() != LINE_OP_PLAY_VOICE)
  800. // {
  801. // LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行停止放音操作失败, 通道[%lu]未执行放音操作"), ResID);
  802. // return false;
  803. // }
  804. // else
  805. // return pCurrOp->cancel(Instance); // 执行取消操作
  806. //}
  807. //else // 启动放音
  808. {
  809. // 生成放音操作类
  810. COperation* pOp = new COpPlayAndDtmf(this, Instance);
  811. if (!pOp->attachHostChan(pChan))
  812. {
  813. // 如果线路正在执行其它操作
  814. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行放音收号操作失败, 无法绑定通道[%lu], ChanCurTask = %d, AudioFile = %s"),
  815. ResID, (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()), pParam->szParam3);
  816. FS_LINK_DELETE(pOp);
  817. return false;
  818. }
  819. // 启动操作
  820. return __execOp(pOp, pParam);
  821. }
  822. }
  823. /*****************************************************************
  824. **【函数名称】 __procOpRecord
  825. **【函数功能】 线路录音
  826. **【参数】
  827. **【返回值】
  828. ****************************************************************/
  829. bool COperationReactor::__procOpRecord( LONG Instance, ULONG ResID, LineOpParam* pParam )
  830. {
  831. // 查找要录音的线路
  832. CVirtualChan* pChan = CFsProxy::GetInstance().getTrunk(ResID);
  833. if(pChan == NULL)
  834. pChan = CFsProxy::GetInstance().getExten(ResID);
  835. if(pChan == NULL)
  836. {
  837. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行录音操作失败, 未找到通道[%lu]"), ResID);
  838. return false;
  839. } // end if
  840. // 生成录音操作类
  841. COperation* pOp = new COpRecord(this, Instance);
  842. if(!pOp->attachHostChan(pChan))
  843. {
  844. // 如果线路正在执行其它操作
  845. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行录音操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  846. (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()));
  847. FS_LINK_DELETE(pOp);
  848. return false;
  849. }
  850. // 启动操作
  851. return __execOp(pOp, pParam);
  852. }
  853. /*****************************************************************
  854. **【函数名称】 __procOpLeaveWord
  855. **【函数功能】 留言录音
  856. **【参数】
  857. **【返回值】
  858. ****************************************************************/
  859. bool COperationReactor::__procOpLeaveWord( LONG Instance, ULONG ResID, LineOpParam* pParam )
  860. {
  861. // 查找要留言的线路
  862. CVirtualChan* pChan = CFsProxy::GetInstance().getTrunk(ResID); // 外线
  863. if(pChan == NULL)
  864. {
  865. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行留言操作失败, 未找到通道[%lu]"), ResID);
  866. return false;
  867. } // end if
  868. // 生成留言操作类
  869. COperation* pOp = new COpLeaveWord(this, Instance);
  870. if(!pOp->attachHostChan(pChan))
  871. {
  872. // 如果线路正在执行其它操作
  873. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行留言操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  874. (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()));
  875. FS_LINK_DELETE(pOp);
  876. return false;
  877. }
  878. // 启动操作
  879. return __execOp(pOp, pParam);
  880. }
  881. /*****************************************************************
  882. **【函数名称】 __procOpFax
  883. **【函数功能】 传真
  884. **【参数】
  885. **【返回值】
  886. ****************************************************************/
  887. bool COperationReactor::__procOpFax( LONG Instance, ULONG ResID, LineOpParam* pParam )
  888. {
  889. return false;
  890. }
  891. //先摘机才有声音
  892. /*****************************************************************
  893. **【函数名称】 procOperation
  894. **【函数功能】 线路操作处理
  895. **【参数】
  896. **【返回值】
  897. ****************************************************************/
  898. bool COperationReactor::procOperation( LONG Instance, UINT OpType, ULONG ResID, LineOpParam* pParam )
  899. {
  900. LOGGER(LOG_LEVEL_NORMAL, _T("{OperationReactor}: 通道操作, OpType = %lu,通道[%lu]"), OpType, ResID);
  901. bool Res = false;
  902. // 根据操作类型进行分类处理
  903. switch(OpType)
  904. {
  905. case LINE_OP_MAKE_CALL: // 座席外呼
  906. Res = __procOpMakeCall(Instance, ResID, pParam);
  907. break;
  908. case LINE_OP_ANSWER_CALL: // 应答呼叫
  909. Res = __procOpAnswerCall(Instance, ResID, pParam);
  910. break;
  911. case LINE_OP_PREDICTION_CALL: // 预测外呼
  912. Res = __procOpPCall(Instance, ResID, pParam);
  913. break;
  914. case LINE_OP_HANG_UP: // 挂机
  915. Res = __procOpHangUp(Instance, ResID, pParam);
  916. break;
  917. case LINE_OP_TRANSFER: // 呼叫转移
  918. Res = __procOpTransfer(Instance, ResID, pParam);
  919. break;
  920. case LINE_OP_TURNAGENT: // 转坐席
  921. Res = __procOpTurnAgent(Instance, ResID, pParam);
  922. break;
  923. //2019-09-11 颐和随访 如要将相关的线路变为外线时会出现转外线就比较合理了
  924. case LINE_OP_TURNOUT: // 转外线
  925. Res = __procOpTurnOut(Instance, ResID, pParam);
  926. break;
  927. case LINE_OP_TURNIVR: // 转IVR
  928. Res = __procOpTurnIvr(Instance, ResID, pParam);
  929. break;
  930. case LINE_OP_CONFERENCE: // 单步会议
  931. Res = __procOpMeeting(Instance, ResID, pParam);
  932. break;
  933. case LINE_OP_LISTEN: // 监听
  934. Res = __procOpListen(Instance, ResID, pParam);
  935. break;
  936. case LINE_OP_INSERT: // 强插
  937. Res = __procOpInsert(Instance, ResID, pParam);
  938. break;
  939. case LINE_OP_RESET: // 重置
  940. Res = __procOpReset(Instance, ResID, pParam);
  941. break;
  942. case LINE_OP_INSTEAD: // 代接
  943. Res = __procOpInstead(Instance, ResID, pParam);
  944. break;
  945. case LINE_OP_GRAB: // 强截
  946. Res = __procOpIntercept(Instance, ResID, pParam);
  947. break;
  948. case LINE_OP_TRANSFER_INFO: // 信息交互
  949. Res = __procOpInfoTransaction(Instance, ResID, pParam);
  950. break;
  951. case LINE_OP_PLAY_VOICE: // 放音收号
  952. Res = __procOpPlayAndDtmf(Instance, ResID, pParam);
  953. break;
  954. case LINE_OP_FAX: // 传真
  955. Res = __procOpFax(Instance, ResID, pParam);
  956. break;
  957. case LINE_OP_RECORD: // 录音
  958. Res = __procOpRecord(Instance, ResID, pParam);
  959. break;
  960. case LINE_OP_LEAVEWORD: // 留言
  961. Res = __procOpLeaveWord(Instance, ResID, pParam);
  962. break;
  963. case LINE_OP_MUTE_BEGIN: // 静音开始
  964. Res = __procOpMuteOn(Instance, ResID, pParam);
  965. break;
  966. case LINE_OP_MUTE_END: // 静音结束
  967. Res = __procOpMuteOff(Instance, ResID, pParam);
  968. break;
  969. case LINE_OP_HOLD: // 保持
  970. Res = __procOpHold(Instance, ResID, pParam);
  971. break;
  972. case LINE_OP_TAKEBACK: // 接回
  973. Res = __procOpTakeBack(Instance, ResID, pParam);
  974. break;
  975. case LINE_OP_CONSULT_CALL_BEGIN: // 协商呼叫启动
  976. Res = __procOpConsultBegin(Instance, ResID, pParam);
  977. break;
  978. case LINE_OP_CONSULT_CALL_CONFIRM: // 协商呼叫确认
  979. Res = __procOpConsultConfirm(Instance, ResID, pParam);
  980. break;
  981. case LINE_OP_IVRFAX_TRANSFER:
  982. {
  983. CDevControl::GetInstance().onEventOpResult(Instance, true, NULL);
  984. Res = true;
  985. }
  986. break;
  987. case LINE_OP_PLAY_VOICE_EXTEN: // 2019-09-11
  988. Res = __procOpPlayAndDtmfExten(Instance, ResID, pParam);
  989. break;
  990. default:
  991. ASSERT(FALSE);
  992. } // end switch
  993. return Res;
  994. }
  995. /*****************************************************************
  996. **【函数名称】 onOpProcess
  997. **【函数功能】 操作进展返回
  998. **【参数】 Instance 调用标识
  999. HostLine 主控线路ID
  1000. AssoLine 关联线路ID
  1001. AssoLineType 关联线路类型
  1002. CallerNum 主叫号码
  1003. CalleeNum 被叫号码
  1004. **【返回值】
  1005. ****************************************************************/
  1006. void COperationReactor::onOpProcess( LONG Instance, UINT HostChanNo, UINT AssoChanNo, DEV_RES_TYPE AssoChanType, LPCTSTR CallerNum, LPCTSTR CalleeNum )
  1007. {
  1008. CDevControl::GetInstance().onEventOpProcess(Instance, HostChanNo, AssoChanNo, AssoChanType, CallerNum, CalleeNum);
  1009. }
  1010. /*****************************************************************
  1011. **【函数名称】 onOpResult
  1012. **【函数功能】 操作结果返回
  1013. **【参数】 Instance 调用标识
  1014. IsSucceed 操作结果
  1015. pInfo 附加信息
  1016. **【返回值】
  1017. ****************************************************************/
  1018. void COperationReactor::onOpResult( LONG Instance, bool IsSucceed )
  1019. {
  1020. CDevControl::GetInstance().onEventOpResult(Instance, IsSucceed, NULL);
  1021. }
  1022. /*****************************************************************
  1023. **【函数名称】 onOpResult
  1024. **【函数功能】 操作结果返回
  1025. **【参数】 Instance 调用标识
  1026. pOp 返回操作结果的操作实体指针
  1027. IsSucceed 操作结果
  1028. pInfo 附加信息
  1029. **【返回值】
  1030. ****************************************************************/
  1031. void COperationReactor::onOpResult( long Instance, COperation* pOp, bool IsSucceed, CString Data /*= _T("")*/ )
  1032. {
  1033. ASSERT(pOp != NULL);
  1034. if(pOp==NULL)return;
  1035. if(__delOperation(pOp)) // 非取消操作的返回结果
  1036. {
  1037. // 关闭线路关联
  1038. pOp->detachHostChan();
  1039. // 释放操作
  1040. FS_LINK_DELETE(pOp);
  1041. } // end if
  1042. // 返回执行结果
  1043. CDevControl::GetInstance().onEventOpResult(Instance, IsSucceed, Data);
  1044. }
  1045. //2019.3.7
  1046. void COperationReactor::releaseOpResult( COperation* pOp)
  1047. {
  1048. if (pOp == NULL)return;
  1049. pOp->clean();
  1050. if (__delOperation(pOp)) // 非取消操作的返回结果
  1051. {
  1052. // 关闭线路关联
  1053. pOp->detachHostChan();
  1054. // 释放操作
  1055. FS_LINK_DELETE(pOp);
  1056. } // end if
  1057. }
  1058. /*****************************************************************
  1059. **【函数名称】 onOpFromDev
  1060. **【函数功能】 设备主动操作事件
  1061. **【参数】 pChan 主动操作的通道
  1062. OpType 操作类型
  1063. CallerNum 主叫号码
  1064. CalleeNum 被叫号码
  1065. **【返回值】
  1066. ****************************************************************/
  1067. void COperationReactor::onOpFromDev( CVirtualChan* pChan, DEV_OP OpType, LPCTSTR CallerNum, LPCTSTR CalleeNum )
  1068. {
  1069. CDevControl::GetInstance().onEventDevOperation(pChan->no(), OpType, CallerNum, CalleeNum);
  1070. }
  1071. /*****************************************************************
  1072. **【函数名称】 onExtenCallFromDev
  1073. **【函数功能】 分机直接外呼
  1074. **【参数】
  1075. **【返回值】
  1076. *****************************************************************/
  1077. bool COperationReactor::onExtenCallFromDev( CVirtualChan* pHostChan, PCHAN_EVENT_NOTIFY pNotify )
  1078. {
  1079. COpMakeCall* pMakeCall = new COpMakeCall(this, FS_LINK_INSTANCE_INVALID);
  1080. pMakeCall->attachHostChan(pHostChan);
  1081. if(pMakeCall->start(pNotify))
  1082. {
  1083. __addOperation(pMakeCall);
  1084. return true;
  1085. }
  1086. else
  1087. {
  1088. pMakeCall->detachHostChan();
  1089. FS_LINK_DELETE(pMakeCall);
  1090. return false;
  1091. }
  1092. }
  1093. /*****************************************************************
  1094. **【函数名称】 onEslEvtBgJobDone
  1095. **【函数功能】 后台任务执行结束事件处理
  1096. **【参数】
  1097. **【返回值】
  1098. *****************************************************************/
  1099. void COperationReactor::onEslEvtBgJobDone( PBG_JOB_NOTIFY pNotify )
  1100. {
  1101. ASSERT(pNotify != NULL);
  1102. COperation* pOperation = __getOperation(pNotify->JobInstance);
  1103. if(pOperation != NULL)
  1104. pOperation->onBackgroudJobDone(pNotify);
  1105. }
  1106. /*****************************************************************
  1107. **【函数名称】 onEslEvtChanState
  1108. **【函数功能】 通道状态事件处理
  1109. **【参数】
  1110. **【返回值】
  1111. *****************************************************************/
  1112. void COperationReactor::onEslEvtChanState( LONG OpInstance, CVirtualChan* pChan )
  1113. {
  1114. COperation* pOperation = __getOperation(OpInstance);
  1115. if(pOperation != NULL)
  1116. pOperation->onAssoChanStateUpdated(pChan);
  1117. }