package yem.base.common.module.version.list;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.form.FormShowParameter;
import kd.bos.form.IFormView;
import kd.bos.form.events.AfterDoOperationEventArgs;
import kd.bos.list.plugin.AbstractListPlugin;
import yem.base.common.module.version.form.AbstractVersionBillPlugIn;
import yem.base.common.module.version.helper.NewVersionHelper;

import java.util.EventObject;

/**
 * 版本变更功能基类
 * @description:列表插件
 * @author longh
 * @date 2021年11月17日 上午11:42:08
 */
public class AbstractVersionListPlugin extends AbstractListPlugin {
	//定义变更功能的列表可见控件标识
	private static final String[] VCTRLS = {"yem_versionhistory", "yem_version"};
	//定义变更功能的仅需求单据列表可见控件标识
	private static final String[] S = {"yem_newversion"};
	//定义变更功能的仅变更单据列表可见控件标识
	private static final String[] D = {"yem_deletehistory"};
	private static final String[] V = {"yem_effective"};
	//定义变更功能的仅变更单据列表不可见控件标识
	private static final String[] UNV = {"tblnew", "tblprint", "tblpush", "tbltrack","yem_push","yem_bizaction","yem_track"};
	
	@Override
	public void afterBindData(EventObject e) {
		super.afterBindData(e);
		this.initNewVersionSetting();
	}
	
	/**
	 * 初始化新版本设置，用于根据模板配置调整界面显示。
	 * 此方法主要用于处理不同类型的单据在界面显示上的差异，特别是与变更功能相关的控件显示。
	 */
	/**
	 * 设置新版本界面字段属性
	 */
	private void initNewVersionSetting() {
		// 获取当前视图
		IFormView view = this.getView();
		// 获取表单展示参数
		FormShowParameter formShowParameter = view.getFormShowParameter();
		// 将表单展示参数转换为JSON对象，以便解析获取单据类型ID
		JSONObject formId = JSON.parseObject(formShowParameter.toString());
		// 从JSON对象中获取单据类型ID
		String entityNumber = formId.getString("BillFormId");
		// 根据单据类型ID查询对应的模板配置
		DynamicObject tplObj = NewVersionHelper.queryTemplate(entityNumber);
		// 隐藏“配置变更”功能相关的控件
		//设置配置变更功能的单据列表控件可见性
		view.setVisible(false, "yem_effectchange");
		// 判断模板配置是否存在
		if(tplObj != null) {
			// 从模板配置中获取“需求单”和“变更单”的单据类型ID
			String yem_requirebill = tplObj.getString("yem_requirebill.number");
			String yem_changebill = tplObj.getString("yem_changebill.number");
			// 根据当前单据类型ID，判断是否为“需求单”或“变更单”，并相应地隐藏或显示控件
			if(entityNumber.equals(yem_requirebill)) {
				//设置控件可见性（非变更单）
				view.setVisible(false, V);
				view.setVisible(tplObj.getBoolean("yem_enabledelete"), D);
			}else if(entityNumber.equals(yem_changebill)) {
				//设置控件可见性（变更单）
				view.setVisible(false, S);
				view.setVisible(false, D);
				view.setVisible(false, UNV);
				// 如果变更单的生效选项不是“审计”，则显示“配置变更”功能相关的控件
				String effectOption = tplObj.getString("yem_effectoption");
				if(!"audit".equals(effectOption)) {
					view.setVisible(true, "yem_effectchange");
				}
			}
		} else {
			// 如果没有查询到模板配置，则隐藏所有与变更功能相关的控件
			//设置未配置变更功能的单据列表控件可见性
			view.setVisible(false, S);
			view.setVisible(false, V);
			view.setVisible(false, D);
			view.setVisible(false, VCTRLS);
		}
	}

	
	@Override
	public void afterDoOperation(AfterDoOperationEventArgs e) {
		super.afterDoOperation(e);
		IFormView view = this.getView();
		String operateKey = e.getOperateKey();
		switch (operateKey) {
		case "newversion":
			AbstractVersionBillPlugIn.viewNewVersion(e, view);
			break;
		case "versionhistory":
			AbstractVersionBillPlugIn.viewVersionHistory(e, view);
			break;
		default:
			break;
		}
	}
	
}
