|
|
- <!-- 质量分装 -->
- <template>
- <div class="zl-container">
- <div class="dialog-content">
- <div class="header-container">
- <div class="header-item" v-for="item in subConfig" :key="item.key">
- <div class="header-title">{{ item.label }}</div>
- <HandleFormItem fieldItemLabel = "质量分装" :fieldKey = item.fieldKey
- :item="item" :error="formErrors[item.key]"
- :type="item.type"
- @blur = "(e)=>onCommonBlur(e,item.key)"
- v-model="formData[item.key]" />
- </div>
- <!-- <div class="header-item">
- <div class="header-title">分装数量</div>
- <HandleFormItem fieldKey = "clfz_fzsl" @blur="onBlurFzsl" :item="integerInputNumberItem"
- type = "inputNumber"
- :error="formErrors.fzsl" v-model="formData.fzsl" />
- </div>
- <div class="header-item">
- <div class="header-title">单位</div>
- <div class="unit-select">
- <HandleFormItem fieldKey = "clfz_dw" :item="unitItem" type="select" :error="formErrors.dw"
- @blur="(e) => onCommonBlur(e, 'dw')" v-model="formData.dw" />
- </div>
- </div> -->
- </div>
- <div class="content-container">
- <div class="header-container">
- <div v-for="(item, index) in fzList" class="list-item" :key="index">
- <div class="list-label">{{ formData.mybh }}-set{{ item.subCode }}</div>
- <HandleFormItem fieldItemLabel = "质量分装" :fieldKey = "'clfz_set'+index+'_prenum'" :item="preInputNumberItem"
- :error="hasError(index, 'prenum')"
- :disabled="true"
- type="inputNumber" @blur="onBlurFzNum(index,'prenum')" v-model="item.prenum" />
- <HandleFormItem fieldItemLabel = "质量分装" :fieldKey = "'clfz_set'+index+'_actnum'" class="ml-5" :item="inputNumberItem"
- :error="hasError(index, 'actnum')"
- type="inputNumber" @blur="onBlurFzNum(index,'actnum')" v-model="item.actnum" />
- <HandleFormItem
- class="ml-5"
- type="button"
- :item="getButtonItem()"
- @clickButton="(e)=>onGetValue(item)" />
- </div>
- </div>
- </div>
- </div>
- </div>
- </template>
-
- <script>
- import HandleFormItem from '@/components/Template/HandleFormItem.vue';
- import { EventBus } from '@/utils/eventBus';
- import { getLatestSn } from '@/api/template';
- import { isValueEmpty } from '@/utils/index.js';
- export default {
- inject: ['templateFillType'],
- dicts: [
- 'business_tjdw',
- ],
- components: {
- HandleFormItem,
- },
- props: {
- subData: {
- type: Object,
- default: () => ({})
- },
- },
- data() {
- return {
- inputItem: {
- type: "input",
- fillType: "actFill",
- disabled: true,
- },
- integerInputNumberItem: {
- type: "inputNumber",
- fillType: "actFill",
- precision: 0,
- maxlength: 3
- },
- inputNumberItem: {
- type: "inputNumber",
- fillType: "actFill",
- label:"实际称量"
- },
- preInputNumberItem: {
- type: "inputNumber",
- fillType: "preFill",
- label:"预计称量"
- },
- formData: {
- mybh: "",//母液编号
- fzsl: "",//分装数量
- dw: "",//单位
- },
- fzList: [],//分装列表
- // 错误状态字段
- formErrors: {
- fzsl: false,
- dw: false,
- },
- fzListErrors: [], // 分装列表错误状态
- uuid:"",//事件id
- }
- },
- watch: {
- subData:{
- handler(newVal) {
- if(newVal.formData){
- this.formData = newVal.formData;
- }
- if(newVal.fzList){
- this.fzList = newVal.fzList;
- }
- },
- deep: true,
- immediate: true,
- },
- // 监听formData的变化
- formData: {
- handler(newVal) {
- this.onDataChange();
- },
- deep: true
- },
- // 监听fzList的变化
- fzList: {
- handler(newVal) {
- this.onDataChange();
- },
- deep: true
- }
- },
- computed: {
- subConfig(){
- return[
- {
- fieldKey:"clfz_mybh",
- key:"mybh",
- label:"母编号",
- type:"input",
- disabled: true,
- fillType: "actFill",
- },
- {
- fieldKey:"clfz_fzsl",
- key:"fzsl",
- label:"分装数量",
- type:"inputNumber",
- fillType: "preFill",
- },
- {
- fieldKey:"clfz_dw",
- key:"dw",
- label:"单位",
- type:"select",
- options: this.dict.type.business_tjdw,
- fillType: "preFill",
- },
- ]
- },
- },
- methods: {
- updateFormData(data){
- this.formData = {...this.formData,...data};
- },
- // 获取按钮项
- getButtonItem() {
- return {
- fillType: "actFill",
- buttonName:"获取值",
- }
- },
- close() {
- this.visible = false;
- this.fzList = [];
- this.formData = {};
- this.resetErrors();
- },
- validateFormData() {
- let isValid = true;
-
- // 定义需要验证的基础字段配制
- const baseFieldConfigs = this.subConfig;
-
- // 验证基础字段
- baseFieldConfigs.forEach(config => {
- if (config.fillType === this.templateFillType) {
- if (isValueEmpty(this.formData[config.key]) && !config.disabled) {
- this.formErrors[config.key] = true;
- isValid = false;
- }
- }
- });
-
- // 验证分装列表中的数值 - 根据字段的fillType和当前templateFillType比较
- if (this.fzList && this.fzList.length > 0) {
- for (let i = 0; i < this.fzList.length; i++) {
- // 验证预填分装数量
- if (this.preInputNumberItem.fillType === this.templateFillType) {
- if (isValueEmpty(this.fzList[i].prenum)) {
- this.fzListErrors.push({
- rowIndex: i,
- field: "prenum",
- error: "请输入预填分装数量",
- })
- isValid = false;
- }
- }
-
- // 验证实际分装数量
- if (this.inputNumberItem.fillType === this.templateFillType) {
- if (isValueEmpty(this.fzList[i].actnum)) {
- this.fzListErrors.push({
- rowIndex: i,
- field: "actnum",
- error: "请输入实际分装数量",
- })
- isValid = false;
- }
- }
- }
- }
- return {valid: isValid,error:"质量分装数据没填完"};
- },
- resetErrors() {
- // 重置表单错误状态
- Object.keys(this.formErrors).forEach(key => {
- this.formErrors[key] = false;
- });
-
- // 重置分装列表错误状态
- this.fzListErrors.forEach((_, index) => {
- this.fzListErrors = []
- });
- },
- // 分装数量失去焦点时,根据数量生成分装列表
- async onBlurFzsl(e) {
- // 清除当前字段的错误状态
- if (e) {
- this.formErrors.fzsl = false;
- }
- // 清空现有列表
- this.fzList = [];
- this.fzListErrors = [];
- const result = await getLatestSn({
- pre: this.formData.mybh,
- count: e,
- type: 2,
- })
- if(result.code === 200){
- const codes = result.data;
- // 根据输入的数量生成新列表
- for (let i = 0; i < e; i++) {
- this.fzList.push({
- prenum: "",
- actnum: "",
- subCode: codes[i],
- });
- }
- const params = {
- type: "fieldChanged",
- newRecord: null,
- resourceList: null,
- }
- EventBus.$emit("onModifyRecord", params);
-
- }
-
- },
- onGetValue(item) {
- item.actnum = 123;
- console.log(item,"获取值")
- this.fzList = [...this.fzList]
- },
- onCommonBlur(e,field) {
- if (this.formData[field]) {
- this.formErrors[field] = false;
- }
- if(field === 'fzsl'){
- this.onBlurFzsl(e);
- }
- },
- onBlurFzNum(index, field) {
- if (this.fzList[index]) {
- // 确保fzListErrors数组有足够的元素
- if (this.fzListErrors.length <= index) {
- this.$set(this.fzListErrors, index, false);
- }
-
- if (this.fzList[index][field]) {
- // 有值的话就清空对应的错误信息
- this.$set(this.fzListErrors, index, false);
- } else {
- // 没有值的话就边框标红
- this.$set(this.fzListErrors, index, true);
- }
- }
- },
- verifyFzListError(index, field) {
- // 如果index和field都为空,就全匹配
- if (index === undefined && field === undefined) {
- if (this.fzList && this.fzList.length > 0) {
- // 清空现有错误信息
- this.fzListErrors = [];
-
- // 遍历fzList,没有值的就放到fzListErrors里面
- for (let i = 0; i < this.fzList.length; i++) {
- const item = this.fzList[i];
- if (isValueEmpty(item.prenum)) {
- this.fzListErrors.push({
- rowIndex: i,
- field: "prenum",
- error: "请输入预填分装数量"
- });
- }
- if (isValueEmpty(item.actnum)) {
- this.fzListErrors.push({
- rowIndex: i,
- field: "actnum",
- error: "请输入实际分装数量"
- });
- }
- }
- }
- } else if (index !== undefined) {
- // 如果index不为空,检查指定索引的项
- if (this.fzList[index]) {
- const item = this.fzList[index];
-
- if (field === undefined) {
- // 如果field为空,检查prenum和actnum
- // 先移除该索引的所有错误信息
- this.fzListErrors = this.fzListErrors.filter(err => err.rowIndex !== index);
-
- // 没有值的就放到fzListErrors里面
- if (isValueEmpty(item.prenum)) {
- this.fzListErrors.push({
- rowIndex: index,
- field: "prenum",
- error: "请输入预填分装数量"
- });
- }
- if (isValueEmpty(item.actnum)) {
- this.fzListErrors.push({
- rowIndex: index,
- field: "actnum",
- error: "请输入实际分装数量"
- });
- }
- } else {
- // 如果field不为空,检查指定字段
- // 先移除该索引和字段的错误信息
- this.fzListErrors = this.fzListErrors.filter(err => !(err.rowIndex === index && err.field === field));
-
- // 没有值的就放到fzListErrors里面
- if (isValueEmpty(item[field])) {
- this.fzListErrors.push({
- rowIndex: index,
- field: field,
- error: field === "prenum" ? "请输入预填分装数量" : "请输入实际分装数量"
- });
- }
- }
- }
- }
- },
-
- hasError(index, field) {
- const o = this.fzListErrors.find((item)=>{
- return item.rowIndex === index && item.field === field;
- })
- return o !== undefined;
- },
- // 数据变化处理方法
- onDataChange() {
- // 触发自定义事件,将数据变化传递给父组件
- this.$emit('update', {
- formData: this.formData,
- fzList: this.fzList
- });
- },
- }
- }
- </script>
-
- <style lang="scss" scoped>
- .zl-container{
- // width: 1100px;
- }
- .dialog-content {
- // padding: 20px;
- }
- .ml-5{
- margin-left: 5px;
- }
- .unit-select {
- width: 100px;
- }
-
- .content-item {
- display: flex;
- align-items: center;
- }
-
- .header-container {
- display: grid;
- grid-template-columns: 1fr 1fr 1fr;
- grid-gap: 20px;
- margin-top: 10px;
- }
-
- .header-item {
- // box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
- background: #fff;
- border-radius: 4px;
- display: flex;
- align-items: center;
- // padding: 20px;
- }
-
- .header-title {
- // margin-bottom: 10px;
- margin-right: 5px;
- }
-
- .content-container {
- margin-top: 10px;
- // padding: 20px;
- // box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
- // max-height: 50vh;
- overflow: auto;
- }
-
- .ml-20 {
- margin-left: 20px;
- }
-
- .list-item {
- display: flex;
- align-items: center;
- // margin-top: 20px;
- }
-
- .list-label {
- margin-right: 5px;
- // width: 200px;
- }
- </style>
|