华西海圻ELN前端工程
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

321 lines
14 KiB

  1. <template>
  2. <div>
  3. <div v-for="(item, index) in formConfig" :key="index" class="step-form-package">
  4. <div v-for="(sItem, key) in item.config" class="step-item" :class="sItem.type === 'radio' ? 'radio-row' : ''" :key="key">
  5. <template v-if="sItem.type === 'input'">
  6. <HandleFormItem class="step-row" :field-item-label="fieldItemLabel" @blur="onBlur(key, $event)"
  7. :item="sItem" v-model="formFields[key]" :field-key="prefixKey+'_' + key"
  8. :ref="key"
  9. @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
  10. :orange-bg="getOrangeBg(key,sItem)" />
  11. </template>
  12. <template v-else-if="sItem.type === 'inputNumber'">
  13. <HandleFormItem class="step-row" :field-item-label="fieldItemLabel" :field-key="prefixKey+'_' + key"
  14. type="inputNumber" @blur="onBlur(key, $event)" :item="sItem" :ref="key"
  15. @input="onInputNumberChange(key, $event)" v-model="formFields[key]" @copy="onCopy(sItem, key)"
  16. :error="errors[key]" @update:error="errors[key] = false" :orange-bg="getOrangeBg(key,sItem)" />
  17. </template>
  18. <template v-else-if="sItem.type === 'select'">
  19. <HandleFormItem class="step-row" :field-item-label="fieldItemLabel" :field-key="prefixKey+'_' + key"
  20. type="select" @blur="onBlur(key, $event)" :item="sItem" v-model="formFields[key]"
  21. @change="onSelectChange(key, $event, sItem.type)" :ref="key"
  22. @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
  23. :orange-bg="orangeBgFields[key]" />
  24. </template>
  25. <template v-else-if="sItem.type === 'checkbox' || sItem.type === 'radio'">
  26. <HandleFormItem :class="sItem.type === 'checkbox' ? 'step-row' : ''" :field-item-label="fieldItemLabel" :field-key="prefixKey+'_' + key"
  27. :type="sItem.type" :item="sItem" v-model="formFields[key]"
  28. @change="onSelectChange(key, $event, sItem.type)" :ref="key"
  29. @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
  30. :orange-bg="orangeBgFields[key]" />
  31. </template>
  32. <template v-else-if="sItem.type === 'button'">
  33. <HandleFormItem
  34. type="button"
  35. @beforeSaveRecord="(data, callback)=>onBeforeSaveRecord(data, callback,sItem)"
  36. :field-key="prefixKey+'_' + key"
  37. :item="getButtonItem(sItem)"
  38. @clickButton="(e,v,data)=>handleClickButton(e,item,key,data)" />
  39. </template>
  40. <!-- 仪器instrumentsj(药剂) gsp(供试品) mix药剂/供试品/给药制剂 -->
  41. <template v-else-if="isRegent(sItem)">
  42. <HandleFormItem class="step-row" :field-item-label="fieldItemLabel" :field-key="prefixKey+ '_' + key"
  43. :type="sItem.type" :error="errors[key]"
  44. @onRegentSubmit="(data)=>onRegentSubmit(data,key,sItem)"
  45. @beforeReagentSubmit="(data, callback) => onBeforeReagentSubmit(data, callback, key)"
  46. @update:error="errors[key] = false" :item="getRegentItem(sItem)"
  47. :orange-bg="regentIsExpired(key)"
  48. :value="formFields[key]" />
  49. </template>
  50. <template v-else-if="sItem.type === 'text'">
  51. <span>{{ sItem.label }}</span>
  52. </template>
  53. <template v-else-if="sItem.type === 'span'">
  54. <span>{{ formFields[key] }}</span>
  55. </template>
  56. <template v-else-if="sItem.type === 'zlfz'">
  57. <ZLSubPackage
  58. @onSubPackageSubmit="onSubPackageSubmit(key) "
  59. :stepIndex="stepIndex" :prefixKey="prefixKey+'_'+index" @update="(data)=>onSubPackageUpdate(data,key)" :subData = "formFields[key]" :ref="'zlSubPackageRef_'+key" />
  60. </template>
  61. <template v-else-if="isShowJcb(sItem,key)">
  62. <JcbComp @update="(data)=>onJcbUpdate(data,key)" :type = "sItem.type" :ref="'jcbComp_'+key" :stepIndex="stepIndex" :prefixKey="prefixKey+'_'+index" @resetRecord = "resetRecord" :item="sItem" :formData="formData[key]" />
  63. </template>
  64. <template v-else-if="sItem.type === 'cdmd'">
  65. <CdmdComp @update="(data)=>onCdmdUpdate(data,key)" :type = "sItem.type" :cs="formFields.cs" :ref="'cdmdComp_'+key" :stepIndex="stepIndex" :prefixKey="prefixKey+'_'+index" :formData="formData[key]" />
  66. </template>
  67. <div v-show="isShowOther(formFields[key])" class="flex flex1">
  68. <!-- <div class="other-title">{{sItem.otherLabel ? $t(sItem.otherLabel) : $t("template.common.other") }}</div> -->
  69. <HandleFormItem sourceFrom = "step" class="step-row" :field-item-label="fieldItemLabel" :field-key="prefixKey+'_'+sItem.otherCode" @blur="onBlur(key, $event)" :item="getOtherItem(sItem)"
  70. v-model="formFields[sItem.otherCode]" @copy="onCopy(sItem, key)"
  71. :error="errors[sItem.otherCode]" @update:error="errors[sItem.otherCode] = false"
  72. :orange-bg="orangeBgFields[sItem.otherCode]" />
  73. </div>
  74. </div>
  75. </div>
  76. </div>
  77. </template>
  78. <script>
  79. import HandleFormItem from '@/components/Template/HandleFormItem.vue'
  80. import formPackageMixins from '@/components/Template/mixins/formPackageMixins.js'
  81. import JcbComp from '@/components/Template/StepComponents/JcbComp.vue'
  82. import CdmdComp from '@/components/Template/StepComponents/CdmdComp.vue'
  83. import ZLSubPackage from '@/components/Template/StepComponents/ZLSubPackage.vue'
  84. import { isShowOther } from "@/utils/formPackageCommon.js";
  85. import { EventBus } from "@/utils/eventBus";
  86. import { isRegent,justUpdateFilledFormData} from "@/utils/index.js";
  87. import moment from 'moment'
  88. export default {
  89. inject: ['templateFillType','templateData'],
  90. components: {
  91. HandleFormItem,
  92. ZLSubPackage,
  93. JcbComp,
  94. CdmdComp,
  95. },
  96. mixins: [formPackageMixins],
  97. props: {
  98. formConfig: {
  99. type: Array,
  100. default: []
  101. },
  102. formData: {
  103. type: Object,
  104. value: () => ({})
  105. },
  106. //主要标识当前表单属于哪个模块,用于传给后端
  107. fieldItemLabel: {
  108. type: String,
  109. default: "",
  110. },
  111. prefixKey: {
  112. type: String,
  113. default: ""
  114. },
  115. stepIndex: {
  116. type: Number,
  117. default: 0
  118. }
  119. },
  120. mounted() {
  121. },
  122. unmounted() {
  123. },
  124. data() {
  125. return {
  126. formFields: {},//表单绑定字段
  127. allFieldsConfig: {},//包含config的所有字段,主要用于校验表单是否填写
  128. errors: {},//存储表单错误信息,用于标红提示
  129. orangeBgFields: {},// 存储需要橙色背景的字段
  130. isShowOther,
  131. currentClickKey: "",//当前点击的字段key
  132. isRegent,
  133. }
  134. },
  135. methods: {
  136. isShowJcb(item,key){
  137. const {stepTableFormData = []} = this.formData[key] || {};
  138. return item.type === 'qb' || (item.type === 'dcjcb' && stepTableFormData.length > 0);
  139. },
  140. // 子组件提交处理方法
  141. onSubPackageSubmit(key){
  142. this.$emit("onSubPackageSubmit", {key,formData:this.formFields});
  143. },
  144. // //试剂/仪器等弹窗提交
  145. onRegentSubmit(data,key,item){
  146. this.updateFormData(key,data.selectedId);
  147. console.log(data.selectedId,key,item,"data.selectedId")
  148. if(data.selectType){
  149. this.allFieldsConfig[key].sjSelectType = data.selectType;
  150. }
  151. this.formFields[`selectInfo_${key}`] = data.selectInfo;
  152. if(data.type === "yq"){
  153. this.formFields[`yqInfo_${key}`] = data.row;
  154. }
  155. this.$emit("onRegentSubmit", {selectInfo:data,key,config:item});
  156. },
  157. getRegentItem(item,fieldCode="type"){
  158. const type = item[fieldCode] ;
  159. return {
  160. label: "",
  161. type,
  162. fillType: item.subFillType || item.fillType,
  163. parentLabel: item.label,
  164. }
  165. },
  166. updateZlfzData(key,data){
  167. const ref = this.$refs[`zlSubPackageRef_${key}`][0];
  168. if(ref){
  169. ref.updateFormData(data);
  170. }
  171. },
  172. // 子组件数据更新处理方法
  173. onSubPackageUpdate(data,key){
  174. this.formFields[key] = data;
  175. },
  176. // 子组件数据更新处理方法
  177. onJcbUpdate(data,key){
  178. this.formFields[key] = data.jcbInfo;
  179. this.$nextTick(() => {
  180. justUpdateFilledFormData();
  181. });
  182. },
  183. onCdmdUpdate(data,key){
  184. this.formFields[key] = data;
  185. this.$nextTick(() => {
  186. justUpdateFilledFormData();
  187. this.$emit("onCdmdUpdate", {key,formData:this.formFields[key]});
  188. });
  189. },
  190. // 重写子组件校验钩子方法,检查ZLSubPackage的表单验证
  191. validateSubComponents() {
  192. const refs = [];
  193. // 遍历formConfig,找到所有type为zlfz的项
  194. for (const item of this.formConfig) {
  195. if (item.config) {
  196. for (const key in item.config) {
  197. const sItem = item.config[key];
  198. if (sItem.type === 'zlfz') {//质量分装
  199. // 根据key构建ref名称
  200. const refName = `zlSubPackageRef_${key}`;
  201. const zlSubPackageRef = this.$refs[refName];
  202. // 检查ZLSubPackage组件的表单验证
  203. if (zlSubPackageRef) {
  204. refs.push(zlSubPackageRef);
  205. }
  206. }else if(sItem.type === 'qb'){
  207. const refName = `jcbComp_${key}`;
  208. const jcbCompRef = this.$refs[refName];
  209. // 检查ZLSubPackage组件的表单验证
  210. if (jcbCompRef) {
  211. refs.push(jcbCompRef);
  212. }
  213. }else if(sItem.type === 'cdmd'){
  214. const refName = `cdmdComp_${key}`;
  215. const cdmdCompRef = this.$refs[refName];
  216. // 检查ZLSubPackage组件的表单验证
  217. if (cdmdCompRef) {
  218. refs.push(cdmdCompRef);
  219. }
  220. }
  221. }
  222. }
  223. }
  224. if(refs.length === 0){
  225. return {valid: true, error: ''};
  226. }else{//目前一个步骤只会有一个质量分装,所以不考虑多个的情况
  227. return refs[0][0].validateFormData();
  228. }
  229. },
  230. getSjResource(){
  231. const {allFieldsConfig,formFields} = this;
  232. const sjResource = [],yqResource = [];
  233. for(const key in allFieldsConfig){
  234. const item = allFieldsConfig[key];
  235. if(item.type === "xj" || item.type === "xb" || item.type === "sj" || item.type === "gsp" || item.type === "mix"){
  236. if(formFields[key]){
  237. let o = {
  238. ...formFields[`selectInfo_${key}`],
  239. value:formFields[key],
  240. }
  241. if(item.ylCode){
  242. o.syl = formFields[item.ylCode];//用量
  243. }
  244. if(item.dwCode){
  245. o.syldw = formFields[item.dwCode];//单位
  246. }
  247. sjResource.push(o);
  248. }
  249. }else if(item.type === "yq"){
  250. if(formFields[key]){
  251. yqResource.push({
  252. type:item.type,
  253. value:formFields[key],
  254. ...formFields[`selectInfo_${key}`],
  255. });
  256. }
  257. }
  258. }
  259. console.log(sjResource,yqResource,allFieldsConfig,formFields,"sjResource")
  260. return {
  261. sjResource,
  262. yqResource,
  263. }
  264. },
  265. // 点击按钮
  266. handleClickButton(e,item,key,data){
  267. const {buttonName = ""} = e;
  268. const {config} = item;
  269. if(buttonName === '开始' && config.hasOwnProperty("startDate")){
  270. this.updateFormData("startDate",moment().format('YYYY-MM-DD HH:mm'))
  271. }else if(buttonName === '结束' && config.hasOwnProperty("endDate")){
  272. this.updateFormData("endDate",moment().format('YYYY-MM-DD HH:mm'))
  273. }
  274. this.$emit("clickButton",e,item,key,data)
  275. },
  276. // 获取按钮项
  277. getButtonItem(sItem) {
  278. return {
  279. ...sItem,
  280. fillType:sItem.fillType || "actFill",
  281. }
  282. },
  283. getClickableItem(sItem) {
  284. return {
  285. ...sItem,
  286. type:sItem.type,
  287. }
  288. },
  289. }
  290. }
  291. </script>
  292. <style lang="scss" scoped>
  293. .step-form-package {
  294. display: flex;
  295. align-items: center;
  296. font-size: 14px;
  297. flex-wrap: wrap;
  298. }
  299. .step-row {
  300. min-width: 180px;
  301. }
  302. .step-item {
  303. display: flex;
  304. align-items: center;
  305. margin-left: 5px;
  306. margin-bottom: 10px;
  307. min-height: 28px;
  308. }
  309. .radio-row{
  310. padding-top: 4px;
  311. }
  312. </style>