diff --git a/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/formplugin/PurOrderBillFormExtPlugin.java b/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/formplugin/PurOrderBillFormExtPlugin.java new file mode 100644 index 0000000..2e1eb1c --- /dev/null +++ b/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/formplugin/PurOrderBillFormExtPlugin.java @@ -0,0 +1,147 @@ +package shkd.fi.fi.formplugin; + +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.entity.datamodel.events.PropertyChangedArgs; +import kd.bos.form.field.BasedataEdit; +import kd.bos.form.field.events.BeforeF7SelectEvent; +import kd.bos.form.field.events.BeforeF7SelectListener; +import kd.bos.form.plugin.AbstractFormPlugin; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.org.OrgServiceHelper; +import org.apache.commons.lang3.ObjectUtils; + +import java.util.*; + +/** + * 采购订单表单插件 + * + */ +public class PurOrderBillFormExtPlugin extends AbstractFormPlugin implements BeforeF7SelectListener { + + private static final String DEPT = "dept"; + + private static final String OPERATOR = "operator"; + + private static final String ENTRY_ENTITY = "entryentity"; + + @Override + public void registerListener(EventObject e) { + super.registerListener(e); + BasedataEdit baseData = this.getView().getControl(DEPT); + baseData.addBeforeF7SelectListener(this); + } + + @Override + public void beforeF7Select(BeforeF7SelectEvent beforeF7SelectEvent) { + String propertyName = beforeF7SelectEvent.getProperty().getName(); + if (DEPT.equals(propertyName)){ + QFilter filter = new QFilter("id", QFilter.in, listMatchDeptId()); + beforeF7SelectEvent.setCustomQFilters(Collections.singletonList(filter)); + } + } + + @Override + public void propertyChanged(PropertyChangedArgs e) { + super.propertyChanged(e); + if (OPERATOR.equals(e.getProperty().getName())){ + setDefaultDept(); + } + } + + /** + * 设置默认采购部门 + * + */ + private void setDefaultDept() { + Optional user = getUser(); + if (!user.isPresent()) { + return; + } + //部门信息分录 + DynamicObjectCollection departEntries = user.get().getDynamicObjectCollection(ENTRY_ENTITY); + Set orgIds = listOrgSubUnitId(); + DynamicObject targetDept = null; + for (DynamicObject departEntry : departEntries) { + //部门 + DynamicObject dept = departEntry.getDynamicObject("dpt"); + //部门ID + long deptId = dept.getLong("id"); + if (!orgIds.contains(dept.getLong("id"))) { + continue; + } + //是否兼职 + boolean isPartJob = departEntry.getBoolean("ispartjob"); + //选取未兼职分录第一行 && 在采购组织下游 + if (ObjectUtils.isEmpty(targetDept) && orgIds.contains(deptId)) { + targetDept = dept; + } + //存在兼职分录行 + if (isPartJob) { + //分录行部门属于采购组织下游行政组织 + targetDept = dept; + break; + } + } + this.getModel().setValue(DEPT, targetDept); + } + + private Optional getUser() { + DynamicObject operator = (DynamicObject) this.getModel().getValue(OPERATOR); + if (ObjectUtils.isEmpty(operator)){ + return Optional.empty(); + } + long userId = operator.getDynamicObject("operatorid").getLong("id"); + DynamicObject user = BusinessDataServiceHelper.loadSingle("bos_user", "id,dpt,ispartjob", new QFilter[]{new QFilter("id", QFilter.equals, userId)}); + return Optional.ofNullable(user); + } + + /** + * 获取采购组织下游业务单元ID列表 + * + * @return 业务单元ID列表 + */ + private Set listOrgSubUnitId(){ + Set result = new HashSet<>(16); + DynamicObject org = (DynamicObject) this.getModel().getValue("org"); + if (ObjectUtils.isEmpty(org)){ + return result; + } + //查询组织下游行政组织ID列表 + List subOrgIds = OrgServiceHelper.getOrgAllSubIds(org.getLong("id"), "01", true); + result.addAll(subOrgIds); + return result; + } + + private Set listUserDeptId(){ + Set result = new HashSet<>(16); + Optional user = getUser(); + if (!user.isPresent()){ + return result; + } + //部门信息分录 + DynamicObjectCollection departEntries = user.get().getDynamicObjectCollection(ENTRY_ENTITY); + for (DynamicObject departEntry : departEntries) { + result.add(departEntry.getLong("dpt.id")); + } + return result; + } + + /** + * 获取与采购组织匹配的采购部门ID列表 + * + * @return 采购部门ID列表 + */ + private Set listMatchDeptId(){ + Set orgSubUnitId = listOrgSubUnitId(); + Set userDeptIds = listUserDeptId(); + Set result = new HashSet<>(16); + for (long userDeptId : userDeptIds) { + if (orgSubUnitId.contains(userDeptId)){ + result.add(userDeptId); + } + } + return result; + } +} \ No newline at end of file