diff --git a/jikimo_frontend/__manifest__.py b/jikimo_frontend/__manifest__.py index d9885897..65438849 100644 --- a/jikimo_frontend/__manifest__.py +++ b/jikimo_frontend/__manifest__.py @@ -32,8 +32,8 @@ 'jikimo_frontend/static/src/scss/rowno_in_tree.scss', # 'jikimo_frontend/static/src/views/list_nums/list_render.xml', 'jikimo_frontend/static/src/list/list_up_down_button.xml', - 'jikimo_frontend/static/src/list/custom_import.js', - 'jikimo_frontend/static/src/list/custom_width.js', + # 'jikimo_frontend/static/src/list/custom_import.js', + # 'jikimo_frontend/static/src/list/custom_width.js', 'jikimo_frontend/static/src/views/list_nums/extent_purchase.xml', ], diff --git a/jikimo_frontend/static/src/scss/custom_style.scss b/jikimo_frontend/static/src/scss/custom_style.scss index c01ca6c9..35416444 100644 --- a/jikimo_frontend/static/src/scss/custom_style.scss +++ b/jikimo_frontend/static/src/scss/custom_style.scss @@ -205,8 +205,8 @@ div[class="o_content o_component_with_search_panel"] img[name="equipment_image"] div[class="o_content o_component_with_search_panel"] .o_kanban_card_content button { position: absolute; - top: -52px; - left: -55px; + //top: -52px; + //left: -55px; width: 80px; } @@ -253,11 +253,11 @@ div[class="o_content o_component_with_search_panel"] .show_state span { font-size: 12px; } -div[class="o_content o_component_with_search_panel"] .o_kanban_primary_right > .row { - position: absolute; - top: 55px; - right: 43.5%; -} +//div[class="o_content o_component_with_search_panel"] .o_kanban_primary_right > .row { +// position: absolute; +// top: 55px; +// right: 43.5%; +//} //------------------------------------------ .test_model > .o_form_label { @@ -270,10 +270,10 @@ div[class="o_content o_component_with_search_panel"] .o_kanban_primary_right > . right: 52%; } - div[class="o_content o_component_with_search_panel"] .o_kanban_card_content button { - - left: -95px; - } + //div[class="o_content o_component_with_search_panel"] .o_kanban_card_content button { + // + // left: -95px; + //} } @@ -354,3 +354,25 @@ div:has(.o_required_modifier) > label::before { } +// 2023-11-16 hy 新增 +.o_kanban_card_content .btn-group { + position: unset; +} + +.o_kanban_card_content .btn-group button{ + top: 100px; + left: 168px; +} + + +.o_kanban_primary_right { + position: absolute; + top: 40px; + left: 168px; + padding: 0; + .row { + >div { + width: unset; + } + } +} \ No newline at end of file diff --git a/sf_base/models/base.py b/sf_base/models/base.py index 066e84e1..29e37630 100644 --- a/sf_base/models/base.py +++ b/sf_base/models/base.py @@ -39,7 +39,7 @@ class MachineBrand(models.Model): remark = fields.Text('备注') active = fields.Boolean('有效', default=True) - + # 机床 class MachineTool(models.Model): _name = 'sf.machine_tool' @@ -86,7 +86,7 @@ class MachineTool(models.Model): state = fields.Selection( [("正常", "正常"), ("故障", "故障"), ("不可用", "不可用")], default='正常', string="机床状态") - #0606新增字段 + # 0606新增字段 machine_tool_picture = fields.Binary('图片') heightened_way = fields.Selection([ ('sifudianji', '伺服电机驱动'), @@ -260,7 +260,7 @@ class MachineToolType(models.Model): default="", string="刀把类型") number_of_knife_library = fields.Integer('刀库数量') rotate_speed = fields.Integer('转速') - #0606新增字段 + # 0606新增字段 created_user = fields.Many2one('res.users', string='创建人', default=lambda self: self.env.user) machine_tool_picture = fields.Binary('图片') heightened_way = fields.Selection([ @@ -326,5 +326,4 @@ class MachineToolCategory(models.Model): remark = fields.Text('备注') active = fields.Boolean('有效', default=True) category = fields.Selection([('shukong', u'数控'), ('putong', u'普通')], string=u'机床类别', - default='shukong') - + default='shukong') diff --git a/sf_base/models/tool_other_features.py b/sf_base/models/tool_other_features.py index 7bb94711..84846c29 100644 --- a/sf_base/models/tool_other_features.py +++ b/sf_base/models/tool_other_features.py @@ -340,7 +340,7 @@ class FeedPerTooth(models.Model): cutting_speed = fields.Char('径向切宽 ae(mm)') machining_method = fields.Selection([('直铣', '直铣'), ('坡铣', '坡铣')], string='加工方式') materials_type_id = fields.Many2one('sf.materials.model', string='材料型号') - blade_diameter = fields.Char('刃部直径(mm)', readonly=True) + blade_diameter = fields.Integer('刃部直径(mm)', readonly=True) feed_per_tooth = fields.Char('每齿走刀量 (mm/z)') def _json_feed_per_tooth(self, obj): diff --git a/sf_bf_connect/models/jd_eclp.py b/sf_bf_connect/models/jd_eclp.py index 030d3da2..6f6b4ab6 100644 --- a/sf_bf_connect/models/jd_eclp.py +++ b/sf_bf_connect/models/jd_eclp.py @@ -1,8 +1,8 @@ -#import cpca -import logging +# import cpca import base64 -import requests +import logging from datetime import datetime +import requests from odoo.exceptions import UserError from odoo.exceptions import ValidationError from odoo import api, fields, models, SUPERUSER_ID, _ @@ -37,7 +37,7 @@ class JdEclp(models.Model): deliveryType = fields.Selection([('6', '特快零担'), ('25', '特快重货')], string='运输类型', default='25') # bill = fields.Char(string='物流面单') - # bill = fields.Many2one('ir.attachment', string='物流面单', compute='query_bill_pdf') + # bill = fields.Many2one('ir.attachment', string='物流面单', compute='query_bill_pdf') # bill_show = fields.Binary(string='物流面单展示', readonly=True, related='self.bill.datas') bill_show = fields.Binary(string='物流面单展示', readonly=True) @@ -48,10 +48,11 @@ class JdEclp(models.Model): @api.depends('origin') def _truck_info(self): # if 'S' in self.origin: - # if self.receiverName and self.receiverMobile and self.receiverProvinceName and self.receiverCityName and self.receiverCountyName and self.receiverTownName: + # if self.receiverName and self.receiverMobile and self.receiverProvinceName and self.receiverCityName and + # self.receiverCountyName and self.receiverTownName: sale_order_id = self.env['sale.order'].search([('name', '=', self.origin)]) - # stock_picking_type_id = self.enc['stock.picking.type'].search([('picking_type_id', '=', '')]) - # if sale_order_id.address_of_delivery != False: + # stock_picking_type_id = self.enc['stock.picking.type'].search([('picking_type_id', '=', '')]) + # if sale_order_id.address_of_delivery != False: try: if 'OUT' in self.name: raw_addres = sale_order_id.address_of_delivery.split('这是一个标志位,用来不分隔字符串') @@ -78,8 +79,6 @@ class JdEclp(models.Model): print(f"Error address is none: {e}") pass - - def create_order(self): # sale_order_id = self.env['sale.order'].search([('name', '=', self.origin)]) diff --git a/sf_bf_connect/models/process_status.py b/sf_bf_connect/models/process_status.py index 0a18096b..069ef2d4 100644 --- a/sf_bf_connect/models/process_status.py +++ b/sf_bf_connect/models/process_status.py @@ -1,10 +1,10 @@ -from odoo import api, fields, models, SUPERUSER_ID, _ -from odoo.exceptions import ValidationError -from collections import defaultdict, namedtuple from datetime import datetime import logging -from odoo.exceptions import UserError import requests +from odoo import api, fields, models, SUPERUSER_ID, _ +from odoo.exceptions import UserError +from odoo.exceptions import ValidationError +from collections import defaultdict, namedtuple _logger = logging.getLogger(__name__) @@ -105,7 +105,6 @@ class StatusChange(models.Model): # # return True - # def action_cancel(self): # """ Cancel SO after showing the cancel wizard when needed. (cfr `_show_cancel_wizard`) # @@ -205,12 +204,12 @@ class FinishStatusChange(models.Model): [('id', 'child_of', self.picking_type_id.warehouse_id.view_location_id.id), ('usage', '!=', 'supplier')]) if self.env['stock.move'].search([ - ('state', 'in', ['confirmed', 'partially_available', 'waiting', 'assigned']), - ('product_qty', '>', 0), - ('location_id', 'in', wh_location_ids), - ('move_orig_ids', '=', False), - ('picking_id', 'not in', self.ids), - ('product_id', 'in', lines.product_id.ids)], limit=1): + ('state', 'in', ['confirmed', 'partially_available', 'waiting', 'assigned']), + ('product_qty', '>', 0), + ('location_id', 'in', wh_location_ids), + ('move_orig_ids', '=', False), + ('picking_id', 'not in', self.ids), + ('product_id', 'in', lines.product_id.ids)], limit=1): action = self.action_view_reception_report() action['context'] = {'default_picking_ids': self.ids} return action diff --git a/sf_dlm/models/product_supplierinfo.py b/sf_dlm/models/product_supplierinfo.py index 0e04c1d2..23102d43 100644 --- a/sf_dlm/models/product_supplierinfo.py +++ b/sf_dlm/models/product_supplierinfo.py @@ -95,7 +95,6 @@ class ResMrpBomMo(models.Model): limit=1, order='volume desc' ) - # logging.info('get_bom-vals:%s' % embryo_has) if embryo_has: rate_of_waste = ((embryo_has.volume - product.model_volume) % embryo_has.volume) * 100 if rate_of_waste <= 20: diff --git a/sf_dlm_management/views/product_template_management_view.xml b/sf_dlm_management/views/product_template_management_view.xml index 692756da..01d40a17 100644 --- a/sf_dlm_management/views/product_template_management_view.xml +++ b/sf_dlm_management/views/product_template_management_view.xml @@ -262,7 +262,7 @@ (mm)&nbsp; + attrs="{'invisible': [('cutting_tool_type','not in',('刀柄','夹头'))]}"/> this.props.value, refName: "scan_code", }); - console.log('我是setup1') + // console.log('我是setup1') super.setup(); this.orm = this.env.services.orm; this.record = this.props.record; @@ -45,12 +39,12 @@ export class CodeField extends Component { async search(barcode) { // alert('我是search') const domain = [["code", "=", barcode]]; - console.log(domain) + // console.log(domain) const fields = ["id", "code", "name", "state"]; - console.log(fields) + // console.log(fields) const results = await this.orm.call("sf.tray", "search_read", [domain, fields]); const values = await this.orm.call("sf.tray", "search_read", [domain]); - console.log(results) + // console.log(results) return results.map((result) => { return { id: result.id, @@ -63,16 +57,16 @@ export class CodeField extends Component { } async onBarcodeScanned(barcode) { const results = await this.search(barcode); - console.log(results) + // console.log(results) const records = results.filter((r) => !!r.id); - console.log(records) + // console.log(records) if (records.length === 1) { if (records[0].state === '空闲') { - console.log('currentModel',this) - console.log('this.record.data',this.record.data) - console.log('this.record.data.id', this.record.data.id) + // console.log('currentModel',this) + // console.log('this.record.data',this.record.data) + // console.log('this.record.data.id', this.record.data.id) const workorder = await this.orm.call('mrp.workorder', 'read', [this.record.data.id]); - console.log('workorder', workorder[0]) + // console.log('workorder', workorder[0]) const updatedRecord = await this.orm.call("sf.tray", "write", [ [records[0].id], { @@ -81,31 +75,32 @@ export class CodeField extends Component { production_id: workorder[0].product_id[0], // workorder_id: workorder.id, }]); - console.log(workorder[0].routing_type); - console.log(workorder[0].production_id); + // console.log(workorder[0].routing_type); + // console.log(workorder[0].production_id); // const productionIDS = await this.orm.call('mrp.production', 'search', [[['id', '=', workorder[0].production_id[0]]]]); const productionIDS = await this.orm.call('mrp.workorder', 'search', [[["production_id", "=", workorder[0].production_id[0]]]]); - console.log('prooooooo', productionIDS); - console.log('values', records[0].values[0]); + // console.log('prooooooo', productionIDS); + // console.log('values', records[0].values[0]); productionIDS.forEach(async (data) => { // 处理每一个数据 - console.log(data); + // console.log(data); const updatetrayRecord = await this.orm.call("mrp.workorder", "write", [ [data], { tray_id: records[0].values[0].id, // tray_id: false, }]); - console.log(updatetrayRecord) + // console.log(updatetrayRecord) }); this.props.update(records[0].code); $('.o_form_button_save').click(); } else { if (records[0].state === '占用') { - console.log('此托盘已占用,请检查') + // console.log('此托盘已占用,请检查') alert('此托盘已占用,请检查') } else { - console.log('此托盘已损坏,请登记') + // console.log('此托盘已损坏,请登记') + alert('此托盘已损坏,请登记') } } diff --git a/sf_machine_connect/static/src/js/barcode_handler_field.js b/sf_machine_connect/static/src/js/barcode_handler_field.js index 020cc5d4..6d24d4c6 100644 --- a/sf_machine_connect/static/src/js/barcode_handler_field.js +++ b/sf_machine_connect/static/src/js/barcode_handler_field.js @@ -8,10 +8,7 @@ const { Component, xml } = owl; export class BarcodeHandlerField extends Component { setup() { - console.log('99999999111'); this.actionService = useService("action") - console.log(this.actionService) - const barcode = useService("barcode"); // this.rpc = useService("rpc"); // useBus(barcode.bus, "barcode_scanned", this.onBarcodeScanned.bind(this)); @@ -20,9 +17,6 @@ export class BarcodeHandlerField extends Component { async _rpc(params) { // const { data } = await this.env.services.rpc('/web/dataset/call_kw', params); const response = await this.env.services.rpc('/web/dataset/call_kw', params); - console.log('response', response); - console.log('response.result', response.result); - // return response const responseObject = JSON.parse(response) return responseObject; @@ -33,8 +27,6 @@ export class BarcodeHandlerField extends Component { this.props.update(barcode); // const actionService = useService("action"); // const productId = 12345 - console.log('111222222222211111'); - // 根据条形码获取相关数据,例如产品ID const response = await this._rpc({ model: 'mrp.workorder', @@ -42,11 +34,10 @@ export class BarcodeHandlerField extends Component { args: [barcode], kwargs:{}, }); - // console.log(productId.result) if (response.result) { - const action = response.result; - console.log(action) - console.log('11111111111111111111111111111111111'); + // const action = response.result; + // console.log(action) + // console.log('11111111111111111111111111111111111'); // 通过产品ID执行操作并跳转到表单视图 // await this.actionService.doAction({ // // type: 'ir.actions.act_window', diff --git a/sf_machine_connect/wizard/__init__.py b/sf_machine_connect/wizard/__init__.py index 5faba653..e84f085d 100644 --- a/sf_machine_connect/wizard/__init__.py +++ b/sf_machine_connect/wizard/__init__.py @@ -1 +1 @@ -from . import action_up \ No newline at end of file +from . import action_up diff --git a/sf_machine_connect/wizard/action_up.py b/sf_machine_connect/wizard/action_up.py index ef4f860c..ffcb88ad 100644 --- a/sf_machine_connect/wizard/action_up.py +++ b/sf_machine_connect/wizard/action_up.py @@ -5,9 +5,8 @@ import os import json import hashlib import time -import requests from datetime import datetime - +import requests from odoo import fields, models, api, _ from odoo.exceptions import ValidationError from odoo.exceptions import UserError diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 1f304950..a2d81e68 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -165,7 +165,7 @@ class ResMrpWorkOrder(models.Model): y0 = ((y3 - y4) * (y2 * x1 - y1 * x2) - (y1 - y2) * (y4 * x3 - y3 * x4)) / ( (y3 - y4) * (x1 - x2) - (y1 - y2) * (x3 - x4)) x1 = ((x7 - x8) * (x6 * y5 - x5 * y6) - (x5 - x6) * (x8 * y7 - x7 * y8)) / ( - (x7 - x8) * (y5 - y6) - (x5 - x6) * (y7 - y8)); + (x7 - x8) * (y5 - y6) - (x5 - x6) * (y7 - y8)) y1 = ((y7 - y8) * (y6 * x5 - y5 * x6) - (y5 - y6) * (y8 * x7 - y7 * x8)) / ( (y7 - y8) * (x5 - x6) - (y5 - y6) * (x7 - x8)) x = (x0 + x1) / 2 @@ -189,19 +189,26 @@ class ResMrpWorkOrder(models.Model): def json_workorder_str(self, k, production, route): # 计算预计时长duration_expected if route.routing_type == '切割': - duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', '切割')]).time_cycle + duration_expected = self.env['mrp.routing.workcenter'].sudo().search( + [('name', '=', '切割')]).time_cycle elif route.routing_type == '获取CNC加工程序': - duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', '获取CNC加工程序')]).time_cycle + duration_expected = self.env['mrp.routing.workcenter'].sudo().search( + [('name', '=', '获取CNC加工程序')]).time_cycle elif route.routing_type == '工件装夹': - duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', '工件装夹')]).time_cycle + duration_expected = self.env['mrp.routing.workcenter'].sudo().search( + [('name', '=', '工件装夹')]).time_cycle elif route.routing_type == '前置三元定位检测': - duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', '前置三元定位检测')]).time_cycle + duration_expected = self.env['mrp.routing.workcenter'].sudo().search( + [('name', '=', '前置三元定位检测')]).time_cycle elif route.routing_type == 'CNC加工': - duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', 'CNC加工')]).time_cycle + duration_expected = self.env['mrp.routing.workcenter'].sudo().search( + [('name', '=', 'CNC加工')]).time_cycle elif route.routing_type == '后置三元质量检测': - duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', '后置三元质量检测')]).time_cycle + duration_expected = self.env['mrp.routing.workcenter'].sudo().search( + [('name', '=', '后置三元质量检测')]).time_cycle elif route.routing_type == '解除装夹': - duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', '解除装夹')]).time_cycle + duration_expected = self.env['mrp.routing.workcenter'].sudo().search( + [('name', '=', '解除装夹')]).time_cycle else: duration_expected = 60 workorders_values_str = [0, '', { diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index b6961fda..73d3d4aa 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -151,33 +151,35 @@ class ResProductMo(models.Model): item.cutting_speed_ids = False item.feed_per_tooth_ids = False - def choice(self): - if self.cutting_tool_type == '整体式刀具': - tree_view = self.env.ref('sf_base.view_sf_tool_materials_basic_parameters_integral_tree') - elif self.cutting_tool_type == '刀片': - tree_view = self.env.ref('sf_base.view_sf_tool_materials_basic_parameters_blade_tree') - elif self.cutting_tool_type == '刀杆': - tree_view = self.env.ref('sf_base.view_sf_tool_materials_basic_parameters_cutter_bar_tree') - elif self.cutting_tool_type == '刀盘': - tree_view = self.env.ref('sf_base.view_sf_tool_materials_basic_parameters_tree') - elif self.cutting_tool_type == '刀柄': - tree_view = self.env.ref('sf_base.view_sf_tool_materials_basic_parameters_tree') - else: - tree_view = self.env.ref('sf_base.view_sf_tool_materials_basic_parameters_tree') - return { - 'name': _('规格'), - 'view_mode': 'list', - 'view_id': tree_view.id, - 'type': 'ir.actions.act_window', - 'res_model': 'sf.tool.materials.basic.parameters', - 'target': 'new', - 'domain': [('cutting_tool_type', '=', self.cutting_tool_type), - ('standard_library_id', '=', self.cutting_tool_model_id.id)], - } + # def choice(self): + # if self.cutting_tool_type == '整体式刀具': + # tree_view = self.env.ref('sf_base.view_sf_tool_materials_basic_parameters_integral_tree') + # elif self.cutting_tool_type == '刀片': + # tree_view = self.env.ref('sf_base.view_sf_tool_materials_basic_parameters_blade_tree') + # elif self.cutting_tool_type == '刀杆': + # tree_view = self.env.ref('sf_base.view_sf_tool_materials_basic_parameters_cutter_bar_tree') + # elif self.cutting_tool_type == '刀盘': + # tree_view = self.env.ref('sf_base.view_sf_tool_materials_basic_parameters_tree') + # elif self.cutting_tool_type == '刀柄': + # tree_view = self.env.ref('sf_base.view_sf_tool_materials_basic_parameters_tree') + # else: + # tree_view = self.env.ref('sf_base.view_sf_tool_materials_basic_parameters_tree') + # return { + # 'name': _('规格'), + # 'view_mode': 'list', + # 'view_id': tree_view.id, + # 'type': 'ir.actions.act_window', + # 'res_model': 'sf.tool.materials.basic.parameters', + # 'target': 'new', + # 'domain': [('cutting_tool_type', '=', self.cutting_tool_type), + # ('standard_library_id', '=', self.cutting_tool_model_id.id)], + # } @api.onchange('specification_id') def _onchange_specification(self): if self.specification_id: + self.cutting_speed_ids = False + self.feed_per_tooth_ids = False self.cutting_tool_type_id = self.cutting_tool_model_id.cutting_tool_type_id.id self.brand_id = self.cutting_tool_model_id.brand_id.id self.tool_hardness = self.cutting_tool_model_id.tool_hardness @@ -202,14 +204,18 @@ class ResProductMo(models.Model): self.cutting_tool_blade_depth = self.specification_id.blade_depth self.cutting_tool_cut_depth = self.specification_id.cutting_depth self.cutting_speed_ids = self.cutting_tool_model_id.cutting_speed_ids - self.feed_per_tooth_ids = [(0, 0, {'product_template_id': product_template.id, - 'cutting_speed': product_template.cutting_speed, - 'machining_method': product_template.machining_method, - 'blade_diameter': product_template.blade_diameter, - 'materials_type_id': product_template.materials_type_id.id}) for - product_template in - self.cutting_tool_model_id.feed_per_tooth_ids.filtered( - lambda r: r.blade_diameter == self.specification_id.blade_diameter)] + # # self.feed_per_tooth_ids = self.cutting_tool_model_id.feed_per_tooth_ids. + # for tooth in self.cutting_tool_model_id.feed_per_tooth_ids: + # print(int(tooth.blade_diameter)) + # print(int(self.specification_id.blade_diameter)) + # if int(tooth.blade_diameter) == int(self.specification_id.blade_diameter): + # self.feed_per_tooth_ids = [(0, 0, { + # 'cutting_speed': tooth.cutting_speed, + # 'machining_method': tooth.machining_method, + # 'blade_diameter': tooth.blade_diameter, + # 'materials_type_id': tooth.materials_type_id.id})] + self.feed_per_tooth_ids = self.cutting_tool_model_id.feed_per_tooth_ids.filtered( + lambda r: int(r.blade_diameter) == int(self.specification_id.blade_diameter)) elif self.cutting_tool_type == '夹头': self.cutting_tool_clamping_length = self.specification_id.clamping_length self.cutting_tool_clamping_tolerance = self.specification_id.clamping_tolerance @@ -284,8 +290,8 @@ class ResProductMo(models.Model): elif self.cutting_tool_type == '刀柄': self.cutting_tool_total_length = self.specification_id.total_length self.cutting_tool_standard_speed = self.specification_id.standard_rotate_speed - self.cutting_tool_speed_max = self.specification_id.speed_max - self.cutting_tool_change_time = self.specification_id.change_time + self.cutting_tool_speed_max = self.specification_id.max_rotate_speed + self.cutting_tool_change_time = self.specification_id.tool_changing_time self.cutting_tool_total_length = self.specification_id.total_length self.cutting_tool_clamping_diameter_max = self.specification_id.max_clamping_diameter self.cutting_tool_clamping_diameter_min = self.specification_id.min_clamping_diameter @@ -313,6 +319,44 @@ class ResProductMo(models.Model): self.compaction_way_ids = [(6, 0, [])] if not self.cutting_tool_model_id.compaction_way_ids else [ (6, 0, self.cutting_tool_model_id.compaction_way_ids.ids)] + else: + self.cutting_tool_type_id = False + self.brand_id = False + self.tool_hardness = False + self.cutting_tool_run_out_accuracy_max = False + self.cutting_tool_run_out_accuracy_min = False + self.materials_type_id = False + self.cutting_tool_blade_type = False + self.cutting_tool_total_length = False + self.cutting_tool_clamping_way = False + self.cutting_tool_blade_diameter = False + self.cutting_tool_shank_length = False + self.cutting_tool_blade_length = False + self.cutting_tool_blade_number = False + self.cutting_tool_neck_length = False + self.cutting_tool_neck_diameter = False + self.cutting_tool_shank_diameter = False + self.cutting_tool_blade_tip_diameter = False + self.cutting_tool_blade_tip_taper = False + self.cutting_tool_blade_helix_angle = False + self.cutting_tool_blade_type = False + self.cutting_tool_pitch = False + self.cutting_tool_blade_width = False + self.cutting_tool_blade_depth = False + self.cutting_tool_cut_depth = False + self.cutting_tool_coarse_medium_fine = False + self.cutting_tool_run_out_accuracy_max = False + self.cutting_tool_run_out_accuracy_min = False + self.cutting_tool_blade_tip_working_size = False + self.fit_blade_shape_id = False + self.suitable_machining_method_ids = False + self.blade_tip_characteristics_id = False + self.handle_type_ids = False + self.cutting_direction_ids = False + self.suitable_coolant_ids = False + self.compaction_way_ids = False + self.cutting_speed_ids = False + self.feed_per_tooth_ids = False # @api.constrains('suitable_machining_method_ids') # def _check_suitable_machining_method_ids(self): @@ -899,7 +943,8 @@ class SfMaintenanceEquipmentTool(models.Model): _description = '机床刀位' equipment_id = fields.Many2one('maintenance.equipment', string='设备') - product_template_id = fields.Many2one('product.template', string='功能刀具名称', domain="[('categ_type', '=', '刀具')]") + product_template_id = fields.Many2one('product.template', string='功能刀具名称', + domain="[('categ_type', '=', '刀具')]") image_1920 = fields.Binary('图片', related='product_template_id.image_1920') categ_type = fields.Char(string='功能刀具类型') diameter = fields.Char('直径') @@ -911,5 +956,3 @@ class SfMaintenanceEquipmentTool(models.Model): alarm_value = fields.Char('报警值') used_value = fields.Char('已使用值') code = fields.Char('机床刀位号') - - diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index ac6ee4c4..a8940d56 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- import logging import base64 -from collections import defaultdict, namedtuple import requests from re import findall as regex_findall from datetime import datetime, timedelta from re import split as regex_split from odoo import SUPERUSER_ID, _, api, fields, models from odoo.tools import float_compare +from collections import defaultdict, namedtuple from odoo.addons.stock.models.stock_rule import ProcurementException from odoo.addons.sf_base.commons.common import Common from odoo.exceptions import UserError @@ -306,12 +306,12 @@ class StockPicking(models.Model): res = super().button_validate() # 采购单验证(夹具) - for item in self.move_ids_without_package: - if item.quantity_done > 0: - if item.product_id.categ_type == '夹具': - item._register_fixture() - elif item.product_id.categ_type == '刀具': - item._register_cutting_tool() + # for item in self.move_ids_without_package: + # if item.quantity_done > 0: + # if item.product_id.categ_type == '夹具': + # item._register_fixture() + # elif item.product_id.categ_type == '刀具': + # item._register_cutting_tool() return res # 创建 外协出库入单 diff --git a/sf_manufacturing/static/src/js/kanban_change.js b/sf_manufacturing/static/src/js/kanban_change.js index 2ef6cb4b..1f25caf4 100644 --- a/sf_manufacturing/static/src/js/kanban_change.js +++ b/sf_manufacturing/static/src/js/kanban_change.js @@ -16,12 +16,12 @@ class CustomKanbanController extends KanbanController { console.log('99999999111'); this.workOrders = await this.getAllWorkOrders(); this.workOrdersNew = this.workOrders; - console.log('lines222222222', this.workOrders); - - console.log(typeof this.workOrders); - console.log(Array.isArray(this.workOrders)); - - console.log(this.workOrders.every(order => typeof order === 'object' && order.id !== undefined)); + // console.log('lines222222222', this.workOrders); + // + // console.log(typeof this.workOrders); + // console.log(Array.isArray(this.workOrders)); + // + // console.log(this.workOrders.every(order => typeof order === 'object' && order.id !== undefined)); diff --git a/sf_manufacturing/views/mrp_production_addional_change.xml b/sf_manufacturing/views/mrp_production_addional_change.xml index 186ebc1c..3f16b734 100644 --- a/sf_manufacturing/views/mrp_production_addional_change.xml +++ b/sf_manufacturing/views/mrp_production_addional_change.xml @@ -104,5 +104,56 @@ + + + + custom.Product.template.product.kanban + product.template + + + + + + + + + + + +
+
+ Product +
+
+
+
+ + + +
+ +
+ +
+ 规格: +
+ [] +
+ + Variants + +
+
+ 价格: +
+
+
+
+
+
+
+
+
+ \ No newline at end of file diff --git a/sf_plan/models/custom_plan.py b/sf_plan/models/custom_plan.py index 7603b4fd..5fba575f 100644 --- a/sf_plan/models/custom_plan.py +++ b/sf_plan/models/custom_plan.py @@ -1,15 +1,15 @@ # -*- coding: utf-8 -*- import base64 -import json, requests -from odoo import models, fields, api, _ +import json from datetime import datetime, timedelta +import requests +from odoo import models, fields, api, _ from odoo.exceptions import UserError, ValidationError # sf排程 class sf_production_plan(models.Model): _name = 'sf.production.plan' - # _inherit = 'mrp.production' _description = 'sf_production_plan' _order = 'create_date desc' @@ -42,22 +42,13 @@ class sf_production_plan(models.Model): actual_end_time = fields.Datetime(string='实际结束时间') shift = fields.Char(string='班次') - # 序号、坯料编号、坯料名称、材质、数量、长度、宽度、厚度、直径、计划开始时间、计划结束时间、状态(已产出与待产出)、操作、创建人、创建时间、客户名称、订单号、行号、长度、宽度、厚度、直径、交货数量、交货日期 + # 序号、坯料编号、坯料名称、材质、数量、长度、宽度、厚度、直径、计划开始时间、计划结束时间、状态(已产出与待产出)、操作、创建人、创建时间、 + # 客户名称、订单号、行号、长度、宽度、厚度、直径、交货数量、交货日期 # sequence = fields.Integer(string='序号', required=True, copy=False, readonly=True, index=True, # default=lambda self: self.env['ir.sequence'].sudo().next_by_code('sf.pl.plan')) sequence = fields.Integer(string='序号', copy=False, readonly=True, index=True) current_operation_name = fields.Char(string='当前工序名称', size=64, default='生产计划') - # state = fields.Selection([ - # ('未排程', '未排程'), ('已排程', '已排程')], string='State', copy=False, index=True, readonly=True, - # store=True, tracking=True) - - # orderpoint_id = fields.Many2one('stock.warehouse.orderpoint', compute='_compute_orderpoint_id') - # location_src_id = fields.Many2one('stock.location', 'Components Location', compute='_compute_orderpoint_id', active=False) - # location_dest_id = fields.Many2one('stock.location', 'Finished Products Location', compute='_compute_orderpoint_id') - # picking_type_id = fields.Many2one('stock.picking.type', 'Operation Type', compute='_compute_orderpoint_id') - # move_dest_ids = fields.One2many('stock.move', 'created_production_id', compute='_compute_orderpoint_id') - @api.model def get_import_templates(self): """returns the xlsx import template file""" @@ -136,112 +127,6 @@ class sf_production_plan(models.Model): return num - # pl_no = fields.Char(string='坯料编号', required=True, default=_get_pl_no, readonly=True) - # pl_name = fields.Char(string='坯料名称', size=64, required=True) - # material = fields.Many2one('sf.production.materials', string='材质', required=True) - # quantity = fields.Float(string='数量', required=True) - # length = fields.Float(string='长度', required=True) - # width = fields.Float(string='宽度', required=True) - # thickness = fields.Float(string='厚度', required=True) - # diameter = fields.Float(string='直径', required=True) - # plan_start_time = fields.Datetime(string='计划开始时间') - # plan_end_time = fields.Datetime(string='计划结束时间') - # state = fields.Selection([ - # ('draft', '待排程'), - # ('produce', '已排程'), - # ('done', '已产出'), - # ], string='状态', copy=False, index=True, default='draft') - # customer_name = fields.Char(string='客户名称', size=64) - # order_no = fields.Char(string='订单号', size=64) - # line_no = fields.Char(string='行号', size=64) - # delivery_length = fields.Float(string='交货长度') - # delivery_width = fields.Float(string='交货宽度') - # delivery_thickness = fields.Float(string='交货厚度') - # delivery_diameter = fields.Float(string='交货直径') - # delivery_quantity = fields.Float(string='交货数量') - # delivery_date = fields.Datetime(string='交货日期', related='plan_end_time', readonly=False, store=True) - - # 当不设置计划结束时间时,增加计算计划结束时间的方法,根据采购周期加缓冲期两个值来算就可以了 - # def do_production_schedule(self): - # """ - # 排程方法 - # """ - # if not self.production_line_id: - # raise ValidationError("未选择生产线") - # else: - # aa = self.env['mrp.production'].sudo().search([('name', '=', self.name)]) - # workorder_time = 0 - # workorder_id_list = self.production_id.workorder_ids.ids - # print(workorder_id_list) - # print(type(self.production_id.workorder_ids)) - # if self.production_id.workorder_ids: - # for item in self.production_id.workorder_ids: - # if item.name == 'CNC加工': - # item.date_planned_start = self.date_planned_start - # item.date_planned_finished = item.date_planned_start + timedelta( - # minutes=self.env['mrp.routing.workcenter'].sudo().search( - # [('name', '=', 'CNC加工')]).time_cycle) - # item.duration_expected = self.env['mrp.routing.workcenter'].sudo().search( - # [('name', '=', 'CNC加工')]).time_cycle - # # print(item.id) - # sequence = workorder_id_list.index(item.id) - 1 - # # print('sequence', sequence) - # # print('total', len(workorder_id_list)) - # # 计算CNC加工之前工单的开始结束时间 - # for i in range(sequence): - # current_workorder_id = (item.id - (i + 1)) - # current_workorder_obj = self.env['mrp.workorder'].sudo().search( - # [('id', '=', current_workorder_id)]) - # old_workorder_obj = self.env['mrp.workorder'].sudo().search( - # [('id', '=', (current_workorder_id + 1))]) - # work_order = self.env['mrp.workorder'].sudo().search( - # [('production_id', '=', self.production_id.id), ('id', '=', current_workorder_id)]) - # work_order.date_planned_finished = old_workorder_obj.date_planned_start - # work_order.date_planned_start = old_workorder_obj.date_planned_start - timedelta( - # minutes=self.env['mrp.routing.workcenter'].sudo().search( - # [('name', '=', current_workorder_obj.name)]).time_cycle) - # work_order.duration_expected = self.env['mrp.routing.workcenter'].sudo().search( - # [('name', '=', current_workorder_obj.name)]).time_cycle - # # 计算CNC加工之后工单的开始结束时间 - # for j in range(len(workorder_id_list) - sequence - 2): - # current_workorder_id = (item.id + (j + 1)) - # current_workorder_obj = self.env['mrp.workorder'].sudo().search( - # [('id', '=', current_workorder_id)]) - # old_workorder_obj = self.env['mrp.workorder'].sudo().search( - # [('id', '=', (current_workorder_id - 1))]) - # work_order = self.env['mrp.workorder'].sudo().search( - # [('production_id', '=', self.production_id.id), ('id', '=', current_workorder_id)]) - # try: - # work_order.date_planned_start = old_workorder_obj.date_planned_finished - # print('work_order.data_start', work_order.date_planned_start) - # work_order.date_planned_finished = old_workorder_obj.date_planned_finished + timedelta( - # minutes=self.env['mrp.routing.workcenter'].sudo().search( - # [('name', '=', current_workorder_obj.name)]).time_cycle) - # work_order.duration_expected = self.env['mrp.routing.workcenter'].sudo().search( - # [('name', '=', current_workorder_obj.name)]).time_cycle - # except ValueError as e: - # print('时间设置失败,请检查是否为工序分配工作中心,%s' % e) - # - # current_workorder = self.env['mrp.workorder'].sudo().search([('id', '=', item.id)]) - # workorder_time += current_workorder.duration_expected - # print('workorder_time', workorder_time) - # self.date_planned_finished = self.date_planned_start + timedelta(minutes=workorder_time) - # self.state = 'done' - # self.production_id.schedule_state = '已排' - # # self.production_id.date_planned_start = self.date_planned_start - # # self.production_id.date_planned_finished = self.date_planned_finished - # else: - # raise ValidationError("未找到工单") - # # self.date_planned_finished = self.date_planned_start + timedelta(days=3) - # # self.state = 'done' - # return { - # 'name': '排程甘特图', - # 'type': 'ir.actions.act_window', - # 'res_model': 'sf.production.plan', # 要跳转的模型名称 - # 'view_mode': 'gantt,tree,form', # 要显示的视图类型,可以是'form', 'tree', 'kanban', 'graph', 'calendar', 'pivot'等 - # 'target': 'current', # 跳转的目标窗口,可以是'current'或'new' - # } - def do_production_schedule(self): """ 排程方法 @@ -262,7 +147,8 @@ class sf_production_plan(models.Model): [('name', '=', 'CNC加工')]).time_cycle self.calculate_plan_time_before(item, workorder_id_list) self.calculate_plan_time_after(item, workorder_id_list) - self.date_planned_start, self.date_planned_finished = item.date_planned_start, item.date_planned_finished + self.date_planned_start, self.date_planned_finished = \ + item.date_planned_start, item.date_planned_finished self.state = 'done' self.production_id.schedule_state = '已排' # self.production_id.date_planned_start = self.date_planned_start @@ -275,7 +161,8 @@ class sf_production_plan(models.Model): 'name': '排程甘特图', 'type': 'ir.actions.act_window', 'res_model': 'sf.production.plan', # 要跳转的模型名称 - 'view_mode': 'gantt,tree,form', # 要显示的视图类型,可以是'form', 'tree', 'kanban', 'graph', 'calendar', 'pivot'等 + # 要显示的视图类型,可以是'form', 'tree', 'kanban', 'graph', 'calendar', 'pivot'等 + 'view_mode': 'gantt,tree,form', 'target': 'current', # 跳转的目标窗口,可以是'current'或'new' } @@ -349,7 +236,6 @@ class sf_production_plan(models.Model): 'bfm_process_order_list': []} aa = self.env['ir.attachment'].search([('id', '=', 631)]) temp = self.env['product.template'].search([('id', '=', 47)]) - item = aa.datas.decode('utf-8') val = { 'model_long': 3, 'model_width': 1, diff --git a/sf_plan_management/__manifest__.py b/sf_plan_management/__manifest__.py index 66f1b72d..138399e9 100644 --- a/sf_plan_management/__manifest__.py +++ b/sf_plan_management/__manifest__.py @@ -24,10 +24,9 @@ 'web.assets_qweb': [ ], - 'web.assets_backend':[ + 'web.assets_backend': [ ] - }, 'license': 'LGPL-3', 'installable': True, diff --git a/sf_quality/models/custom_quality.py b/sf_quality/models/custom_quality.py index 4e323d73..1887da7a 100644 --- a/sf_quality/models/custom_quality.py +++ b/sf_quality/models/custom_quality.py @@ -7,9 +7,8 @@ class SfQualityPoint(models.Model): product_ids = fields.Many2many( 'product.product', string='适用产品', - domain="[('type', 'in', ('product', 'consu')), '|', ('company_id', '=', False), ('company_id', '=', company_id)]", - help="Quality Point will apply to every selected Products.") + domain="[('type', 'in', " + "('product', 'consu')), '|', ('company_id', '=', False), ('company_id', '=', company_id)]", help= + "Quality Point will apply to every selected Products.") # picking_type_ids = fields.Many2many( # 'stock.picking.type', string='执行节点', required=True, check_company=True) - - diff --git a/sf_tool_management/models/__init__.py b/sf_tool_management/models/__init__.py index 67b36bda..3ab6007e 100644 --- a/sf_tool_management/models/__init__.py +++ b/sf_tool_management/models/__init__.py @@ -1,3 +1,2 @@ from . import base from . import tool_material_search - diff --git a/sf_tool_management/models/tool_material_search.py b/sf_tool_management/models/tool_material_search.py index aad862b6..b89b76cd 100644 --- a/sf_tool_management/models/tool_material_search.py +++ b/sf_tool_management/models/tool_material_search.py @@ -19,13 +19,15 @@ class SfToolMaterialSearch(models.Model): mrs_cutting_tool_material_name = fields.Char(related='mrs_cutting_tool_material_id.name', string='刀具物料名称', store=True) cutting_tool_type = fields.Char(related='mrs_cutting_tool_material_id.name', string='刀具物料类型', store=True) - mrs_machine_brand_id = fields.Many2one('sf.machine.brand', '品牌', required=True, domain="[('tag_ids.name', 'ilike', '刀具')]") + mrs_machine_brand_id = fields.Many2one('sf.machine.brand', '品牌', required=True, + domain="[('tag_ids.name', 'ilike', '刀具')]") # 关联刀具型号 # mrs_cutting_tool_model_id = fields.Many2one('sf.cutting.tool.model', '刀具型号') # 关联刀具物料模型 mrs_cutting_tool_material_id = fields.Many2one('sf.cutting.tool.material', '刀具物料', - group_expand='_read_group_mrs_cutting_tool_material_ids', required=True) + group_expand='_read_group_mrs_cutting_tool_material_ids', + required=True) cutting_tool_material_name = fields.Char(string='物料名称', invisible=True) @api.onchange('mrs_cutting_tool_material_id') @@ -91,15 +93,15 @@ class SfToolMaterialSearch(models.Model): # integral_blade_material = fields.Selection([('碳素钢', '碳素钢'), ('硬质合金', '硬质合金')], '整体式刀具刀具材质') integral_hardness = fields.Integer('整体式刀具硬度(HRC)') integral_coating_material = fields.Char('整体式刀具涂层材质') - integral_run_out_accuracy_max = fields.Float('整体式刀具端跳精度max', digits=(6,1)) + integral_run_out_accuracy_max = fields.Float('整体式刀具端跳精度max', digits=(6, 1)) integral_run_out_accuracy_min = fields.Float('整体式刀具端跳精度min', digits=(6, 1)) suitable_machining_method_ids = fields.Many2many('maintenance.equipment.image', 'rel_machining_product_template_material_search', '适合加工方式', domain=[('type', '=', '加工能力')]) blade_tip_characteristics_id = fields.Many2many('maintenance.equipment.image', - 'rel_blade_tip_product_template_material_search', '刀尖特征', - domain=[('type', '=', '刀尖特征')]) + 'rel_blade_tip_product_template_material_search', '刀尖特征', + domain=[('type', '=', '刀尖特征')]) handle_type_ids = fields.Many2many('maintenance.equipment.image', 'rel_handle_product_template_material_search', '柄部类型', domain=[('type', '=', '柄部类型')]) diff --git a/sf_warehouse/__manifest__.py b/sf_warehouse/__manifest__.py index 2bf2de4f..c3cdf682 100644 --- a/sf_warehouse/__manifest__.py +++ b/sf_warehouse/__manifest__.py @@ -23,7 +23,7 @@ 'web.assets_qweb': [ ], - 'web.assets_backend':[ + 'web.assets_backend': [ # 'sf_warehouse/static/src/js/vanilla-masker.min.js', 'sf_warehouse/static/src/css/kanban_color_change.scss', 'sf_warehouse/static/src/js/custom_kanban_controller.js', diff --git a/sf_warehouse/models/__init__.py b/sf_warehouse/models/__init__.py index 833a0ba1..9186ee3a 100644 --- a/sf_warehouse/models/__init__.py +++ b/sf_warehouse/models/__init__.py @@ -1,2 +1 @@ from . import model - diff --git a/sf_warehouse/models/model.py b/sf_warehouse/models/model.py index 10acb1fa..cfa097ce 100644 --- a/sf_warehouse/models/model.py +++ b/sf_warehouse/models/model.py @@ -203,7 +203,8 @@ class SfLocation(models.Model): # def generate_barcode(self, i, j): # # 这里是你生成barcode的代码 # area_type_barcode = self.location_id.barcode - # return area_type_barcode + self.channel + self.direction + '-' + self.barcode + '-' + str(i + 1) + '-' + str(j + 1) + # return area_type_barcode + self.channel + self.direction + '-' + self.barcode + '-' + str(i + 1) + '-' + # + str(j + 1) class SfProcurementGroup(models.Model): @@ -223,7 +224,8 @@ class SfProcurementGroup(models.Model): res_list = Rule.search(expression.AND([[('route_id', 'in', route_ids.ids)], domain]), order='route_sequence, sequence') for res1 in res_list: - if product_id.categ_id in res1.location_dest_id.product_type or product_id.categ_id in res1.location_src_id.product_type: + if product_id.categ_id in res1.location_dest_id.product_type or product_id.categ_id in \ + res1.location_src_id.product_type: res = res1 if not res: res = Rule.search(expression.AND([[('route_id', 'in', route_ids.ids)], domain]), @@ -235,7 +237,8 @@ class SfProcurementGroup(models.Model): res_list = Rule.search(expression.AND([[('route_id', 'in', packaging_routes.ids)], domain]), order='route_sequence, sequence') for res1 in res_list: - if product_id.categ_id in res1.location_dest_id.product_type or product_id.categ_id in res1.location_src_id.product_type: + if product_id.categ_id in res1.location_dest_id.product_type or product_id.categ_id in \ + res1.location_src_id.product_type: res = res1 if not res: res = Rule.search(expression.AND([[('route_id', 'in', packaging_routes.ids)], domain]), @@ -246,7 +249,8 @@ class SfProcurementGroup(models.Model): res_list = Rule.search(expression.AND([[('route_id', 'in', product_routes.ids)], domain]), order='route_sequence, sequence') for res1 in res_list: - if product_id.categ_id in res1.location_dest_id.product_type or product_id.categ_id in res1.location_src_id.product_type: + if product_id.categ_id in res1.location_dest_id.product_type or product_id.categ_id in \ + res1.location_src_id.product_type: res = res1 if not res: res = Rule.search(expression.AND([[('route_id', 'in', product_routes.ids)], domain]), @@ -257,7 +261,8 @@ class SfProcurementGroup(models.Model): res_list = Rule.search(expression.AND([[('route_id', 'in', warehouse_routes.ids)], domain]), order='route_sequence, sequence') for res1 in res_list: - if product_id.categ_id in res1.location_dest_id.product_type or product_id.categ_id in res1.location_src_id.product_type: + if product_id.categ_id in res1.location_dest_id.product_type or product_id.categ_id in \ + res1.location_src_id.product_type: res = res1 if not res: res = Rule.search(expression.AND([[('route_id', 'in', warehouse_routes.ids)], domain]), diff --git a/sf_wxwork_approval/models/model.py b/sf_wxwork_approval/models/model.py index ba1cf15a..9a7e5911 100644 --- a/sf_wxwork_approval/models/model.py +++ b/sf_wxwork_approval/models/model.py @@ -13,8 +13,6 @@ from odoo.http import request from odoo.exceptions import ValidationError from odoo.exceptions import UserError - - _logger = logging.getLogger(__name__) @@ -44,9 +42,3 @@ class WxWorkApproval(models.Model): # ], string='请假类型') # leave_days = fields.Float(string='Leave Days') # overtime_hours = fields.Float(string='Overtime Hours') - - - - - - diff --git a/sf_wxwork_approval/models/wxwork_settings.py b/sf_wxwork_approval/models/wxwork_settings.py index 1be0f354..23592f15 100644 --- a/sf_wxwork_approval/models/wxwork_settings.py +++ b/sf_wxwork_approval/models/wxwork_settings.py @@ -80,7 +80,8 @@ class WxSettings(models.Model): # 'control_type': child_data.get('property', {}).get('control', None), # 'unique_control_id': child_data.get('property', {}).get('id', None), # 'title': child_data.get('property', {}).get('title', [{}])[0].get('text', None), - # 'placeholder': child_data.get('property', {}).get('placeholder', [{}])[0].get('text', None), + # 'placeholder': child_data.get('property', {}).get('placeholder', [{}])[0]. + # get('text', None), # 'require': child_data.get('property', {}).get('require', None), # 'un_print': child_data.get('property', {}).get('un_print', None), # 'un_replace': child_data.get('property', {}).get('un_replace', None), @@ -99,7 +100,8 @@ class WxSettings(models.Model): # 例如: config_id_data = { 'date_type': [(0, 0, {'date_type': child_data.get('config', {}).get('date', {}).get('type', - None)})] if 'date' in child_data.get( + None)})] + if 'date' in child_data.get( 'config', {}) else [], 'selector_type': [(0, 0, { 'selector_type': 'single', @@ -108,26 +110,14 @@ class WxSettings(models.Model): 'contact_type': [ (0, 0, {'contact_type': config_data.get('contact', {}).get('type', None), 'contact_mode': config_data.get('contact', {}).get('mode', - None)})] if 'contact' in child_data.get( + None)})] if 'contact' in + child_data.get( 'config', {}).get('contact', {}) else [], 'file_type': [ (0, 0, {'is_only_photo': config_data.get('file', {}).get('is_only_photo', - None)})] if 'file' in child_data.get( + None)})] if 'file' in + child_data.get( 'config', {}).get('file', {}) else [], - # 'table_type': [(0, 0, { - # 'table_children': [ - # (0, 0, {'control_type': config_data.get('table', {}).get('children', None)[0].get('property', {}).get('control', None), - # 'unique_control_id': config_data.get('table', {}).get('children', None)[0].get('property', {}).get('id', None), - # 'title': config_data.get('table', {}).get('children', None)[0].get('property', {}).get('title', None)[0].get('text', None), - # 'placeholder': config_data.get('table', {}).get('children', None)[0].get('property', {}).get('placeholder', None)[0].get('text', None), - # 'require': config_data.get('table', {}).get('children', None)[0].get('property', {}).get('require', None), - # 'un_print': config_data.get('table', {}).get('children', None)[0].get('property', {}).get('un_print', None), - # 'un_replace': config_data.get('table', {}).get('children', None)[0].get('property', {}).get('un_replace', None), - # 'display': config_data.get('table', {}).get('children', None)[0].get('property', {}).get('display', None), - # })], - # })] if 'table' in config_data else [], - # 'attendance_type': [(0, 0, {'attendance_type': '1', - # 'attendance_date_range_type': 'hour'})] if 'attendance' in config_data else [], } # 将config_id_data添加到property_data中(如果有的话) @@ -152,16 +142,9 @@ class WxSettings(models.Model): 'display': property_data.get('display', None), })], 'config_id': [(0, 0, { - 'date_type': [(0, 0, {'date_type': config_data.get('date', {}).get('type', - None)})] if 'date' in config_data else [], - # 'selector_type': [(0, 0, { - # 'selector_type': config_data['table']['children'][0].get('config', {}).get( - # 'selector', {}).get('type', None), - # 'options': [ - # (0, 0, {'key': option['key'], 'text': option['value'][0]['text']}) - # for option in config_data['table']['children'][0].get('config', {}).get('selector', {}).get('options', []) - # ], - # })] if 'selector' in config_data else [], + 'date_type': [(0, 0, {'date_type': + config_data.get('date', {}).get( + 'type', None)})] if 'date' in config_data else [], 'selector_type': [ (0, 0, { 'selector_type': child.get('config', {}).get('selector', {}).get('type', None), @@ -177,10 +160,12 @@ class WxSettings(models.Model): 'contact_type': [ (0, 0, {'contact_type': config_data.get('contact', {}).get('type', None), 'contact_mode': config_data.get('contact', {}).get('mode', - None)})] if 'contact' in config_data else [], + None)})] + if 'contact' in config_data else [], 'file_type': [ (0, 0, {'is_only_photo': config_data.get('file', {}).get('is_only_photo', - None)})] if 'file' in config_data else [], + None)})] + if 'file' in config_data else [], 'table_type': [(0, 0, { 'table_children': table_children_records, })] if 'table' in config_data else [], @@ -200,7 +185,8 @@ class WxSettings(models.Model): # # 'title': '文本框2'})] 'attendance_type': [(0, 0, {'attendance_type': '1', - 'attendance_date_range_type': 'hour'})] if 'attendance' in config_data else [], + 'attendance_date_range_type': 'hour'})] + if 'attendance' in config_data else [], })], }), # 在这里添加更多的控件数据