Accept Merge Request #1305: (feature/tax_sync -> develop)

Merge Request: 功能刀具清单 bom添加查询排序与清单明细行删除校验

Created By: @廖丹龙
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @廖丹龙
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/1305?initial=true
This commit is contained in:
廖丹龙
2024-09-14 14:30:59 +08:00
committed by Coding
5 changed files with 44 additions and 24 deletions

View File

@@ -1,3 +1,4 @@
import traceback
from datetime import datetime from datetime import datetime
import logging import logging
import requests import requests
@@ -53,11 +54,14 @@ class StatusChange(models.Model):
if not ret.get('error'): if not ret.get('error'):
logging.info('接口已经执行=============') logging.info('接口已经执行=============')
else: else:
logging.error('工厂加工同步订单状态失败 {}'.format(ret)) traceback_error = traceback.format_exc()
raise UserError('工厂加工同步订单状态失败') logging.error("bfm订单状态同步失败:%s request info %s" % traceback_error)
logging.error('/api/get/state/get_order 请求失败{}'.format(ret))
raise UserError('工厂加工同步订单状态到bfm失败')
except UserError as e: except UserError as e:
logging.error('工厂加工同步订单状态失败 {}'.format(e)) traceback_error = traceback.format_exc()
raise UserError('工厂加工同步订单状态失败') logging.error("工厂加工同步订单状态失败:%s " % traceback_error)
raise UserError(e)
return res return res
def action_cancel(self): def action_cancel(self):

View File

@@ -318,6 +318,8 @@ class MrpProduction(models.Model):
# cnc程序获取 # cnc程序获取
def fetchCNC(self, production_names): def fetchCNC(self, production_names):
cnc = self.env['mrp.production'].search([('id', '=', self.id)]) cnc = self.env['mrp.production'].search([('id', '=', self.id)])
quick_order = False
if cnc.product_id.default_code:
quick_order = self.env['quick.easy.order'].search( quick_order = self.env['quick.easy.order'].search(
[('name', '=', cnc.product_id.default_code.rsplit('-', 1)[0])]) [('name', '=', cnc.product_id.default_code.rsplit('-', 1)[0])])
programme_way = False programme_way = False

View File

@@ -30,9 +30,23 @@ class jikimo_bom(models.Model):
return result return result
def check_types_in_list(self): def check_types_in_list(self):
# 统计每个元素的类型 """
检查产品列表中的元素是否包含了所有指定的类型,并且每种类型至少出现一次。
:return: 如果条件满足返回True否则返回False
"""
if not self.product_ids:
return False
try:
# 统计每个类型的出现次数
type_counts = Counter(item.cutting_tool_material_id.name for item in self.product_ids) type_counts = Counter(item.cutting_tool_material_id.name for item in self.product_ids)
return all(count > 0 for count in type_counts.values()) and len(type_counts) == self.options.split('+')
# 检查是否每种类型的出现次数都大于0并且类型的数量与选项字符串中的数量相等
return all(count > 0 for count in type_counts.values()) and len(type_counts) == len(self.options.split('+'))
except AttributeError:
# 如果出现属性错误,说明产品列表中的元素可能缺少必要的属性
return False
# type_counts = Counter(item.cutting_tool_material_id.name for item in self.product_ids)
# return all(count > 0 for count in type_counts.values()) and len(type_counts) == self.options.split('+')
def write(self, vals): def write(self, vals):
# 在更新模型时记录旧的 Many2many ID 列表 # 在更新模型时记录旧的 Many2many ID 列表
@@ -47,9 +61,15 @@ class jikimo_bom(models.Model):
return True return True
else: else:
raise UserError('每种物料最少要有一个') raise UserError('每种物料最少要有一个')
return True
return super(jikimo_bom, self).write(vals) return super(jikimo_bom, self).write(vals)
def bom_product_domains(self, assembly_options): def bom_product_domains(self, assembly_options):
"""
根据装配选项生成产品域列表
:param assembly_options: 装配选项字符串,各选项以'+'分隔
:return: 动态生成的产品搜索条件
"""
self.options = assembly_options self.options = assembly_options
cutting_tool_materials = self.env['sf.cutting.tool.material'].search( cutting_tool_materials = self.env['sf.cutting.tool.material'].search(
[('name', 'in', assembly_options.split('+'))]) [('name', 'in', assembly_options.split('+'))])
@@ -82,23 +102,22 @@ class jikimo_bom(models.Model):
domains = domains + domain domains = domains + domain
if index != 0: if index != 0:
domains = ['|'] + domains domains = ['|'] + domains
# wqwqwe = self.env['product.product'].search(ddd)
# product = self.env['product.product'].search(domain)
# if product:
# products = products + product
domains = domains + [('stock_move_count', '>', 0)] domains = domains + [('stock_move_count', '>', 0)]
return domains return domains
def generate_bill_materials(self, assembly_options): def generate_bill_materials(self, assembly_options):
"""
生成物料清单
根据装配选项生成物料清单首先获取产品领域然后搜索相关产品并设置产品ID。
:param assembly_options: 组装方式
:type assembly_options: 装配选项字符串,各选项以'+'分隔
"""
domains = self.bom_product_domains(assembly_options) domains = self.bom_product_domains(assembly_options)
products = self.env['product.product'].search(domains) products = self.env['product.product'].search(domains)
if products: if products:
self.product_ids = [Command.set(products.ids)] self.product_ids = [Command.set(products.ids)]
# if option.name == '刀盘':
# hilt = self.env['product.product'].search(
# [('cutting_tool_blade_diameter', '=', self.tool_inventory_id.diameter),
# ('cutting_tool_material_id', '=', option.id)])
# self.product_ids = [Command.set(hilt.ids)]k
class jikimo_bom_line(models.Model): class jikimo_bom_line(models.Model):

View File

@@ -14,10 +14,7 @@ class ToolInventory(models.Model):
self._bom_mainfest() self._bom_mainfest()
return self.bom_mainfest() return self.bom_mainfest()
request.session['jikimo_bom_product'] = {'bom_id': int(self.jikimo_bom_ids)} request.session['jikimo_bom_product'] = {'bom_id': int(self.jikimo_bom_ids)}
# context = dict(self.env.context)
# context.update({'jikimo_bom_product': self.jikimo_bom_ids.options})
# if self.functional_cutting_tool_model_id.cutting_tool_type_ids:
# context.update({'jikimo_bom_product_cutting_tool_type': self.functional_cutting_tool_model_id.cutting_tool_type_ids.ids})
return { return {
'type': 'ir.actions.act_window', 'type': 'ir.actions.act_window',
'name': '刀具组装清单', 'name': '刀具组装清单',
@@ -26,7 +23,6 @@ class ToolInventory(models.Model):
'view_id': self.env.ref('sf_tool_management.view_jikimo_bom_form').id, 'view_id': self.env.ref('sf_tool_management.view_jikimo_bom_form').id,
'res_id': int(self.jikimo_bom_ids), 'res_id': int(self.jikimo_bom_ids),
'target': 'current', # Use 'new' to open in a new window/tab 'target': 'current', # Use 'new' to open in a new window/tab
# {'jikimo_bom_product': self.jikimo_bom_ids.options}
} }
# 创建bom单 # 创建bom单

View File

@@ -15,7 +15,6 @@ class JikimoBomWizard(models.TransientModel):
('刀柄+刀杆+刀片', '刀柄+刀杆+刀片'), ('刀柄+刀杆+刀片', '刀柄+刀杆+刀片'),
('刀柄+刀盘+刀片', '刀柄+刀盘+刀片') ('刀柄+刀盘+刀片', '刀柄+刀盘+刀片')
], string='组装方式', required=True) ], string='组装方式', required=True)
# assembly_options_ids = fields.Many2many('sf.cutting.tool.material', string="组装方式")
is_ok = fields.Boolean('确认上述信息正确无误。') is_ok = fields.Boolean('确认上述信息正确无误。')
def submit(self): def submit(self):