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

256 lines
11 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. <!-- 仪器instrumentsj(药剂) gsp(供试品) mix药剂/供试品/给药制剂 -->
  38. <template v-else-if="isRegent(sItem)">
  39. <HandleFormItem class="step-row" :field-item-label="fieldItemLabel" :field-key="prefixKey+ '_' + key"
  40. :type="sItem.type" :error="errors[key]"
  41. @onRegentSubmit="(data)=>onRegentSubmit(data,key,sItem)"
  42. @update:error="errors[key] = false" :item="getRegentItem(sItem)"
  43. :value="formFields[key]" />
  44. </template>
  45. <template v-else-if="sItem.type === 'text'">
  46. <span>{{ sItem.label }}</span>
  47. </template>
  48. <template v-else-if="sItem.type === 'span'">
  49. <span>{{ formFields[key] }}</span>
  50. </template>
  51. <template v-else-if="sItem.type === 'zlfz'">
  52. {{ key }}
  53. <ZLSubPackage @update="(data)=>onSubPackageUpdate(data,key)" :subData = "formFields[key]" :ref="'zlSubPackageRef_'+key" />
  54. </template>
  55. <div v-show="isShowOther(formFields[key])" class="flex flex1">
  56. <div class="other-title">{{sItem.otherLabel ? $t(sItem.otherLabel) : $t("template.common.other") }}</div>
  57. <HandleFormItem sourceFrom = "step" class="step-row" :field-item-label="fieldItemLabel" :field-key="prefixKey+'_'+sItem.otherCode" @blur="onBlur(key, $event)" :item="getOtherItem(sItem)"
  58. v-model="formFields[sItem.otherCode]" @copy="onCopy(sItem, key)"
  59. :error="errors[sItem.otherCode]" @update:error="errors[sItem.otherCode] = false"
  60. :orange-bg="orangeBgFields[sItem.otherCode]" />
  61. </div>
  62. </div>
  63. </div>
  64. </div>
  65. </template>
  66. <script>
  67. import HandleFormItem from '@/components/Template/HandleFormItem.vue'
  68. import formPackageMixins from '@/components/Template/mixins/formPackageMixins.js'
  69. import ZLSubPackage from '@/components/Template/StepComponents/ZLSubPackage.vue'
  70. import { isShowOther } from "@/utils/formPackageCommon.js";
  71. import { EventBus } from "@/utils/eventBus";
  72. import { isRegent} from "@/utils/index.js";
  73. import moment from 'moment'
  74. export default {
  75. inject: ['templateFillType','templateData'],
  76. components: {
  77. HandleFormItem,
  78. ZLSubPackage
  79. },
  80. mixins: [formPackageMixins],
  81. props: {
  82. formConfig: {
  83. type: Array,
  84. default: []
  85. },
  86. formData: {
  87. type: Object,
  88. value: () => ({})
  89. },
  90. //主要标识当前表单属于哪个模块,用于传给后端
  91. fieldItemLabel: {
  92. type: String,
  93. default: "",
  94. },
  95. prefixKey: {
  96. type: String,
  97. default: ""
  98. }
  99. },
  100. mounted() {
  101. },
  102. unmounted() {
  103. },
  104. data() {
  105. return {
  106. formFields: {},//表单绑定字段
  107. allFieldsConfig: {},//包含config的所有字段,主要用于校验表单是否填写
  108. errors: {},//存储表单错误信息,用于标红提示
  109. orangeBgFields: {},// 存储需要橙色背景的字段
  110. isShowOther,
  111. currentClickKey: "",//当前点击的字段key
  112. isRegent,
  113. }
  114. },
  115. methods: {
  116. // //试剂/仪器等弹窗提交
  117. onRegentSubmit(data,key,item){
  118. this.updateFormData(key,data.selectedId);
  119. console.log(data.selectedId,key,"data.selectedId")
  120. if(data.selectType){
  121. this.allFieldsConfig[key].sjSelectType = data.selectType;
  122. }
  123. this.formFields[`selectInfo_${key}`] = data.selectInfo;
  124. // this.$emit("onRegentSubmit", {selectInfo:data,key,config:item});
  125. },
  126. getRegentItem(item,fieldCode="type"){
  127. const type = item[fieldCode] ;
  128. return {
  129. label: "",
  130. type,
  131. fillType: item.subFillType || item.fillType,
  132. parentLabel: item.label,
  133. }
  134. },
  135. updateZlfzData(key,data){
  136. const ref = this.$refs[`zlSubPackageRef_${key}`][0];
  137. if(ref){
  138. ref.updateFormData(data);
  139. }
  140. },
  141. // 子组件数据更新处理方法
  142. onSubPackageUpdate(data,key){
  143. this.formFields[key] = data;
  144. },
  145. // 重写子组件校验钩子方法,检查ZLSubPackage的表单验证
  146. validateSubComponents() {
  147. const refs = [];
  148. // 遍历formConfig,找到所有type为zlfz的项
  149. for (const item of this.formConfig) {
  150. if (item.config) {
  151. for (const key in item.config) {
  152. const sItem = item.config[key];
  153. if (sItem.type === 'zlfz') {//质量分装
  154. // 根据key构建ref名称
  155. const refName = `zlSubPackageRef_${key}`;
  156. const zlSubPackageRef = this.$refs[refName];
  157. // 检查ZLSubPackage组件的表单验证
  158. if (zlSubPackageRef) {
  159. refs.push(zlSubPackageRef);
  160. }
  161. }
  162. }
  163. }
  164. }
  165. if(refs.length === 0){
  166. return {valid: true, error: ''};
  167. }else{//目前一个步骤只会有一个质量分装,所以不考虑多个的情况
  168. return refs[0][0].validateFormData();
  169. }
  170. },
  171. getSjResource(){
  172. const {allFieldsConfig,formFields} = this;
  173. const sjResource = [],yqResource = [];
  174. for(const key in allFieldsConfig){
  175. const item = allFieldsConfig[key];
  176. if(item.type === "xb" || item.type === "sj" || item.type === "gsp" || item.type === "mix"){
  177. if(formFields[key]){
  178. let o = {
  179. ...formFields[`selectInfo_${key}`],
  180. value:formFields[key],
  181. }
  182. if(item.ylCode){
  183. o.syl = formFields[item.ylCode];//用量
  184. }
  185. if(item.dwCode){
  186. o.syldw = formFields[item.dwCode];//单位
  187. }
  188. sjResource.push(o);
  189. }
  190. }else if(item.type === "yq"){
  191. if(formFields[key]){
  192. yqResource.push({
  193. type:item.type,
  194. value:formFields[key],
  195. ...formFields[`selectInfo_${key}`],
  196. });
  197. }
  198. }
  199. }
  200. return {
  201. sjResource,
  202. yqResource,
  203. }
  204. },
  205. // 点击按钮
  206. handleClickButton(e,item){
  207. const {buttonName = ""} = e;
  208. const {config} = item;
  209. if(buttonName === '开始' && config.hasOwnProperty("startDate")){
  210. this.updateFormData("startDate",moment().format('YYYY-MM-DD HH:mm'))
  211. }else if(buttonName === '结束' && config.hasOwnProperty("endDate")){
  212. this.updateFormData("endDate",moment().format('YYYY-MM-DD HH:mm'))
  213. }
  214. this.$emit("clickButton",e,item)
  215. },
  216. // 获取按钮项
  217. getButtonItem(sItem) {
  218. return {
  219. ...sItem,
  220. fillType:sItem.fillType || "actFill",
  221. }
  222. },
  223. getClickableItem(sItem) {
  224. return {
  225. ...sItem,
  226. type:sItem.type,
  227. }
  228. },
  229. }
  230. }
  231. </script>
  232. <style lang="scss" scoped>
  233. .step-form-package {
  234. display: flex;
  235. align-items: center;
  236. font-size: 14px;
  237. flex-wrap: wrap;
  238. }
  239. .step-row {
  240. min-width: 180px;
  241. }
  242. .step-item {
  243. display: flex;
  244. align-items: center;
  245. margin-left: 5px;
  246. margin-bottom: 10px;
  247. min-height: 28px;
  248. }
  249. </style>