华西海圻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.

282 lines
12 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" :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. @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
  9. :orange-bg="orangeBgFields[key]" />
  10. </template>
  11. <template v-else-if="sItem.type === 'inputNumber'">
  12. <HandleFormItem class="step-row" :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  13. type="inputNumber" @blur="onBlur(key, $event)" :item="sItem"
  14. @input="onInputNumberChange(key, $event)" v-model="formFields[key]" @copy="onCopy(sItem, key)"
  15. :error="errors[key]" @update:error="errors[key] = false" :orange-bg="orangeBgFields[key]" />
  16. </template>
  17. <template v-else-if="sItem.type === 'select'">
  18. <HandleFormItem class="step-row" :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  19. type="select" @blur="onBlur(key, $event)" :item="sItem" v-model="formFields[key]"
  20. @change="onSelectChange(key, $event, sItem.type)"
  21. @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
  22. :orange-bg="orangeBgFields[key]" />
  23. </template>
  24. <template v-else-if="sItem.type === 'checkbox'">
  25. <HandleFormItem class="step-row" :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  26. type="checkbox" :item="sItem" v-model="formFields[key]"
  27. @change="onSelectChange(key, $event, sItem.type)"
  28. @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
  29. :orange-bg="orangeBgFields[key]" />
  30. </template>
  31. <template v-else-if="sItem.type === 'button'">
  32. <HandleFormItem
  33. type="button"
  34. :item="getButtonItem(sItem)"
  35. @clickButton="(e)=>handleClickButton(e,item)" />
  36. </template>
  37. <!-- 仪器instrumentregent(药剂) gsp(供试品) mix药剂/供试品/给药制剂 -->
  38. <template v-else-if="sItem.type === 'instrument' || sItem.type === 'regent' || sItem.type === 'gsp' || sItem.type === 'mix' || sItem.type === 'xb'">
  39. <HandleFormItem class="step-row" :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  40. type="clickable" @clickable="handleClickInstrument(key,sItem.type)" :error="errors[key]"
  41. @update:error="errors[key] = false" @resetRecord="resetRecord(key)" :item="getClickableItem(sItem)"
  42. :value="formFields[key]" />
  43. </template>
  44. <template v-else-if="sItem.type === 'text'">
  45. <span>{{ sItem.label }}</span>
  46. </template>
  47. <template v-else-if="sItem.type === 'span'">
  48. <span>{{ formFields[key] }}</span>
  49. </template>
  50. <div v-show="isShowOther(formFields[key])" class="flex flex1">
  51. <div class="other-title">{{sItem.otherLabel ? $t(sItem.otherLabel) : $t("template.common.other") }}</div>
  52. <HandleFormItem class="step-row" :field-item-label="fieldItemLabel" :field-key="prefixKey+'_'+sItem.otherCode" @blur="onBlur(key, $event)" :item="getOtherItem(sItem)"
  53. v-model="formFields[sItem.otherCode]" @copy="onCopy(sItem, key)"
  54. :error="errors[sItem.otherCode]" @update:error="errors[sItem.otherCode] = false"
  55. :orange-bg="orangeBgFields[sItem.otherCode]" />
  56. </div>
  57. </div>
  58. </div>
  59. </div>
  60. </template>
  61. <script>
  62. import HandleFormItem from '@/components/Template/HandleFormItem.vue'
  63. import formPackageMixins from '@/components/Template/mixins/formPackageMixins.js'
  64. import { isShowOther } from "@/utils/formPackageCommon.js";
  65. import { EventBus } from "@/utils/eventBus";
  66. import { getuuid } from "@/utils/index.js";
  67. import moment from 'moment'
  68. export default {
  69. inject: ['templateFillType','templateData'],
  70. components: {
  71. HandleFormItem,
  72. },
  73. mixins: [formPackageMixins],
  74. props: {
  75. formConfig: {
  76. type: Array,
  77. default: []
  78. },
  79. formData: {
  80. type: Object,
  81. value: () => ({})
  82. },
  83. //主要标识当前表单属于哪个模块,用于传给后端
  84. fieldItemLabel: {
  85. type: String,
  86. default: "",
  87. },
  88. prefixKey: {
  89. type: String,
  90. default: ""
  91. }
  92. },
  93. mounted() {
  94. EventBus.$on("onReagentSubmit",this.onReagentSubmit)
  95. EventBus.$on("onInstrumentSubmit",this.onInstrumentSubmit)
  96. EventBus.$on("onMixReagentSubmit",this.onMixReagentSubmit)
  97. },
  98. unmounted() {
  99. EventBus.$off("onReagentSubmit",this.onReagentSubmit)
  100. EventBus.$off("onInstrumentSubmit",this.onInstrumentSubmit)
  101. EventBus.$off("onMixReagentSubmit",this.onMixReagentSubmit)
  102. },
  103. data() {
  104. return {
  105. formFields: {},//表单绑定字段
  106. allFieldsConfig: {},//包含config的所有字段,主要用于校验表单是否填写
  107. errors: {},//存储表单错误信息,用于标红提示
  108. orangeBgFields: {},// 存储需要橙色背景的字段
  109. isShowOther,
  110. currentClickKey: "",//当前点击的字段key
  111. uuid:getuuid(),
  112. }
  113. },
  114. methods: {
  115. getSjResource(){
  116. const {allFieldsConfig,formFields} = this;
  117. const sjResource = [],yqResource = [];
  118. for(const key in allFieldsConfig){
  119. const item = allFieldsConfig[key];
  120. if(item.type === "xb" || item.type === "regent" || item.type === "gsp" || item.type === "mix"){
  121. if(formFields[key]){
  122. let o = {
  123. ...formFields[`selectInfo_${key}`],
  124. value:formFields[key],
  125. }
  126. if(item.ylCode){
  127. o.syl = formFields[item.ylCode];//用量
  128. }
  129. if(item.dwCode){
  130. o.syldw = formFields[item.dwCode];//单位
  131. }
  132. sjResource.push(o);
  133. }
  134. }else if(item.type === "instrument"){
  135. if(formFields[key]){
  136. yqResource.push({
  137. type:item.type,
  138. value:formFields[key],
  139. ...formFields[`selectInfo_${key}`],
  140. });
  141. }
  142. }
  143. }
  144. return {
  145. sjResource,
  146. yqResource,
  147. }
  148. },
  149. // 点击按钮
  150. handleClickButton(e,item){
  151. const {buttonName = ""} = e;
  152. const {config} = item;
  153. if(buttonName === '开始' && config.hasOwnProperty("startDate")){
  154. this.formFields["startDate"] = moment().format('YYYY-MM-DD HH:mm:ss');
  155. }else if(buttonName === '结束' && config.hasOwnProperty("endDate")){
  156. this.formFields["endDate"] = moment().format('YYYY-MM-DD HH:mm:ss');
  157. }
  158. this.$emit("clickButton",e,item)
  159. },
  160. // 获取按钮项
  161. getButtonItem(sItem) {
  162. return {
  163. ...sItem,
  164. fillType:sItem.fillType || "actFill",
  165. }
  166. },
  167. // 处理选择试剂/供试品/给药制剂提交
  168. onMixReagentSubmit(data){
  169. if(data.uuid !== this.uuid) return;
  170. this.updateFormData(this.currentClickKey,data.selectedId)
  171. if(data.selectType){
  172. this.allFieldsConfig[this.currentClickKey].sjSelectType = data.selectType;
  173. this.formFields[`selectInfo_${this.currentClickKey}`] = data.selectInfo;
  174. }
  175. this.$emit("onDialogSubmit",data)
  176. },
  177. // 处理选择试剂提交
  178. onReagentSubmit(data){
  179. if(data.uuid !== this.uuid) return;
  180. this.updateFormData(this.currentClickKey,data.selectedId)
  181. },
  182. // 处理选择仪器提交,不确定后续还会不会有其他操作,所以和选择试剂提交区分开。
  183. onInstrumentSubmit(data){
  184. if(data.uuid !== this.uuid) return;
  185. this.updateFormData(this.currentClickKey,data.selectedId)
  186. // this.formFields[this.currentClickKey] = data.selectedId;
  187. this.formFields[`selectInfo_${this.currentClickKey}`] = data.selectInfo;
  188. },
  189. getClickableItem(sItem) {
  190. return {
  191. ...sItem,
  192. type:"clickable",
  193. }
  194. },
  195. handleClickInstrument(key,type) {
  196. this.currentClickKey = key;
  197. if(type === 'regent'){//试剂
  198. EventBus.$emit("showSelectMixReagentDialog",{
  199. studyFormId:this.templateData.id,
  200. uuid:this.uuid,
  201. sourceFrom:'step',
  202. type:"1"
  203. })
  204. }else if(type === 'gyzj'){//给药制剂
  205. EventBus.$emit("showSelectMixReagentDialog",{
  206. studyFormId:this.templateData.id,
  207. uuid:this.uuid,
  208. sourceFrom:'step',
  209. type:"3"
  210. })
  211. }else if(type === 'mjy'){//麻精药
  212. EventBus.$emit("showSelectMixReagentDialog",{
  213. studyFormId:this.templateData.id,
  214. uuid:this.uuid,
  215. sourceFrom:'step',
  216. type:"5"
  217. })
  218. }else if(type === 'gsp'){//供试品
  219. EventBus.$emit("showSelectMixReagentDialog",{
  220. studyFormId:this.templateData.id,
  221. uuid:this.uuid,
  222. sourceFrom:'step',
  223. type:"7"
  224. })
  225. }else if(type === 'mix'){
  226. EventBus.$emit("showSelectMixReagentDialog",{
  227. studyFormId:this.templateData.id,
  228. uuid:this.uuid,
  229. sourceFrom:'step',
  230. type:"1",
  231. mixType:true,
  232. })
  233. }else if(type === 'xj'){//细菌
  234. EventBus.$emit("showSelectMixReagentDialog",{
  235. studyFormId:this.templateData.id,
  236. uuid:this.uuid,
  237. sourceFrom:'step',
  238. type:"9",
  239. })
  240. }else if(type === 'xb'){//细胞
  241. EventBus.$emit("showSelectMixReagentDialog",{
  242. studyFormId:this.templateData.id,
  243. uuid:this.uuid,
  244. sourceFrom:'step',
  245. type:"11",
  246. })
  247. }else if(type === 'instrument'){
  248. EventBus.$emit("showSelectInstrumentDialog",{
  249. studyFormId:this.templateData.id,
  250. uuid:this.uuid,
  251. })
  252. }
  253. },
  254. }
  255. }
  256. </script>
  257. <style lang="scss" scoped>
  258. .step-form-package {
  259. display: flex;
  260. align-items: center;
  261. font-size: 14px;
  262. flex-wrap: wrap;
  263. }
  264. .step-row {
  265. min-width: 180px;
  266. }
  267. .step-item {
  268. display: flex;
  269. align-items: center;
  270. margin-left: 5px;
  271. margin-bottom: 10px;
  272. min-height: 28px;
  273. }
  274. </style>