businessReports.vue 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956
  1. <template>
  2. <div>
  3. <el-dialog append-to-body title="预览报表" class="el-dialogDeep" :visible.sync="previewDialog" width="60%"
  4. :close-on-click-modal="false" :destroy-on-close="true" :close-on-press-escape="false" v-dialog-drag>
  5. <avue-crud :option="option" :table-loading="loading" :data="data" :page.sync="page" :permission="permissionList"
  6. v-model="form" ref="crud" id="out-table" :header-cell-class-name="headerClassName" :search.sync="query"
  7. @resetColumn="resetColumnTwo('crud', 'option', 'optionBack', 397)"
  8. @saveColumn="saveColumnTwo('crud', 'option', 'optionBack', 397)" @search-change="searchChange"
  9. @search-reset="searchReset" @selection-change="selectionChange" @current-change="currentChange"
  10. @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
  11. <template slot-scope="scope" slot="menu">
  12. <el-link type="primary" :disabled="scope.row.status == 1"
  13. @click="reportsGetReportDatafun(scope.row.url, scope.row)">预览报表</el-link>
  14. </template>
  15. </avue-crud>
  16. </el-dialog>
  17. <reportContainer ref="reportContainer"></reportContainer>
  18. </div>
  19. </template>
  20. <script>
  21. import { getList, getDetail, add, update, remove, } from "@/api/iosBasicData/reports";
  22. import { reportsGetReportData } from "@/api/tradeAgency/tradeAgency";
  23. import { getUserApprovalList } from "@/api/approval/processConfig";
  24. import { mapGetters } from "vuex";
  25. import { billsDetail } from '@/api/iosBasicData/bills'
  26. import { bbusinesstypeList } from "@/api/iosBasicData/bbusinesstype";
  27. import reportContainer from "@/views/iosBasicData/report-container/report-container.vue"
  28. export default {
  29. components: {
  30. reportContainer
  31. },
  32. props: {
  33. id: {
  34. type: String
  35. },
  36. disabled: {
  37. type: Boolean,
  38. default: false,
  39. },
  40. businessValue: {
  41. type: String,
  42. default: ''
  43. },
  44. itemIds: {
  45. type: String,
  46. default: null
  47. }
  48. },
  49. data() {
  50. return {
  51. userList: [],
  52. previewDialog: false,
  53. isPrintTheBoxNumber: false,
  54. bbDisabled: false,
  55. form: {},
  56. formReport: {},
  57. query: {
  58. classifyCode: '业务',
  59. },
  60. loading: true,
  61. page: {
  62. pageSize: 10,
  63. currentPage: 1,
  64. total: 0
  65. },
  66. selectionList: [],
  67. option: {},
  68. optionBack: {
  69. height: 400,
  70. calcHeight: 30,
  71. tip: false,
  72. searchShow: false,
  73. searchMenuSpan: 6,
  74. border: true,
  75. index: true,
  76. viewBtn: true,
  77. selection: true,
  78. search: false,
  79. dialogClickModal: false,
  80. menuWidth: 100,
  81. column: [
  82. {
  83. label: "组别",
  84. prop: "groupCode",
  85. rules: [{
  86. required: true,
  87. message: "请输入组别",
  88. trigger: "blur"
  89. }]
  90. },
  91. {
  92. label: "业务类别",
  93. prop: "classifyCode"
  94. },
  95. {
  96. label: "报表编码",
  97. prop: "code",
  98. rules: [{
  99. required: true,
  100. message: "请输入报表编码",
  101. trigger: "blur"
  102. }]
  103. },
  104. {
  105. label: "中文名称",
  106. prop: "cnName",
  107. rules: [{
  108. required: true,
  109. message: "请输入中文名称",
  110. trigger: "blur"
  111. }]
  112. },
  113. {
  114. label: "英文名称",
  115. prop: "enName"
  116. },
  117. {
  118. label: "报表格式",
  119. prop: "content",
  120. rules: [{
  121. required: true,
  122. message: "请输入报表格式",
  123. trigger: "blur"
  124. }]
  125. },
  126. {
  127. label: "备注",
  128. prop: "remarks"
  129. },
  130. ]
  131. },
  132. data: []
  133. };
  134. },
  135. async created() {
  136. this.option = await this.getColumnData(this.getColumnName(397), this.optionBack);
  137. getUserApprovalList().then(res => {
  138. this.findObject(this.option.column, "authorizedUsersId").dicData = res.data.data
  139. })
  140. // 获取业务类型
  141. bbusinesstypeList(1, 20).then(res => {
  142. this.findObject(this.option.column, "businessType").dicData = res.data.data.records
  143. })
  144. },
  145. computed: {
  146. ...mapGetters(["permission"]),
  147. permissionList() {
  148. return {
  149. addBtn: this.vaildData(this.permission.reports_add, false),
  150. viewBtn: this.vaildData(this.permission.reports_view, false),
  151. delBtn: this.vaildData(this.permission.reports_delete, false),
  152. editBtn: this.vaildData(this.permission.reports_edit, false)
  153. };
  154. },
  155. ids() {
  156. let ids = [];
  157. this.selectionList.forEach(ele => {
  158. ids.push(ele.id);
  159. });
  160. return ids.join(",");
  161. }
  162. },
  163. methods: {
  164. openDialog() {
  165. this.previewDialog = true
  166. },
  167. // 设计报表
  168. async reportDesignButton(url) {
  169. Stimulsoft.Base.StiLicense.key = '6vJhGtLLLz2GNviWmUTrhSqnOItdDwjBylQzQcAOiHn0s4gy0Fr5YoUZ9V00Y0igCSFQzwEqYBh/N77k4f0fWXTHW5rqeBNLkaurJDenJ9o97TyqHs9HfvINK18Uwzsc/bG01Rq+x3H3Rf+g7AY92gvWmp7VA2Uxa30Q97f61siWz2dE5kdBVcCnSFzC6awE74JzDcJMj8OuxplqB1CYcpoPcOjKy1PiATlC3UsBaLEXsok1xxtRMQ283r282tkh8XQitsxtTczAJBxijuJNfziYhci2jResWXK51ygOOEbVAxmpflujkJ8oEVHkOA/CjX6bGx05pNZ6oSIu9H8deF94MyqIwcdeirCe60GbIQByQtLimfxbIZnO35X3fs/94av0ODfELqrQEpLrpU6FNeHttvlMc5UVrT4K+8lPbqR8Hq0PFWmFrbVIYSi7tAVFMMe2D1C59NWyLu3AkrD3No7YhLVh7LV0Tttr/8FrcZ8xirBPcMZCIGrRIesrHxOsZH2V8t/t0GXCnLLAWX+TNvdNXkB8cF2y9ZXf1enI064yE5dwMs2fQ0yOUG/xornE'
  170. // Stimulsoft.Base.StiLicense.Key = '6vJhGtLLLz2GNviWmUTrhSqnOItdDwjBylQzQcAOiHkcgIvwL0jnpsDqRpWg5FI5kt2G7A0tYIcUygBh1sPs7plofUOqPB1a4HBIXJB621mau2oiAIj+ysU7gKUXfjn/D5BocmduNB+ZMiDGPxFrAp3PoD0nYNkkWh8r7gBZ1v/JZSXGE3bQDrCQCNSy6mgby+iFAMV8/PuZ1z77U+Xz3fkpbm6MYQXYp3cQooLGLUti7k1TFWrnawT0iEEDJ2iRcU9wLqn2g9UiWesEZtKwI/UmEI2T7nv5NbgV+CHguu6QU4WWzFpIgW+3LUnKCT/vCDY+ymzgycw9A9+HFSzARiPzgOaAuQYrFDpzhXV+ZeX31AxWlnzjDWqpfluygSNPtGul5gyNt2CEoJD1Yom0VN9fvRonYsMsimkFFx2AwyVpPcs+JfVBtpPbTcZscnzUdmiIvxv8Gcin6sNSibM6in/uUKFt3bVgW/XeMYa7MLGF53kvBSwi78poUDigA2n12SmghLR0AHxyEDIgZGOTbNI33GWu7ZsPBeUdGu55R8w='
  171. Stimulsoft.Base.Localization.StiLocalization.addLocalizationFile('/reports/stimulsoft/Localization/zh-CHS.xml', true, 'zh-CHS')
  172. Stimulsoft.Base.Localization.StiLocalization.setLocalizationFile('/reports/stimulsoft/Localization/zh-CHS.xml')
  173. var options = new Stimulsoft.Designer.StiDesignerOptions()
  174. options.appearance.fullScreenMode = true
  175. options.allowChangeWindowTitle = false
  176. options.toolbar.showSaveDialog = false
  177. options.toolbar.showFileMenuSave = false
  178. options.toolbar.showFileMenuAbout = false
  179. options.toolbar.showFileMenuClose = false
  180. options.toolbar.showFileMenuExit = false
  181. options.toolbar.showFileMenuInfo = false
  182. options.toolbar.showFileMenuHelp = false
  183. options.toolbar.showFileMenuNew = false
  184. options.appearance.showTooltips = false
  185. options.appearance.showDialogsHelp = false
  186. options.toolbar.showSetupToolboxButton = true
  187. options.appearance.htmlRenderMode = Stimulsoft.Report.Export.StiHtmlExportMode.Table
  188. let designer = new Stimulsoft.Designer.StiDesigner(
  189. options,
  190. 'StiDesigner',
  191. false
  192. )
  193. designer.onSaveReport = (e) => {
  194. console.log('onSaveReport')
  195. // let jsObject = this.jsObject
  196. if (!e.report.isModified)
  197. return
  198. var jsonString = e.report.saveToJsonString()
  199. // console.log(jsonString)
  200. this.form.url = jsonString;
  201. console.log('保存url')
  202. console.log(jsonString)
  203. console.log('保存url结束')
  204. }
  205. let report = new window.Stimulsoft.Report.StiReport();
  206. report.styles.loadFile('static/Plugins/reports/css/Styles.sts')
  207. report.applyStyles()
  208. console.log("从 url 报表");
  209. console.log(url)
  210. console.log("结束");
  211. if (url) {
  212. report.load(url)
  213. }
  214. // 加载文件
  215. // if (this.id) {
  216. // billsDetail(this.id).then(res => {
  217. // var data = res.data.data
  218. // data.pageOne = 'Page : 1 of 1'
  219. // // 处理超长数据
  220. // if (data.hshipperDetails) {
  221. // var consignerIndex2 = data.hshipperDetails.indexOf( '\n' )
  222. // for (let i = 0; i < 4; i++) {
  223. // consignerIndex2 = data.hshipperDetails.indexOf( '\n', consignerIndex2 + 1 );
  224. // }
  225. // if (consignerIndex2 != -1) {
  226. // var hshipperDetails = data.hshipperDetails.substring(consignerIndex2 + 2, data.hshipperDetails.length)
  227. // data.hshipperDetails = data.hshipperDetails.substring(0, consignerIndex2) + ' *'
  228. // data.commodityDescr += '\n*' + hshipperDetails
  229. // }
  230. // }
  231. //
  232. // if (data.hconsigneeDetails) {
  233. // var consigneeIndex2 = data.hconsigneeDetails.indexOf( '\n' )
  234. // for (let i = 0; i < 3; i++) {
  235. // consigneeIndex2 = data.hconsigneeDetails.indexOf( '\n', consigneeIndex2 + 1 );
  236. // }
  237. // if (consigneeIndex2 != -1) {
  238. // var hconsigneeDetails = data.hconsigneeDetails.substring(consigneeIndex2 + 2, data.hconsigneeDetails.length)
  239. // data.hconsigneeDetails = data.hconsigneeDetails.substring(0, consigneeIndex2) + ' **'
  240. // data.commodityDescr += '\n**' + hconsigneeDetails
  241. // }
  242. // }
  243. //
  244. // if (data.hnotifyDetails) {
  245. // var notifierIndex2 = data.hnotifyDetails.indexOf( '\n' )
  246. // for (let i = 0; i < 3; i++) {
  247. // notifierIndex2 = data.hnotifyDetails.indexOf( '\n', notifierIndex2 + 1 );
  248. // }
  249. // if (notifierIndex2 != -1) {
  250. // var hnotifyDetails = data.hnotifyDetails.substring(notifierIndex2 + 2, data.hnotifyDetails.length)
  251. // data.hnotifyDetails = data.hnotifyDetails.substring(0, notifierIndex2) + ' ***'
  252. // data.commodityDescr += '\n***' + hnotifyDetails
  253. // }
  254. // }
  255. //
  256. // // 处理箱号
  257. // if (this.isPrintTheBoxNumber) {
  258. // data.commodityDescr += '\n.\n.\n'
  259. // }
  260. //
  261. // // PLACE & DATE OF ISSUE
  262. // data.placeAndDateOfIssue = ''
  263. // if (data.issueAt) {
  264. // data.placeAndDateOfIssue += data.issueAt
  265. // }
  266. // if (data.issueDate) {
  267. // let date = new Date(data.issueDate.replace(/-/g,'/'));
  268. // let yyyy = date.getFullYear();
  269. // let mmmm = date.toDateString().split(" ")[1]
  270. // let dd = date.getDate()
  271. // data.placeAndDateOfIssue += ', ' + dd + '-' + mmmm + '-' + yyyy
  272. // }
  273. //
  274. // // Total number of containers or packages received by the Carriers
  275. // if (data.preContainersList) {
  276. // let boxMap = new Map();
  277. // for (let boxQuantity of data.preContainersList) {
  278. // if (boxMap.get(boxQuantity.cntrTypeCode)) {
  279. // let v = boxMap.get(boxQuantity.cntrTypeCode)
  280. // boxMap.set(boxQuantity.cntrTypeCode, v + boxQuantity.quantity)
  281. // } else {
  282. // boxMap.set(boxQuantity.cntrTypeCode, boxQuantity.quantity)
  283. // }
  284. // }
  285. // let boxs = ''
  286. // boxMap.forEach(function (value, key, map) {
  287. // boxs += value + 'x' + key + ', '
  288. // })
  289. // boxs = boxs.substring(0, boxs.length - 2)
  290. //
  291. // data.boxQuantity = boxs + ' CONTAINER(S) ONLY'
  292. // }
  293. //
  294. // // Number of original B/Ls
  295. // if (data.numberOfObl) {
  296. // data.numberOfObl += ' (' + data.numberOfOblDigit + ')'
  297. // }
  298. //
  299. // if (data.commodityDescr) {
  300. // var descriptionIndex2 = data.commodityDescr.indexOf( '\n' )
  301. // for (let i = 0; i < 19; i++) {
  302. // descriptionIndex2 = data.commodityDescr.indexOf( '\n', descriptionIndex2 + 1 );
  303. // }
  304. // if (descriptionIndex2 != -1) {
  305. // data.pageOne = 'Page : 1 of 2'
  306. // data.pageTwo = 'Page : 2 of 2'
  307. // var extraLongText = data.commodityDescr.substring(descriptionIndex2 + 2, data.commodityDescr.length)
  308. // data.commodityDescr = data.commodityDescr.substring(0, descriptionIndex2)
  309. // data.extraLongTips = '** TO BE CONTINUED ON ATTACHED LIST **'
  310. // data.extraLongText = extraLongText
  311. // }
  312. // }
  313. // var dataSet = new Stimulsoft.System.Data.DataSet(
  314. // 'reportData'
  315. // )
  316. // dataSet.readJson(data)
  317. // report.regData('reportData', 'reportData', dataSet)
  318. // // 从模版和数据加载报表
  319. // // loadReport(report, '', {})
  320. //
  321. // designer.report = report
  322. // })
  323. // }
  324. // let data = [
  325. // {
  326. // id: 2,
  327. // billNo: 'JOB NO',
  328. // billDate: 'DATE',
  329. // operatorName: 'OP',
  330. // bookingNo: 'bookingNo',
  331. // mblno: 'ob/l no',
  332. // carrierCnName: 'CARRIER',
  333. // polCnName: 'POL',
  334. // vesselCnName: 'vsl/voy',
  335. // voyageNo: 'vsl/voy',
  336. // podCnName: 'POD',
  337. // cyCnName: 'DEPOT',
  338. // etd: 'etd/eta',
  339. // eta: 'etd/eta',
  340. // mpaymode: 'freight / freight',
  341. // volume: '箱型箱量',
  342. // hblno: 'hb/l no',
  343. // srcType: 'analysis1',
  344. // srcCnName: 'analysis2',
  345. // corpCnName: 'analysis3',
  346. // list: [
  347. // {
  348. // id:1,
  349. // pid:2,
  350. // feeCnNameData: 'fee list1',
  351. // usd: 'usd',
  352. // rmb: 'rmb',
  353. // tr: '税',
  354. // corpCnName: 'customer',
  355. // },
  356. // {
  357. // id:2,
  358. // pid:2,
  359. // feeCnNameData: 'fee list2',
  360. // usd: 'usd',
  361. // rmb: 'rmb',
  362. // tr: '税',
  363. // corpCnName: 'customer',
  364. // },
  365. // ]
  366. //
  367. // }, {
  368. // id:3,
  369. // billNo: 'JOB NO',
  370. // billDate: 'DATE',
  371. // operatorName: 'OP',
  372. // bookingNo: 'bookingNo',
  373. // mblno: 'ob/l no',
  374. // carrierCnName: 'CARRIER',
  375. // polCnName: 'POL',
  376. // vesselCnName: 'vsl/voy',
  377. // voyageNo: 'vsl/voy',
  378. // podCnName: 'POD',
  379. // cyCnName: 'DEPOT',
  380. // etd: 'etd/eta',
  381. // eta: 'etd/eta',
  382. // mpaymode: 'freight / freight',
  383. // volume: '箱型箱量',
  384. //
  385. // hblno: 'hb/l no',
  386. // srcType: 'analysis1',
  387. // srcCnName: 'analysis2',
  388. // corpCnName: 'analysis3',
  389. // list: [
  390. // {
  391. // id:3,
  392. // pid:3,
  393. // feeCnNameData: 'fee list',
  394. // usd: 'usd',
  395. // rmb: 'rmb',
  396. // tr: '税',
  397. // corpCnName: 'customer',
  398. // },
  399. // {
  400. // id:4,
  401. // pid:3,
  402. // feeCnNameData: 'fee list',
  403. // usd: 'usd',
  404. // rmb: 'rmb',
  405. // tr: '税',
  406. // corpCnName: 'customer',
  407. // },
  408. // ]
  409. //
  410. // }, {
  411. // id:4,
  412. // billNo: 'JOB NO',
  413. // billDate: 'DATE',
  414. // operatorName: 'OP',
  415. // bookingNo: 'bookingNo',
  416. // mblno: 'ob/l no',
  417. // carrierCnName: 'CARRIER',
  418. // polCnName: 'POL',
  419. // vesselCnName: 'vsl/voy',
  420. // voyageNo: 'vsl/voy',
  421. // podCnName: 'POD',
  422. // cyCnName: 'DEPOT',
  423. // etd: 'etd/eta',
  424. // eta: 'etd/eta',
  425. // mpaymode: 'freight / freight',
  426. // volume: '箱型箱量',
  427. //
  428. // hblno: 'hb/l no',
  429. // srcType: 'analysis1',
  430. // srcCnName: 'analysis2',
  431. // corpCnName: 'analysis3',
  432. // list: [
  433. // {
  434. // id:10,
  435. // pid:4,
  436. // feeCnNameData: 'fee list',
  437. // usd: 'usd',
  438. // rmb: 'rmb',
  439. // tr: '税',
  440. // corpCnName: 'customer',
  441. // },
  442. // {
  443. // id:11,
  444. // pid:4,
  445. // feeCnNameData: 'fee list',
  446. // usd: 'usd',
  447. // rmb: 'rmb',
  448. // tr: '税',
  449. // corpCnName: 'customer',
  450. // },
  451. // ]
  452. // },
  453. // ]
  454. // 获取报表数据
  455. const res = await reportsGetReportData({
  456. billId: this.id,
  457. reportCode: this.form.code,
  458. groupCode: this.form.groupCode,
  459. itemIds:this.itemIds,
  460. type:this.businessValue
  461. })
  462. // 获取的数据赋值
  463. console.log(res.data.data, 584)
  464. if (!res.data.data.data) {
  465. var data = res.data.data.data
  466. } else {
  467. var data = res.data.data.data
  468. // var data = res.data.data.data.map((item,index)=>{
  469. // item.index = index
  470. // item.feeCenterList.forEach(ite=>{
  471. // ite.ppid = index
  472. // })
  473. // return item
  474. // })
  475. }
  476. var dataSet = new Stimulsoft.System.Data.DataSet(
  477. 'reportData'
  478. )
  479. dataSet.readJson(data)
  480. report.regData('reportData', 'reportData', dataSet)
  481. // 从模版和数据加载报表
  482. // loadReport(report, '', {})
  483. designer.report = report
  484. this.designer = designer
  485. this.$refs.reportContainer.showContainer(
  486. () => {
  487. setTimeout(() => {
  488. designer.renderHtml('reportContainer')
  489. this.createDesignerButtons()
  490. }, 50)
  491. },
  492. () => { },
  493. )
  494. },
  495. // 打印报表获取数据
  496. reportsGetReportDatafun(url, row) {
  497. if(row.groupCode=='首款'&&this.itemIds==null) return this.$message.error("请选择明细");
  498. if(row.groupCode=='尾款'&&this.itemIds==null) return this.$message.error("请选择明细");
  499. reportsGetReportData({
  500. billId: this.id,
  501. reportCode: row.classifyCode,
  502. groupCode: row.groupCode,
  503. itemIds:this.itemIds,
  504. type:this.businessValue
  505. }).then(res => {
  506. this.handleReportPreview(url, res.data.data.data)
  507. })
  508. },
  509. // 预览报表
  510. handleReportPreview(url, row) {
  511. Stimulsoft.Base.StiLicense.key = '6vJhGtLLLz2GNviWmUTrhSqnOItdDwjBylQzQcAOiHn0s4gy0Fr5YoUZ9V00Y0igCSFQzwEqYBh/N77k4f0fWXTHW5rqeBNLkaurJDenJ9o97TyqHs9HfvINK18Uwzsc/bG01Rq+x3H3Rf+g7AY92gvWmp7VA2Uxa30Q97f61siWz2dE5kdBVcCnSFzC6awE74JzDcJMj8OuxplqB1CYcpoPcOjKy1PiATlC3UsBaLEXsok1xxtRMQ283r282tkh8XQitsxtTczAJBxijuJNfziYhci2jResWXK51ygOOEbVAxmpflujkJ8oEVHkOA/CjX6bGx05pNZ6oSIu9H8deF94MyqIwcdeirCe60GbIQByQtLimfxbIZnO35X3fs/94av0ODfELqrQEpLrpU6FNeHttvlMc5UVrT4K+8lPbqR8Hq0PFWmFrbVIYSi7tAVFMMe2D1C59NWyLu3AkrD3No7YhLVh7LV0Tttr/8FrcZ8xirBPcMZCIGrRIesrHxOsZH2V8t/t0GXCnLLAWX+TNvdNXkB8cF2y9ZXf1enI064yE5dwMs2fQ0yOUG/xornE'
  512. // Stimulsoft.Base.StiLicense.Key = '6vJhGtLLLz2GNviWmUTrhSqnOItdDwjBylQzQcAOiHkcgIvwL0jnpsDqRpWg5FI5kt2G7A0tYIcUygBh1sPs7plofUOqPB1a4HBIXJB621mau2oiAIj+ysU7gKUXfjn/D5BocmduNB+ZMiDGPxFrAp3PoD0nYNkkWh8r7gBZ1v/JZSXGE3bQDrCQCNSy6mgby+iFAMV8/PuZ1z77U+Xz3fkpbm6MYQXYp3cQooLGLUti7k1TFWrnawT0iEEDJ2iRcU9wLqn2g9UiWesEZtKwI/UmEI2T7nv5NbgV+CHguu6QU4WWzFpIgW+3LUnKCT/vCDY+ymzgycw9A9+HFSzARiPzgOaAuQYrFDpzhXV+ZeX31AxWlnzjDWqpfluygSNPtGul5gyNt2CEoJD1Yom0VN9fvRonYsMsimkFFx2AwyVpPcs+JfVBtpPbTcZscnzUdmiIvxv8Gcin6sNSibM6in/uUKFt3bVgW/XeMYa7MLGF53kvBSwi78poUDigA2n12SmghLR0AHxyEDIgZGOTbNI33GWu7ZsPBeUdGu55R8w='
  513. Stimulsoft.Base.Localization.StiLocalization.addLocalizationFile('/reports/stimulsoft/Localization/zh-CHS.xml', true, 'zh-CHS')
  514. Stimulsoft.Base.Localization.StiLocalization.setLocalizationFile('/reports/stimulsoft/Localization/zh-CHS.xml')
  515. // 工具栏
  516. var options = new Stimulsoft.Viewer.StiViewerOptions()
  517. options.height = '100%'
  518. options.appearance.scrollbarsMode = true // 滚动条模式
  519. options.toolbar.showDesignButton = false // 显示设计按钮
  520. options.toolbar.showAboutButton = false // 显示关于按钮
  521. options.toolbar.showResourcesButton = false // 显示资源按钮
  522. options.toolbar.showFullScreenButton = false // 显示全屏按钮
  523. options.toolbar.showOpenButton = false // 显示打开按钮
  524. options.appearance.showTooltips = false // 显示工具提示
  525. options.appearance.showDialogsHelp = false // 显示对话框帮助
  526. options.exports.showExportToDocument = false // 显示导出到文档
  527. options.toolbar.showParametersButton = true // 显示参数按钮
  528. options.appearance.bookmarksPrint = true // 书签打印
  529. // options.toolbar.showPrintButton = false // 打印按钮是否显示 下面直接自定义控制打印弹窗是否开启
  530. // printDestination 参数:用于指定报表打印的目标位置,可以是打印机、PDF 文件或者直接打印到浏览器等。
  531. // Stimulsoft.Viewer.StiPrintDestination.Direct:表示直接打印到打印机,即将报表内容直接发送至打印机进行打印。
  532. // 通过设置不同的 printDestination 参数,你可以控制报表打印的行为,例如是直接打印到打印机,还是生成 PDF 文件,或者直接在浏览器中预览打印内容等。
  533. options.toolbar.printDestination = Stimulsoft.Viewer.StiPrintDestination.Direct
  534. // htmlRenderMode html渲染模式
  535. options.appearance.htmlRenderMode = Stimulsoft.Report.Export.StiHtmlExportMode.Table
  536. // 是创建一个 Stimulsoft 报表查看器的实例的代码
  537. let viewer = new Stimulsoft.Viewer.StiViewer(options, 'StiViewer', false)
  538. // 报表
  539. console.log("创建一个报表实例");
  540. let report = new window.Stimulsoft.Report.StiReport();
  541. // 加载文件
  542. console.log("从url加载报表");
  543. // report.loadFile("/reports/stimulsoft/demos/SimpleList.mrt");
  544. report.load(url)
  545. // 获取报表数据
  546. var data = row
  547. data.pageOne = 'Page : 1 of 1'
  548. // 处理超长数据
  549. if (data.hshipperDetails) {
  550. var consignerIndex2 = data.hshipperDetails.indexOf('\n')
  551. for (let i = 0; i < 4; i++) {
  552. consignerIndex2 = data.hshipperDetails.indexOf('\n', consignerIndex2 + 1);
  553. }
  554. if (consignerIndex2 != -1) {
  555. var hshipperDetails = data.hshipperDetails.substring(consignerIndex2 + 2, data.hshipperDetails.length)
  556. data.hshipperDetails = data.hshipperDetails.substring(0, consignerIndex2) + ' *'
  557. data.commodityDescr += '\n*' + hshipperDetails
  558. }
  559. }
  560. if (data.hconsigneeDetails) {
  561. var consigneeIndex2 = data.hconsigneeDetails.indexOf('\n')
  562. for (let i = 0; i < 3; i++) {
  563. consigneeIndex2 = data.hconsigneeDetails.indexOf('\n', consigneeIndex2 + 1);
  564. }
  565. if (consigneeIndex2 != -1) {
  566. var hconsigneeDetails = data.hconsigneeDetails.substring(consigneeIndex2 + 2, data.hconsigneeDetails.length)
  567. data.hconsigneeDetails = data.hconsigneeDetails.substring(0, consigneeIndex2) + ' **'
  568. data.commodityDescr += '\n**' + hconsigneeDetails
  569. }
  570. }
  571. if (data.hnotifyDetails) {
  572. var notifierIndex2 = data.hnotifyDetails.indexOf('\n')
  573. for (let i = 0; i < 3; i++) {
  574. notifierIndex2 = data.hnotifyDetails.indexOf('\n', notifierIndex2 + 1);
  575. }
  576. if (notifierIndex2 != -1) {
  577. var hnotifyDetails = data.hnotifyDetails.substring(notifierIndex2 + 2, data.hnotifyDetails.length)
  578. data.hnotifyDetails = data.hnotifyDetails.substring(0, notifierIndex2) + ' ***'
  579. data.commodityDescr += '\n***' + hnotifyDetails
  580. }
  581. }
  582. // 处理箱号
  583. if (this.isPrintTheBoxNumber) {
  584. data.commodityDescr += '\n.\n.\n'
  585. }
  586. // PLACE & DATE OF ISSUE
  587. data.placeAndDateOfIssue = ''
  588. if (data.issueAt) {
  589. data.placeAndDateOfIssue += data.issueAt
  590. }
  591. if (data.issueDate) {
  592. let date = new Date(data.issueDate.replace(/-/g, '/'));
  593. let yyyy = date.getFullYear();
  594. let mmmm = date.toDateString().split(" ")[1]
  595. let dd = date.getDate()
  596. data.placeAndDateOfIssue += ', ' + dd + '-' + mmmm + '-' + yyyy
  597. }
  598. // Total number of containers or packages received by the Carriers
  599. if (data.preContainersList) {
  600. let boxMap = new Map();
  601. for (let boxQuantity of data.preContainersList) {
  602. if (boxMap.get(boxQuantity.cntrTypeCode)) {
  603. let v = boxMap.get(boxQuantity.cntrTypeCode)
  604. boxMap.set(boxQuantity.cntrTypeCode, v + boxQuantity.quantity)
  605. } else {
  606. boxMap.set(boxQuantity.cntrTypeCode, boxQuantity.quantity)
  607. }
  608. }
  609. let boxs = ''
  610. boxMap.forEach(function (value, key, map) {
  611. boxs += value + 'x' + key + ', '
  612. })
  613. boxs = boxs.substring(0, boxs.length - 2)
  614. data.boxQuantity = boxs + ' CONTAINER(S) ONLY'
  615. }
  616. // Number of original B/Ls
  617. if (data.numberOfObl) {
  618. data.numberOfObl += ' (' + data.numberOfOblDigit + ')'
  619. }
  620. if (data.commodityDescr) {
  621. var descriptionIndex2 = data.commodityDescr.indexOf('\n')
  622. for (let i = 0; i < 19; i++) {
  623. descriptionIndex2 = data.commodityDescr.indexOf('\n', descriptionIndex2 + 1);
  624. }
  625. if (descriptionIndex2 != -1) {
  626. data.pageOne = 'Page : 1 of 2'
  627. data.pageTwo = 'Page : 2 of 2'
  628. var extraLongText = data.commodityDescr.substring(descriptionIndex2 + 2, data.commodityDescr.length)
  629. data.commodityDescr = data.commodityDescr.substring(0, descriptionIndex2)
  630. data.extraLongTips = '** TO BE CONTINUED ON ATTACHED LIST **'
  631. data.extraLongText = extraLongText
  632. }
  633. }
  634. // console.log(data.hshipperDetails, 'hshipperDetails2')
  635. // 创建一个 Stimulsoft 数据集(DataSet)的实例的代码
  636. var dataSet = new Stimulsoft.System.Data.DataSet(
  637. 'reportData'
  638. )
  639. dataSet.readJson(data) // 用于将 JSON 格式的数据加载到数据集中。data 是包含报表数据的 JSON 对象。
  640. // 这是一个方法调用,用于在报表中注册数据源。参数 'reportData' 是数据源的名称,
  641. // 第二个 'reportData' 是数据源的别名,dataSet 则是之前创建的数据集实例
  642. report.regData('reportData', 'reportData', dataSet)
  643. // 从模版和数据加载报表
  644. // loadReport(report, '', {})
  645. // 这是将报表对象指定给报表查看器的属性。viewer 是报表查看器的实例,而 report 是之前创建的报表对象。
  646. viewer.report = report;
  647. this.$refs.reportContainer.showContainer(
  648. () => {
  649. setTimeout(() => {
  650. viewer.renderHtml('reportContainer')
  651. this.createViewerButtons(viewer)
  652. }, 50)
  653. },
  654. () => {
  655. },
  656. )
  657. console.log("加载成功完成!");
  658. },
  659. loadReport(report, content, data) {
  660. var mimeString = content
  661. .split(',')[0]
  662. .split(':')[1]
  663. .split(';')[0]
  664. var byteString = atob(content.split(',')[1])
  665. var ab = new ArrayBuffer(byteString.length)
  666. var ia = new Uint8Array(ab)
  667. for (var i = 0; i < byteString.length; i++) {
  668. ia[i] = byteString.charCodeAt(i)
  669. }
  670. var blob = new Blob([ab])
  671. JSZip.loadAsync(blob).then(function (unziped) {
  672. unziped
  673. .file('reportfile.json')
  674. .async('string')
  675. .then(res => {
  676. report.load(res)
  677. if (!!data) {
  678. var dataSet = new Stimulsoft.System.Data.DataSet(
  679. 'reportData'
  680. )
  681. dataSet.readJson(data)
  682. report.regData('reportData', 'reportData', dataSet)
  683. }
  684. })
  685. })
  686. },
  687. createDesignerButtons(e) {
  688. console.log(e, 936)
  689. if (!!e) {
  690. try {
  691. this.designer.jsObject.options.menus.localizationMenu.addEventListener(
  692. 'click',
  693. this.createDesignerButtons
  694. )
  695. } catch (error) {
  696. }
  697. }
  698. let toolBarRow = this.designer.jsObject.options.toolBar.firstChild.tr[0]
  699. let customButton = this.designer.jsObject.StatusPanelButton(
  700. 'exitButton',
  701. '关闭',
  702. 'LoginControls.Window.CloseWhite.png',
  703. '关闭',
  704. null,
  705. 30,
  706. 60
  707. )
  708. customButton.image.style.width = customButton.image.style.height = '16px'
  709. let buttonCell = document.createElement('td')
  710. buttonCell.className = 'stiDesignerToolButtonCell'
  711. buttonCell.appendChild(customButton)
  712. toolBarRow.appendChild(buttonCell)
  713. let that = this
  714. customButton.action = function (e) {
  715. let jsObject = this.jsObject
  716. if (jsObject.options.reportIsModified) {
  717. var messageForm = jsObject.MessageFormForSave()
  718. messageForm.changeVisibleState(true)
  719. messageForm.action = function (state) {
  720. if (state) {
  721. jsObject.SendCommandSaveReport()
  722. setTimeout(() => {
  723. jsObject.SendCommandCloseReport()
  724. jsObject.designer.invokeExit()
  725. if (that.$refs.reportContainer)
  726. that.$refs.reportContainer.hideContainer()
  727. }, 250)
  728. } else {
  729. jsObject.SendCommandCloseReport()
  730. jsObject.designer.invokeExit()
  731. if (that.$refs.reportContainer)
  732. that.$refs.reportContainer.hideContainer()
  733. }
  734. }
  735. } else {
  736. jsObject.SendCommandCloseReport()
  737. jsObject.designer.invokeExit()
  738. if (that.$refs.reportContainer)
  739. that.$refs.reportContainer.hideContainer()
  740. }
  741. }
  742. },
  743. createViewerButtons(viewer) {
  744. viewer.jsObject.collections.images['myClose.png'] =
  745. 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAA0ElEQVQ4ja3TO05CQRQG4A8iOwAbtYWETndAaecK7NwCKmETtJZsSBNLobEz8ZFIJQ0UnOGSm3DnYviTybzO/895DQXGWGCVGQuMEqkRcwcfuMOLalziCaf4TIe9UG9nyMJmFRzNGoRK1BU4xxx9G7cfwostciGk+x8MqgySwDXe4tU53hVV+MNtTmAoX84JGv9NYgrHyR6DV8wUSW7hItZLm36ZVoVQxsFJLOMsPOrH/h7dQwR2cdxOTEn8DtUbPGc4V2H7Vb4Yqfedf/GYSGt8VUmxgyfuBAAAAABJRU5ErkJggg=='
  746. const closeBtn = viewer.jsObject.SmallButton(
  747. 'closeBtn',
  748. '关闭',
  749. 'myClose.png'
  750. )
  751. // 增加打印弹窗配置
  752. const printBtn = viewer.jsObject.SmallButton(
  753. 'printBtn',
  754. '打印报表',
  755. 'myClose.png'
  756. )
  757. // console.log(viewer.jsObject.print(),'1013')
  758. // 获取 关闭按钮的dom元素位置
  759. const toolbarTable = viewer.jsObject.controls.toolbar.firstChild.firstChild
  760. const buttonsTable = toolbarTable.rows[0].lastChild.lastChild
  761. const userButtonCell = buttonsTable.rows[0].insertCell(0)
  762. // 获取打印按钮的位置
  763. const buttonsTablePrint = toolbarTable.rows[0].childNodes[0].lastChild // 打印按钮
  764. const userButtonPrint = buttonsTablePrint.rows[0].childNodes[0] // 打印按钮dom位置
  765. userButtonPrint.addEventListener("click", (event) => {
  766. console.log("打印点击");
  767. // event.preventDefault()
  768. });
  769. userButtonPrint.addEventListener("mouseover", (event) => {
  770. console.log("移入打印按钮");
  771. console.log(event, 1035)
  772. });
  773. userButtonCell.className = 'stiJsViewerClearAllStyles'
  774. userButtonCell.appendChild(closeBtn) // 添加关闭节点
  775. // userButtonPrint.prepend(printBtn) // 在 printBtn 节点里最前面增加一个子级节点
  776. let that = this
  777. // 关闭按钮的监听点击
  778. closeBtn.action = function () {
  779. console.log(that.$refs.reportContainer, '1022')
  780. if (that.$refs.reportContainer)
  781. that.$refs.reportContainer.hideContainer()
  782. }
  783. // // // 打印按钮监听
  784. // printBtn.action = (e)=>{
  785. // console.log('打印')
  786. // window.print()
  787. // }
  788. },
  789. searchReset() {
  790. this.query = {};
  791. this.onLoad(this.page);
  792. },
  793. searchChange(params, done) {
  794. this.query = params;
  795. this.page.currentPage = 1;
  796. this.onLoad(this.page, params);
  797. done();
  798. },
  799. selectionChange(list) {
  800. this.selectionList = list;
  801. },
  802. selectionClear() {
  803. this.selectionList = [];
  804. this.$refs.crud.toggleSelection();
  805. },
  806. currentChange(currentPage) {
  807. this.page.currentPage = currentPage;
  808. },
  809. sizeChange(pageSize) {
  810. this.page.pageSize = pageSize;
  811. },
  812. refreshChange() {
  813. this.onLoad(this.page, this.query);
  814. },
  815. onLoad(page, params = {}) {
  816. this.loading = true;
  817. params.businessType = this.businessValue
  818. getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
  819. const data = res.data.data;
  820. this.page.total = data.total;
  821. this.data = data.records;
  822. this.loading = false;
  823. this.selectionClear();
  824. });
  825. },
  826. //自定义列保存
  827. async saveColumnTwo(ref, option, optionBack, code) {
  828. /**
  829. * 已定义全局方法,直接使用,saveColumnData保存列数据方法,参数传值(表格名称,当前表格的option数据)
  830. * 已定义全局方法,直接使用,getColumnName方法用来获取枚举值,参数根据自己定义的code值获取中文名
  831. * 一定要执行异步操作,要等接口成功返回,才能执行下一行代码
  832. */
  833. const inSave = await this.saveColumnData(this.getColumnName(code), this[option]);
  834. if (inSave) {
  835. this.$message.success("保存成功");
  836. //关闭窗口
  837. this.$refs[ref].$refs.dialogColumn.columnBox = false;
  838. }
  839. },
  840. //自定义列重置
  841. async resetColumnTwo(ref, option, optionBack, code) {
  842. this[option] = this[optionBack];
  843. const inSave = await this.delColumnData(this.getColumnName(code), this[optionBack]);
  844. if (inSave) {
  845. this.$message.success("重置成功");
  846. this.$refs[ref].$refs.dialogColumn.columnBox = false;
  847. }
  848. },
  849. // 更改表格颜色
  850. headerClassName(tab) {
  851. //颜色间隔
  852. let back = ""
  853. if (tab.columnIndex >= 0 && tab.column.level === 1) {
  854. if (tab.columnIndex % 2 === 0) {
  855. back = "back-one"
  856. } else if (tab.columnIndex % 2 === 1) {
  857. back = "back-two"
  858. }
  859. }
  860. return back;
  861. },
  862. }
  863. };
  864. </script>
  865. <style lang="scss" scoped>
  866. ::v-deep#out-table .back-one {
  867. background: #ecf5ff !important;
  868. }
  869. ::v-deep#out-table .back-two {
  870. background: #ecf5ff !important;
  871. }
  872. ::v-deep .el-input-group__append {
  873. padding: 0 0px !important;
  874. }
  875. /deep/ .el-tree-node__content>.el-tree-node__expand-icon {
  876. visibility: hidden;
  877. }
  878. /deep/ .el-col-md-8 {
  879. width: 24.33333%;
  880. }
  881. </style>