需求计划供货方式修改

This commit is contained in:
guanhuan
2025-07-03 14:33:19 +08:00
parent 0350f78710
commit 3822d78f35
5 changed files with 81 additions and 39 deletions

View File

@@ -40,7 +40,8 @@ class ReSaleOrder(models.Model):
'sale_order_line_id': ret.id, 'sale_order_line_id': ret.id,
} }
demand_plan_info = self.env['sf.demand.plan'].sudo().create(vals) demand_plan_info = self.env['sf.demand.plan'].sudo().create(vals)
vals.update({'demand_plan_id': demand_plan_info.id, 'plan_uom_qty': ret.product_uom_qty}) vals.update({'demand_plan_id': demand_plan_info.id, 'plan_uom_qty': ret.product_uom_qty,
'new_supply_method': 'custom_made', 'custom_made_type': 'manual'})
demand_plan = self.env['sf.production.demand.plan'].sudo().create(vals) demand_plan = self.env['sf.production.demand.plan'].sudo().create(vals)
demand_plan_info.write({'line_ids': demand_plan.ids}) demand_plan_info.write({'line_ids': demand_plan.ids})
if demand_plan.product_id.machining_drawings_name: if demand_plan.product_id.machining_drawings_name:

View File

@@ -9,11 +9,6 @@ class SfDemandPlan(models.Model):
_name = 'sf.demand.plan' _name = 'sf.demand.plan'
_description = 'sf_demand_plan' _description = 'sf_demand_plan'
def _get_machining_precision(self):
machinings = self.env['sf.machining.accuracy'].sudo().search([])
list = [(m.sync_id, m.name) for m in machinings]
return list
state = fields.Selection([ state = fields.Selection([
('10', '需求确认'), ('10', '需求确认'),
('20', '待工艺设计'), ('20', '待工艺设计'),
@@ -64,9 +59,7 @@ class SfDemandPlan(models.Model):
compute='_compute_model_process_parameters_ids' compute='_compute_model_process_parameters_ids'
, store=True , store=True
) )
model_machining_precision = fields.Selection(selection=_get_machining_precision, string='精度', model_machining_precision = fields.Selection(related='product_id.model_machining_precision', string='精度')
related='product_id.model_machining_precision')
inventory_quantity_auto_apply = fields.Float( inventory_quantity_auto_apply = fields.Float(
string="成品库存", string="成品库存",
compute='_compute_inventory_quantity_auto_apply', store=True compute='_compute_inventory_quantity_auto_apply', store=True
@@ -85,6 +78,12 @@ class SfDemandPlan(models.Model):
default=False default=False
) )
readonly_custom_made_type = fields.Boolean(
string='字段自制类型只读',
compute='_compute_readonly_custom_made_type',
default=False
)
@api.depends('product_id.part_number', 'product_id.model_name') @api.depends('product_id.part_number', 'product_id.model_name')
def _compute_part_number(self): def _compute_part_number(self):
for line in self: for line in self:
@@ -181,17 +180,18 @@ class SfDemandPlan(models.Model):
else: else:
line.state = '10' line.state = '10'
@api.depends('line_ids.status')
def _compute_readonly_custom_made_type(self):
for line in self:
production_demand_plan = line.line_ids.filtered(
lambda p: p.status in ('50', '60') and p.new_supply_method == 'custom_made')
line.readonly_custom_made_type = bool(production_demand_plan)
def write(self, vals): def write(self, vals):
res = super(SfDemandPlan, self).write(vals) res = super(SfDemandPlan, self).write(vals)
line_ids = self.line_ids.filtered(lambda p: p.plan_uom_qty == 0 or p.plan_uom_qty < 0) line_ids = self.line_ids.filtered(lambda p: p.plan_uom_qty == 0 or p.plan_uom_qty < 0)
if line_ids: if line_ids:
raise ValidationError(f"计划量不能小于等于0") raise ValidationError(f"计划量不能小于等于0")
if 'line_ids' in vals:
for line in self.line_ids:
if not line.sale_order_id:
line.sale_order_id = self.sale_order_id
if not line.sale_order_line_id:
line.sale_order_line_id = self.sale_order_line_id
return res return res
def name_get(self): def name_get(self):

View File

@@ -17,17 +17,7 @@ class SfProductionDemandPlan(models.Model):
stock_location = self.env['stock.location'].sudo().search([('name', '=', '客户')], limit=1) stock_location = self.env['stock.location'].sudo().search([('name', '=', '客户')], limit=1)
return stock_location.id return stock_location.id
def _get_machining_precision(self): priority = fields.Selection(related='demand_plan_id.priority', string='优先级')
machinings = self.env['sf.machining.accuracy'].sudo().search([])
list = [(m.sync_id, m.name) for m in machinings]
return list
priority = fields.Selection([
('1', '紧急'),
('2', ''),
('3', ''),
('4', ''),
], string='优先级', related='demand_plan_id.priority')
status = fields.Selection([ status = fields.Selection([
('10', '草稿'), ('10', '草稿'),
('20', '待确认'), ('20', '待确认'),
@@ -38,9 +28,9 @@ class SfProductionDemandPlan(models.Model):
], string='状态', default='30', readonly=True) ], string='状态', default='30', readonly=True)
demand_plan_id = fields.Many2one(comodel_name="sf.demand.plan", demand_plan_id = fields.Many2one(comodel_name="sf.demand.plan",
string="物料需求", readonly=True) string="物料需求", readonly=True)
sale_order_id = fields.Many2one(comodel_name="sale.order", sale_order_id = fields.Many2one(comodel_name="sale.order", related='demand_plan_id.sale_order_id',
string="销售订单", readonly=True) string="销售订单", readonly=True)
sale_order_line_id = fields.Many2one(comodel_name="sale.order.line", sale_order_line_id = fields.Many2one(comodel_name="sale.order.line", related='demand_plan_id.sale_order_line_id',
string="销售订单明细", readonly=True) string="销售订单明细", readonly=True)
sale_order_line_number = fields.Char(string='销售订单行', compute='_compute_sale_order_line_number', store=True) sale_order_line_number = fields.Char(string='销售订单行', compute='_compute_sale_order_line_number', store=True)
company_id = fields.Many2one( company_id = fields.Many2one(
@@ -58,12 +48,24 @@ class SfProductionDemandPlan(models.Model):
part_name = fields.Char('零件名称', related='product_id.part_name') part_name = fields.Char('零件名称', related='product_id.part_name')
part_number = fields.Char('零件图号', related='demand_plan_id.part_number') part_number = fields.Char('零件图号', related='demand_plan_id.part_number')
is_incoming_material = fields.Boolean('客供料', related='sale_order_line_id.is_incoming_material', store=True) is_incoming_material = fields.Boolean('客供料', related='sale_order_line_id.is_incoming_material', store=True)
new_supply_method = fields.Selection([
('custom_made', "自制"),
('purchase', "外购"),
('outsourcing', "委外加工"),
], string='供货方式', readonly=True)
custom_made_type = fields.Selection([
('automation', "自动化产线加工"),
('manual', "人工线下加工"),
], string='自制类型', compute='_compute_custom_made_type', store=True)
supply_method = fields.Selection([ supply_method = fields.Selection([
('automation', "自动化产线加工"), ('automation', "自动化产线加工"),
('manual', "人工线下加工"), ('manual', "人工线下加工"),
('purchase', "外购"), ('purchase', "外购"),
('outsourcing', "委外加工"), ('outsourcing', "委外加工"),
], string='供货方式', default='manual') ], string='供货方式', compute='_compute_supply_method', store=True, readonly=True)
product_uom_qty = fields.Float( product_uom_qty = fields.Float(
string="需求数量", string="需求数量",
related='sale_order_line_id.product_uom_qty', store=True) related='sale_order_line_id.product_uom_qty', store=True)
@@ -79,11 +81,11 @@ class SfProductionDemandPlan(models.Model):
model_long = fields.Char('尺寸(mm)', compute='_compute_model_long') model_long = fields.Char('尺寸(mm)', compute='_compute_model_long')
blank_type = fields.Selection([('圆料', '圆料'), ('方料', '方料')], string='坯料分类', blank_type = fields.Selection([('圆料', '圆料'), ('方料', '方料')], string='坯料分类',
related='product_id.blank_type') related='product_id.blank_type')
blank_precision = fields.Selection([('精坯', '精坯'), ('粗坯', '粗坯')], string='坯料类型', related='product_id.blank_precision') blank_precision = fields.Selection([('精坯', '精坯'), ('粗坯', '粗坯')], string='坯料类型',
related='product_id.blank_precision')
embryo_long = fields.Char('坯料尺寸(mm)', related='demand_plan_id.embryo_long') embryo_long = fields.Char('坯料尺寸(mm)', related='demand_plan_id.embryo_long')
materials_id = fields.Char('材料', related='demand_plan_id.materials_id') materials_id = fields.Char('材料', related='demand_plan_id.materials_id')
model_machining_precision = fields.Selection(selection=_get_machining_precision, string='精度', model_machining_precision = fields.Selection(related='product_id.model_machining_precision', string='精度')
related='product_id.model_machining_precision')
model_process_parameters_ids = fields.Many2many(related='demand_plan_id.model_process_parameters_ids', model_process_parameters_ids = fields.Many2many(related='demand_plan_id.model_process_parameters_ids',
string='表面工艺', ) string='表面工艺', )
product_remark = fields.Char("产品备注", related='product_id.model_remark') product_remark = fields.Char("产品备注", related='product_id.model_remark')
@@ -121,6 +123,11 @@ class SfProductionDemandPlan(models.Model):
default=False default=False
) )
readonly_custom_made_type = fields.Boolean(
related='demand_plan_id.readonly_custom_made_type',
string='字段自制类型只读'
)
# hide_action_open_mrp_production = fields.Boolean( # hide_action_open_mrp_production = fields.Boolean(
# string='显示待工艺确认按钮', # string='显示待工艺确认按钮',
# compute='_compute_hid_button', # compute='_compute_hid_button',
@@ -165,6 +172,30 @@ class SfProductionDemandPlan(models.Model):
bom_id = fields.Many2one('mrp.bom', string="BOM", readonly=True) bom_id = fields.Many2one('mrp.bom', string="BOM", readonly=True)
location_id = fields.Many2one('stock.location', string='需求位置', default=get_location_id, readonly=True) location_id = fields.Many2one('stock.location', string='需求位置', default=get_location_id, readonly=True)
@api.depends('new_supply_method')
def _compute_custom_made_type(self):
DemandPlan = self.env['sf.production.demand.plan'].sudo()
for line in self:
if line.new_supply_method != "custom_made":
line.custom_made_type = False
else:
demand_plan_id = line.demand_plan_id._origin.id
demand_plan = DemandPlan.search([
('demand_plan_id', '=', demand_plan_id),
('new_supply_method', '=', 'custom_made'),
('status', 'in', ('50', '60'))
], limit=1)
if demand_plan:
line.custom_made_type = demand_plan.custom_made_type
@api.depends('new_supply_method', 'custom_made_type')
def _compute_supply_method(self):
for line in self:
if line.new_supply_method == 'custom_made':
line.supply_method = line.custom_made_type
else:
line.supply_method = line.new_supply_method
@api.depends('supply_method') @api.depends('supply_method')
def _compute_route_ids(self): def _compute_route_ids(self):
for pdp in self: for pdp in self:
@@ -549,7 +580,7 @@ class SfProductionDemandPlan(models.Model):
def button_release_plan(self): def button_release_plan(self):
self.ensure_one() self.ensure_one()
if not self.supply_method: if not self.new_supply_method:
raise ValidationError(f"供货方式不能为空!") raise ValidationError(f"供货方式不能为空!")
if self.plan_uom_qty > self.product_uom_qty: if self.plan_uom_qty > self.product_uom_qty:
return { return {

View File

@@ -4,7 +4,7 @@
<field name="model">sf.production.demand.plan</field> <field name="model">sf.production.demand.plan</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree string="需求计划" default_order="sequence desc,id desc" editable="bottom" <tree string="需求计划" default_order="sequence desc,id desc" editable="bottom"
class="demand_plan_tree freeze-columns-before-part_number" create="false" delete="false"> class="demand_plan_tree freeze-columns-before-part_number" create="false" delete="false">
<header> <header>
<button string="打印" name="button_action_print" type="object" <button string="打印" name="button_action_print" type="object"
class="btn-primary"/> class="btn-primary"/>
@@ -20,7 +20,11 @@
<field name="part_name"/> <field name="part_name"/>
<field name="part_number"/> <field name="part_number"/>
<field name="is_incoming_material"/> <field name="is_incoming_material"/>
<field name="supply_method" attrs="{'readonly': [('status', '!=', '30')]}"/> <field name="new_supply_method" attrs="{'readonly': [('status', '!=', '30')]}"/>
<field name="readonly_custom_made_type" invisible="1"/>
<field name="custom_made_type"
attrs="{'readonly': ['|',('status', '!=', '30'),('readonly_custom_made_type', '=', True)],
'required': [('new_supply_method', '=', 'custom_made')]}"/>
<field name="product_uom_qty"/> <field name="product_uom_qty"/>
<field name="deadline_of_delivery"/> <field name="deadline_of_delivery"/>
<field name="inventory_quantity_auto_apply"/> <field name="inventory_quantity_auto_apply"/>

View File

@@ -6,8 +6,8 @@
<form> <form>
<header> <header>
<field name="hide_button_release_plan" invisible="1"/> <field name="hide_button_release_plan" invisible="1"/>
<!-- <button string="下达计划" name="button_release_plan" type="object"--> <!-- <button string="下达计划" name="button_release_plan" type="object"-->
<!-- class="btn-primary" attrs="{'invisible': [('hide_button_release_plan', '=', False)]}"/>--> <!-- class="btn-primary" attrs="{'invisible': [('hide_button_release_plan', '=', False)]}"/>-->
<field name="state" widget="statusbar"/> <field name="state" widget="statusbar"/>
</header> </header>
<sheet> <sheet>
@@ -41,11 +41,17 @@
<field name="line_ids" attrs="{'readonly': [('state', 'in', ('40','50'))]}"> <field name="line_ids" attrs="{'readonly': [('state', 'in', ('40','50'))]}">
<tree editable="bottom" delete="false"> <tree editable="bottom" delete="false">
<field name="status"/> <field name="status"/>
<field name="supply_method" attrs="{'readonly': [('status', '!=', '30')]}"/> <field name="readonly_custom_made_type" invisible="1"/>
<field name="new_supply_method" attrs="{'readonly': [('status', '!=', '30')]}"/>
<field name="custom_made_type"
attrs="{
'readonly': ['|', '|', ('new_supply_method', '!=', 'custom_made'), ('status', '!=', '30'), ('readonly_custom_made_type', '=', True)],
'required': [('new_supply_method', '=', 'custom_made')]}"/>
<field name="supply_method"/>
<field name="route_ids" widget="many2many_tags" optional="hide"/> <field name="route_ids" widget="many2many_tags" optional="hide"/>
<field name="location_id" optional="hide"/> <field name="location_id" optional="hide"/>
<field name="bom_id" optional="hide"/> <field name="bom_id" optional="hide"/>
<field name="plan_uom_qty"/> <field name="plan_uom_qty" attrs="{'readonly': [('status', '!=', '30')]}"/>
<field name="blank_arrival_date"/> <field name="blank_arrival_date"/>
<field name="finished_product_arrival_date"/> <field name="finished_product_arrival_date"/>
<field name="planned_start_date"/> <field name="planned_start_date"/>