<template>
	<div class="step-container">
		<el-button v-if="isShowAddStep()" type="primary" @click="addStep" icon="el-icon-plus">添加步骤</el-button>
		<div class="step-list">
			<draggable v-model="steps"  ghost-class="ghost" handle=".drag-handle" @end="onDragEnd" :animation="200">
				<div v-for="(step, index) in steps" :key="step.id" class="step-list-item">
					<div class="step-content">
						<i class="el-icon-rank drag-handle" v-if="templateFillType === 'preFill'" style="cursor: move; margin-right: 10px; margin-top: 6px;"></i>
						<span class="step-title">{{ index + 1 }}</span>
						<HandleFormItem type="select" placeholder="请选择" class="step-type-select" :item="stepSelectConfig"
							v-model="step.type" @change="onTypeChange(index)" />
						<!-- 根据步骤类型显示对应的表单 -->
						<component class="flex1" :sn="step.type" :is="getStepComponent(step.type)" :formData="step.formData"
							@update="onFormUpdate(index, $event)" :stepIndex = "prefixKey + index" :ref="'stepCompRef_' + index">
						</component>
						<div v-if="templateFillType === 'preFill'" class="step-header-item">
							<el-popconfirm
							@confirm="removeStep(index)"
							title="确定删除当前步骤吗？"
							>
							<el-button type="text" slot="reference" icon="el-icon-delete"
								class="delete-btn"></el-button>
							</el-popconfirm>
						</div>
					</div>
				</div>
			</draggable>
		</div>
	</div>
</template>

<script>
import draggable from 'vuedraggable';
import { duplicateResource,justUpdateFilledFormData } from '@/utils/index.js';
import HandleFormItem from './HandleFormItem.vue';
import Czdd from './StepComponents/ry/czdd.vue';//溶液-操作地点
import Czhj from './StepComponents/ry/czhj.vue';//溶液-操作方法
import Xzrq from './StepComponents/ry/xzrq.vue';//溶液-选择容器
import Jrry from './StepComponents/ry/jrry.vue';//溶液-加入溶液
import Tpjydd from './StepComponents/ry/tpjydd.vue';//溶液-天平校验(单点) 
import Tpjysd from './StepComponents/ry/tpjysd.vue';//溶液-天平校验(双点)
import Qywz from './StepComponents/ry/qywz.vue';//溶液-取用物质
import Clfcz from './StepComponents/ry/clfcz.vue';//溶液-称量（非传值）
import Clcz from './StepComponents/ry/clcz.vue';//溶液-称量（传值）
import Bdtj from './StepComponents/ry/bdtj.vue';//溶液-标定（体积）
import Bdzl from './StepComponents/ry/bdzl.vue';//溶液-标定（质量）
import Tjphcz from './StepComponents/ry/tjphcz.vue';//溶液-调节PH(传值)
import Tjphfcz from './StepComponents/ry/tjphfcz.vue';//溶液-调节PH(非传值)
import Lx from './StepComponents/ry/lx.vue';//溶液-离心
import Hwhy from './StepComponents/ry/hwhy.vue';//溶液-恒温混匀
import Zyhy from './StepComponents/ry/zyhy.vue';//溶液-振摇混匀
import Wxhy from "./StepComponents/ry/wxhy.vue";//溶液-涡旋混匀
import Ddhy from "./StepComponents/ry/ddhy.vue";//溶液-颠倒混匀
import Ym from "./StepComponents/ry/ym.vue";//溶液-研磨
import Jb from "./StepComponents/ry/jb.vue";//溶液-搅拌
import Jrjb from "./StepComponents/ry/jrjb.vue";//溶液-加热搅拌
import Cs from "./StepComponents/ry/cs.vue";//溶液-超声
import Sy from "./StepComponents/ry/sy.vue";//溶液-水浴
import Zy from "./StepComponents/ry/zy.vue";//溶液-正压
import Dc from "./StepComponents/ry/dc.vue";//溶液-氮吹
import Jd from "./StepComponents/ry/jd.vue";//溶液-解冻
import Jz from "./StepComponents/ry/jz.vue";//溶液-静置
import Glzd from "./StepComponents/ry/glzd.vue";//溶液-过滤(自动) 
import Glsd from "./StepComponents/ry/glsd.vue";//溶液-过滤(手动) 
import Fy from "./StepComponents/ry/fy.vue";//溶液-孵育
import Qcyy from "./StepComponents/ry/qcyy.vue";//溶液-取出原药
import Frdrq from "./StepComponents/ry/frdrq.vue";//溶液-复溶(多容器)
import Fr from "./StepComponents/ry/fr.vue";//溶液-复溶
import Hb from "./StepComponents/ry/hb.vue";//溶液-合并
import Rs from "./StepComponents/ry/rs.vue";//溶液-染色
import Js from "./StepComponents/ry/js.vue";//溶液-计数
import Mj from "./StepComponents/ry/mj.vue";//溶液-灭菌
import Fs from "./StepComponents/ry/fs.vue";//溶液-复苏
import Fb from "./StepComponents/ry/fb.vue";//溶液-封板
import Zlfz from "./StepComponents/ry/zlfz.vue";//溶液-质量分装

//罗开凡新增
import kbyq from "./StepComponents/ry/kbyq.vue";//溶液-空白仪器
import kbsjgsp from "./StepComponents/ry/kbsjgsp.vue";//溶液-空白（试剂/供试品）
import kb from "./StepComponents/ry/kb.vue";//溶液-空白
import jr from "./StepComponents/ry/jr.vue";//溶液-加热
import fz from "./StepComponents/ry/fz.vue";//溶液-分装
//罗开凡新增

//表配制
import jrry_b from './StepComponents/b/jrry_b.vue';//表配制-加入溶液
//表配制-离心：使用溶液-离心
import cl from './StepComponents/b/cl.vue';//表配制-称量
//表配制-超声：使用溶液-超声
//表配制-恒温混匀：使用溶液-恒温混匀
//表配制-振摇混匀：使用溶液-振摇混匀
//表配制-涡旋混匀：使用溶液-涡旋混匀
//表配制-颠倒混匀：使用溶液-颠倒混匀

//表配制-搅拌：使用溶液-搅拌
//表配制-加热搅拌：使用溶液-加热搅拌
//表配制-水浴：使用溶液-水浴
//表配制-正压：使用溶液-正压
//表配制-氮吹：使用溶液-氮吹
//表配制-过滤（自动）：使用溶液-过滤（自动）
//表配制-过滤（手动）：使用溶液-过滤（手动）
//表配制-静置：使用溶液-静置
//表配制-解冻：使用溶液-解冻
//表配制-孵育：使用溶液-孵育
//表配制-复溶：使用溶液-复溶


//生物样品分析
//生物样品分析-解冻：使用溶液-解冻
//生物样品分析-涡旋混匀：使用溶液-涡旋混匀
//生物样品分析-选择容器：使用溶液-选择容器
import jryp from './StepComponents/swypfx/jryp.vue';//生物样品分析-加入样品
//生物样品分析-衍生反应：使用溶液-离心
import hhspe from './StepComponents/swypfx/hhspe.vue';//生物样品分析-活化（SPE）
//生物样品分析-平衡（SPE）：使用溶液-活化（SPE）
//生物样品分析-上样（SPE）：使用溶液-活化（SPE）
//生物样品分析-淋洗（SPE）：使用溶液-活化（SPE）
//生物样品分析-洗脱（SPE）：使用溶液-活化（SPE）
import zyfc from './StepComponents/swypfx/zyfc.vue';//生物样品分析-转移（分层）
//生物样品分析-氮吹：使用溶液-氮吹
//生物样品分析-正压：使用溶液-正压
//生物样品分析-孵育：使用溶液-孵育
//生物样品分析-复溶：使用溶液-复溶



//色谱匀浆组织表
import jszz from './StepComponents/spyjzzb/jszz.vue';//色谱匀浆组织表-剪碎组织
//色谱匀浆组织表-称取组织：使用色谱匀浆组织表-剪碎组织
import jryjry from './StepComponents/spyjzzb/jryjry.vue';//色谱匀浆组织表-加入匀浆溶液
import ymyj from './StepComponents/spyjzzb/ymyj.vue';//色谱匀浆组织表-研磨匀浆
import yjyfz2 from './StepComponents/spyjzzb/yjyfz2.vue';//色谱匀浆组织表-匀浆液分装2
//色谱匀浆组织表-匀浆液分装3：使用色谱匀浆组织表-匀浆液分装2
import yjbc from './StepComponents/spyjzzb/yjbc.vue';//色谱匀浆组织表-匀浆保存
//色谱匀浆组织表-匀浆液混合：使用色谱匀浆组织表-剪碎组织
//色谱匀浆组织表-加入溶液：使用溶液-加入溶液
import fy_spyjzzb from './StepComponents/spyjzzb/fy_spyjzzb.vue';//色谱匀浆组织表-孵育
//色谱匀浆组织表-天平校验双点：使用溶液-天平校验双点
//色谱匀浆组织表-天平校验单点：使用溶液-天平校验单点
//色谱匀浆组织表-离心：使用溶液-离心
import jz_spyjzzb from './StepComponents/spyjzzb/jz_spyjzzb.vue';//色谱匀浆组织表-静置


//全血稳定性
//全血稳定性-颠倒混匀：使用溶液-颠倒混匀
//全血稳定性-恒温平衡：使用溶液-恒温混匀
import qxfz from './StepComponents/qxwdx/qxfz.vue';//全血稳定性-全血分装
import qxjz from './StepComponents/qxwdx/qxjz.vue';//全血稳定性-全血静置
import qxlx from './StepComponents/qxwdx/qxlx.vue';//全血稳定性-全血离心
//全血稳定性-全血取样：使用全血稳定性-全血静置
//全血稳定性-静置后离心：使用全血稳定性-全血离心


//样品分取
import fq2 from './StepComponents/ypfq/fq2.vue';//样品分取-分取2
//样品分取-分取3：使用样品分取-分取2
import hh from './StepComponents/ypfq/hh.vue';//样品分取-混合


//组织清洗
import qx from './StepComponents/zzqx/qx.vue';//组织清洗-清洗
import zc from './StepComponents/zzqx/zc.vue';//组织清洗-暂存
import qy from './StepComponents/zzqx/qy.vue';//组织清洗-弃液


//PCR
import sjjy from './StepComponents/pcr/sjjy.vue';//PCR-试剂加样
import jryp_pcr from './StepComponents/pcr/jryp_pcr.vue';//PCR-加入样品
import bzyp from './StepComponents/pcr/bzyp.vue';//PCR-补足样品
import jz_pcr from './StepComponents/pcr/jz_pcr.vue';//PCR-静置
import nscyp from './StepComponents/pcr/nscyp.vue';//PCR-NSC样品
import qrhy from './StepComponents/pcr/qrhy.vue';//PCR-轻柔混匀
//PCR-PE板位放置：使用PCR-轻柔混匀
import tgbwfz from './StepComponents/pcr/tgbwfz.vue';//PCR-天根板位放置
//PCR-罗氏板位放置：使用PCR-轻柔混匀
import tqsj from './StepComponents/pcr/tqsj.vue';//PCR-提取上机
import lssj from './StepComponents/pcr/lssj.vue';//PCR-罗氏上机
import yqzt from './StepComponents/pcr/yqzt.vue';//PCR-仪器暂停
import ecsj from './StepComponents/pcr/ecsj.vue';//PCR-二次上机
import czclcl from './StepComponents/pcr/czclcl.vue';//PCR-磁珠残留处理
import ypzy from './StepComponents/pcr/ypzy.vue';//PCR-样品转移
import hsypfz from './StepComponents/pcr/hsypfz.vue';//PCR-核酸样品分装
import ypbc from './StepComponents/pcr/ypbc.vue';//PCR-样品保存
import jd_pcr from './StepComponents/pcr/jd_pcr.vue';//PCR-解冻
import sjjyst from './StepComponents/pcr/sjjyst.vue';//PCR-试剂加样（手提）
import ddhy_pcr from './StepComponents/pcr/ddhy_pcr.vue';//PCR-颠倒混匀
import wxhy_pcr from './StepComponents/pcr/wxhy_pcr.vue';//PCR-涡旋混匀
import sy_pcr from './StepComponents/pcr/sy_pcr.vue';//PCR-水浴
import sslx from './StepComponents/pcr/sslx.vue';//PCR-瞬时离心
import xfzcl from './StepComponents/pcr/xfzcl.vue';//PCR-吸附柱处理
import lxdy from './StepComponents/pcr/lxdy.vue';//PCR-离心（倒液）
import xfzzysjg from './StepComponents/pcr/xfzzysjg.vue';//PCR-吸附柱转移（收集管）
import xfzzylxg from './StepComponents/pcr/xfzzylxg.vue';//PCR-吸附柱转移（离心管）
import xt from './StepComponents/pcr/xt.vue';//PCR-洗脱
import ecxt from './StepComponents/pcr/ecxt.vue';//PCR-二次洗脱
import lx_pcr from './StepComponents/pcr/lx.vue';//PCR-离心


//PCR分析核酸提取浓度测定表
import ndcd from './StepComponents/pcrfx/ndcd.vue';//PCR分析核酸提取浓度测定表-浓度测定


//PCR采集管称重记录表
import jrry_pcrcjg from './StepComponents/pcrcjg/jrry_pcrcjg.vue';//PCR采集管称重记录表-加入溶液


//PCR匀浆表(知管重、知组织重、常规)
import jszz_pcryj from './StepComponents/pcryj/jszz_pcryj.vue';//PCR采集管称重记录表-剪碎组织
import cqzz_pcryj from './StepComponents/pcryj/cqzz_pcryj.vue';//PCR采集管称重记录表-称取组织
import jryjry_pcryj from './StepComponents/pcryj/jryjry_pcryj.vue';//PCR采集管称重记录表-加入匀浆溶液
//PCR采集管称重记录表-研磨匀浆：使用色谱匀浆组织表-研磨匀浆
//PCR采集管称重记录表-水浴：使用PCR分析核酸提取样品处理表-水浴
//PCR采集管称重记录表-离心：使用PCR分析核酸提取样品处理表-水浴
//PCR采集管称重记录表-天平校验（双点）：使用溶液-天平校验（双点）
//PCR采集管称重记录表-天平校验（单点）：使用溶液-天平校验（单点）


//PCR分析样品处理表
import xs from './StepComponents/pcrfxyp/xs.vue';//PCR分析样品处理表-稀释
//PCR分析样品处理表-操作环境：使用溶液-操作环境
import sjjy_pcrfxyp from './StepComponents/pcrfxyp/sjjy_pcrfxyp.vue';//PCR分析样品处理表-试剂加样
import jryp_pcrfxyp from './StepComponents/pcrfxyp/jryp_pcrfxyp.vue';//PCR分析样品处理表-加入样品
import fmlx from './StepComponents/pcrfxyp/fmlx.vue';//PCR分析样品处理表-封膜离心
import pcrsj from './StepComponents/pcrfxyp/pcrsj.vue';//PCR分析样品处理表-PCR上机
import pbsz from './StepComponents/pcrfxyp/pbsz.vue';//PCR分析样品处理表-排版设置
import cbygxz from './StepComponents/pcrfxyp/cbygxz.vue';//PCR分析样品处理表-参比荧光选择
import yxpcry from './StepComponents/pcrfxyp/yxpcry.vue';//PCR分析样品处理表-运行PCR仪
import cdnsypfz from './StepComponents/pcrfxyp/cdnsypfz.vue';//PCR分析样品处理表-cDNA样品分装


//检测板配制
import bb from './StepComponents/jcb/bb.vue';//检测板配制-包被
//检测板配制-洗板：使用检测板配制-包被
//检测板配制-封闭：使用检测板配制-包被
import jy from './StepComponents/jcb/jy.vue';//检测板配制-加样
//检测板配制-中和：使用检测板配制-包被
//检测板配制-加检测试剂：使用检测板配制-包被
//检测板配制-酸解：使用检测板配制-包被
import sjjy_jcb from './StepComponents/jcb/sjjy_jcb.vue';//检测板配制-酸解加样
import zhfy from './StepComponents/jcb/zhfy.vue';//检测板配制-中和孵育
//检测板配制-二次酸解：使用检测板配制-包被
import xs_jcb from './StepComponents/jcb/xs_jcb.vue';//检测板配制-显色
//检测板配制-终止：使用检测板配制-包被
//检测板配制-检测：使用检测板配制-包被
import dbmby from './StepComponents/jcb/dbmby.vue';//检测板配制-读板（酶标仪）
//检测板配制-读板（化学发光系统）：使用检测板配制-读板（酶标仪）
import dbdhxfgxt from './StepComponents/jcb/dbdhxfgxt.vue';//检测板配制-读板（电化学发光系统）
import dbygxt from './StepComponents/jcb/dbygxt.vue';//检测板配制-读板（荧光系统）
import dzacl from './StepComponents/jcb/dzacl.vue';//检测板配制-读值（ACL）
import qb from './StepComponents/jcb/qb.vue';//检测板配制-取板
import jzks from './StepComponents/jcb/jzks.vue';//检测板配制-静置开始
import fyxks from './StepComponents/jcb/fyxks.vue';//检测板配制-孵育箱开始
import ycfyks from './StepComponents/jcb/ycfyks.vue';//检测板配制-摇床孵育开始
import ycks from './StepComponents/jcb/ycks.vue';//检测板配制-摇床开始
import js_jcb from './StepComponents/jcb/js_jcb.vue';//检测板配制-结束
//检测板配制-覆膜：使用检测板配制-读值（ACL）
//检测板配制-拍干：使用检测板配制-读值（ACL）
import czqx from './StepComponents/jcb/czqx.vue';//检测板配制-磁珠清洗
import czzx from './StepComponents/jcb/czzx.vue';//检测板配制-磁珠重悬
import ychy from './StepComponents/jcb/ychy.vue';//检测板配制-摇床混匀
import czzy from './StepComponents/jcb/czzy.vue';//检测板配制-磁珠转移
import sjbj from './StepComponents/jcb/sjbj.vue';//检测板配制-试剂标记


//细胞/菌株配制
import qxb from './StepComponents/xbjzpz/qxb.vue';//细胞/菌株配制-取细胞
import qjz from './StepComponents/xbjzpz/qjz.vue';//细胞/菌株配制-取菌株
import fr_xbjzpz from './StepComponents/xbjzpz/fr_xbjzpz.vue';//细胞/菌株配制-复溶
import lxqy from './StepComponents/xbjzpz/lxqy.vue';//细胞/菌株配制-离心（弃液）
import cd from './StepComponents/xbjzpz/cd.vue';//细胞/菌株配制-吹打
import xbzy from './StepComponents/xbjzpz/xbzy.vue';//细胞/菌株配制-细胞转移
import jzzy from './StepComponents/xbjzpz/jzzy.vue';//细胞/菌株配制-菌株转移
import dypyy from './StepComponents/xbjzpz/dypyy.vue';//细胞/菌株配制-倒原培养液
import xd from './StepComponents/xbjzpz/xd.vue';//细胞/菌株配制-洗涤
//细胞/菌株配制-消化：使用细胞/菌株配制-洗涤
//细胞/菌株配制-终止消化：使用细胞/菌株配制-洗涤
import copy from './StepComponents/xbjzpz/copy.vue';//细胞/菌株配制-CO2培养
import gc from './StepComponents/xbjzpz/gc.vue';//细胞/菌株配制-观察
import cdmd from './StepComponents/xbjzpz/cdmd.vue';//细胞/菌株配制-测定密度
//细胞/菌株配制-低渗：使用细胞/菌株配制-洗涤
//细胞/菌株配制-固定：使用细胞/菌株配制-洗涤
import cdxs from './StepComponents/xbjzpz/cdxs.vue';//细胞/菌株配制-传代/稀释


//细胞表单
import gc_xb from './StepComponents/xb/gc_xb.vue';//细胞表单-观察
import xdlc from './StepComponents/xb/xdlc.vue';//细胞表单-洗涤（2次）
import bzpyy from './StepComponents/xb/bzpyy.vue';//细胞表单-补足培养液
import xh_xb from './StepComponents/xb/xh_xb.vue';//细胞表单-消化
import jrrydh from './StepComponents/xb/jrrydh.vue';//细胞表单-加入溶液（多行）
//细胞表单-固定：使用细胞表单-消化
import rs_xb from './StepComponents/xb/rs_xb.vue';//细胞表单-染色
import bpqr from './StepComponents/xb/bpqr.vue';//细胞表单-破片确认
import dp from './StepComponents/xb/dp.vue';//细胞表单-滴片
import bprs from './StepComponents/xb/bprs.vue';//细胞表单-破片染色
import cx from './StepComponents/xb/cx.vue';//细胞表单-冲洗
import lg from './StepComponents/xb/lg.vue';//细胞表单-晾干



//Ames表单
import hygh from './StepComponents/ames/hygh.vue';//Ames表单-混匀固化
import hwzd from './StepComponents/ames/hwzd.vue';//Ames表单-恒温振荡
import jbcpyj from './StepComponents/ames/jbcpyj.vue';//Ames表单-加表层培养基


//配体结合分析样品/MRD稀释记录表
import xs_ptjhfxyp from './StepComponents/ptjhfxyp/xs_ptjhfxyp.vue';//体结合分析样品/MRD稀释记录表-稀释


import { public_templateStepList } from '@/api/business/public/public';


// const stepTypes = [
// 	{ label: '操作地点', value: 'czdd' },
// 	{ label: '操作方法', value: 'czhj' },
// 	{ label: '选择容器', value: 'xzrq' },
// 	{ label: '加入溶液', value: 'jrry' },
// 	{ label: '天平校验(单点)', value: 'tpjydd' },
// 	{ label: '天平校验(双点)', value: 'tpjysd' },
// 	{ label: '取用物质', value: 'qywz' },
// 	{ label: '称量(非传值)', value: 'clfcz' },
// 	{ label: '称量(传值)', value: 'clcz' },
// 	{ label: '标定(体积)', value: 'bdtj' },
// 	{ label: '标定(质量)', value: 'bdzl' },
// 	{ label: '调节PH(传值)', value: 'tjphcz' },
// 	{ label: '调节PH(非传值)', value: 'tjphfcz' },
// 	{ label: '离心', value: 'lx' },
// 	{ label: '恒温混匀', value: 'hwhy' },
// 	{ label: '振摇混匀', value: 'zyhy' },
// 	{ label: '涡旋混匀', value: 'wxhy' },
// 	{ label: '颠倒混匀', value: 'ddhy' },
// 	{ label: '研磨', value: 'ym' },
// 	{ label: '搅拌', value: 'jb' },
// 	{ label: '加热搅拌', value: 'jrjb' },
// 	{ label: '超声', value: 'cs' },
// 	{ label: '水浴', value: 'sy' },
// 	{ label: '正压', value: 'zy' },
// 	{ label: '氮吹', value: 'dc' },
// 	{ label: '解冻', value: 'jd' },
// 	{ label: '静置', value: 'jz' },
// 	{ label: '过滤(自动)', value: 'glzd' },
// 	{ label: '过滤(手动)', value: 'glsd' },
// 	{ label: '孵育', value: 'fy' },
// 	{ label: '取出原药', value: 'qcyy' },
// 	{ label: '复溶(多容器)', value: 'frdrq' },
// 	{ label: '复溶', value: 'fr' },
// 	{ label: '合并', value: 'hb' },
// 	{ label: '染色', value: 'rs' },
// 	{ label: '计数', value: 'js' },
// 	{ label: '灭菌', value: 'mj' },
// 	{ label: '复苏', value: 'fs' },
// 	{ label: '封板', value: 'fb' },
// 	{ label: '质量分装', value: 'zlfz' },
	
// ];

export default {
	inject: ['templateFillType','templateData'],
	name: 'Step',
	props: {
		formData: {
			type: Array,
			default: () => []
		},
		prefixKey: {
			type: String,
			default: ''
		}
	},
	data() {
		return {
			stepSelectConfig: {
				options: [],
				fillType: "preFill",
				placeholder: "请选择步骤类型"
			},
			steps: [],
			stepId: 1,
			componentMap: null
		}
	},
	components: {
		draggable,
		HandleFormItem,
		Czdd,
		Czhj,
		Xzrq,
		Jrry,
		Tpjydd,
		Tpjysd,
		Qywz,
		Clfcz,
		Clcz,
		Bdtj,
		Bdzl,
		Tjphcz,
		Tjphfcz,
		Lx,
		Hwhy,
		Zyhy,
		Wxhy,
		Ddhy,
		Ym,
		Jb,
		Jrjb,
		Cs,
		Sy,
		Zy,
		Dc,
		Jd,
		Jz,
		Glzd,
		Glsd,
		Fy,
		Qcyy,
		Frdrq,
		Fr,
		Hb,
		Rs,
		Js,
		Mj,
		Fs,
		Fb,
		Zlfz,
		//罗开凡新增
		kbyq,
		kbsjgsp,
		kb,
		jr,
		fz,
		//罗开凡新增

		//表配制
		jrry_b,
		cl,

		//生物样品分析
		jryp,
		hhspe,
		zyfc,

		//色谱匀浆组织表
		jszz,
		jryjry,
		ymyj,
		yjyfz2,
		yjbc,
		fy_spyjzzb,
		jz_spyjzzb,

		//全血稳定性
		qxfz,
		qxjz,
		qxlx,

		//样品分取
		fq2,
		hh,

		//组织清洗
		qx,
		zc,
		qy,

		//PCR
		sjjy,
		jryp_pcr,
		bzyp,
		jz_pcr,
		nscyp,
		qrhy,
		tgbwfz,
		tqsj,
		lssj,
		yqzt,
		ecsj,
		czclcl,
		ypzy,
		hsypfz,

		ypbc,
		jd_pcr,
		sjjyst,
		ddhy_pcr,
		wxhy_pcr,
		sy_pcr,
		sslx,
		xfzcl,
		lxdy,
		xfzzysjg,
		xfzzylxg,
		xt,
		ecxt,
		lx_pcr,

		//PCR分析核酸提取浓度测定表
		ndcd,

		//PCR采集管称重记录表
		jrry_pcrcjg,
		
		
		//PCR匀浆表(知管重、知组织重、常规)
		jszz_pcryj,
		cqzz_pcryj,
		jryjry_pcryj,

		//PCR分析样品处理表
		xs,
		sjjy_pcrfxyp,
		jryp_pcrfxyp,
		fmlx,
		pcrsj,
		pbsz,
		cbygxz,
		yxpcry,
		cdnsypfz,

		//检测板配制
		bb,
		jy,
		sjjy_jcb,
		zhfy,
		xs_jcb,
		dbmby,
		dbdhxfgxt,
		dbygxt,
		dzacl,
		qb,
		jzks,
		fyxks,
		ycfyks,
		ycks,
		js_jcb,
		czqx,
		czzx,
		ychy,
		czzy,
		sjbj,

		//细胞/菌株配制
		qxb,
		qjz,
		fr_xbjzpz,
		lxqy,
		cd,
		xbzy,
		jzzy,
		dypyy,
		xd,
		copy,
		gc,
		cdmd,
		cdxs,

		//细胞表单
		gc_xb,
		xdlc,
		bzpyy,
		xh_xb,
		jrrydh,
		rs_xb,
		bpqr,
		dp,
		bprs,
		cx,
		lg,


		//Ames表单
		hygh,
		hwzd,
		jbcpyj,

		//配体结合分析样品/MRD稀释记录表
		xs_ptjhfxyp,
	},
	computed: {
		stepComponentMap() {
			if (!this.componentMap) {
				this.componentMap = {
					'czdd': 'Czdd',
					'czhj': 'Czhj',
					'xzrq': 'Xzrq',
					'jrry': 'Jrry',
					'tpjydd': 'Tpjydd',
					'tpjysd': 'Tpjysd',
					'qywz': 'Qywz',
					'clfcz': 'Clfcz',
					'clcz': 'Clcz',
					'bdtj': 'Bdtj',
					'bdzl': 'Bdzl',
					'tjphcz': 'Tjphcz',
					'tjphfcz': 'Tjphfcz',
					'lx': 'Lx',
					'hwhy': 'Hwhy',
					'zyhy': 'Zyhy',
					'wxhy': 'Wxhy',
					'ddhy': 'Ddhy',
					'ym': 'Ym',
					'jb': 'Jb',
					'jrjb': 'Jrjb',
					'sy': 'Sy',
					'zy': 'Zy',
					'cs': 'Cs',
					'dc': 'Dc',
					'jd': 'Jd',
					'jz': 'Jz',
					'glzd': 'Glzd',
					'glsd': 'Glsd',
					'fy': 'Fy',
					'qcyy': 'Qcyy',
					'frdrq': 'Frdrq',
					'fr': 'Fr',
					'hb': 'Hb',
					'rs': 'Rs',
					'js': 'Js',
					'mj': 'Mj',
					'fs': 'Fs',
					'fb': 'Fb',
					'zlfz': 'Zlfz',

					//罗开凡新增
					'kbyq': 'kbyq',
					'kbsjgsp': 'kbsjgsp',
					'kb': 'kb',
					'jr': 'jr',
					'fz': 'fz',
					//罗开凡新增

					//标配配制
					'jrry_b': 'jrry_b',
					'cl': 'cl',
					'lx_b': 'Lx',
					'cs_b': 'Cs',
					'hwhy_b': 'Hwhy',
					'zyhy_b': 'Zyhy',
					'wxhy_b': 'Wxhy',
					'ddhy_b': 'Ddhy',

					'jb_b': 'Jb',
					'jrjb_b': 'Jrjb',
					'sy_b': 'Sy',
					'zy_b': 'Zy',
					'dc_b': 'Dc',
					'glzd_b': 'Glzd',
					'glsd_b': 'Glsd',
					'jz_b': 'Jz',
					'jd_b': 'Jd',
					'fy_b': 'Fy',
					'fr_b': 'Fr',

					//生物样品分析
					'jd_swypfx': 'Jd',
					'jryp': 'jryp',
					'ysfy': 'Lx',
					'hhspe': 'hhspe',

					'phspe': 'hhspe',
					'syspe': 'hhspe',
					'lxspe': 'hhspe',
					'xtspe': 'hhspe',
					'zyfc': 'zyfc',
					

					//色谱匀浆组织表
					'jszz':'jszz',
					'cqzz':'jszz',
					'jryjry':'jryjry',
					'ymyj':'ymyj',
					'yjyfz2':'yjyfz2',
					'yjyfz3':'yjyfz2',
					'yjbc':'yjbc',
					'yjyhh':'jszz',
					'fy_spyjzzb':'fy_spyjzzb',
					'jz_spyjzzb':'jz_spyjzzb',


					//全血稳定性
					'ddhy_qxwdx': 'Ddhy',
					'hwph':'Hwhy',
					'qxfz':'qxfz',
					'qxjz':'qxjz',
					'qxlx':'qxlx',
					'qxqy':'qxjz',
					'jzhlx':'qxlx',

					//样品分取
					'fq2':'fq2',
					'fq3':'fq2',
					'hh':'hh',
					
					//组织清洗
					'qx':'qx',
					'zc':'zc',
					'qy':'qy',

					//PCR
					'sjjy':'sjjy',
					'jryp_pcr':'jryp_pcr',
					'bzyp':'bzyp',
					'jz_pcr':'jz_pcr',
					'nscyp':'nscyp',
					'qrhy':'qrhy',
					'pebwfz':'qrhy',
					'tgbwfz':'tgbwfz',
					'lsbwfz':'qrhy',
					'tqsj':'tqsj',
					'lssj':'lssj',

					'yqzt':'yqzt',
					'ecsj':'ecsj',
					'czclcl':'czclcl',
					'ypzy':'ypzy',
					'hsypfz':'hsypfz',

					'ypbc':'ypbc',
					'jd_pcr':'jd_pcr',
					'sjjyst':'sjjyst',
					'ddhy_pcr':'ddhy_pcr',
					'wxhy_pcr':'wxhy_pcr',
					'sy_pcr':'sy_pcr',
					'sslx':'sslx',
					'xfzcl':'xfzcl',
					'lxdy':'lxdy',
					'xfzzysjg':'xfzzysjg',
					'xfzzylxg':'xfzzylxg',
					'xt':'xt',
					'ecxt':'ecxt',
					'lx_pcr':'lx_pcr',

					//PCR分析核酸提取浓度测定表
					'ndcd':'ndcd',

					//PCR采集管称重记录表
					'jrry_pcrcjg':'jrry_pcrcjg',

					//PCR匀浆表(知管重、知组织重、常规)
					'jszz_pcryj':'jszz_pcryj',
					'cqzz_pcryj':'cqzz_pcryj',
					'jryjry_pcryj':'jryjry_pcryj',


					//PCR分析样品处理表
					'xs':'xs',
					'sjjy_pcrfxyp':'sjjy_pcrfxyp',
					'jryp_pcrfxyp':'jryp_pcrfxyp',
					'fmlx':'fmlx',
					'pcrsj':'pcrsj',
					'pbsz':'pbsz',
					'cbygxz':'cbygxz',
					'yxpcry':'yxpcry',
					'cdnsypfz':'cdnsypfz',

					//检测板配制
					'bb':'bb',
					'xb':'bb',
					'fb_jcb':'bb',
					'jy':'jy',
					'zh':'bb',
					'jjcsj':'bb',
					'sj':'bb',
					'sjjy_jcb':'sjjy_jcb',
					'zhfy':'zhfy',
					'ecsj_jcb':'bb',
					'xs_jcb':'xs_jcb',
					'zz':'bb',
					'jc':'bb',
					'dbmby':'dbmby',
					'dbhxfgxt':'dbmby',
					'dbdhxfgxt':'dbdhxfgxt',
					'dbygxt':'dbygxt',
					'dzacl':'dzacl',
					'qb':'qb',
					'jzks':'jzks',
					'fyxks':'fyxks',
					'ycfyks':'ycfyks',
					'ycks':'ycks',
					'js_jcb':'js_jcb',
					'fm':'dzacl',
					'pg':'dzacl',
					'czqx':'czqx',
					'czzx':'czzx',
					'ychy':'ychy',
					'czzy':'czzy',
					'sjbj':'sjbj',

					//细胞/菌株配制
					'qxb':'qxb',
					'qjz':'qjz',
					'fr_xbjzpz':'fr_xbjzpz',
					'lxqy':'lxqy',
					'cd':'cd',
					'xbzy':'xbzy',
					'jzzy':'jzzy',
					'dypyy':'dypyy',
					'xd':'xd',
					'xh':'xd',
					'zzxh':'xd',
					'copy':'copy',
					'gc':'gc',
					'cdmd':'cdmd',
					'ds':'xd',
					'gd':'xd',
					'cdxs':'cdxs',
					//细胞表单
					'gc_xb':'gc_xb',
					'xdlc':'xdlc',
					'bzpyy':'bzpyy',
					'xh_xb':'xh_xb',
					'jrrydh':'jrrydh',
					'gd_xb':'xh_xb',
					'rs_xb':'rs_xb',
					'bpqr':'bpqr',
					'dp':'dp',
					'bprs':'bprs',
					'cx':'cx',
					'lg':'lg',

					//Ames表单
					'hygh':'hygh',
					'hwzd':'hwzd',
					'jbcpyj':'jbcpyj',

					//配体结合分析样品/MRD稀释记录表
					'xs_ptjhfxyp':'xs_ptjhfxyp',
				}
			}
			return this.componentMap
		}
	},

	created() {
		// // 初始化步骤数据
		// if (this.value && this.value.length > 0) {
		//   this.steps = this.value.map((step) => ({
		//     id: this.stepId++,
		//     type: step.type || '',
		//     formData: step.formData || {}
		//   }))
		// } else {
		//   // 默认添加一个步骤
		//   this.addStep()
		// }
		this.getStepList()
	},
	watch: {
		// steps: {
		// 	handler(newVal) {
		// 		this.$emit('input', newVal);
		// 	},
		// 	deep: true
		// },
		formData: {
			handler(newVal) {
				if (!newVal || newVal.length === 0) return
				this.steps = newVal;
			},
			deep: true,
			immediate: true
		}
	},
	methods: {
		onDragEnd(evt) {
			justUpdateFilledFormData();
		},

		getStepList(){
			public_templateStepList({templateId:this.templateData.templateId}).then(response => {
				let options = []
				_.forEach(response.data,(item)=>{
					options.push({ label: item.name, value: item.sn })
				})
                this.stepSelectConfig.options = options
            });
		},
		isShowAddStep() {
			return this.templateFillType === 'preFill';
		},
		addStep() {
			try {
				this.steps.push({
					id: this.stepId++,
					type: '',
					formData: {}
				})
				justUpdateFilledFormData();
				this.$emit('step-added', this.steps.length)
			} catch (error) {
				console.error('添加步骤失败:', error)
				this.$message.error('添加步骤失败，请重试')
			}
		},

		removeStep(index) {

			if (this.steps.length > 1) {
				const removedStep = this.steps.splice(index, 1)[0]
				justUpdateFilledFormData();
				this.$emit('step-removed', { index, step: removedStep, remaining: this.steps.length })
			} else {
				this.$message.warning('至少需要保留一个步骤')
			}
		},

		onTypeChange(index) {
			// 切换步骤类型时重置表单数据，并确保数据更新
			const oldType = this.steps[index].type
			this.$set(this.steps[index], 'formData', {})
			// 可选：添加类型变化的回调
			this.$emit('step-type-changed', {
				index,
				newType: this.steps[index].type,
				oldType
			})
		},

		onFormUpdate(stepIndex, formData) {
			this.steps[stepIndex].formData = formData
		},

		getStepComponent(type) {
			// 使用计算属性中的映射，提高性能
			return this.stepComponentMap[type]
		},

		// 公共方法：获取所有步骤数据
		getFormData() {
			return new Promise(async (resolve, reject) => {
				// 检查是否有步骤数据
				if (this.steps.length === 0) {
					// this.$message.error(this.$t('template.common.addStepError'))
					reject({ errorType: "step" });
					return
				}

				try {
					const stepData = await Promise.all(
						this.steps.map(async (step, index) => {
							const stepComponentRef = this.$refs[`stepCompRef_${index}`];
							if (stepComponentRef && stepComponentRef.length > 0) {
								try {
									const stepFormData = await stepComponentRef[0].getFormData();
									return { type: step.type, formData: stepFormData }
								} catch (error) {
									// 如果某个步骤的getFormData方法失败，抛出错误
									throw error;
								}
							} else {
								// 如果没有找到组件引用，返回原始数据
								return { type: step.type, formData: step.formData }
							}
						})
					);
					resolve({ stepData });
				} catch (error) {
					reject(error);
				}
			})
		},
		getStepResource(){
			const sj = [];
			let yq = [];
			this.steps.map((step, index) => {
				const stepComponentRef = this.$refs[`stepCompRef_${index}`];
				if(stepComponentRef && stepComponentRef.length > 0){
					const {sjResource,yqResource} = this.$refs[`stepCompRef_${index}`][0]?.getSjResource();
					if(sjResource && sjResource.length > 0){
						sj.push(...sjResource);
					}
					if(yqResource && yqResource.length > 0){
						yq.push(...yqResource);
					}
				}
			})
			const resource = duplicateResource(sj, yq);
			return { sjResource: resource.sj, yqResource: resource.yq };
		},

		// 直接获取表单数据，不做校验
		getFilledFormData() {
			const stepData = this.steps.map((step, index) => {
				const stepComponentRef = this.$refs[`stepCompRef_${index}`];
				if(stepComponentRef && stepComponentRef.length > 0){
					const stepFormData = this.$refs[`stepCompRef_${index}`][0]?.getFilledFormData();
					return { type: step.type, formData: stepFormData }
				}else{
					return { type: step.type, formData: step.formData }
				}
			})
			return { stepData }
		},

		// 公共方法：设置步骤数据
		setStepData(data) {
			if (Array.isArray(data)) {
				this.steps = data.map(step => ({
					id: this.stepId++,
					type: step.type || '',
					formData: step.formData || {}
				}))
			}
		},

		// 公共方法：重置所有步骤
		resetSteps() {
			this.steps = [{
				id: this.stepId++,
				type: '',
				formData: {}
			}]
			this.$emit('steps-reset')
		},

		// 公共方法：获取指定步骤的数据
		getStepDataByIndex(index) {
			if (index >= 0 && index < this.steps.length) {
				return {
					type: this.steps[index].type,
					formData: this.steps[index].formData
				}
			}
			return null
		},

		// 公共方法：验证所有步骤
		async validateSteps() {
			const errors = []
			for (let index = 0; index < this.steps.length; index++) {
				const step = this.steps[index];
				
				if (!step.type) {
					errors.push(`步骤 ${index + 1}: 请选择步骤类型`)
					continue;
				}
				
				// 获取当前步骤的组件实例
				const stepComponentRef = this.$refs[`stepCompRef_${index}`];
				if (stepComponentRef && stepComponentRef.length > 0) {
					try {
						// 调用子组件的getFormData方法进行验证（不抛出错误，只验证）
						await stepComponentRef[0].validateAndMarkRed();
					} catch (error) {
						// validateAndMarkRed方法不应该抛出错误，但如果有的话捕获它
						console.error(`步骤 ${index + 1} 验证时出错:`, error);
					}
				}
			}
			return {
				isValid: errors.length === 0,
				errors
			}
		},

		// 公共方法：批量导入步骤数据
		importSteps(stepDataArray) {
			if (Array.isArray(stepDataArray)) {
				this.steps = stepDataArray.map((step, index) => ({
					id: this.stepId++,
					type: step.type || '',
					formData: step.formData || {}
				}))
				this.$emit('steps-imported', this.steps.length)
			}
		},

		// 公共方法：获取步骤统计信息
		getStepStatistics() {
			const stats = {
				total: this.steps.length,
				byType: {},
				filled: 0
			}

			this.steps.forEach(step => {
				// 统计各类型数量
				if (step.type) {
					stats.byType[step.type] = (stats.byType[step.type] || 0) + 1
				}

				// 统计已填写的步骤
				if (step.type && Object.keys(step.formData).length > 0) {
					stats.filled++
				}
			})

			return stats
		}
	},

}
</script>

<style lang="scss" scoped>
.step-container {
	box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
	margin-top: 24px;
	padding: 24px;
	border-radius: 5px 5px;

	.step-header {
		margin-bottom: 20px;
		padding: 15px;
		background: #f5f7fa;
		border-radius: 6px;
	}
	.flex1 {
		flex:1
	}
	.step-list {
		padding-top: 10px;
		.step-list-item {
            page-break-inside: avoid;
			padding-top: 10px;
			border-radius: 6px;
			overflow: hidden;
			transition: background-color 0.2s;

			&:hover {
				// background-color: #f5f7fa;
			}

			&.ghost {
				background-color: transparent !important;
			}

			.drag-handle {
				color: #909399;
				transition: color 0.2s;

				&:hover {
					color: #409eff;
				}
			}

			.step-title {
				margin-right: 10px;
				margin-top: 6px;
			}

			.step-type-select {
				width: 200px;
				margin-right: 10px;
				max-width: 200px;
			}

			.delete-btn {
				color: #f56c6c;

				&:hover {
					color: #f78989;
				}

				&:disabled {
					color: #c0c4cc;
				}
			}

			.step-content {
				display: flex;
				align-items: flex-start;
			}
		}
	}
}
</style>