前端转vue
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SubmitEntry.ts 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. import { ref } from 'vue'
  2. import { PrintflowEntry } from './PrintflowEntry'
  3. import type { PageBase } from '../ContractBase/PageBase'
  4. import Message from "@/views/front/develop/Communication/Message";
  5. import { PrintContainer } from "@/views/front/platfrom/Print/PrintContainer";
  6. // import { LoginAuthentication } from '../Library/Ext/Function/LoginAuthentication'
  7. import { ContractManager } from '../Contracts/ContractManager'
  8. import PlatformLogger from "@/views/front/platfrom/common/LogSystem/PlatformLogger"; // import { ExamSystem } from '../ServiceProxy/Ext/ServiceHelper/ExamSystem'
  9. // import { AuthDataHelper } from '@/views/front/develop/Contract/Function/TradeAuth/AuthDataHelper';
  10. import { AuthDataHelper } from '@/views/front/develop/Contract/Function/TradeAuth/AuthDataHelper';
  11. import { CheckDataHelper } from '@/views/front/develop/Contract/Function/TradeCheck/CheckDataHelper';
  12. import TradeHandle from "@/views/front/develop/ServiceProxy.Ext/ServiceHelper/TradeHandle"
  13. import SocketManager from '@/views/front/develop/Communication/SocketListener/SocketManager'
  14. import { WorkFlowHandle } from '@/views/front/develop/ServiceProxy.Ext/ServiceHelper/WorkFlowHandle'
  15. import { TradeInfoData } from "@/views/front/develop/Library.Ext/TradeExtension/TradeInfo/TradeInfoData"
  16. import { ServiceSettings } from '../../ServiceProxy.Ext/ServiceSettings';
  17. import Hue from '@/components/ColorPicker/common/Hue.vue';
  18. import SystemFunction from '../../Library.Ext/Function/SystemFunction';
  19. import LoginUserInfo from '@/views/front/platfrom/common/RunningParameters/LoginUserInfo';
  20. /**
  21. * 提交逻辑入口(抽象类)
  22. */
  23. export abstract class SubmitEntry extends PrintflowEntry {
  24. private _submitted = ref(false)
  25. private _morePrintList: PrintContainer[] = []
  26. private _flag2Finally = false
  27. private static _counter = 0
  28. /**
  29. * 提交标识,当提交成功后将变为true
  30. */
  31. public get Submitted(): boolean {
  32. return this._submitted.value
  33. }
  34. private set Submitted(value: boolean) {
  35. this._submitted.value = value
  36. }
  37. /**
  38. * 是否自定义检测通讯返包
  39. */
  40. public IsCustomizeVerify = false
  41. /**
  42. * 更多的打印数据
  43. */
  44. public get MorePrintList(): PrintContainer[] {
  45. return this._morePrintList
  46. }
  47. /**
  48. * 执行提交流程
  49. */
  50. public RaiseSubmit(): boolean {
  51. if (!this.MessageData || !this.PageData || this.Submitted) return false
  52. const serialNumber = this.PageData.CreateSerialNumber()
  53. if (!serialNumber) return false
  54. if (serialNumber.length > 8) {
  55. this.MessageData.Fd96_Q = serialNumber.substring(8)
  56. }
  57. const authdata = new AuthDataHelper(this.PageData)
  58. const checkdata = new CheckDataHelper(this.PageData)
  59. if (checkdata.SuperTeller) {
  60. this.MessageData.Fd8 = checkdata.SuperTeller
  61. }
  62. if (authdata.AuthTeller) {
  63. this.MessageData.Fd9_1 = authdata.AuthTeller
  64. }
  65. this.MessageData.Fd14 = this.PageData.TradeModel.Code
  66. // 考试系统相关处理
  67. let sendMessage = ''
  68. // if (ExamSystem.Instance.InExamMode) {
  69. // sendMessage = ExamSystem.Instance.KGetMessageString(this.MessageData, "发送")
  70. // }hulei_cs 暂不考虑考试系统
  71. this.MessageData.SerialNumber = this.TradeInfo.SystemSerialNumber
  72. if (!this.StashPrintData()) return false
  73. const flag = SystemFunction.DoTransit(this.MessageData)
  74. this.MessageData.SerialNumber = ''
  75. // 考试系统相关处理
  76. // if (ExamSystem.Instance.InExamMode) {
  77. // const receiveMessage = ExamSystem.Instance.KGetMessageString(this.MessageData, "返回")
  78. // ExamSystem.Instance.SendExamData(
  79. // sendMessage,
  80. // receiveMessage,
  81. // this.TradeInfo.TradeCode,
  82. // this.TradeInfo.SystemSerialNumber || ''
  83. // )
  84. // } hulei_cs 暂不考虑考试系统
  85. if (this.IsCustomizeVerify) {
  86. if (!this.SubmitComplete()) return false
  87. } else {
  88. if (!flag) {
  89. // this.TradeAPIs.ShowWarnMessageBox("提交交易不成功, 为了避免重复提交\n请查看该笔业务流程是否已经完成!")
  90. PlatformLogger.TradeInfo(`提交交易不成功,为了避免重复提交</n>请主动去查看该笔业务流程是否已经完成!\n前端流水号:${serialNumber}\n操作柜员:${this.MessageData.Fd7}`)
  91. TradeHandle.WriteImportantLog(
  92. `${serialNumber}提交交易无法确认状态`,
  93. "通讯返回false,请检查网络",
  94. this.PageData.TradeModel.Code,
  95. "RaiseSubmit",
  96. "1",
  97. SocketManager.GetLocalIpAddressList(),//.join(',') join方法暂时不用
  98. )
  99. this.PageData.Close()
  100. return false
  101. }
  102. if (!this.AutoVerify()) return false
  103. try {
  104. this.SubmitComplete()
  105. } catch (ex) {
  106. PlatformLogger.SystemErrorInfo("SubmitEntry.RaiseSubmit方法,执行SubmitComplete发生异常!", ex)
  107. }
  108. }
  109. try {
  110. if (!new RegExp(ServiceSettings.GetConfig("SkipFlagSubmitted", "none")).test(this.PageData.TradeInfo.TradeCode)) {
  111. this.Submitted = true
  112. }
  113. // this.PageData.TradeBus.RecvMessage = this.MessageData
  114. // this.PageData.TradeBus.PageAction = this.PageData.constructor.name
  115. this.UploadData()
  116. this.RaiseCallbackDescription()
  117. // this.PageData.PagePrinted = this.PageData_PagePrinted hulei先注销
  118. this.RaisePrint()
  119. } catch (ex) {
  120. // this.TradeAPIs.ShowInfoMessageBox(`提交交易成功,解析返回数据出错,错误信息:\n${ex.message}`)
  121. const msgLog = this.GetMessageString(this.MessageData)
  122. PlatformLogger.SystemErrorInfo(`提交交易成功,解析返回数据出错\n***************************************************\n${msgLog}\n`, ex)
  123. TradeHandle.WriteImportantLog(
  124. `${serialNumber}提交交易成功,解析返回数据出错`,
  125. `${ex.message}\n${ex.stack}`,
  126. this.PageData.TradeModel.Code,
  127. "RaiseSubmit",
  128. "1",
  129. SocketManager.GetLocalIpAddressList(),//.join(',') hulei_todo
  130. )
  131. }
  132. // this.PageData_PagePrinted(null, null)
  133. this.TradeCompleted()
  134. authdata.AuthTeller = ''
  135. authdata.AuthTeller2 = ''
  136. checkdata.SuperTeller = ''
  137. // this.PageData.ClearSerialNumber()
  138. // TradeInfoData.GetTradeInfo(this.PageData).SerialNumber = '' hulei_todo
  139. return true
  140. }
  141. /**
  142. * 自动检测通讯返包
  143. */
  144. private AutoVerify(): boolean {
  145. if (this.MessageData.Fd12 !== "0000") {
  146. // this.PageData.TradeAPIs.ShowErrorMessageBox(this.PageData.GetError(this.MessageData))
  147. //hulei_todo
  148. return false
  149. }
  150. return true
  151. }
  152. /**
  153. * 执行打印流程
  154. */
  155. public RaisePrint(): boolean {
  156. //hulei_todo 打印先不写
  157. // if (this.PageData instanceof ISubmitContract) {
  158. // return this.RaisePrintflow(false)
  159. // }
  160. // let printList: PrintContainer[] | null = null
  161. // try {
  162. // if (!this.CreatePrintList(printList)) {
  163. // TradeHandle.WriteImportantLog(
  164. // "SubmitEntry.RaisePrint方法,调用CreatePrintList方法失败!",
  165. // this.MessageData.FileData,
  166. // this.PageData.TradeModel.Code,
  167. // "RaiseSubmit",
  168. // "5",
  169. // SocketManager.GetLocalIpAddressList().join(',')
  170. // )
  171. // }
  172. // } catch (ex) {
  173. // PlatformLogger.SystemErrorInfo("SubmitEntry.RaisePrint方法,调用CreatePrintList方法发生异常!", ex)
  174. // this.PageData.ShowErrorMessageBox("产生凭证打印清单失败!请检查完整性...")
  175. // TradeHandle.WriteImportantLog(
  176. // "SubmitEntry.RaisePrint方法,调用CreatePrintList方法发生异常!",
  177. // `${ex.message}\n${ex.stack}`,
  178. // this.PageData.TradeModel.Code,
  179. // "RaiseSubmit",
  180. // "5",
  181. // SocketManager.GetLocalIpAddressList().join(',')
  182. // )
  183. // }
  184. // if (!printList) printList = []
  185. // printList.push(...this.MorePrintList)
  186. // if (printList.length === 0) return true
  187. return true;// ContractManager.RaisePrint(this.PageData, this.MessageData, printList)
  188. }
  189. // private PageData_PagePrinted(sender: any, e: any): void {
  190. // this.PageData.Log2PagePrinted(`触发finally${this._flag2Finally}`)
  191. // this.PageData.PagePrinted = null
  192. // if (this._flag2Finally) return
  193. // this._flag2Finally = true
  194. // this.Finally()
  195. // } hulei_todo 打印部分先注
  196. private GetMessageString(msg: Message): string {
  197. const props = Object.getOwnPropertyNames(msg)
  198. let strText = ''
  199. props.filter(p => p.startsWith('Fd')).forEach(p => {
  200. const val = msg[p].toString().trim().replace(/\r|\n/g, '')
  201. if (val) {
  202. strText += `[${p}=${val}]\n`
  203. }
  204. })
  205. return strText
  206. }
  207. private UploadData(): void {
  208. try {
  209. const tradeInfo = {
  210. TellerNo: LoginUserInfo.TellerNo,
  211. TradeNo: this.PageData.TradeModel.Code,
  212. Tlrlvl: "",
  213. BrNo: LoginUserInfo.KinbrNo,
  214. Status: 1,
  215. BlackSerialNo2: "",//this.MessageData.CustomizeTransitEntry?.SerialNo || this.MessageData.Fd126_1,""
  216. BlackSerialNo: this.MessageData.Fd4,
  217. TradeFileName: this.constructor.name,
  218. BusinessDate: LoginUserInfo.TradeDate
  219. }
  220. const authdata = new AuthDataHelper(this.PageData)
  221. const checkdata = new CheckDataHelper(this.PageData)
  222. let pageData: Uint8Array = new Uint8Array()
  223. if (checkdata.SuperTeller || authdata.AuthTeller) {
  224. //hulei_todo
  225. //pageData = this.PageData.SaveTradePage(this.PageData.Content)
  226. }
  227. const tradeBus = TradeInfoData.GetTradeInfo().TradeBus.Serialize()
  228. const serialNumber = this.PageData.CreateSerialNumber()
  229. setTimeout(() => {
  230. try {
  231. WorkFlowHandle.GetWorkFlowTradeSubmit(
  232. tradeInfo,
  233. pageData,
  234. tradeBus,
  235. "",
  236. serialNumber,
  237. false,
  238. true
  239. )
  240. } catch (e) {
  241. TradeHandle.WriteImportantLog(
  242. "UploadData",
  243. `${e.message}\n${e.stack}`,
  244. "GetWorkFlowTradeSubmitException",
  245. "0",
  246. "",
  247. SocketManager.GetLocalIpAddressList(),//.join(',') hulei_todo
  248. )
  249. }
  250. }, 0)
  251. } catch (ex) {
  252. PlatformLogger.SystemErrorInfo("SubmitEntry.UploadData方法,上载交易数据发生异常!", ex)
  253. }
  254. }
  255. private RaiseCallbackDescription(): void {
  256. let displayDesc: Record<string, string> | null = null
  257. try {
  258. displayDesc = this.CreateDisplayDescription()
  259. } catch (ex) {
  260. PlatformLogger.SystemErrorInfo("SubmitEntry.RaiseCallbackDescription方法,创建回显要素集合发生异常!", ex)
  261. }
  262. if (!displayDesc) {
  263. // this.TradeAPIs.ShowSuccessMessageBox()
  264. } else {
  265. // Vue中实现类似WPF的WrapPanel和BulletDecorator效果
  266. // 这里需要根据实际UI框架实现对应组件
  267. const wrapper = document.createElement('div')
  268. wrapper.style.display = 'flex'
  269. wrapper.style.flexWrap = 'wrap'
  270. wrapper.style.gap = '10px'
  271. Object.entries(displayDesc).forEach(([key, value]) => {
  272. const item = document.createElement('div')
  273. item.style.display = 'flex'
  274. item.style.alignItems = 'center'
  275. item.style.minWidth = '350px'
  276. const bullet = document.createElement('span')
  277. bullet.textContent = `${key}:`
  278. bullet.style.marginRight = '5px'
  279. const content = document.createElement('span')
  280. content.textContent = value
  281. item.appendChild(bullet)
  282. item.appendChild(content)
  283. wrapper.appendChild(item)
  284. })
  285. // this.TradeAPIs.ShowSuccessMessageBox(wrapper)//hulei_todo
  286. }
  287. }
  288. public TradeCompleted(): boolean {
  289. SubmitEntry._counter++
  290. if (SubmitEntry._counter % ServiceSettings.GetConfig("PrinterLoop", 99999) === 0) {
  291. // 浏览器环境下无法直接操作进程,这里需要根据实际环境调整
  292. console.log('Printer process cleanup triggered')
  293. }
  294. if (this.PageData.TradeAPIs.GetTradeMetadata("isClosePage")?.toLowerCase() === "true") {
  295. // this.PageData.OpenPage(this.PageData.TradeModel.Action, null)hulei_todo 打开页面 这个与vue中不确定
  296. } else {
  297. this.PageData.Close()
  298. }
  299. return true
  300. }
  301. public override GeneratePrintList(): PrintContainer[] {
  302. let printList: PrintContainer[] | null = null
  303. try {
  304. if (!this.CreatePrintList(printList)) {
  305. TradeHandle.WriteImportantLog(
  306. "SubmitEntry.RaisePrint方法,调用CreatePrintList方法失败!",
  307. this.MessageData.fileData,
  308. this.PageData.TradeModel.Code,
  309. "RaiseSubmit",
  310. "5",
  311. SocketManager.GetLocalIpAddressList(),//.join(',')
  312. )
  313. }
  314. } catch (ex) {
  315. PlatformLogger.SystemErrorInfo("SubmitEntry.RaisePrint方法,调用CreatePrintList方法发生异常!", ex)
  316. // this.TradeAPIs.ShowErrorMessageBox("产生凭证打印清单失败!请检查完整性...")
  317. TradeHandle.WriteImportantLog(
  318. "SubmitEntry.RaisePrint方法,调用CreatePrintList方法发生异常!",
  319. `${ex.message}\n${ex.stack}`,
  320. this.PageData.TradeModel.Code,
  321. "RaiseSubmit",
  322. "5",
  323. SocketManager.GetLocalIpAddressList(),//.join(',')
  324. )
  325. }
  326. if (!printList) printList = []
  327. printList.push(...this.MorePrintList)
  328. return printList
  329. }
  330. public override PreviewPrintflow(): boolean {
  331. return true
  332. }
  333. /**
  334. * 提交完毕,并验证结果
  335. */
  336. public abstract SubmitComplete(): boolean
  337. /**
  338. * 流程处理结束,执行后续操作
  339. */
  340. public abstract Finally(): boolean
  341. /**
  342. * 创建打印列表
  343. */
  344. public abstract CreatePrintList(outList: PrintContainer[] | null): boolean
  345. /**
  346. * 创建回显要素集合
  347. */
  348. public CreateDisplayDescription(): Record<string, string> | null {
  349. return null
  350. }
  351. }
  352. // Vue组合式API封装
  353. export const useSubmitEntry = () => {
  354. return {
  355. SubmitEntry
  356. }
  357. }