diff --git a/sf_hr/__manifest__.py b/sf_hr/__manifest__.py index c0bd63ef..b3e21ab3 100644 --- a/sf_hr/__manifest__.py +++ b/sf_hr/__manifest__.py @@ -7,10 +7,11 @@ 'sequence': 1, 'category': 'sf', 'website': 'https://www.sf.jikimo.com', - 'depends': ['hr'], + 'depends': ['base', 'hr'], 'data': [ 'views/hr_employee.xml', 'views/res_config_settings_views.xml', + 'views/res_users_view.xml', 'data/cron_data.xml', ], 'demo': [ diff --git a/sf_hr/models/__init__.py b/sf_hr/models/__init__.py index ffe76391..9744f0cc 100644 --- a/sf_hr/models/__init__.py +++ b/sf_hr/models/__init__.py @@ -2,3 +2,4 @@ from . import hr_employee from . import res_config_setting +from . import res_users diff --git a/sf_hr/models/hr_employee.py b/sf_hr/models/hr_employee.py index 8cf5595d..e9826f29 100644 --- a/sf_hr/models/hr_employee.py +++ b/sf_hr/models/hr_employee.py @@ -20,7 +20,9 @@ class JkmPracticeEmployee(models.Model): if result['employee_list']: for employee_info in result['employee_list']: if employee_info['work_email']: - self.sudo().search([('work_email', '=', employee_info['work_email'])]).write( - {'we_id': employee_info['we_id']}) + hr_employee = self.sudo().search([('work_email', '=', employee_info['work_email'])]) + hr_employee.write({'we_id': employee_info['we_id']}) + if hr_employee.user_id: + hr_employee.user_id.write({'we_employee_id': employee_info['we_id']}) else: logging.info('_employee_info_sync error:%s' % result['message']) diff --git a/sf_hr/models/res_users.py b/sf_hr/models/res_users.py new file mode 100644 index 00000000..392c297a --- /dev/null +++ b/sf_hr/models/res_users.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api + +import logging + +_logger = logging.getLogger(__name__) + + +class ResUsers(models.Model): + _inherit = 'res.users' + + we_employee_id = fields.Char(string=u'企业微信账号', default="") diff --git a/sf_hr/views/res_users_view.xml b/sf_hr/views/res_users_view.xml new file mode 100644 index 00000000..c65d8e46 --- /dev/null +++ b/sf_hr/views/res_users_view.xml @@ -0,0 +1,20 @@ + + + + + res.users.account.form + res.users + + + + + + + + + + + + + + diff --git a/sf_message/__manifest__.py b/sf_message/__manifest__.py index cdfef4bd..0f032a6d 100644 --- a/sf_message/__manifest__.py +++ b/sf_message/__manifest__.py @@ -11,7 +11,7 @@ """, 'category': 'sf', 'website': 'https://www.sf.jikimo.com', - 'depends': ['sale', 'purchase', 'sf_plan', 'jikimo_message_notify'], + 'depends': ['sale', 'purchase', 'sf_plan', 'jikimo_message_notify','stock'], 'data': [ 'data/bussiness_node.xml' ], diff --git a/sf_message/data/bussiness_node.xml b/sf_message/data/bussiness_node.xml index eeb7cbe7..76f3fcb7 100644 --- a/sf_message/data/bussiness_node.xml +++ b/sf_message/data/bussiness_node.xml @@ -10,5 +10,21 @@ 确认接单 sale.order + + 调拨入库 + stock.picking + + + 功能刀具组装 + sf.functional.tool.assembly + + + 功能刀具寿命到期 + sf.functional.tool.dismantle + + + 坯料采购提醒 + purchase.order + \ No newline at end of file diff --git a/sf_message/models/__init__.py b/sf_message/models/__init__.py index b0c058fc..e84a0acd 100644 --- a/sf_message/models/__init__.py +++ b/sf_message/models/__init__.py @@ -6,3 +6,4 @@ from . import sf_message_cam_program from . import sf_message_functional_tool_assembly from . import sf_message_purchase from . import sf_message_workorder +from . import sf_message_functional_tool_dismantle \ No newline at end of file diff --git a/sf_message/models/sf_message_functional_tool_assembly.py b/sf_message/models/sf_message_functional_tool_assembly.py index 251af2cc..d4e05fc0 100644 --- a/sf_message/models/sf_message_functional_tool_assembly.py +++ b/sf_message/models/sf_message_functional_tool_assembly.py @@ -3,4 +3,16 @@ from odoo import models, fields, api, _ class SFMessagefunctionalToolAssembly(models.Model): _name = 'sf.functional.tool.assembly' + _description = "刀具组装单" _inherit = ['sf.functional.tool.assembly', 'jikimo.message.dispatch'] + + @api.model_create_multi + def create(self, vals): + result = super(SFMessagefunctionalToolAssembly, self).create(vals) + is_cam = False + for obj in result: + if obj.loading_task_source == '0' and obj.assemble_status == '0': + is_cam = True + if is_cam: + self.add_queue('功能刀具组装') + return result diff --git a/sf_message/models/sf_message_functional_tool_dismantle.py b/sf_message/models/sf_message_functional_tool_dismantle.py new file mode 100644 index 00000000..dac3db28 --- /dev/null +++ b/sf_message/models/sf_message_functional_tool_dismantle.py @@ -0,0 +1,18 @@ +from odoo import models, api + + +class SFMessagefunctionalToolDismantle(models.Model): + _name = 'sf.functional.tool.dismantle' + _description = "刀具拆解单" + _inherit = ['sf.functional.tool.dismantle', 'jikimo.message.dispatch'] + + @api.model + def create(self, vals): + result = super(SFMessagefunctionalToolDismantle, self).create(vals) + is_dismantle = False + for obj in result: + if obj.dismantle_cause in ['寿命到期报废', '崩刀报废']and obj.state=='待拆解': + is_dismantle = True + if is_dismantle: + self.add_queue('功能刀具寿命到期') + return result diff --git a/sf_message/models/sf_message_purchase.py b/sf_message/models/sf_message_purchase.py index 073a7814..e9fe3956 100644 --- a/sf_message/models/sf_message_purchase.py +++ b/sf_message/models/sf_message_purchase.py @@ -1,6 +1,17 @@ +import logging from odoo import models, fields, api, _ class SFMessagePurchase(models.Model): _name = 'purchase.order' _inherit = ['purchase.order', 'jikimo.message.dispatch'] + + @api.model_create_multi + def create(self, vals_list): + res = super(SFMessagePurchase, self).create(vals_list) + if res: + try: + res.add_queue('坯料采购提醒') + except Exception as e: + logging.info('add_queue error:%s' % e) + return res diff --git a/sf_message/models/sf_message_stock_picking.py b/sf_message/models/sf_message_stock_picking.py index b090549e..d66008f9 100644 --- a/sf_message/models/sf_message_stock_picking.py +++ b/sf_message/models/sf_message_stock_picking.py @@ -3,4 +3,11 @@ from odoo import models, fields, api, _ class SFMessageStockPicking(models.Model): _name = 'stock.picking' + _description = "库存调拨" _inherit = ['stock.picking', 'jikimo.message.dispatch'] + + def button_validate(self): + res = super(SFMessageStockPicking, self).button_validate() + if self.location_id.name == '进货' and self.location_dest_id.name == '刀具房': + self.add_queue('调拨入库') + return res diff --git a/sf_message/models/sf_message_template.py b/sf_message/models/sf_message_template.py index 7380fbe6..957b0f58 100644 --- a/sf_message/models/sf_message_template.py +++ b/sf_message/models/sf_message_template.py @@ -9,4 +9,8 @@ class SfMessageTemplate(models.Model): def _get_message_model(self): res = super(SfMessageTemplate, self)._get_message_model() res.append("sale.order") + res.append("stock.picking") + res.append('sf.functional.tool.assembly') + res.append('sf.functional.tool.dismantle') + res.append('purchase.order') return res diff --git a/sf_plan/static/description/计划.png b/sf_plan/static/description/计划.png new file mode 100644 index 00000000..e4efa9f9 Binary files /dev/null and b/sf_plan/static/description/计划.png differ diff --git a/sf_plan/views/view.xml b/sf_plan/views/view.xml index 82382ef3..bfb584b8 100644 --- a/sf_plan/views/view.xml +++ b/sf_plan/views/view.xml @@ -278,6 +278,7 @@ sequence="150" action="sf_production_plan_action" groups="sf_base.group_plan_dispatch" + web_icon="sf_plan,static/description/计划.png" /> diff --git a/sf_stock/models/stock_picking.py b/sf_stock/models/stock_picking.py index 3a64f78c..a429db36 100644 --- a/sf_stock/models/stock_picking.py +++ b/sf_stock/models/stock_picking.py @@ -74,6 +74,8 @@ class StockPicking(models.Model): def send_to_bfm(self): skip_backorder = self.env.context.get('skip_backorder') + cancel_backorder_ids = self.env.context.get('picking_ids_not_to_backorder') + # 下发发货到bfm config = self.env['res.config.settings'].get_values() move_ids, move_line_ids = self.deal_move_ids(self.move_ids, self.move_line_ids) @@ -92,13 +94,13 @@ class StockPicking(models.Model): 'state': self.state, 'backorder_id': self.deal_send_backorder_id(self.backorder_id), 'backorder_ids': self.deal_send_backorder_id(self.backorder_ids), - 'cancel_backorder_ids': skip_backorder, + 'cancel_backorder_ids': True if skip_backorder and cancel_backorder_ids else False, # 没有欠单判断 'move_type': self.move_type, }, } url1 = config['bfm_url_new'] + '/api/stock/deliver_goods' json_str = json.dumps(data) - print('json_str', json_str) + logging.info('json_str= %s', json_str) r = requests.post(url1, json=data, data=None) if r.status_code == 200: result = json.loads(r.json()['result']) diff --git a/sf_tool_management/models/jikimo_bom.py b/sf_tool_management/models/jikimo_bom.py index 62138d77..b5caf495 100644 --- a/sf_tool_management/models/jikimo_bom.py +++ b/sf_tool_management/models/jikimo_bom.py @@ -89,7 +89,7 @@ class jikimo_bom(models.Model): ('cutting_tool_blade_diameter', '=', self.tool_inventory_id.diameter), # r角 - ('cutting_tool_blade_tip_working_size', '=', self.tool_inventory_id.angle)] + ('cutting_tool_blade_tip_r_size', '=', self.tool_inventory_id.angle)] if option.name == '刀杆': domain = ['&'] + domain + [ ("cutting_tool_cutter_arbor_diameter", "=", self.tool_inventory_id.diameter)]