diff --git a/jikimo_sale_multiple_supply_methods/__init__.py b/jikimo_sale_multiple_supply_methods/__init__.py index 9cb6cca1..62b89387 100644 --- a/jikimo_sale_multiple_supply_methods/__init__.py +++ b/jikimo_sale_multiple_supply_methods/__init__.py @@ -7,11 +7,16 @@ from odoo import api, SUPERUSER_ID def _data_install(cr, registry): env = api.Environment(cr, SUPERUSER_ID, {}) # 获取所有需要设置的产品模板 - env.ref('jikimo_sale_multiple_supply_methods.product_product_purchase').product_tmpl_id.write({'active': False}) - env.ref('jikimo_sale_multiple_supply_methods.product_product_manual_processing').product_tmpl_id.write({'active': False, 'single_manufacturing': True}) - env.ref('jikimo_sale_multiple_supply_methods.product_product_default').product_tmpl_id.write({'active': False}) - env.ref('jikimo_sale_multiple_supply_methods.product_product_raw_material_customer_provided').product_tmpl_id.write({'active': False}) - env.ref('jikimo_sale_multiple_supply_methods.product_product_outsourcing').product_tmpl_id.write({'active': False}) + env.ref('jikimo_sale_multiple_supply_methods.product_template_purchase').product_variant_id.write({'active': False, 'is_bfm': True}) + env.ref('jikimo_sale_multiple_supply_methods.product_template_manual_processing').product_variant_id.write({'active': False, 'single_manufacturing': True, 'is_bfm': True}) + env.ref('jikimo_sale_multiple_supply_methods.product_template_default').product_variant_id.write({'active': False, 'is_bfm': True}) + env.ref('jikimo_sale_multiple_supply_methods.product_template_raw_material_customer_provided').product_variant_id.write({'active': False}) + env.ref('jikimo_sale_multiple_supply_methods.product_template_outsourcing').product_variant_id.write({'active': False, 'is_bfm': True}) + env.ref('sf_dlm.product_embryo_sf_self_machining').product_tmpl_id.write({'categ_type': '坯料'}) + env.ref('sf_dlm.product_template_sf').product_tmpl_id.write({'categ_type': '成品'}) + env.ref('sf_dlm.product_embryo_sf_outsource').product_tmpl_id.write({'categ_type': '坯料'}) + env.ref('sf_dlm.product_embryo_sf_purchase').product_tmpl_id.write({'categ_type': '坯料'}) + # 为三步制造增加规则 warehouse = env['stock.warehouse'].search([('company_id', '=', env.company.id)], limit=1) product_route_id = warehouse.pbm_route_id @@ -121,3 +126,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..a7d39ac7 100644 --- a/jikimo_sale_multiple_supply_methods/__manifest__.py +++ b/jikimo_sale_multiple_supply_methods/__manifest__.py @@ -6,7 +6,7 @@ 'author': 'fox', 'website': '', 'category': '', - 'depends': ['product', 'sf_dlm', 'sale_stock', 'sf_sale'], + 'depends': ['sf_dlm', 'sale_stock', 'sf_sale'], "data": [ 'security/ir.model.access.csv', 'data/stock_routes.xml', @@ -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..9127f80e 100644 --- a/jikimo_sale_multiple_supply_methods/controllers/main.py +++ b/jikimo_sale_multiple_supply_methods/controllers/main.py @@ -19,7 +19,8 @@ class JikimoSaleRoutePicking(Sf_Bf_Connect): res = {'status': 1, 'factory_order_no': ''} # _logger.info('get_bfm_process_order_list:%s' % kw['order_number']) try: - product_id = request.env.ref('jikimo_sale_multiple_supply_methods.product_product_default').sudo() + product_id = request.env.ref('jikimo_sale_multiple_supply_methods.product_template_default').with_context(active_test=False).sudo().product_variant_id + _logger.info('product_id:%s' % product_id) company_id = request.env.ref('base.main_company').sudo() bfm_process_order_list = json.loads(kw['bfm_process_order_list']) order_id = request.env['sale.order'].with_user(request.env.ref("base.user_admin")).sale_order_create( @@ -27,12 +28,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'] - _logger.info('get_bfm_process_order_listaaaaaaaaaaaaaaaaaaaaaaaaaaaa================:%s' % aa.default_code) + order_id.logistics_way = kw['logistics_way'] 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/jikimo_sale_multiple_supply_methods/data/product_data.xml b/jikimo_sale_multiple_supply_methods/data/product_data.xml index 40c8ca63..dc9b70a7 100644 --- a/jikimo_sale_multiple_supply_methods/data/product_data.xml +++ b/jikimo_sale_multiple_supply_methods/data/product_data.xml @@ -1,7 +1,7 @@ - + 人工线下加工模板 @@ -15,11 +15,11 @@ true serial - true + true - + 成品外购模板 @@ -30,10 +30,10 @@ - true + - + 成品委外加工模板 @@ -44,10 +44,10 @@ - true + - + 成品初始化模板 @@ -57,7 +57,7 @@ - true + @@ -65,7 +65,7 @@ - + 坯料客供料模板 @@ -79,12 +79,20 @@ + - - 坯料加工模板(人工线下加工) + true + + + + + + + + \ No newline at end of file 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..89d3a6d8 --- /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_template_default').sudo().with_context(active_test=False).product_variant_id + # 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/models/sale_order.py b/jikimo_sale_multiple_supply_methods/models/sale_order.py index 822958ec..cd8fa749 100644 --- a/jikimo_sale_multiple_supply_methods/models/sale_order.py +++ b/jikimo_sale_multiple_supply_methods/models/sale_order.py @@ -21,25 +21,28 @@ class SaleOrder(models.Model): self.state = 'supply method' def action_confirm(self): + # 判断是否所有产品都选择了供货方式 + filter_line = self.order_line.filtered(lambda line: not line.supply_method) + if filter_line: + raise UserError('当前订单内(%s)产品未选择路线,请选择后重试' % ','.join(filter_line.mapped('product_id.name'))) + for line in self.order_line: - if not line.supply_method: - raise UserError('请先选择供货方式') bom_type = '' # 根据供货方式修改成品模板 if line.supply_method == 'automation': bom_type = 'normal' - product_template_id = self.env.ref('sf_dlm.product_template_sf').sudo() + product_template_id = self.env.ref('sf_dlm.product_template_sf').sudo().product_tmpl_id elif line.supply_method == 'outsourcing': bom_type = 'subcontract' - product_template_id = self.env.ref('jikimo_sale_multiple_supply_methods.product_product_outsourcing').sudo() + product_template_id = self.env.ref('jikimo_sale_multiple_supply_methods.product_template_outsourcing').sudo() elif line.supply_method == 'purchase': - product_template_id = self.env.ref('jikimo_sale_multiple_supply_methods.product_product_purchase').sudo() + product_template_id = self.env.ref('jikimo_sale_multiple_supply_methods.product_template_purchase').sudo() elif line.supply_method == 'manual': bom_type = 'normal' - product_template_id = self.env.ref('jikimo_sale_multiple_supply_methods.product_product_manual_processing').sudo() + product_template_id = self.env.ref('jikimo_sale_multiple_supply_methods.product_template_manual_processing').sudo() # 复制成品模板上的属性 - line.product_id.product_tmpl_id.copy_template(product_template_id.product_tmpl_id) + line.product_id.product_tmpl_id.copy_template(product_template_id) order_id = self product = line.product_id @@ -52,6 +55,8 @@ class SaleOrder(models.Model): 'model_height': product.height, 'price': product.list_price, } + # 获取成品名结尾-n的n + product_seria = int(product.name.split('-')[-1]) # 成品供货方式为采购则不生成bom if line.supply_method != 'purchase': bom_data = self.env['mrp.bom'].with_user(self.env.ref("base.user_admin")).get_bom(product) @@ -63,12 +68,12 @@ class SaleOrder(models.Model): # 当成品上带有客供料选项时,生成坯料时选择“客供料”路线 if line.is_incoming_material: # 将成品模板的内容复制到成品上 - customer_provided_embryo = self.env.ref('jikimo_sale_multiple_supply_methods.product_product_raw_material_customer_provided').sudo() + customer_provided_embryo = self.env.ref('jikimo_sale_multiple_supply_methods.product_tempalte_raw_material_customer_provided').sudo() # 创建坯料,客供料的批量不需要创建bom material_customer_provided_embryo = self.env['product.template'].sudo().no_bom_product_create( - customer_provided_embryo, + customer_provided_embryo.with_context(active_test=False).product_variant_id, item, - order_id, 'material_customer_provided', 0, product) + order_id, 'material_customer_provided', product_seria, product) # 成品配置bom product_bom_material_customer_provided = self.env['mrp.bom'].with_user( self.env.ref("base.user_admin")).bom_create( @@ -81,7 +86,7 @@ class SaleOrder(models.Model): self_machining_embryo = self.env['product.template'].sudo().no_bom_product_create( self_machining_id, item, - order_id, 'self_machining', 0, product) + order_id, 'self_machining', product_seria, product) # 创建坯料的bom self_machining_bom = self.env['mrp.bom'].with_user( self.env.ref("base.user_admin")).bom_create( @@ -105,7 +110,7 @@ class SaleOrder(models.Model): item, order_id, 'subcontract', - 0, product) + product_seria, product) if outsource_embryo == -3: raise UserError('该订单模型的材料型号暂未设置获取方式和供应商,请先配置再进行分配') # 创建坯料的bom @@ -127,7 +132,7 @@ class SaleOrder(models.Model): purchase_embryo = self.env['product.template'].sudo().no_bom_product_create(purchase_id, item, order_id, - 'purchase', 0, + 'purchase', product_seria, product) if purchase_embryo == -3: raise 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..2ea9a835 100644 --- a/jikimo_sale_multiple_supply_methods/views/sale_order_views.xml +++ b/jikimo_sale_multiple_supply_methods/views/sale_order_views.xml @@ -22,7 +22,7 @@ confirm_to_supply_method -