文章目录
- 一. 关于权限控制:组织、角色、人员权限的说明
- 二. 关于快速批量功能:有一些事情可以交给电脑来做
- 三. 关于可以拖拉拽应用:技术模块
- 3.1 可配置的MVC
- 3.2 简单开发下附件模块也可用来作为企业的知识沉淀
- 3.3 多语言支持:对于跨国业务的小伙伴,绝对是福音
- 3.4 当然还有更多其他的功能
- 四. 题外话
- odoo中文社区野史-V2
如果你有一个苹果,我也有一个苹果,彼此交换后,你我还是一人一个苹果;但是如果你有一个想法,我有一个想法,彼此交换后,你我就都有两个想法,三个人呢?一百个人呢?
跟Odoo的初次邂逅,绝对称不上美好的回忆。
时间回到2018年4月11日。
第一次经手Odoo的工作是写报表,居然一写就写到2019年6月25日,我们第二位小伙伴加入。团队中一个人码代码的日子,1年2个月又14天,这是一件有趣而绝对称不上美好的事情。经历一年多对Odoo手摸手的学习,Odoo从controllers、models、report、views到JsonRPC各个板块也摸了个遍。
既然讲企业信息化,那接下来交代下后面故事的背景:
公司: 贸易性质公司 + 节能产品生产 + 工业维修再造三个业态,包括SFA(Sales force automation)/L2C(Leads To Cash)销售业态、MRO私域电商、永磁传动设备自主生产、工业维修再造、工厂数字化解决方案五个板块。
系统: ERP财务业务一体化系统(包括购销存财费/人事/生产等模块) + MRO私域电商系统 + CRM客户关系管理系统 + WMS仓储管理系统 + 生产报工系统
移动端: 企业微信(OA 系统)
在已上线ERP并稳定使用的情况下,不适宜启用Odoo的ERP功能。经过考虑:只把ERP作为订单中台,启用Base/Mail模块对核心ERP系统扩展并向前对接业务系统,是相对高效的模式。【这种模式适用性比较广,没过多破坏ERP的业务逻辑,大家都可以玩。当然这种基于ERP为订单中台的场景,后面将有章节讲到】
业务示意图:
下面再讲一些关于Odoo的事情:
一. 关于权限控制:组织、角色、人员权限的说明
一套相对完备的系统,需要有几个层级的控制,分别为满足组织隔离、同时至少应满足按角色设置:表单级权限控制、记录级权限控制、字段级权限控制。有部分做的较为优秀的系统,还可以实现按组织树关系对部门及员工数据进行共享及隔离处理(即自己可以查看本人数据,上级可以查看下级及本人数据,部门负责人可以查看本部门数据)。
二. 关于快速批量功能:有一些事情可以交给电脑来做
先来讲个场景,公司某部门有近200名业务人员,需要每天统计营销数据,并将销售报表每天定时发送给各个业务人员。
发200个邮件需要多长时间?测算一下,每个邮件30秒,数学不好,好像100分钟。
用Odoo框架来一段装下逼格的代码,花小半个小时,写个方法:先找一下数据,再循环一下,200个业务员的销售数据就出来了。接下来就可以泡壶茶等着报表发出来了。
当然,你也可以动动小指头去发送,只要个人愿意。
在大多数时候,效率与成本是比较难以平衡的一个事情。
经济管理上有个专业名称,叫“机会成本”,即所有的机会的获得都是以放弃其他机会来换取的,说得比较拗口。简单来讲,同一时间,你手上有AB两个机会,你选择A,那么你得放弃B;选择B同理。
看个228行代码实现自动邮件分发的例子:
class SDReportDaily(models.Model):
"""
业务员销售日报表
"""
def sd_report_daily(self):
config_db = self.env['sync.server'].search([('name', '=', 'eas_db')])[0]
oracle_db = cx_Oracle.connect(config_db.sync_user, config_db.sync_pwd, '%s:%s/%s' %
(config_db.sync_server, config_db.sync_port, config_db.sync_db))
cursor = oracle_db.cursor()
try:
cursor.execute(sql_data_salesman.format(current_date)) # 执行销售数据查询——查业务员
record_salesman = cursor.fetchall()
for bill in record_salesman: # 这里循环一下,200个业务员就出来了
self.sd_report_record(cursor, bill[0], bill[1], all_data=False, is_leader=False, is_origin=False)
def sd_report_record(self, cursor, person, manager_email, all_data, is_leader, is_origin):
pass
不是要挂附件吗,那在这里把附件“挂”上去吧
def add_file_in_attachment(self, file_name, name):
"""
生成附件
:param file_name: 附件路径
:param name: 附件名称
:return: 附件对象
"""
with open(file_name, "rb") as xlfile:
byte_data = xlfile.read()
attachment = self.env['ir.attachment'].create({'name': name,
'datas': base64.b64encode(byte_data),
'res_model': 'res.users',
'res_id': 2})
return attachment
喝茶的时间200个邮件在这里就可以发出来了。
def create_email(self, attachment_id, person, manager_email, current_time, body):
"""
生成邮件
:param attachment_id: 附件对象的id
:param current_time:
:return:
"""
msg_body = u'%s<br/><br/> %s' % (body, '此电子邮件由系统自动发送.<br/>请不要直接回复邮件.')
self.env['mail.mail'].create({
'auto_delete': False,
'notification': False,
'state': 'outgoing',
'mail_server_id': 1,
'record_name': time.strftime('%Y-%m-%d %H-%M-%S'),
'message_type': 'email',
'reply_to': 'coco@qiye.com',
'email_from': 'coco@qiye.com',
'email_cc': 'coco@qiye.com',
'email_to': manager_email,
'attachment_ids': [(6, 0, [attachment_id])],
'subject': '[%s]销售日报表%s' % (person, current_time),
'body_html': msg_body,
}).send()
三. 关于可以拖拉拽应用:技术模块
3.1 可配置的MVC
3.2 简单开发下附件模块也可用来作为企业的知识沉淀
3.3 多语言支持:对于跨国业务的小伙伴,绝对是福音
3.4 当然还有更多其他的功能
四. 题外话
2018年,一个人用Odoo10在写报表。Odoo10一个不太漂亮的系统,像主家庭主夫,不修边幅,但基本不会有明显BUG;
2019年,二个人用Odoo13写模块。功能靠修,泛善可陈;
2020年,三个人用Odoo13的写各种接口,对接客户、对接供应商、对接eCommerce;
2021年,四个人用Odoo14完成前端“业务中台”与ERP后端“订单中台”的大部分数据交互,也写一些BI的功能;
2022年,不到五个人,还是四个人。用着odoo16,继续做着码农,痛并快乐,,,,
odoo中文社区野史-V2
保定-粉刷匠: 开源ERP系统Odoo中国发展史
上海开源信息技术协会: 分享回顾 | Odoo的独特性及其“八卦”