web打印组件康虎云报表与odoo整合示例

康虎云报表是最好用的web打印组件之一,而Odoo(前身为OpenERP)则是最好的开源ERP,把康虎云报表与odoo整合,实现odoo报表精准输出,复杂报表快速开发,这个任务我筹划很久了,也已经拖了很久了,昨天终于抽出时间给一班兄弟讲解了一下,讲的过程中气氛还不错,可惜的是录视频时,声音没录下来,成了哑剧。这两天要抽时间再录一段。
康虎云报表与odoo集成,原理其实很简单,就是在odoo原有报表基础上或者新建报表,把原来用QWeb输出的报表内容,转换成符合康虎云报表的json数据。在这个转换过程中,如果是简单字段,是很方便的,用<t t-esc=”…”>即可输出不带html标签的数值;而对于one2many、many2many等关联字段,最简便的办法就是利用Qweb引擎自身的功能把关联字段值取出来,即t-field标签。但t-field标签有个问题,它生成的值带有多重HTML标签,不仅容易造成json出现语法错误,也不易在康虎云报表中使用,因此如何生成不带HTML标签的值(姑且称之为 raw值)是转换的关键。
通过对QWeb底层渲染机制的研究,想出一种办法,在字段值最终输出前调用自定义函数移除HTML标签,只保留内容,目前这个功能已经做成通用功能,内置在 cfprint这个模块中,要在odoo中使用康虎云报表,需要先安装这个模块。然后对Qweb报表进行简单改造,插入生成json的代码。这次使用的是对仓库收货功能的一个小扩展,打印“入库核对单”,即仓管在收货前先打印“入库核对单”,然后根据核对单上的商品一个个清点,把实际清点的数据填写到表格里,在然后在odoo收货单里填上实际收货数量。
如何开发一个odoo模块并创建一个QWeb报表就不赘述了,大家自己去网上搜索,这里只贴出对Qweb报表的改造部分。在QWeb报表代码中,在模板底部找到

 
 
  1. </template>

标签,然后在该标签上一行插入如下的代码:

 
 
  1. <!--必须先安装cfprint模块,以引入基础类库-->
  2. <script type="text/javascript">
  3. var cfprint_addr = "127.0.0.1"; //打印服务器监听地址
  4. var _delay_close = -1; //打印完成后关闭窗口的延时时长(毫秒), -1则表示不关闭
  5. var _tablePack = {
  6. "Name": "Pack",
  7. "Cols":[
  8. { "type": "str", "size": 255, "name": "仓库", "required": false },
  9. { "type": "str", "size": 50, "name": "供应商", "required": false },
  10. { "type": "str", "size": 30, "name": "日期", "required": false },
  11. { "type": "str", "size": 255, "name": "入库单号", "required": false },
  12. { "type": "str", "size": 30, "name": "采购单号", "required": false },
  13. { "type": "int", "size": 0, "name": "件数", "required": false },
  14. { "type": "str", "size": 20, "name": "包装种类", "required": false },
  15. { "type": "str", "size": 30, "name": "车号", "required": false },
  16. { "type": "str", "size": 30, "name": "柜号", "required": false }
  17. ],
  18. "Data":[ ]
  19. };
  20.  
  21. var _tablePackLines = {
  22. "Name": "PackLines",
  23. "Cols":[
  24. { "type": "str", "size": 30, "name": "入库单号", "required": false },
  25. { "type": "str", "size": 255, "name": "产品", "required": false },
  26. { "type": "str", "size": 30, "name": "条形码", "required": false },
  27. { "type": "float", "size": 0, "name": "采购数量", "required": false },
  28. { "type": "float", "size": 0, "name": "实际数量", "required": false },
  29. { "type": "str", "size": 20, "name": "计量单位", "required": false },
  30. ],
  31. "Data":[ ]
  32. };
  33.  
  34. <t t-foreach="docs" t-as="o">
  35. /*生成主表数据*/
  36. _tablePack.Data.push(
  37. {
  38. "仓库":"<span t-field="o.picking_type_id.warehouse_id.partner_id" t-field-options='{"widget": "contact", "fields": ["name"], "no_marker": true, "no_tag_br": true, "data_type": "raw"}' />",
  39. "供应商":"<t t-if="o.partner_id" name="partner_header"><span t-field="o.partner_id" t-field-options='{"widget": "contact", "fields": ["name"], "no_marker": true, "no_tag_br": true, "data_type": "raw"}' /></t>",
  40. "日期":"<t t-esc="context_timestamp(datetime.datetime.now()).strftime('%Y-%m-%d %H:%M')"/>",
  41. "入库单号":"<t t-esc="o.name" class="mt0"/>",
  42. "采购单号":"<t t-if="o.origin"><t t-esc="o.origin"/></t>",
  43. "件数":"<t t-esc="sum(pack_operation.product_qty for pack_operation in o.pack_operation_ids)"/>",
  44. "包装种类":"",
  45. "车号":"",
  46. "柜号":""
  47. });
  48. <t t-foreach="o.pack_operation_ids" t-as="pack_operation">
  49. /*生成从表数据*/
  50. _tablePackLines.Data.push(
  51. {
  52. "入库单号":"<t t-esc="o.name" class="mt0"/>",
  53. "产品":"<span t-field="pack_operation.product_id" t-options='{"data_type":"raw"}'/>",
  54. "条形码":"<t t-if="pack_operation.product_id and pack_operation.product_id.barcode"><span t-field="pack_operation.product_id.barcode" t-field-options='{"data_type":"raw"}'/></t>",
  55. "采购数量":"<t t-esc="pack_operation.product_qty"/>",
  56. "实际数量":"",
  57. "计量单位":"<span t-field="pack_operation.product_uom_id" t-options='{"data_type":"raw"}'/>"
  58. });
  59. </t>
  60. </t>
  61. /*数据合并到总的数据对象*/
  62. var _data = {"template": "warehouse_checklist.fr3", "ver": 4, "Copies": 1, "Duplex": 0, "Tables":[]};
  63. _data["Tables"].push(_tablePack);
  64. _data["Tables"].push(_tablePackLines);
  65. var _reportData = JSON.stringify(_data); //转成json字符串
  66.  
  67. console.log(_reportData);
  68. //生成数据之后,在cfprint_ext.js中会自动调用进行打印
  69.  
  70. </script>

细心的用户可能会发现,在

 
 
  1. <span t-field="pack_operation.product_id" t-options='{"data_type":"raw"}'/>"

里有一个t-options='{“data_type”:”raw”}’,这正是我们对t-field标签的扩展,以输出raw值。
在QWeb报表中插入上面代码之后,还需要把报表类型由pdf改为html才可以。具体是在报表定义中进行修改(也可以通过界面修改,不过通过界面修改的话,重装或升级模块报表类型就恢复成PDF了)。具体修改如下:

 
 
  1. <report
  2. string="Warehouse Checklist"
  3. id="action_report_warehouse_checklist"
  4. model="stock.picking"
  5. report_type="qweb-html" ###这个地方由qweb-pdf改成为 qweb-html
  6. name="stock_cf.report_warehouse_checklist"
  7. file="stock_cf.report_warehouse_checklist"
  8. />

改造完成后,把康虎云报表解压到任意目录(例如:康虎云报表系统_ver1.3.7.3),运行cfprint\cfprint.exe程序并保持运行状态。把预先设计好的报表模板(stock_cf\cfprint_template\warehouse_checklist.fr3)复制到康虎云报表安装目录(cfprint.exe所在目录)。
重新安装或升级stock_cf模块,然后进入仓库管理,如果有待收货记录,选择一条收货记录(如果没有,就新建一个采购订单并确认),然后按“打印”–>“入库核对单”,如果不出意外,康虎云报表就会接收到打印请求并向打印机输出报表。如果没有输出,建议打开浏览器的javascript控制台,看看有什么出错信息,并根据出错信息进行修改除错。
以上就是康虎云报表与odoo的整合工作,以后就只需要按此步骤操作即可。

另外附上两个示例的程序包(里面带康虎云报表1.3.7.3版,可以永久免费使用):
康虎云报表与odoo10整合基础模块及示例.zip
康虎云报表与odoo8集成基础模块及示例.zip


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
控件功能强大,却简单易用,所有调用如同JavaScript扩展语句, 主要接口函数如下: PRINT_INIT 打印初始化 SET_PRINT_PAGESIZE 设定纸张大小 ADD_PRINT_HTM 增加超文本项 ADD_PRINT_TEXT 增加纯文本项 ADD_PRINT_TABLE 增加表格项 ADD_PRINT_SHAPE 画图形 SET_PRINT_STYLE 设置对象风格 PREVIEW 打印预览 PRINT 直接打印 PRINT_SETUP 打印维护 PRINT_DESIGN 打印设计 ... 样例清单 1.如何在页面内嵌入控件见样例一 2.如何选材打印当前页面内容见样例二 3.如何用代码生成打印页见样例三 4.如何打印设计和定位打见样例四 5.如何控制纸张大小和连续打印见样例五 6.如何输出多页长文档及双面打印见样例六 7.如何定向输出见样例七 8.如何打印图片见样例八 9.如何用程序加载打印维护背景图见样例九 10.如何控制打印样式(STYLE)见样例十 11.如何直接打印条形码见样例十一 12.如何读写本地文件见样例十二 13.如何打印旋转内容见样例十三 14.如何按URL打印见样例十四 15.如何打印表格的页头页尾见样例十五 16.如何设置预览窗口大小见样例十六 17.如何发打印机指令或直接读写端口见样例十七 18.如何打印幅面高度不固定的票据见样例十八 19.如何内嵌显示及预览时包含背景图见样例十九 20.如何强制分页并预览多页卡片见样例二十 21.如何控制打印维护的功能权限见样例二十一 22.如何构建自己的纯WEB打印预览见样例二十二 23.如何居中打印超文本见样例二十三 24.如何选择界面皮肤见样例二十四 25.如何指定输出到哪页或仅预览见样例二十五 26.如何提高多页打印的性能见样例二十六 27.如何导出数据到Excel文件见样例二十七 28.如何快速读取客户端系统信息见样例二十八 29.如何使用其它长度单位见样例二十九 30.如何分页输出页面内容见样例三十 31.如何打印表格的分页小计或合计见样例三十一 32.如何实现清晰的图表打印见样例三十二 33.如何实现甘特图等的图表打印见样例三十三 34.如何使用百分比%和满页打印见样例三十四 35.如何获得打印结果和程序代码见样例三十五 36.如何在设计过程中用js编辑内容见样例三十六 37.如何打印公章效果图见样例三十七 38.如何用BASE64编码输出图片见样例三十八 39.如何打印田字格、上划线等文本见样例三十九 40.如何进行数据格式转换见样例四十 41.如何把内容关联后按顺序打印见样例四十一 42.如何把整页内容缩放打印见样例四十二 43.如何分页打印综合表格见样例四十三 44.如何缩放打印单个超文本内容见样例四十四 45.如何获得打印状态及最终结果见样例四十五 46.如何设置右边距和下边距见样例四十六

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wdmsyf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值