From 69f3453134438a3b1ee408053454aa15a7deedc0 Mon Sep 17 00:00:00 2001
From: guanhuan
Date: Fri, 25 Oct 2024 09:48:57 +0800
Subject: [PATCH 1/5] =?UTF-8?q?=E5=8A=A0=E5=B7=A5=E7=B2=BE=E5=BA=A6?=
=?UTF-8?q?=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_manufacturing/models/product_template.py | 13 +++++++------
sf_sale/models/quick_easy_order_old.py | 13 +++++++------
2 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py
index 6c6b1bf8..a73cd904 100644
--- a/sf_manufacturing/models/product_template.py
+++ b/sf_manufacturing/models/product_template.py
@@ -16,6 +16,12 @@ from OCC.Extend.DataExchange import write_stl_file
class ResProductMo(models.Model):
_inherit = 'product.template'
+ 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
+
model_file = fields.Binary('模型文件')
categ_type = fields.Selection(string='产品的类别', related='categ_id.type', store=True)
model_name = fields.Char('模型名称')
@@ -23,12 +29,7 @@ class ResProductMo(models.Model):
model_width = fields.Float('模型宽(mm)', digits=(16, 3))
model_height = fields.Float('模型高(mm)', digits=(16, 3))
model_volume = fields.Float('模型体积(m³)')
- model_machining_precision = fields.Selection([
- ('0.10', '±0.10mm'),
- ('0.05', '±0.05mm'),
- ('0.03', '±0.03mm'),
- ('0.02', '±0.02mm'),
- ('0.01', '±0.01mm')], string='加工精度')
+ model_machining_precision = fields.Selection(selection=_get_machining_precision, string='加工精度')
model_processing_panel = fields.Char('模型加工面板')
model_remark = fields.Char('模型备注说明')
length = fields.Float('长(mm)', digits=(16, 3))
diff --git a/sf_sale/models/quick_easy_order_old.py b/sf_sale/models/quick_easy_order_old.py
index 4756a2c5..1c62b782 100644
--- a/sf_sale/models/quick_easy_order_old.py
+++ b/sf_sale/models/quick_easy_order_old.py
@@ -20,6 +20,12 @@ class QuickEasyOrder(models.Model):
_description = '简易下单'
_order = 'id desc'
+ 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
+
name = fields.Char('订单编号', default=lambda self: self.env['ir.sequence'].next_by_code('quick.easy.order'))
model_length = fields.Float('长(mm)', digits=(16, 3))
model_width = fields.Float('宽(mm)', digits=(16, 3))
@@ -27,12 +33,7 @@ class QuickEasyOrder(models.Model):
model_volume = fields.Float('体积(mm³)', digits=(16, 3))
model_processing_side = fields.Char('加工面', default='A')
model_feature = fields.Char('特征')
- machining_precision = fields.Selection([
- ('0.10', '±0.10mm'),
- ('0.05', '±0.05mm'),
- ('0.03', '±0.03mm'),
- ('0.02', '±0.02mm'),
- ('0.01', '±0.01mm')], string='加工精度', default='0.10')
+ machining_precision = fields.Selection(selection=_get_machining_precision, string='加工精度')
material_id = fields.Many2one('sf.production.materials', '材料', tracking=True)
material_model_id = fields.Many2one('sf.materials.model', '型号', domain="[('materials_id', '=', material_id)]",
tracking=True)
From 2fe8e0e356f4f45dac79c3c6be80bbf6bf2e021e Mon Sep 17 00:00:00 2001
From: guanhuan
Date: Fri, 25 Oct 2024 11:11:24 +0800
Subject: [PATCH 2/5] =?UTF-8?q?=E5=B7=A5=E5=8D=95=E4=B8=8B=E5=8F=91?=
=?UTF-8?q?=E8=B0=83=E6=95=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_message/models/sf_message_workorder.py | 5 ++--
sf_message/views/mrp_workorder_views.xml | 31 +++++++++++++++++++++++
2 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/sf_message/models/sf_message_workorder.py b/sf_message/models/sf_message_workorder.py
index c531e013..e02f4bdd 100644
--- a/sf_message/models/sf_message_workorder.py
+++ b/sf_message/models/sf_message_workorder.py
@@ -85,11 +85,12 @@ class SFMessageWork(models.Model):
def request_url(self):
url = self.env['ir.config_parameter'].get_param('web.base.url')
- action_id = self.env.ref('sf_message.mrp_workorder_action_notify').id
+ action_id = self.env.ref('sf_message.mrp_workorder_issued_action').id
menu_id = self.env['ir.model.data'].search([('name', '=', 'module_stock_dropshipping')]).id
+ active_id = self.env['mrp.workcenter'].search([('name', '=', '工件装夹中心')]).id
# 查询参数
params = {'menu_id': menu_id, 'action': action_id, 'model': 'mrp.workorder',
- 'view_type': 'list', 'active_id': 1}
+ 'view_type': 'list', 'active_id': active_id}
# 拼接查询参数
query_string = urlencode(params)
# 拼接URL
diff --git a/sf_message/views/mrp_workorder_views.xml b/sf_message/views/mrp_workorder_views.xml
index 1e31fc6d..ab0a76a9 100644
--- a/sf_message/views/mrp_workorder_views.xml
+++ b/sf_message/views/mrp_workorder_views.xml
@@ -30,5 +30,36 @@
+
+
+
+ 工单
+ ir.actions.act_window
+ mrp.workorder
+ tree,form
+
+
+
+ current
+ [('state', '!=', 'cancel'),('schedule_state', '=', '已排')]
+ {'search_default_product': 1, 'search_default_workcenter_id':
+ active_id,'search_default_ready': 1, 'search_default_progress': 1}
+
+
+
+ 没有工单要做!
+
+
+ 工作订单是作为制造订单的一部分执行的操作。
+ 工序在物料清单中定义或直接添加到制造订单中。
+
+
+ 使用工作台工作中心控制面板直接登记车间中的操作.
+ 平板电脑为您的工人提供工作表,并允许他们报废产品,跟踪时间,
+ 发起维护请求,执行质量测试等.
+
+
+
\ No newline at end of file
From b9039ef46606748c32cb33fb16e2d943fe0da61b Mon Sep 17 00:00:00 2001
From: liaodanlong
Date: Fri, 25 Oct 2024 14:01:38 +0800
Subject: [PATCH 3/5] =?UTF-8?q?=E5=88=80=E5=85=B7=E6=A0=87=E5=87=86?=
=?UTF-8?q?=E5=BA=93page=E6=A0=B7=E5=BC=8F=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_base/static/js/customTable.js | 125 ++++++++++++++++++++++
sf_base/static/js/setTableWidth.js | 47 ++++++++
sf_base/static/js/updateTable.js | 159 ++++++++++++++++++++++++++++
sf_base/static/src/scss/change.scss | 52 +++++++++
sf_base/views/tool_views.xml | 6 ++
5 files changed, 389 insertions(+)
create mode 100644 sf_base/static/js/customTable.js
create mode 100644 sf_base/static/js/setTableWidth.js
create mode 100644 sf_base/static/js/updateTable.js
create mode 100644 sf_base/static/src/scss/change.scss
diff --git a/sf_base/static/js/customTable.js b/sf_base/static/js/customTable.js
new file mode 100644
index 00000000..a3da6f4f
--- /dev/null
+++ b/sf_base/static/js/customTable.js
@@ -0,0 +1,125 @@
+// 获取表格数据
+function getDomData() {
+ const dom = $('div[name=cutting_speed_ids]')
+ if (!dom.length) return
+ const table = dom.find('.o_list_table')
+ const thead = table.children('thead')
+ const tbody = table.children('tbody')
+ const tbody_child = tbody.children()
+ const hideTheadDom = thead.find('[data-name=process_capability]')
+ hideTheadDom.hide().next().hide()
+ hideTheadDom.before('精加工 | 粗加工 | ')
+ tbody_child.each(function () {
+ const dom = $(this).children('[name=process_capability]')
+ if(!dom.length) return
+ dom.css('cssText', 'display: none!important').next().css('cssText', 'display: none!important')
+ const isCu = dom.text() == '粗加工' // 是否粗加工
+ const v = dom.next().text() // 切削速度
+ dom.after(`${!isCu ? v : ''} | ${isCu ? v : ''} | `)
+ setListenClick()
+ })
+return;
+ handleTbody(tbody, newTableData, ΦList, table)
+}
+
+// 监听点击
+function setListenClick() {
+ $(document).click(function (e) {
+ if ($(e.target).attr('customSpeed')) {
+ const orginV = $('[customInput=1]').children('input').val()
+ $('[customInput=1]').parent().html(orginV)
+ const v = $(e.target).attr('val')
+ const is = $(e.target).attr('is')
+ $(e.target).html('')
+ const input = $('')
+ input.children('input').val(v)
+ $(e.target).append(input)
+ input.children('input').focus()
+ input.children('input').select()
+ } else if ($(e.target).attr('customInput')) {
+
+ } else {
+ const orginV = $('[customInput=1]').children('input').val()
+ $('[customInput=1]').parent().html(orginV)
+ const v = $(e.target).attr('val')
+ }
+ })
+ $(document).off('change') // 防止重复绑定
+ $(document).on('change', '[customInput] input', async function () {
+ $(this).parents('td').attr('val', $(this).val())
+ $(this).parents('td').siblings('[customspeed]').attr('val', $(this).val())
+ var eve1 = new Event('change')
+ var eve2 = new Event('input')
+ var eve3 = new Event('click')
+ let patchSpeedDom = $(this).parents('td').siblings('[name=cutting_speed]')
+ let patchProcessDom = $(this).parents('td').siblings('[name=process_capability]')
+ $(this).parents('td').siblings('[customspeed]').text('') // 清空其他加工类型的数据
+ await timeOut(500)
+ patchProcessDom[0].dispatchEvent(eve3)
+ await timeOut(200)
+ const processVal = $(this).parent().attr('is')
+ patchProcessDom.find('select').val(`"${processVal}"`) // 设置源select的val为“加工类型 is”、
+ patchProcessDom.attr("data-tooltip", `${processVal}`)
+ patchProcessDom.find('select')[0].dispatchEvent(eve1)
+
+ patchSpeedDom[0].dispatchEvent(eve3)
+ await timeOut(200)
+ patchSpeedDom.find('input').val($(this).val())
+ await timeOut(50)
+ patchSpeedDom.find('input')[0].dispatchEvent(eve2)
+ patchSpeedDom.find('input')[0].dispatchEvent(eve1)
+ })
+ $(document).off('blur') // 防止重复绑定
+ $(document).on('blur', '[customInput] input', async function () {
+ if(!$(this).length) return
+
+ $(this).parents('td').siblings('[customspeed]').text('') // 清空其他加工类型的数据
+ let patchProcessDom = $(this).parents('td').siblings('[name=process_capability]')
+ try {
+ patchProcessDom[0].dispatchEvent(new Event('click'))
+ const processVal = $(this).parent().attr('is')
+ patchProcessDom.find('select').val(`"${processVal}"`) // 设置源select的val为“加工类型 is”、
+ patchProcessDom.attr("data-tooltip", `${processVal}`)
+ patchProcessDom.find('select')[0].dispatchEvent(new Event('change'))
+ } catch {
+
+ }
+
+ })
+}
+function timeOut(time) {
+ return new Promise(resolve => {
+ setTimeout(() => {
+ resolve()
+ }, time)
+ })
+}
+
+function listenAdd() {
+ $('td.o_field_x2many_list_row_add a').click(async function () {
+ await timeOut(500)
+ const tr = $('.o_list_table').children('tbody').children('tr').eq(-2)
+ if(tr.children('td').eq(2).text() == '') {
+ const dom = tr.children('[name=process_capability]')
+ if(!dom.length) return
+ dom.css('cssText', 'display: none!important').next().css('cssText', 'display: none!important')
+ const isCu = dom.text() == '粗加工' // 是否粗加工
+ const v = dom.next().text() // 切削速度
+ dom.after(`${!isCu ? v : ''} | ${isCu ? v : ''} | `)
+ }
+ })
+}
+
+function listenSave() {
+ $('.o_form_button_save').click( async function () {
+ await timeOut(1000)
+ if($(this).parent().next().length) return
+ $('th[customTh],td[cusomSpeed]').remove()
+ getDomData()
+
+ })
+}
+
+listenAdd()
+listenSave()
+getDomData()
diff --git a/sf_base/static/js/setTableWidth.js b/sf_base/static/js/setTableWidth.js
new file mode 100644
index 00000000..571d46cf
--- /dev/null
+++ b/sf_base/static/js/setTableWidth.js
@@ -0,0 +1,47 @@
+// 因为表格可以拖动设置宽度,所以需要用js设置初始宽度
+function setBasicParamTableWidth() {
+ // const _100px = 'th[data-name="cutting_blade_length"],th[data-name="cutting_blade_length"],th[data-name="name"],th[data-name="tip_handling_size"],th[data-name="cutting_depth_max"],th[data-name="diameter_inner_circle"],th[data-name="diameter_mounting_hole" ],th[data-name="radius_tip_re" ],th[data-name="is_chip_breaker"],th[data-name="chip_breaker_type_code"],th[data-name="blade_profile"]'
+ // const _65px = 'th[data-name="edge_angle"],th[data-name="relief_angle"],[data-name="total_length"],th[data-name="length"],th[data-name="thickness"],th[data-name="blade_number"]'
+ // const _80px = 'th[data-name="arbor_diameter"],th[data-name="head_height"],th[data-name="head_width"],th[data-name="head_length"],th[data-name="blade_diameter"],th[data-name="blade_length"] ,th[data-name="neck_length"] ,th[data-name="neck_diameter"] ,th[data-name="shank_diameter"],th[data-name="shank_length"],th[data-name="tip_diameter"],th[data-name="knife_tip_taper"],th[data-name="blade_helix_angle"] ,th[data-name="blade_width"],th[data-name="blade_depth"]'
+ // const _50px = 'th[data-name="pitch"],th[data-name="width"],th[data-name="height"]'
+
+ const basicParamDom = $('.fixTableCss')
+ // const basicParamDom_100px = basicParamDom.find(_100px) // 四字以上
+ // const basicParamDom_65px = basicParamDom.find(_65px) // 大概三个字加单位
+ // const basicParamDom_80px = basicParamDom.find(_80px) // 大概四个字加单位
+ // const basicParamDom_50px= basicParamDom.find(_50px) // 大概两个字加单位
+ //
+ // basicParamDom_100px.css({'width': '100px', 'max-width': 'auto', ',min-width': 'auto'})
+ // basicParamDom_65px.css({'width': '65px', 'max-width': 'auto', ',min-width': 'auto'})
+ // basicParamDom_80px.css({'width': '80px', 'max-width': 'auto', ',min-width': 'auto'})
+ // basicParamDom_50px.css({'width': '50px', 'max-width': 'auto', ',min-width': 'auto'})
+ let dom = []
+ try {
+ dom = basicParamDom.find('table').find('thead').children().children()
+
+ } catch {
+ dom = []
+ }
+ if (!dom) return
+ dom.each(function () {
+ if ($(this).hasClass('row_no') >= 0) { // 序号列
+ // 不设置 通过css设置
+ }
+ const text = $(this).text().split('(')
+ if ($(this).attr('data-name') == 'name' || text[0].length > 4) {
+ $(this).width('100px')
+ } else if(text[0].length == 4){
+ $(this).width('80px')
+ } else if(text[0].length == 3){
+ $(this).width('65px')
+ } else if(text[0].length == 2){
+ $(this).width('50px')
+ }
+
+ })
+}
+
+setBasicParamTableWidth()
+$('.o_field_many2one_selection').on('click', $('#cutting_tool_material_id + ul'), function () {
+ setTimeout(setBasicParamTableWidth, 500)
+})
diff --git a/sf_base/static/js/updateTable.js b/sf_base/static/js/updateTable.js
new file mode 100644
index 00000000..beec2c94
--- /dev/null
+++ b/sf_base/static/js/updateTable.js
@@ -0,0 +1,159 @@
+// 获取表格数据
+function getDomData() {
+ const dom = $('#updateTable').prev()
+ if (!dom.length) return
+ const table = $('#updateTable').prev().find('.o_list_table')
+ const customTable = table.clone()
+ customTable.addClass('customTable')
+ table.parent().append(customTable)
+ table.hide()
+ const thead = customTable.children('thead')
+ const tbody = customTable.children('tbody')
+ const tableData = []
+ const tbody_child = tbody.children()
+
+ const tbody_child_len = tbody_child.length
+
+ for (let v = 0; v < tbody_child_len; v++) { // 将数据取出来到tableData里面
+ const data = tbody_child[v].innerText.split('\t')
+ // console.log('dom data',data)
+ const [index, deep, name, Φ, value] = data
+ tableData.push({index, deep, name, Φ, value})
+ }
+ const ΦList = [...new Set(tableData.map(_ => _.name))] // ΦList去重
+ const newTableData = {}
+ tableData.forEach(_ => {
+ const key = _.deep + '|' + _.Φ
+ !newTableData[key] ? newTableData[key] = {i: _.index} : '';
+ if (_.Φ) { // 去除没有Φ的脏数据
+ newTableData[key]['Φ' + _.Φ] = _.value
+ newTableData[key]['Φ' + _.Φ + 'i'] = _.index
+ }
+ })
+ // console.log('qwdh',tableData, ΦList, newTableData);
+
+ if (ΦList.filter(_ => _).length == 0) return;
+ handleThead(thead, ΦList)
+
+ handleTbody(tbody, newTableData, ΦList, table)
+}
+
+// 重新设置表头、
+function handleThead(thead, ΦList) {
+ const dom = thead.children().eq(0).children()
+ const len = dom.length
+ dom.eq(0).attr('rowspan', 2)
+ dom.eq(1).attr('rowspan', 2)
+ len == 5 ? dom.eq(2).attr('rowspan', 2) : ''
+ dom.eq(-2).attr('colspan', ΦList.length)
+ dom.eq(-1).remove()
+
+ const tr = document.createElement('tr')
+ for (let v = 0; v < ΦList.length; v++) {
+ const th = document.createElement('th')
+ th.innerText = 'Φ' + ΦList[v]
+ tr.append(th)
+ }
+ thead.append(tr)
+}
+
+// 重新设置表格
+function handleTbody(tbody, newTableData, ΦList, table) {
+ console.log(newTableData)
+ tbody.html('')
+ let i = 0
+ const data = Object.keys(newTableData)
+ // data.sort((a, b) => {
+ // a = a.split('=')[1].split('%')[0]
+ // b = b.split('=')[1].split('%')[0]
+ // return a - b
+ // })
+ // console.log('wqoqw ',ΦList)
+ data.forEach(_ => {
+ i++
+ const tr = $('
')
+ const td0 = $(' | ')
+ td0.text(i)
+ tr.append(td0)
+ const lit = _.split('|')
+ //
+ const td1 = $(' | ')
+ const td2 = $(' | ')
+ td1.text(lit[0])
+ td2.text(lit[1] || '')
+ tr.append(td1)
+ tr.append(td2)
+ ΦList.forEach(Φ => {
+ const td = $(' | ')
+ td.text(newTableData[_]['Φ' + Φ])
+ td.attr('col', newTableData[_]['Φ' + Φ + 'i'])
+ td.attr('val', newTableData[_]['Φ' + Φ])
+ td.attr('coustomTd', 1)
+ tr.append(td)
+ })
+ // // for (let j = 0; j < ΦList.length; j++) {
+ // // const td = document.createElement('td')
+ // // td.innerText = newTableData[data[v]][_]
+ // // th.append(td)
+ // // }
+ tbody.append(tr)
+ })
+ // $(document).click(function (e) {
+ // if ($(e.target).attr('coustomTd')) {
+ // const orginV = $('[coustomInput=1]').children('input').val()
+ // $('[coustomInput=1]').parent().html(orginV)
+ // const v = $(e.target).attr('val')
+ // console.log($(e.target));
+ // $(e.target).html('')
+ // const input = $('')
+ // input.children('input').val(v)
+ // $(e.target).append(input)
+ // input.children('input').focus()
+ // input.children('input').select()
+ // } else if ($(e.target).attr('coustomInput')) {
+ //
+ // } else {
+ // const orginV = $('[coustomInput=1]').children('input').val()
+ // $('[coustomInput=1]').parent().html(orginV)
+ // const v = $(e.target).attr('val')
+ // }
+ // })
+ // $(document).off('change') // 防止重复绑定
+// $(document).on('change', '[coustomInput] input', function () {
+// $(this).parents('td').attr('val', $(this).val());
+// var eve1 = new Event('change');
+// var eve2 = new Event('input');
+// var eve3 = new Event('click');
+// const i = $(this).parents('td').attr('col');
+// let patchDom = table.find('tbody').children('tr').eq(i - 1);
+//
+// if (patchDom.length === 0) {
+// console.error('No such row found');
+// return;
+// }
+//
+// patchDom = patchDom.children().eq(-1);
+//
+// setTimeout(() => {
+// if (patchDom.length === 0) {
+// console.error('No such cell found');
+// return;
+// }
+// patchDom[0].dispatchEvent(eve3); // Simulate click event
+//
+// setTimeout(() => {
+// patchDom = patchDom.find('input');
+// if (patchDom.length === 0) {
+// console.error('No input found in the target cell');
+// return;
+// }
+// patchDom.val($(this).val());
+// patchDom[0].dispatchEvent(eve2);
+// patchDom[0].dispatchEvent(eve1);
+// }, 200);
+// }, 500);
+// });
+
+}
+
+getDomData()
\ No newline at end of file
diff --git a/sf_base/static/src/scss/change.scss b/sf_base/static/src/scss/change.scss
new file mode 100644
index 00000000..6102b815
--- /dev/null
+++ b/sf_base/static/src/scss/change.scss
@@ -0,0 +1,52 @@
+.o_list_renderer .o_list_table tbody > tr > td:not(.o_list_record_selector):not(.o_handle_cell):not(.o_list_button):not(.o_list_record_remove) {
+ white-space: nowrap !important;
+}
+
+.text-truncate {
+ overflow: unset !important;
+ text-overflow: unset !important;
+ white-space: unset !important;
+}
+
+
+// 设置表格不超出页面宽度
+.o_form_view .o_field_widget .o_list_renderer {
+ width: calc(100% - 64px) !important;
+ margin:0 auto;
+ overflow: auto;
+}
+
+// 表格针对处理
+.fixTableCss {
+ text-align: center;
+ .o_list_number_th,.o_list_number {
+ text-align: center!important;
+ }
+ .ui-sortable {
+ tr > td:first-child {
+ padding: 0!important;
+ }
+ }
+ .row_no {
+ padding: 0!important;;
+ width: 35px!important;
+ }
+
+ th[data-name="total_length"],th[data-name="length"],th[data-name="thickness"] {
+ .flex-row-reverse {
+ span {
+ text-align: center;
+ }
+ }
+ }
+}
+
+// 其他不能用js处理的表格
+.otherTableFix {
+ th[data-name="cutting_tool_material_id"] {
+ width: 100px!important;
+ }
+ th[data-name="ramping_angle_max"],th[data-name="ramping_angle_min"] {
+ width: 200px!important;
+ }
+}
\ No newline at end of file
diff --git a/sf_base/views/tool_views.xml b/sf_base/views/tool_views.xml
index 6b97f0ec..b2d53392 100644
--- a/sf_base/views/tool_views.xml
+++ b/sf_base/views/tool_views.xml
@@ -360,6 +360,7 @@
+
@@ -380,6 +381,9 @@
+
+
+
@@ -392,6 +396,8 @@
+
+
From 06eaebd0982f2b833faefdcd5caebee6068f3957 Mon Sep 17 00:00:00 2001
From: liaodanlong
Date: Fri, 25 Oct 2024 14:02:37 +0800
Subject: [PATCH 4/5] =?UTF-8?q?=E4=BA=A7=E5=93=81=E7=B1=BB=E5=88=AB?=
=?UTF-8?q?=E8=BF=87=E6=BB=A4=E7=BC=BA=E9=99=B7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
quality_control/models/product_category.py | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/quality_control/models/product_category.py b/quality_control/models/product_category.py
index 9b5535d4..17f26006 100644
--- a/quality_control/models/product_category.py
+++ b/quality_control/models/product_category.py
@@ -21,4 +21,12 @@ class ProductCategory(models.Model):
args += [('name', 'not in', ['Saleable', 'Expenses', 'Deliveries'])]
# 调用父类的 name_search 方法
- return super(ProductCategory, self).name_search(name, args=args, operator=operator, limit=limit)
\ No newline at end of file
+ return super(ProductCategory, self).name_search(name, args=args, operator=operator, limit=limit)
+
+ @api.model
+ def search(self, args, limit=100, offset=0, order=None, count=False):
+ # 添加过滤条件,确保只返回名称不在指定列表中的记录
+ args += [('name', 'not in', ['Saleable', 'Expenses', 'Deliveries'])]
+
+ # 调用父类的 search 方法
+ return super(ProductCategory, self).search(args, limit=limit, offset=offset, order=order, count=count)
\ No newline at end of file
From 906a0ea7678c71a547222d3e1f24984ed18d54d9 Mon Sep 17 00:00:00 2001
From: liaodanlong
Date: Fri, 25 Oct 2024 14:25:47 +0800
Subject: [PATCH 5/5] =?UTF-8?q?=E9=87=87=E8=B4=AD=E6=8C=89=E9=92=AE?=
=?UTF-8?q?=E4=BD=8D=E7=BD=AE=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_sale/views/purchase_order_view.xml | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/sf_sale/views/purchase_order_view.xml b/sf_sale/views/purchase_order_view.xml
index 7a9836c5..f721d515 100644
--- a/sf_sale/views/purchase_order_view.xml
+++ b/sf_sale/views/purchase_order_view.xml
@@ -6,14 +6,20 @@
purchase.order
-
+
+ 1
+
-
+
+
1