From e1121cc3b51cdcffaaf709f39c8f19bd941a52e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=B0=A7?= Date: Tue, 12 Nov 2024 11:16:42 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BF=AB=E9=80=9F?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=8A=A5=E4=BB=B7=E7=AD=9B=E9=80=89=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__init__.py | 15 ++++ .../__manifest__.py | 1 + .../controllers/main.py | 8 +-- .../models/quick_easy_order.py | 71 +++++++++++++++++++ .../views/sale_order_views.xml | 17 ++--- 5 files changed, 98 insertions(+), 14 deletions(-) create mode 100644 jikimo_sale_multiple_supply_methods/models/quick_easy_order.py diff --git a/jikimo_sale_multiple_supply_methods/__init__.py b/jikimo_sale_multiple_supply_methods/__init__.py index 9cb6cca1..e7a30879 100644 --- a/jikimo_sale_multiple_supply_methods/__init__.py +++ b/jikimo_sale_multiple_supply_methods/__init__.py @@ -121,3 +121,18 @@ def _create_or_update_stock_rule(env, rule_data): # 如果不存在,创建新记录 env['stock.rule'].create(rule_data) +def _data_uninstall(cr, registry): + env = api.Environment(cr, SUPERUSER_ID, {}) + warehouse = env['stock.warehouse'].search([('company_id', '=', env.company.id)], limit=1) + product_route_id = warehouse.pbm_route_id + resupply_route_id = warehouse.subcontracting_route_id + mto_route_id = env.ref('stock.route_warehouse0_mto') + # Fail unlink means that the route is used somewhere (e.g. route_id on stock.rule). In this case + # we don't try to do anything. + try: + with env.cr.savepoint(): + env['stock.rule'].search([('name', 'in', ('WH: 原料存货区 → 制造前', 'WH: 坯料存货区 → 制造前', 'WH: 制造后 → 坯料存货区', 'WH: 制造后 → 成品存货区')), ('route_id', '=', product_route_id.id)]).unlink() + env['stock.rule'].search([('name', 'in', ('WH: 原料存货区 → 外包位置 (MTO)', 'WH: 坯料存货区 → 外包位置 (MTO)')), ('route_id', '=', mto_route_id.id)]).unlink() + env['stock.rule'].search([('name', '=', 'WH: 坯料存货区 → 外包位置'), ('route_id', '=', resupply_route_id.id)]).unlink() + except: + pass \ No newline at end of file diff --git a/jikimo_sale_multiple_supply_methods/__manifest__.py b/jikimo_sale_multiple_supply_methods/__manifest__.py index 78507e37..b39d70a8 100644 --- a/jikimo_sale_multiple_supply_methods/__manifest__.py +++ b/jikimo_sale_multiple_supply_methods/__manifest__.py @@ -19,6 +19,7 @@ # ], }, 'post_init_hook': '_data_install', + 'uninstall_hook': '_data_uninstall', 'application': True, 'installable': True, 'auto_install': False, diff --git a/jikimo_sale_multiple_supply_methods/controllers/main.py b/jikimo_sale_multiple_supply_methods/controllers/main.py index 13113ac0..389c0c3c 100644 --- a/jikimo_sale_multiple_supply_methods/controllers/main.py +++ b/jikimo_sale_multiple_supply_methods/controllers/main.py @@ -27,11 +27,11 @@ class JikimoSaleRoutePicking(Sf_Bf_Connect): kw['delivery_end_date'], kw['payments_way'], kw['pay_way'], state='draft') i = 1 # 给sale_order的default_code字段赋值 - aa = request.env['sale.order'].sudo().search([('name', '=', order_id.name)]) - _logger.info('get_bfm_process_or===================================:%s' % order_id.name) - aa.default_code = kw['order_number'] + # aa = request.env['sale.order'].sudo().search([('name', '=', order_id.name)]) + # _logger.info('get_bfm_process_or===================================:%s' % order_id.name) + order_id.default_code = kw['order_number'] if kw.get('logistics_way'): - aa.logistics_way = kw['logistics_way'] + order_id.logistics_way = kw['logistics_way'] _logger.info('get_bfm_process_order_listaaaaaaaaaaaaaaaaaaaaaaaaaaaa================:%s' % aa.default_code) for item in bfm_process_order_list: product = request.env['product.template'].sudo().product_create(product_id, item, order_id, diff --git a/jikimo_sale_multiple_supply_methods/models/quick_easy_order.py b/jikimo_sale_multiple_supply_methods/models/quick_easy_order.py new file mode 100644 index 00000000..d61d3a6f --- /dev/null +++ b/jikimo_sale_multiple_supply_methods/models/quick_easy_order.py @@ -0,0 +1,71 @@ +from datetime import datetime +from odoo import models + +import logging +import base64 +import hashlib + +_logger = logging.getLogger(__name__) + + +class QuickEasyOrder(models.Model): + _inherit = 'quick.easy.order' + + def distribute_to_factory(self, obj): + """ + 多供货方式,重写派单到工厂 + :return: + """ + try: + _logger.info('---------派单到工厂-------') + res = {'bfm_process_order_list': []} + for item in obj: + attachment = item.upload_model_file[0] + base64_data = base64.b64encode(attachment.datas) + base64_datas = base64_data.decode('utf-8') + barcode = hashlib.sha1(base64_datas.encode('utf-8')).hexdigest() + # logging.info('model_file-size: %s' % len(item.model_file)) + res['bfm_process_order_list'].append({ + 'model_long': item.model_length, + 'model_width': item.model_width, + 'model_height': item.model_height, + 'model_volume': item.model_volume, + 'model_machining_precision': item.machining_precision, + 'model_name': attachment.name, + 'model_data': base64_datas, + 'model_file': base64.b64encode(item.model_file).decode('utf-8'), + 'texture_code': item.material_id.materials_no, + 'texture_type_code': item.material_model_id.materials_no, + # 'surface_process_code': self.env['jikimo.surface.process']._json_surface_process_code(item), + 'process_parameters_code': self.env[ + 'sf.production.process.parameter']._json_production_process_item_code( + item), + 'price': item.price, + 'number': item.quantity, + 'total_amount': item.price, + 'remark': '', + 'manual_quotation': True, + 'barcode': barcode, + 'part_number': item.part_drawing_number, + 'machining_drawings_name': '', + 'quality_standard_name': '', + 'machining_drawings_mimetype': '', + 'quality_standard_mimetype': '', + 'machining_drawings': item.machining_drawings, + 'quality_standard': '', + 'part_name': '', + }) + company_id = self.env.ref('base.main_company').sudo() + product_id = self.env.ref('jikimo_sale_multiple_supply_methods.product_product_default').sudo() + # user_id = request.env.ref('base.user_admin').sudo() + order_id = self.env['sale.order'].sale_order_create(company_id, 'XXXXX', 'XXXXX', 'XXXXX', + str(datetime.now()), '现结', '支付宝', state='draft') + order_id.default_code = obj.name + i = 1 + for item in res['bfm_process_order_list']: + product = self.env['product.template'].sudo().product_create(product_id, item, order_id, + obj.name, i) + order_id.with_user(self.env.ref("base.user_admin")).sale_order_create_line(product, item) + return order_id + except Exception as e: + return UserError('工厂创建销售订单和产品失败,请联系管理员') diff --git a/jikimo_sale_multiple_supply_methods/views/sale_order_views.xml b/jikimo_sale_multiple_supply_methods/views/sale_order_views.xml index 3021f301..58e8f8ae 100644 --- a/jikimo_sale_multiple_supply_methods/views/sale_order_views.xml +++ b/jikimo_sale_multiple_supply_methods/views/sale_order_views.xml @@ -34,13 +34,9 @@ - jikimo.sale.order.search.inherit.quotation - sale.order - primary - - - + + [('state', 'in', ('draft', 'sent')), ('user_id', '=', uid)] @@ -51,8 +47,8 @@ primary - - + + [('state', 'in', ('draft', 'sent')), ('user_id', '=', uid)] @@ -60,7 +56,7 @@ - + @@ -69,6 +65,7 @@ ir.actions.act_window sale.order tree,kanban,form,calendar,pivot,graph,activity + {'search_default_supply_method': 1} @@ -93,7 +90,7 @@ Date: Tue, 12 Nov 2024 14:00:27 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=88=90=E5=93=81?= =?UTF-8?q?=E5=B7=A5=E5=BA=8F=E6=A8=A1=E6=9D=BF=EF=BC=88=E4=BA=BA=E5=B7=A5?= =?UTF-8?q?=E7=BA=BF=E4=B8=8B=E5=8A=A0=E5=B7=A5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/model_type.py | 23 +++++++++++++++++-- sf_manufacturing/security/ir.model.access.csv | 5 ++-- sf_manufacturing/views/model_type_view.xml | 11 +++++++++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/sf_manufacturing/models/model_type.py b/sf_manufacturing/models/model_type.py index 27ebfb03..548b1f73 100644 --- a/sf_manufacturing/models/model_type.py +++ b/sf_manufacturing/models/model_type.py @@ -8,17 +8,20 @@ class ModelType(models.Model): name = fields.Char('名称') embryo_tolerance = fields.Integer('坯料容余') product_routing_tmpl_ids = fields.One2many('sf.product.model.type.routing.sort', 'product_model_type_id', - '成品工序模板') + '成品工序模板(自动化产线加工') embryo_routing_tmpl_ids = fields.One2many('sf.embryo.model.type.routing.sort', 'embryo_model_type_id', '坯料工序模板') surface_technics_routing_tmpl_ids = fields.One2many('sf.surface_technics.model.type.routing.sort', 'surface_technics_model_type_id', '表面工艺工序模板') + manual_product_routing_tmpl_ids = fields.One2many('sf.manual.product.model.type.routing.sort', + 'manual_product_model_type_id', + '成品工序模板(人工线下加工)') class ProductModelTypeRoutingSort(models.Model): _name = 'sf.product.model.type.routing.sort' - _description = '成品工序排序' + _description = '成品工序排序(自动化产线加工)' sequence = fields.Integer('Sequence') route_workcenter_id = fields.Many2one('mrp.routing.workcenter', @@ -65,3 +68,19 @@ class SurfaceTechnicsModelTypeRoutingSort(models.Model): 'route_model_type_uniq', 'unique (route_workcenter_id,surface_technics_model_type_id)', '表面工艺工序不能重复!') ] + +class ManualProductModelTypeRoutingSort(models.Model): + _name = 'sf.manual.product.model.type.routing.sort' + _description = '成品工序排序(人工线下加工)' + + sequence = fields.Integer('Sequence') + route_workcenter_id = fields.Many2one('mrp.routing.workcenter', + domain=[('routing_type', 'in', ['装夹预调', 'CNC加工', '解除装夹'])]) + is_repeat = fields.Boolean('重复', related='route_workcenter_id.is_repeat') + routing_type = fields.Selection(string="工序类型", related='route_workcenter_id.routing_type') + workcenter_ids = fields.Many2many('mrp.workcenter', required=False, related='route_workcenter_id.workcenter_ids') + manual_product_model_type_id = fields.Many2one('sf.model.type') + + _sql_constraints = [ + ('route_model_type_uniq', 'unique (route_workcenter_id,manual_product_model_type_id)', '成品工序不能重复!') + ] \ No newline at end of file diff --git a/sf_manufacturing/security/ir.model.access.csv b/sf_manufacturing/security/ir.model.access.csv index 21386995..693a39a2 100644 --- a/sf_manufacturing/security/ir.model.access.csv +++ b/sf_manufacturing/security/ir.model.access.csv @@ -172,5 +172,6 @@ access_sf_production_technology_wizard_group_plan_dispatch,sf_production_technol access_sf_production_technology_wizard_group_sf_mrp_manager,sf_production_technology_wizard_group_sf_mrp_manager,model_sf_production_technology_wizard,sf_base.group_sf_mrp_manager,1,1,1,0 access_sf_production_technology_wizard_group_production_engineer,sf_production_technology_wizard_group_production_engineer,model_sf_production_technology_wizard,sf_base.group_production_engineer,1,1,1,0 - - +access_sf_manual_product_model_type_routing_sort_group_sf_mrp_user,sf_manual_product_model_type_routing_sort,model_sf_manual_product_model_type_routing_sort,sf_base.group_sf_mrp_user,1,0,0,0 +access_sf_manual_product_model_type_routing_sort_manager,sf_manual_product_model_type_routing_sort,model_sf_manual_product_model_type_routing_sort,sf_base.group_sf_mrp_manager,1,1,1,0 +access_sf_manual_product_model_type_routing_sort_group_plan_dispatch,sf_manual_product_model_type_routing_sort_group_plan_dispatch,model_sf_manual_product_model_type_routing_sort,sf_base.group_plan_dispatch,1,0,0,0 diff --git a/sf_manufacturing/views/model_type_view.xml b/sf_manufacturing/views/model_type_view.xml index 09877a83..56d5f94c 100644 --- a/sf_manufacturing/views/model_type_view.xml +++ b/sf_manufacturing/views/model_type_view.xml @@ -44,6 +44,17 @@ + + + + + + + + + + + From 37538141bf8ab42716b7a00937540b1a081e672f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=B0=A7?= Date: Tue, 12 Nov 2024 14:57:59 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9D=90=E6=96=99?= =?UTF-8?q?=E5=9E=8B=E5=8F=B7=E8=8E=B7=E5=8F=96=E6=96=B9=E5=BC=8F=E5=90=8D?= =?UTF-8?q?=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_base/models/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sf_base/models/common.py b/sf_base/models/common.py index 257eb2d4..9061ffe0 100644 --- a/sf_base/models/common.py +++ b/sf_base/models/common.py @@ -56,7 +56,7 @@ class MrsMaterialModel(models.Model): finish_machining = fields.Float("精加工Vc(m/min)") remark = fields.Text("备注") gain_way = fields.Selection( - [("自加工", "自加工"), ("外协", "外协"), ("采购", "采购")], + [("自加工", "自加工"), ("外协", "委外加工"), ("采购", "采购")], default="", string="获取方式") supplier_ids = fields.One2many('sf.supplier.sort', 'materials_model_id', string='供应商') active = fields.Boolean('有效', default=True) From 205bfd05388be110e963f638a880e59898948c68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=B0=A7?= Date: Tue, 12 Nov 2024 15:19:57 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=BA=E5=B7=A5?= =?UTF-8?q?=E7=BA=BF=E4=B8=8B=E5=8A=A0=E5=B7=A5=E5=B7=A5=E5=BA=8Fdomain?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jikimo_sale_multiple_supply_methods/controllers/main.py | 1 - sf_manufacturing/models/model_type.py | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/jikimo_sale_multiple_supply_methods/controllers/main.py b/jikimo_sale_multiple_supply_methods/controllers/main.py index 389c0c3c..17a8c9a4 100644 --- a/jikimo_sale_multiple_supply_methods/controllers/main.py +++ b/jikimo_sale_multiple_supply_methods/controllers/main.py @@ -32,7 +32,6 @@ class JikimoSaleRoutePicking(Sf_Bf_Connect): order_id.default_code = kw['order_number'] if kw.get('logistics_way'): order_id.logistics_way = kw['logistics_way'] - _logger.info('get_bfm_process_order_listaaaaaaaaaaaaaaaaaaaaaaaaaaaa================:%s' % aa.default_code) for item in bfm_process_order_list: product = request.env['product.template'].sudo().product_create(product_id, item, order_id, kw['order_number'], i) diff --git a/sf_manufacturing/models/model_type.py b/sf_manufacturing/models/model_type.py index 548b1f73..9058e005 100644 --- a/sf_manufacturing/models/model_type.py +++ b/sf_manufacturing/models/model_type.py @@ -74,8 +74,7 @@ class ManualProductModelTypeRoutingSort(models.Model): _description = '成品工序排序(人工线下加工)' sequence = fields.Integer('Sequence') - route_workcenter_id = fields.Many2one('mrp.routing.workcenter', - domain=[('routing_type', 'in', ['装夹预调', 'CNC加工', '解除装夹'])]) + route_workcenter_id = fields.Many2one('mrp.routing.workcenter') is_repeat = fields.Boolean('重复', related='route_workcenter_id.is_repeat') routing_type = fields.Selection(string="工序类型", related='route_workcenter_id.routing_type') workcenter_ids = fields.Many2many('mrp.workcenter', required=False, related='route_workcenter_id.workcenter_ids')