327 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			327 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Java
		
	
	
	
| package shkd.repc.repmd.formplugin;
 | ||
| 
 | ||
| import com.alibaba.fastjson.JSONObject;
 | ||
| import kd.bos.dataentity.OperateOption;
 | ||
| import kd.bos.dataentity.entity.DynamicObject;
 | ||
| import kd.bos.dataentity.entity.DynamicObjectCollection;
 | ||
| import kd.bos.dataentity.utils.StringUtils;
 | ||
| import kd.bos.entity.datamodel.IDataModel;
 | ||
| import kd.bos.entity.datamodel.RowDataEntity;
 | ||
| import kd.bos.entity.datamodel.events.AfterAddRowEventArgs;
 | ||
| import kd.bos.entity.datamodel.events.BeforeImportEntryEventArgs;
 | ||
| import kd.bos.entity.datamodel.events.ImportDataEventArgs;
 | ||
| import kd.bos.entity.datamodel.events.PropertyChangedArgs;
 | ||
| import kd.bos.entity.operate.result.OperationResult;
 | ||
| import kd.bos.form.container.Tab;
 | ||
| import kd.bos.form.control.Control;
 | ||
| import kd.bos.form.control.EntryGrid;
 | ||
| import kd.bos.form.control.Label;
 | ||
| import kd.bos.form.control.Toolbar;
 | ||
| import kd.bos.form.control.events.BeforeItemClickEvent;
 | ||
| import kd.bos.form.control.events.ItemClickEvent;
 | ||
| import kd.bos.form.control.events.RowClickEvent;
 | ||
| import kd.bos.form.control.events.RowClickEventListener;
 | ||
| import kd.bos.form.events.ClientCallBackEvent;
 | ||
| import kd.bos.form.plugin.AbstractFormPlugin;
 | ||
| import kd.bos.form.plugin.importentry.resolving.ImportEntryData;
 | ||
| import kd.bos.orm.query.QCP;
 | ||
| import kd.bos.orm.query.QFilter;
 | ||
| import kd.bos.servicehelper.BusinessDataServiceHelper;
 | ||
| import kd.bos.servicehelper.operation.OperationServiceHelper;
 | ||
| import kd.bos.servicehelper.operation.SaveServiceHelper;
 | ||
| import kd.sdk.plugin.Plugin;
 | ||
| import kd.tsc.tsrbs.business.domain.oprecord.service.helper.OprecordHelper;
 | ||
| 
 | ||
| import java.math.BigDecimal;
 | ||
| import java.math.RoundingMode;
 | ||
| import java.util.ArrayList;
 | ||
| import java.util.EventObject;
 | ||
| import java.util.HashMap;
 | ||
| import java.util.Map;
 | ||
| 
 | ||
| /**
 | ||
|  * 位置:【项目主数据】-【项目建立】-表单插件
 | ||
|  * 功能:面积数据合计赋值
 | ||
|  * 时间:2024/12/16
 | ||
|  */
 | ||
| public class TotalAssignmentPlugin extends AbstractFormPlugin implements RowClickEventListener, Plugin {
 | ||
| 
 | ||
|     private static final String ENTRY_VALUE = "qeug_jrgsbsz";
 | ||
|     private static final String PRODUCT_ENTRY = "productentry";
 | ||
|     private static final String SUB_ENTRY = "qeug_subentryentity";
 | ||
| 
 | ||
|     // 控件缓存
 | ||
|     private Label publicAmountLabel;
 | ||
|     //private Label pubInsideAmountLabel;
 | ||
|     private Label watertightAmountLabel;
 | ||
|     private Label hardcoverAmount;
 | ||
| 
 | ||
|     @Override
 | ||
|     public void registerListener(EventObject e) {
 | ||
|         super.registerListener(e);
 | ||
|         this.addItemClickListeners("tbmain");
 | ||
|         this.addItemClickListeners("advcontoolbarap");
 | ||
|         this.addItemClickListeners("qeug_advcontoolbarap");
 | ||
|         EntryGrid entryGrid = this.getControl(PRODUCT_ENTRY);
 | ||
|         entryGrid.addRowClickListener(this);
 | ||
|         // 缓存控件,减少重复调用
 | ||
|         publicAmountLabel = (Label) this.getControl("qeug_publicamount");
 | ||
|         //pubInsideAmountLabel = (Label) this.getControl("qeug_pubinsideamount");
 | ||
|         watertightAmountLabel = (Label) this.getControl("qeug_watertightamount");
 | ||
|         hardcoverAmount = (Label) this.getControl("qeug_hardcoveramount");
 | ||
| 
 | ||
|     }
 | ||
| 
 | ||
|     @Override
 | ||
|     public void clientCallBack(ClientCallBackEvent e) {
 | ||
|         super.clientCallBack(e);
 | ||
|         String name = e.getName();
 | ||
|         if ("auto_save".equals(name)) {
 | ||
|             this.getView().invokeOperation("save");
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
|     @Override
 | ||
|     public void entryRowClick(RowClickEvent evt) {
 | ||
|         EntryGrid entryGrid = (EntryGrid) evt.getSource();
 | ||
|         if (PRODUCT_ENTRY.equals(entryGrid.getKey())) {
 | ||
|             // 业务逻辑
 | ||
|             DynamicObjectCollection subEntryEntity = (DynamicObjectCollection) this.getModel().getValue(SUB_ENTRY);
 | ||
|             if (subEntryEntity != null) {
 | ||
|                 onlyCalculateArea(subEntryEntity);
 | ||
|             }
 | ||
|             this.getView().updateView(SUB_ENTRY);
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     @Override
 | ||
|     public void propertyChanged(PropertyChangedArgs e) {
 | ||
|         super.propertyChanged(e);
 | ||
|         String fieldKey = e.getProperty().getName();
 | ||
|         if (ENTRY_VALUE.equals(fieldKey)) {
 | ||
|             //当前变更分录关联产品构成是否未保存
 | ||
|             DynamicObjectCollection collections = (DynamicObjectCollection) this.getModel().getValue(SUB_ENTRY);
 | ||
|             DynamicObject parent = (DynamicObject) collections.get(0).getParent();
 | ||
|             Long id = parent.getLong("id");
 | ||
|             if (id != 0L) {
 | ||
|                 //更新指标信息数据
 | ||
|                 Object pkValue = this.getModel().getValue("id");
 | ||
|                 Long typeId = parent.getLong("productentry_producttype.id");
 | ||
|                 this.updateMetricInfo(collections, typeId, pkValue);
 | ||
|                 //更新产品构成数据(不切换标签也能生效)
 | ||
|                 DynamicObjectCollection productEntry = this.getModel().getEntryEntity(PRODUCT_ENTRY);
 | ||
|                 this.setProductEntryValue(productEntry,collections,id);
 | ||
| 
 | ||
|             }
 | ||
| 
 | ||
|         } else if ("billname".equals(fieldKey)) {
 | ||
|             String value = (String) this.getModel().getValue("billno");
 | ||
|             if (value != null) {
 | ||
|                 this.getView().addClientCallBack("auto_save", 0);
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     @Override
 | ||
|     public void afterBindData(EventObject e) {
 | ||
|         super.afterBindData(e);
 | ||
|         DynamicObjectCollection productEntry = this.getModel().getEntryEntity(PRODUCT_ENTRY);
 | ||
|         if (null != productEntry && productEntry.size() != 0) {
 | ||
|             //选中第一条数据
 | ||
|             EntryGrid entryGrid = this.getControl("productentry");
 | ||
|             entryGrid.selectRows(0);
 | ||
|             //查询是否有未保存数据(id==0L)
 | ||
|             boolean exitNoSaveData = false;
 | ||
|             for (int i = 0; i < productEntry.size(); i++) {
 | ||
|                 Long id = productEntry.get(i).getLong("id");
 | ||
|                 if (id == 0L) {
 | ||
|                     exitNoSaveData = true;
 | ||
|                     break;
 | ||
|                 }
 | ||
|             }
 | ||
|             if (exitNoSaveData) {
 | ||
|                 DynamicObjectCollection subEntryEntity = (DynamicObjectCollection) this.getModel().getValue(SUB_ENTRY);
 | ||
|                 if (null != subEntryEntity && subEntryEntity.size() != 0) {
 | ||
|                     //获取产品构成分录父数据实体类型
 | ||
|                     DynamicObject parent = (DynamicObject) ((DynamicObject) subEntryEntity.getParent()).getParent();
 | ||
|                     DynamicObjectCollection productParent = parent.getDynamicObjectCollection(PRODUCT_ENTRY);
 | ||
|                     for (int i = 0; i < productParent.size(); i++) {
 | ||
|                         //获取产品构成分录相关联的面积数据分录
 | ||
|                         DynamicObjectCollection collections = productParent.get(i).getDynamicObjectCollection(SUB_ENTRY);
 | ||
|                         //先清空计入估算表数值再赋值,触发保存
 | ||
|                         for (int j = 0; j < collections.size(); j++) {
 | ||
|                             this.getModel().setValue("qeug_jrgsbsz", BigDecimal.ZERO, j, i);
 | ||
|                             BigDecimal all = collections.get(j).getBigDecimal("qeug_hjs");
 | ||
|                             this.getModel().setValue("qeug_jrgsbsz", all, j, i);
 | ||
|                         }
 | ||
|                     }
 | ||
|                     this.getView().addClientCallBack("auto_save", 0);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     @Override
 | ||
|     public void itemClick(ItemClickEvent evt) {
 | ||
|         super.itemClick(evt);
 | ||
|         if (StringUtils.equals("qeug_advconbaritemap7", evt.getItemKey())) {
 | ||
|             //表单id
 | ||
|             Object pkValue = this.getModel().getValue("id");
 | ||
|             DynamicObjectCollection productEntry = this.getModel().getEntryEntity(PRODUCT_ENTRY);
 | ||
|             if (null != productEntry && productEntry.size() != 0) {
 | ||
|                 for (DynamicObject dynamicObject : productEntry) {
 | ||
|                     if (dynamicObject.getBigDecimal("productentry_buildingarea").compareTo(BigDecimal.ZERO) == 0) {
 | ||
|                         DynamicObjectCollection collections = dynamicObject.getDynamicObjectCollection(SUB_ENTRY);
 | ||
|                         //指标信息赋值
 | ||
|                         Long typeId = dynamicObject.getLong("productentry_producttype.id");
 | ||
|                         this.updateMetricInfo(collections, typeId, pkValue);
 | ||
|                     }
 | ||
|                 }
 | ||
|                 Tab tab = this.getView().getControl("tabap");
 | ||
|                 tab.activeTab("indexpage_tab");
 | ||
|             }
 | ||
|         } else if (StringUtils.equals("deleteproductentry", evt.getItemKey())) {
 | ||
|             this.getView().addClientCallBack("auto_save", 0);
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     private void onlyCalculateArea(DynamicObjectCollection subEntryEntity) {
 | ||
|         if (subEntryEntity == null || subEntryEntity.isEmpty()) {
 | ||
|             return; // 防止空集合
 | ||
|         }
 | ||
| 
 | ||
|         // 合计值
 | ||
|         BigDecimal publicArea = BigDecimal.ZERO;
 | ||
|         BigDecimal publicAndInside = BigDecimal.ZERO;
 | ||
|         BigDecimal watertight = BigDecimal.ZERO;
 | ||
|         BigDecimal hardcover = BigDecimal.ZERO;
 | ||
| 
 | ||
|         // 分类处理
 | ||
|         for (DynamicObject entry : subEntryEntity) {
 | ||
|             String type = entry.getString("qeug_fl");
 | ||
|             BigDecimal value = entry.getBigDecimal(ENTRY_VALUE);
 | ||
| 
 | ||
|             if (StringUtils.isNotEmpty(type)) {
 | ||
|                 switch (type) {
 | ||
|                     case "公区":
 | ||
|                         publicArea = publicArea.add(value);
 | ||
|                         publicAndInside = publicAndInside.add(value);
 | ||
|                         break;
 | ||
|                     case "套内":
 | ||
|                         publicAndInside = publicAndInside.add(value);
 | ||
|                         hardcover = hardcover.add(value);
 | ||
|                         break;
 | ||
|                     case "防水":
 | ||
|                         watertight = watertight.add(value);
 | ||
|                         break;
 | ||
|                     default:
 | ||
|                         this.getView().showMessage("无效的分类: " + type + ", 请重新选择!");
 | ||
|                         break;
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         // 更新控件显示
 | ||
|         updateLabel(publicAmountLabel, publicArea);
 | ||
|         updateLabel(watertightAmountLabel, watertight);
 | ||
|         updateLabel(hardcoverAmount, hardcover);
 | ||
| 
 | ||
| 
 | ||
|     }
 | ||
| 
 | ||
|     private void updateLabel(Label label, BigDecimal value) {
 | ||
|         // 设置值并确保格式化保留两位小数
 | ||
|         if (label != null && value != null) {
 | ||
|             label.setText(value.setScale(2, RoundingMode.HALF_UP).toString());
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
|     /**
 | ||
|      * 更新指标信息
 | ||
|      *
 | ||
|      * @param collections   面积数据分录数据
 | ||
|      * @param productTypeId 产品构成产品类型
 | ||
|      * @param pkValue       表单id
 | ||
|      */
 | ||
|     private void updateMetricInfo(DynamicObjectCollection collections, Long productTypeId, Object pkValue) {
 | ||
|         // 获取地下面积汇总值
 | ||
|         BigDecimal groundFloorSummary = collections.stream()
 | ||
|                 .map(collection -> {
 | ||
|                     // 获取两个 BigDecimal 值,如果为 null,则使用 BigDecimal.ZERO
 | ||
|                     BigDecimal b1f = collection.getBigDecimal("qeug_b1f") != null ? collection.getBigDecimal("qeug_b1f") : BigDecimal.ZERO;
 | ||
|                     BigDecimal b2f = collection.getBigDecimal("qeug_b2f") != null ? collection.getBigDecimal("qeug_b2f") : BigDecimal.ZERO;
 | ||
|                     return b1f.add(b2f); // 返回 b1f 和 b2f 的和
 | ||
|                 })
 | ||
|                 .reduce(BigDecimal.ZERO, BigDecimal::add); // 累加所有的和
 | ||
| 
 | ||
|         // 获取地上面积汇总值
 | ||
|         BigDecimal allArea = collections.stream()
 | ||
|                 .map(collection -> {
 | ||
|                     // 获取 BigDecimal 值,如果为 null,则使用 BigDecimal.ZERO
 | ||
|                     BigDecimal hjs = collection.getBigDecimal("qeug_hjs") != null ? collection.getBigDecimal("qeug_hjs") : BigDecimal.ZERO;
 | ||
|                     return hjs;
 | ||
|                 })
 | ||
|                 .reduce(BigDecimal.ZERO, BigDecimal::add); // 累加所有的面积
 | ||
| 
 | ||
|         // 获取地上面积 - 地下面积
 | ||
|         BigDecimal groundSummary = allArea.subtract(groundFloorSummary);
 | ||
| 
 | ||
|         // 获取精装面积汇总值
 | ||
|         BigDecimal hardcoverSummary = collections.stream()
 | ||
|                 .filter(collection -> "套内".equals(collection.getString("qeug_fl"))) // 筛选 "套内" 类型
 | ||
|                 .map(collection -> {
 | ||
|                     // 获取 BigDecimal 值,如果为 null,则使用 BigDecimal.ZERO
 | ||
|                     BigDecimal hjs = collection.getBigDecimal("qeug_hjs") != null ? collection.getBigDecimal("qeug_hjs") : BigDecimal.ZERO;
 | ||
|                     return hjs;
 | ||
|                 })
 | ||
|                 .reduce(BigDecimal.ZERO, BigDecimal::add); // 累加所有的 "套内" 面积
 | ||
| 
 | ||
|         QFilter qFilter = new QFilter("mainprojectid", QCP.equals, pkValue);
 | ||
|         DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle("repmd_index_products", qFilter.toArray());
 | ||
|         if (null != dynamicObject) {
 | ||
|             DynamicObjectCollection buildingEntry = dynamicObject.getDynamicObjectCollection("buildingindexentry");
 | ||
|             if (buildingEntry != null && buildingEntry.size() != 0) {
 | ||
|                 for (DynamicObject entry : buildingEntry) {
 | ||
|                     Long typeId = entry.getLong("buildentry_producttype.id");
 | ||
|                     if (typeId.compareTo(productTypeId) == 0) {
 | ||
|                         entry.set("buildentry_allbuildarea", groundSummary.add(groundFloorSummary));
 | ||
|                         entry.set("buildentry_onbuildarea", groundSummary);
 | ||
|                         entry.set("buildentry_downbuildarea", groundFloorSummary);
 | ||
|                         entry.set("buildentry_finedecortarea", hardcoverSummary);
 | ||
|                         SaveServiceHelper.update(dynamicObject);
 | ||
|                         break;
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
|     /**
 | ||
|      * 产品构成分录赋值
 | ||
|      *
 | ||
|      * @param productEntry    产品构成分录
 | ||
|      * @param collections  面积数据分录
 | ||
|      * @param id 产品构成分录id
 | ||
|      */
 | ||
|     private void setProductEntryValue(DynamicObjectCollection productEntry, DynamicObjectCollection collections, Long id) {
 | ||
| 
 | ||
|         BigDecimal allArea = collections.stream()
 | ||
|                 .filter(collection -> !"防水".equals(collection.getString("qeug_fl"))) // 排除 "防水" 类型
 | ||
|                 .map(collection -> {
 | ||
|                     BigDecimal hjs = collection.getBigDecimal("qeug_hjs");
 | ||
|                     return hjs != null ? hjs : BigDecimal.ZERO;
 | ||
|                 })
 | ||
|                 .reduce(BigDecimal.ZERO, BigDecimal::add);
 | ||
|         for (int i = 0; i < productEntry.size(); i++) {
 | ||
|             DynamicObject dynamicObject = productEntry.get(i);
 | ||
|             Long id1 = dynamicObject.getLong("id");
 | ||
|             if (id1.compareTo(id) == 0) {
 | ||
|                 dynamicObject.set("productentry_buildingarea", allArea);
 | ||
|                 this.getView().updateView("productentry_buildingarea",i);
 | ||
|                 break;
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| }
 |