diff --git a/jikimo_system_order/__init__.py b/jikimo_system_order/__init__.py new file mode 100644 index 00000000..bbc55806 --- /dev/null +++ b/jikimo_system_order/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- + +from . import controllers +from . import models +from . import wizard diff --git a/jikimo_system_order/__manifest__.py b/jikimo_system_order/__manifest__.py new file mode 100644 index 00000000..75a20ebf --- /dev/null +++ b/jikimo_system_order/__manifest__.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +{ + 'name': "jikimo_system_order", + + 'summary': """ + 系统工单""", + + 'description': """ + 用于处理针对系统的工作任务; + 员工可以通过系统工单发起申请,由维护人员处理以后,填写处理结果。 + """, + + 'author': "机企猫", + 'website': "http://www.jikimo.com", + + # Categories can be used to filter modules in modules listing + # Check https://github.com/odoo/odoo/blob/master/odoo/addons/base/module/module_data.xml + # for the full list + 'category': 'Uncategorized', + 'version': '0.1', + + # any module necessary for this one to work correctly + 'depends': ['base','mail'], + + # always loaded + 'data': [ + 'security/account_security.xml', + 'security/ir.model.access.csv', + 'wizard/order_wizard.xml', + 'views/notice_user_config.xml', + 'views/yizuo_system_order_view.xml', + 'views/work_order_number.xml', + ], + # only loaded in demonstration mode + 'demo': [ + 'demo/demo.xml', + ], +} \ No newline at end of file diff --git a/jikimo_system_order/controllers/__init__.py b/jikimo_system_order/controllers/__init__.py new file mode 100644 index 00000000..457bae27 --- /dev/null +++ b/jikimo_system_order/controllers/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import controllers \ No newline at end of file diff --git a/jikimo_system_order/controllers/controllers.py b/jikimo_system_order/controllers/controllers.py new file mode 100644 index 00000000..cfcad7d0 --- /dev/null +++ b/jikimo_system_order/controllers/controllers.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from odoo import http + +# class TopSystemOrder(http.Controller): +# @http.route('/jikimo_system_order/jikimo_system_order/', auth='public') +# def index(self, **kw): +# return "Hello, world" + +# @http.route('/jikimo_system_order/jikimo_system_order/objects/', auth='public') +# def list(self, **kw): +# return http.request.render('jikimo_system_order.listing', { +# 'root': '/jikimo_system_order/jikimo_system_order', +# 'objects': http.request.env['jikimo_system_order.jikimo_system_order'].search([]), +# }) + +# @http.route('/jikimo_system_order/jikimo_system_order/objects//', auth='public') +# def object(self, obj, **kw): +# return http.request.render('jikimo_system_order.object', { +# 'object': obj +# }) \ No newline at end of file diff --git a/jikimo_system_order/demo/demo.xml b/jikimo_system_order/demo/demo.xml new file mode 100644 index 00000000..b167f9be --- /dev/null +++ b/jikimo_system_order/demo/demo.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jikimo_system_order/models/__init__.py b/jikimo_system_order/models/__init__.py new file mode 100644 index 00000000..ca081c2e --- /dev/null +++ b/jikimo_system_order/models/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- + +from . import constant +from . import order_classify +from . import system_work_order +from . import work_order_template diff --git a/jikimo_system_order/models/constant.py b/jikimo_system_order/models/constant.py new file mode 100644 index 00000000..414371b9 --- /dev/null +++ b/jikimo_system_order/models/constant.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- + +# 工单状态 +STATE_SELECTION = [('draft', u'草稿'), ('unconfirmed', u'待确认'), ('pending', u'待处理'), + ('processed', u'已处理待评分'), ('completed', u'已完成'), ('closed', u'已关闭')] + +GRADE = [('1', '1非常不满意'), ('2', '2不满意'), ('3', '3一般'), ('4', '4满意'), ('5', '5非常满意')] diff --git a/jikimo_system_order/models/order_classify.py b/jikimo_system_order/models/order_classify.py new file mode 100644 index 00000000..d143487d --- /dev/null +++ b/jikimo_system_order/models/order_classify.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api +from odoo.exceptions import ValidationError + + +class OrderClassify(models.Model): + _name = 'order.classify' + _order = 'sequence, name' + + + @api.constrains('name') + def check_base_name(self): + """类型名称唯一""" + name_obj = self.env['order.classify'].search([('name', '=', self.name)]) + if len(name_obj) >= 2: + raise ValidationError(u'该类型已存在') + + # 名称 + name = fields.Char(string=u'名称', size=20) + # 排序 + sequence = fields.Integer(default=10) + # 是否有效 + state = fields.Boolean(default=True, string='是否有效') + diff --git a/jikimo_system_order/models/system_work_order.py b/jikimo_system_order/models/system_work_order.py new file mode 100644 index 00000000..19bff200 --- /dev/null +++ b/jikimo_system_order/models/system_work_order.py @@ -0,0 +1,183 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api +from odoo.exceptions import ValidationError +from odoo import exceptions +from .constant import STATE_SELECTION, GRADE +import datetime +import logging + + +class SystemWorkOrder(models.Model): + _name = 'system.work.order' + _inherit = ['mail.thread', 'mail.activity.mixin'] + _order = 'date desc' + _description = u'系统工单' + _rec_name = 'order_number' + + def get_is_technicist(self): + self._cr.execute( + "select u.id from res_users u left join res_groups_users_rel r on r.uid = u.id where r.gid in (select g.id from res_groups g where g.name = '技术员权限') and u.id ='%s'", + (self.env.user.id,)) + hr = self._cr.dictfetchall() + if len(hr) > 0: + return True + else: + return False + + # def get_user_department_id(self): + # """根据用户id系统员工id""" + # employee = self.env['hr.employee'].sudo().search([('user_id', '=', self.env.uid)], limit=1) + # if employee: + # if len(employee) > 0: + # if not employee.department_id: + # raise exceptions.Warning(u'您当前使用的用户没有所属部门') + # return employee.department_id + # else: + # return False + # else: + # raise exceptions.Warning(u'您当前使用的用户没有关联员工') + + @api.onchange('order_template_id') + def get_title(self): + """选择模板自动填充""" + if self.order_template_id: + self.title = self.order_template_id.title_template + self.text = self.order_template_id.text_template + + # 工单编号 + order_number = fields.Char(string=u'工单编号', default='/') + # 紧急程度 + urgency_degree = fields.Selection([('0', u'0星'), ('1', u'一星'), ('2', u'二星'), ('3', u'三星'), ('4', u'四星'), + ('5', u'五星')], string=u'紧急程度', help='五星为最紧急!', default='5') + # 工单分类(可以配置,并调整优先级) + order_type = fields.Many2one('order.classify', string=u'工单分类', domain=[('state', '=', True)]) + # 发起人所属公司(res.company) + initiator_company_id = fields.Many2one('res.company', string=u'发起人所属公司', default=lambda self: self.env.user.company_id) + # 发起人部门(hr.department) + # initiator_department_id = fields.Many2one('hr.department', string=u'发起人部门', default=get_user_department_id) + # 发起人(hr.employee) + initiator_id = fields.Many2one('res.users', string=u'发起人', default=lambda self: self.env.user) + # 发起时间 + date = fields.Datetime(string=u'发起时间', default=lambda self: fields.datetime.now()) + # 确认人 + confirm_id = fields.Many2one('res.users', string=u'确认人') + # 确认日期 + confirmation_date = fields.Datetime(string=u'确认时间') + # 模板 + order_template_id = fields.Many2one('work.order.template', string=u'模板', domain=[('state', '=', True)]) + # 标题 + title = fields.Char(string=u'标题') + # 正文 + text = fields.Html(string=u'正文') + # 状态[草稿\待确认\待处理\已处理\已关闭] + state = fields.Selection(STATE_SELECTION, default='draft', string=u'状态') + # 关闭原因 + close_cause = fields.Text(string=u'关闭问题原因') + # 关闭时间 + close_time = fields.Datetime(string=u'关闭问题时间') + # 关闭人 + close_user_id = fields.Many2one('res.users', string=u'关闭人') + # 解决人 + solve_people_id = fields.Many2one('res.users', string=u'解决人') + # 用户实际问题 + users_problem = fields.Text(string=u'用户实际问题') + # 最终解决方案 + solution = fields.Text(string=u'最终解决方案') + # 判断是否为技术人员 + is_technicist = fields.Boolean(string=u'是否为技术人员', default=get_is_technicist) + # 打分 + grade = fields.Selection(GRADE, string=u'评分') + # 评价按钮的显示 + is_display = fields.Boolean('控制显示评价按钮', compute='compute_is_display') + + def compute_is_display(self): + for item in self: + if item.state == 'processed' and self.env.user.id == item.initiator_id.id: + item.is_display = True + else: + item.is_display = False + + @api.onchange('order_type') + def _onchange_order_type(self): + self.order_template_id = None + self.title = None + self.text = None + + @api.model + def create(self, vals): + # 创建编号 + if vals.get('order_number', '/') == '/': + vals['order_number'] = self.env['ir.sequence'].get('system.work.order') or '/' + return super(SystemWorkOrder, self).create(vals) + + def do_draft(self, order=None): + """状态草稿""" + bill = self + if order: + bill = order + if bill.state == 'unconfirmed': + state_remark = u'待确认 --> 草稿' + # bill.message_post(u'操作人:%s,操作时间:%s,状态变更过程:%s' % (self.env.user.name, + # (datetime.datetime.now() + datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S'), state_remark)) + bill.state = 'draft' + + def do_unconfirmed(self): + """状态待确认""" + if self.state == 'draft': + state_remark = u'草稿 --> 待确认' + # self.message_post(u'操作人:%s,操作时间:%s,状态变更过程:%s' % ( + # self.env.user.name, + # (datetime.datetime.now() + datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S'), state_remark)) + self.state = 'unconfirmed' + # 获取通知人 + objs = self.env['system.order.notice'].search([]) + user_ids = objs.notice_user_ids.filtered(lambda item: item.we_employee_id not in ['', False]) + we_employee_ids = user_ids.mapped('we_employee_id') + lost_agent_id = self.env['ir.config_parameter'].sudo().get_param('lost_agent_id') + wechat = self.env['we.config'].sudo().get_wechat(agent_id=lost_agent_id) + # agent_id, user_ids, content + content = """您有一张工单待处理:**工单标题:{2}** + >创建人:{1} + >提交时间:{3} + >紧急程度:{0}星 + 请查看工单消息,并及时处理! + """.format(self.urgency_degree, + self.initiator_id.name, self.title, (self.date + datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M')) + for we_employee_id in we_employee_ids: + try: + wechat.message.send_markdown(agent_id=lost_agent_id, user_ids=we_employee_id, content=content) + except Exception as e: + logging.error('工单处理发送消息异常%s' % str(e)) + + return True + + def do_pending(self): + """状态待处理""" + if self.state == 'unconfirmed': + state_remark = u'待确认 --> 待处理' + # self.message_post(u'操作人:%s,操作时间:%s,状态变更过程:%s' % ( + # self.env.user.name, + # (datetime.datetime.now() + datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S'), state_remark)) + self.state = 'pending' + self.confirm_id = self.env.user + self.confirmation_date = fields.datetime.now() + return True + + def urned_off(self): + """状态关闭""" + if self.close_cause: + self.state = 'closed' + self.close_time = fields.datetime.now() + else: + raise ValidationError(u'请注明关闭原因') + return True + + def unlink(self): + for item in self: + if item.state != "draft": + raise ValidationError(u'只能删除状态为【草稿】的工单。') + elif item.env.uid != item.initiator_id.id: + raise ValidationError(u'非本人不能删除') + else: + super(SystemWorkOrder, item).unlink() diff --git a/jikimo_system_order/models/work_order_template.py b/jikimo_system_order/models/work_order_template.py new file mode 100644 index 00000000..f50fd42d --- /dev/null +++ b/jikimo_system_order/models/work_order_template.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api + + +class WorkOrderTemplate(models.Model): + _name = 'work.order.template' + _order = 'num' + + # 编号 + num = fields.Char(string=u'编号', default='/') + # 名称 + name = fields.Char(string=u'模板名称', required="1") + # 分类 + work_order_type = fields.Many2one('order.classify', string=u'系统工单分类', domain=[('state', '=', True)]) + # 模板标题 + title_template = fields.Char(string=u'模板标题') + # 模板正文 + text_template = fields.Html(string=u'模板正文') + # 模板说明 + template_explain = fields.Text(string=u'模板说明') + # 是否有效 + state = fields.Boolean(default=True, string=u'是否有效') + + @api.model + def create(self, vals): + # 创建编号 + if vals.get('num', '/') == '/': + vals['num'] = self.env['ir.sequence'].get('work.order.template') or '/' + return super(WorkOrderTemplate, self).create(vals) + + +class SystemOrderNotice(models.Model): + _name = 'system.order.notice' + _description = '工单处理人设置' + + notice_user_ids = fields.Many2many('res.users', string='工单处理人') + diff --git a/jikimo_system_order/security/account_security.xml b/jikimo_system_order/security/account_security.xml new file mode 100644 index 00000000..8356964e --- /dev/null +++ b/jikimo_system_order/security/account_security.xml @@ -0,0 +1,24 @@ + + + + + + 运维权限 + + + + 用户访问工单信息 + + + [('initiator_id', '=', user.id)] + + + + 运维访问工单信息 + + + [(1, '=', 1)] + + + + diff --git a/jikimo_system_order/security/ir.model.access.csv b/jikimo_system_order/security/ir.model.access.csv new file mode 100644 index 00000000..5c76352d --- /dev/null +++ b/jikimo_system_order/security/ir.model.access.csv @@ -0,0 +1,16 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink + +inside_system_order_classify_r,jikimo_system_order.order_classify,model_order_classify,,1,1,1,1 +inside_system_work_order_rc,jikimo_system_order.system_work_order,model_system_work_order,,1,1,1,1 +inside_work_order_template_r,jikimo_system_order.work_order_template,model_work_order_template,,1,1,1,1 + +inside_system_order_classify_rwc,jikimo_system_order.order_classify,model_order_classify,group_operations_permissions_rwc,1,1,1,0 +inside_system_work_order_rwc,jikimo_system_order.system_work_order,model_system_work_order,group_operations_permissions_rwc,1,1,1,0 +inside_work_order_template_rwc,jikimo_system_order.work_order_template,model_work_order_template,group_operations_permissions_rwc,1,1,1,0 + +order_close_wizard_group_user,jikimo_system_order.order_close_wizard,model_order_close_wizard,base.group_user,1,1,1,1 +order_other_wizard_group_user,jikimo_system_order.order_other_wizard,model_order_other_wizard,base.group_user,1,1,1,1 +order_technician_wizard_group_user,jikimo_system_order.order_technician_wizard,model_order_technician_wizard,base.group_user,1,1,1,1 +system_work_order_wizard_group_user,jikimo_system_order.system_work_order_wizard,model_system_work_order_wizard,base.group_user,1,1,1,1 + +system_order_notice_group_user,jikimo_system_order.system_order_notice,model_system_order_notice,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/jikimo_system_order/static/description/icon.png b/jikimo_system_order/static/description/icon.png new file mode 100644 index 00000000..24aa8fc8 Binary files /dev/null and b/jikimo_system_order/static/description/icon.png differ diff --git a/jikimo_system_order/views/notice_user_config.xml b/jikimo_system_order/views/notice_user_config.xml new file mode 100644 index 00000000..353afb96 --- /dev/null +++ b/jikimo_system_order/views/notice_user_config.xml @@ -0,0 +1,58 @@ + + + + # ---------- 工单通知处理人设置 ------------ + + + tree.system.order.notice + system.order.notice + + + + + + + + + + search.system.order.notice + system.order.notice + + + + + + + + + + + + + + 工单处理人 + system.order.notice + tree + [] + {} + +

+ [工单处理人] 还没有哦!点左上角的[创建]按钮,沙发归你了! +

+

+

+
+
+ + + + + + + + + + +
+
\ No newline at end of file diff --git a/jikimo_system_order/views/work_order_number.xml b/jikimo_system_order/views/work_order_number.xml new file mode 100644 index 00000000..63f0d5a3 --- /dev/null +++ b/jikimo_system_order/views/work_order_number.xml @@ -0,0 +1,23 @@ + + + + + + + seq_work_order + + system.work.order + SO%(year)s%(month)s%(day)s + 1 + + + + + seq_order_template + + work.order.template + TL + 1 + + + \ No newline at end of file diff --git a/jikimo_system_order/views/yizuo_system_order_view.xml b/jikimo_system_order/views/yizuo_system_order_view.xml new file mode 100644 index 00000000..b5de3bcc --- /dev/null +++ b/jikimo_system_order/views/yizuo_system_order_view.xml @@ -0,0 +1,243 @@ + + + + + + + 工单信息 + system.work.order + + + + + + + + + + + + + + 新建系统工单 + system.work.order + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + 搜索工单 + system.work.order + + + + + + + + + + + + + + + + + + + + + + + + + + + 工单图表 + system.work.order + + + + + + + + + + + + 工单 + system.work.order + tree,form,search,graph,pivot + + + + + 工单模板信息 + work.order.template + + + + + + + + + + + + + + + 新建系统工单模板 + work.order.template + +
+ + + + + + + + + + + +
+
+
+ + + + 工单模板 + work.order.template + tree,form + + + + + 工单分类信息 + order.classify + + + + + + + + + + + + 新建系统分类信息 + order.classify + +
+ + + + + + + +
+
+
+ + + + 工单分类 + order.classify + tree,form + + + + + + + + +
+
\ No newline at end of file diff --git a/jikimo_system_order/wizard/__init__.py b/jikimo_system_order/wizard/__init__.py new file mode 100644 index 00000000..8cf586ce --- /dev/null +++ b/jikimo_system_order/wizard/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- + +from . import order_other_wizard +from . import order_technician_wizard +from . import order_close_wizard +from . import system_work_order_wizard diff --git a/jikimo_system_order/wizard/order_close_wizard.py b/jikimo_system_order/wizard/order_close_wizard.py new file mode 100644 index 00000000..ca10ae7c --- /dev/null +++ b/jikimo_system_order/wizard/order_close_wizard.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api +from odoo.addons.jikimo_system_order.models.constant import STATE_SELECTION +from odoo.exceptions import ValidationError +import datetime, logging + + +class OrderCloseWizard(models.TransientModel): + _name = 'order.close.wizard' + + + def get_context(self): + if self._context.get('active_id'): + obj = self.env['system.work.order'].browse(self._context.get('active_id')) + if obj.initiator_id.id != self.env.user.id: + raise ValidationError(u'非本人无法操作') + return obj + + order_id = fields.Many2one('system.work.order', string=u'工单ID', + default=lambda self: self.get_context().id) + # 关闭原因 + close_cause = fields.Text(string=u'关闭问题原因', default=lambda self: self.get_context().close_cause) + # 关闭时间 + close_time = fields.Datetime(string=u'关闭问题时间', default=fields.datetime.now()) + # 状态 + state = fields.Selection(STATE_SELECTION, default='closed', string=u'状态') + # 关闭人 + close_user_id = fields.Many2one('res.users', string=u'关闭人', default=lambda self: self.env.user) + + + def sure(self): + self.order_id.close_cause = self.close_cause + self.order_id.close_time = self.close_time + if self.order_id.state == 'unconfirmed': + state_remark = u'待确认 --> 已关闭' + if self.order_id.state == 'pending': + state_remark = u'待处理 --> 已关闭' + if self.order_id.state == 'processed': + state_remark = u'已处理待评分 --> 已关闭' + # self.order_id.message_post(u'操作人:%s,操作时间:%s,状态变更过程:%s' % ( + # self.env.user.name, + # (datetime.datetime.now() + datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S'), state_remark)) + self.order_id.state = self.state + self.order_id.close_user_id = self.close_user_id + we_employee_ids = [] + if self.order_id.initiator_id.we_employee_id: + we_employee_ids.append(self.order_id.initiator_id.we_employee_id) + lost_agent_id = self.env['ir.config_parameter'].sudo().get_param('lost_agent_id') + wechat = self.env['we.config'].sudo().get_wechat(agent_id=lost_agent_id) + # agent_id, user_ids, content + content = """您提交的工单-**工单标题:{0}**-**已关闭** + >提交时间:{1} + >处理时间:{2} + >处理人:{3} + 如有问题,请联系系统管理员! + """.format(self.order_id.title, + (self.order_id.date + datetime.timedelta(hours=8)).strftime( + '%Y-%m-%d %H:%M'), (datetime.datetime.now() + datetime.timedelta( + hours=8)).strftime('%Y-%m-%d %H:%M'), self.env.user.name or '') + # wechat.message.send_markdown(agent_id=lost_agent_id, user_ids=we_employee_ids, content=content) + for we_employee_id in we_employee_ids: + try: + wechat.message.send_markdown(agent_id=lost_agent_id, user_ids=we_employee_id, content=content) + except Exception as e: + logging.error('工单关闭发送消息异常%s' % str(e)) + return {} + + + + + + + + + + + + diff --git a/jikimo_system_order/wizard/order_other_wizard.py b/jikimo_system_order/wizard/order_other_wizard.py new file mode 100644 index 00000000..3f6c8710 --- /dev/null +++ b/jikimo_system_order/wizard/order_other_wizard.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api +from odoo.exceptions import ValidationError +from odoo.addons.jikimo_system_order.models.constant import STATE_SELECTION, GRADE +import datetime + + +class OrderOtherWizard(models.TransientModel): + _name = 'order.other.wizard' + + + def get_context(self): + if self._context.get('active_id'): + obj = self.env['system.work.order'].browse(self._context.get('active_id')) + if obj.initiator_id.id != self.env.user.id: + raise ValidationError(u'非本人无法操作') + return obj + + order_id = fields.Many2one('system.work.order', string=u'工单ID', + default=lambda self: self.get_context().id) + # 关闭时间 + close_time = fields.Datetime(string=u'关闭时间', default=fields.datetime.now()) + # 状态 + state = fields.Selection(STATE_SELECTION, default='completed', string=u'状态') + # 打分 + grade = fields.Selection(GRADE, string=u'评分') + # 关闭人 + close_user_id = fields.Many2one('res.users', string=u'关闭人', default=lambda self: self.env.user) + + + def sure(self): + self.order_id.close_time = self.close_time + self.order_id.grade = self.grade + if self.order_id.state == 'processed': + state_remark = u'已处理待评分 --> 已完成' + # self.order_id.message_post(u'操作人:%s,操作时间:%s,状态变更过程:%s' % ( + # self.env.user.name, + # (datetime.datetime.now() + datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S'), state_remark)) + self.order_id.state = self.state + self.order_id.close_user_id = self.close_user_id + return {} diff --git a/jikimo_system_order/wizard/order_technician_wizard.py b/jikimo_system_order/wizard/order_technician_wizard.py new file mode 100644 index 00000000..78458038 --- /dev/null +++ b/jikimo_system_order/wizard/order_technician_wizard.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api +from odoo.addons.jikimo_system_order.models.constant import STATE_SELECTION +import datetime +import logging + + +class OrderTechnicianWizard(models.TransientModel): + _name = 'order.technician.wizard' + + order_id = fields.Many2one('system.work.order', string=u'工单ID', + default=lambda self: self.env.context.get('active_id')) + # 解决人 + solve_people_id = fields.Many2one('res.users', string=u'解决人', default=lambda self: self.env.user) + # 用户实际问题 + users_problem = fields.Text(string=u'用户实际问题') + # 最终解决方案 + solution = fields.Text(string=u'最终解决方案') + # 状态 + state = fields.Selection(STATE_SELECTION, default='processed', string=u'状态') + + def sure(self): + self.order_id.solve_people_id = self.solve_people_id + self.order_id.users_problem = self.users_problem + self.order_id.solution = self.solution + if self.order_id.state == 'pending': + state_remark = u'待处理 --> 已处理待评分' + # self.order_id.message_post(u'操作人:%s,操作时间:%s,状态变更过程:%s' % ( + # self.env.user.name, + # (datetime.datetime.now() + datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S'), state_remark)) + self.order_id.state = self.state + # 获取通知人 + # objs = self.env['system.order.notice'].search([]) + # user_ids = objs.notice_user_ids.filtered(lambda item: item.we_employee_id not in ['', False]) + # we_employee_ids = user_ids.mapped('we_employee_id') + we_employee_ids = [] + if self.order_id.initiator_id.we_employee_id: + we_employee_ids.append(self.order_id.initiator_id.we_employee_id) + print(we_employee_ids) + lost_agent_id = self.env['ir.config_parameter'].sudo().get_param('lost_agent_id') + wechat = self.env['we.config'].sudo().get_wechat(agent_id=lost_agent_id) + # agent_id, user_ids, content + content = """您提交的工单-**工单标题:{0}**-**已处理** + >提交时间:{1} + >处理反馈:{4} + >处理时间:{2} + >处理人:{3} + 如有问题,请联系系统管理员! + """.format(self.order_id.title, + (self.order_id.date + datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M'), (datetime.datetime.now() + datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M'), self.env.user.name or '', self.solution or '') + # wechat.message.send_markdown(agent_id=lost_agent_id, user_ids=we_employee_ids, content=content) + for we_employee_id in we_employee_ids: + try: + wechat.message.send_markdown(agent_id=lost_agent_id, user_ids=we_employee_id, content=content) + except Exception as e: + logging.error('工单处理发送消息异常%s' % str(e)) + + return {} diff --git a/jikimo_system_order/wizard/order_wizard.xml b/jikimo_system_order/wizard/order_wizard.xml new file mode 100644 index 00000000..64c13ccd --- /dev/null +++ b/jikimo_system_order/wizard/order_wizard.xml @@ -0,0 +1,122 @@ + + + + + + 技术员向导 + order.technician.wizard + +
+ + + + + + +
+
+
+
+
+ + + 技术员编辑 + ir.actions.act_window + order.technician.wizard + form + + {'display_default_code':False} + new + + + + + + + 其它向导 + order.other.wizard + +
+ + + + + + +
+
+
+
+
+ + + 其它编辑 + ir.actions.act_window + order.other.wizard + form + + {'display_default_code':False} + new + + + + + 关闭向导 + order.close.wizard + +
+ + + + + + +
+
+
+
+
+ + + 关闭工单 + ir.actions.act_window + order.close.wizard + form + + {'display_default_code':False} + new + + + + system_work_order_wizard_view + system.work.order.wizard + +
+ +
+
+ +
+
+ + + 二次确认 + ir.actions.act_window + system.work.order.wizard + form + new + +
+
diff --git a/jikimo_system_order/wizard/system_work_order_wizard.py b/jikimo_system_order/wizard/system_work_order_wizard.py new file mode 100644 index 00000000..8c8f95dc --- /dev/null +++ b/jikimo_system_order/wizard/system_work_order_wizard.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# @Time : 2017/12/12 9:46 +# @Author : GuoXiang +# @Site : +# @File : system_work_order_wizard.py +# @Software: PyCharm +# @Desc : +# @license : Copyright©2018 www.dasmaster.com All Rights Reserved. +# @Contact : xg1230205321@163.com +from odoo import models, api, fields +from odoo.exceptions import ValidationError + + +class SystemWorkOrderWizard(models.TransientModel): + _name = "system.work.order.wizard" + _description = u"追回确认" + + + def _get_explain(self): + if self._context.get('object_id'): + obj = self.env['system.work.order'].browse(self._context.get('object_id')) + if obj.initiator_id.id != self.env.user.id: + raise ValidationError(u'非本人无法操作') + if self._context.get('explain'): + return self._context["explain"] + + explain = fields.Char(default=_get_explain) + + + def sure(self): + """ + 确认 + :return: + """ + if self._context.get('object_id') and self._context.get('object_name') and self._context.get( + 'explain') and self._context.get('function_name'): + work_sheet_obj = self.env[self._context["object_name"]].search([('id', '=', int(self._context["object_id"]))]) + class_name = self._context.get('object_name') # 获得对象类名 + method_name = self._context.get('function_name') # 获得对象的方法 + obj_function = getattr(self.env[class_name], method_name) + obj_function(work_sheet_obj)