!10487 !10486 Merge branch 'dev' of <a href="https://gitee.com/jinan-pengyuse…

Merge pull request !10487 from 李鹏宇/dev
This commit is contained in:
李鹏宇
2026-04-01 09:08:38 +00:00
committed by Gitee
3 changed files with 104 additions and 1 deletions
+1
View File
@@ -120,6 +120,7 @@
'web.assets_backend': [
'yuthon_property_approval/static/src/scss/approval.scss',
'yuthon_property_approval/static/xml/misc.xml',
'yuthon_property_approval/static/src/js/contract_m2m_tags.js',
],
},
'demo': [],
@@ -0,0 +1,102 @@
/** @odoo-module **/
import { registry } from "@web/core/registry";
import {
Many2ManyTagsField,
many2ManyTagsField,
} from "@web/views/fields/many2many_tags/many2many_tags_field";
import { Many2XAutocomplete } from "@web/views/fields/relational_utils";
/**
* 自定义的 Many2X 自动完成组件:
* - 下拉候选使用 property.lease.contract 的 contract_code + lessor_id
*/
class ContractMany2XAutocomplete extends Many2XAutocomplete {
/**
* 重写搜索逻辑:不用 name_search,而是 search_read 读合同编号和出租方
*/
search(name) {
const baseDomain = this.props.getDomain ? this.props.getDomain() : [];
const domain = [...(baseDomain || [])];
if (name) {
domain.push(["contract_code", "ilike", name]);
}
// 返回 ORM 的原始 Promise(带 abort 方法),以兼容父类 loadOptionsSource
return this.orm.searchRead(
"property.lease.contract",
domain,
["contract_code", "lessor_id"],
{ limit: this.props.searchLimit + 1 }
);
}
/**
* 把 search 返回的记录转换成下拉选项
*/
mapRecordToOption(rec) {
const base = rec.contract_code || "";
const lessor = rec.lessor_id && rec.lessor_id[1] ? rec.lessor_id[1] : "";
const label = lessor ? `${base}(${lessor})` : base || "";
return {
value: rec.id,
label: label,
displayName: label,
};
}
}
/**
* 自定义 Many2ManyTags 字段:
* - 已选标签显示为 合同编号(出租方)
* - 下拉使用上面的 ContractMany2XAutocomplete
*/
export class ContractMany2ManyTags extends Many2ManyTagsField {
// 替换内部使用的自动完成组件
static components = {
...Many2ManyTagsField.components,
Many2XAutocomplete: ContractMany2XAutocomplete,
};
/**
* 控制标签上的显示文本
*/
getTagProps(record) {
const props = super.getTagProps(record);
const base = record.data.contract_code || record.data.display_name || "";
const lessor =
record.data.lessor_id && record.data.lessor_id[1]
? record.data.lessor_id[1]
: "";
const label = lessor ? `${base}(${lessor})` : base;
return {
...props,
text: label,
title: label,
};
}
}
/**
* 字段注册配置:
* - 复用原 many2many_tags 的配置
* - 额外声明需要加载 contract_code 和 lessor_id 这两个字段
*/
export const contractMany2ManyTagsField = {
...many2ManyTagsField,
component: ContractMany2ManyTags,
relatedFields: (env) => {
const fields = many2ManyTagsField.relatedFields(env) || [];
const names = new Set(fields.map((f) => f.name));
if (!names.has("contract_code")) {
fields.push({ name: "contract_code", type: "char" });
}
if (!names.has("lessor_id")) {
fields.push({ name: "lessor_id", type: "many2one" });
}
return fields;
},
};
// 注册成一个新的字段类型:contract_m2m_tags
registry.category("fields").add("contract_m2m_tags", contractMany2ManyTagsField);
@@ -12,7 +12,7 @@
<field name="available_contract_ids" widget="many2many_tags"/>
<field name="your_own_unit" invisible="1"/>
<field name="property_ids" widget="many2many_tags" options="{'no_create': True}"/>
<field name="contract_ids" widget="many2many_tags" domain="[('is_split', '=', False), ('id', 'not in', available_contract_ids)]" options="{'no_create': True}" context="{'show_lessor_in_contract_name': True}"/>
<field name="contract_ids" widget="contract_m2m_tags" domain="[('is_split', '=', False), ('id', 'not in', available_contract_ids)]" options="{'no_create': True}"/>
</group>
</sheet>