浏览代码

Merge branch 'dev' of http://36.137.93.232:3000/hf/byte-sailing-mobile into dev

cz 1 年之前
父节点
当前提交
84b6428691
共有 4 个文件被更改,包括 207 次插入409 次删除
  1. 133 395
      src/components/testForm/index.vue
  2. 3 1
      src/lang/cn.js
  3. 2 0
      src/lang/cnLXF.js
  4. 69 13
      src/views/processApproval/components/Contract.vue

+ 133 - 395
src/components/testForm/index.vue

@@ -7,14 +7,9 @@
       :label-width="formOption.labelWidth"
       :label-align="formOption.labelAlign || 'top'"
       :scroll-to-error="formOption.scroll"
-      ref="testForm"
-    >
+      ref="testForm">
       <van-cell-group inset>
-        <div
-          v-for="(i, index) in formConfig"
-          :key="index"
-          :style="i.style || ''"
-        >
+        <div v-for="(i, index) in formConfig" :key="index" :style="i.style || ''">
           <van-field v-if="i.type == 'title'" style="background: #ecebeb">
             <template #input>
               <div class="_title">
@@ -35,69 +30,32 @@
             :required="getRequired(i.prop)"
             :right-icon="i.isNeedRightBtn ? i.rightIcon : ''"
             @click-right-icon="i.isNeedRightBtn ? i.rightIconClick() : () => {}"
-            @blur="
-              i.isNeedBlurMethon ? i.blurMethon(formData[i.prop]) : () => {}
-            "
+            @blur="i.isNeedBlurMethon ? i.blurMethon(formData[i.prop]) : () => {}"
             @input="
               () => {
                 return i.inputFn ? i.inputFn(formData[i.prop]) : () => {};
               }
-            "
-          >
+            ">
           </van-field>
           <!-- switch -->
-          <van-field
-            v-if="i.type == 'switch'"
-            :label="i.label"
-            :name="i.prop"
-            :required="getRequired(i.prop)"
-          >
+          <van-field v-if="i.type == 'switch'" :label="i.label" :name="i.prop" :required="getRequired(i.prop)">
             <template #input>
               <van-switch v-model="formData[i.prop]" />
             </template>
           </van-field>
           <!-- 多选checkbox -->
-          <van-field
-            v-if="i.type == 'checkbox'"
-            :label="i.label"
-            :name="i.prop"
-            :rules="getRules(i.prop)"
-            :required="getRequired(i.prop)"
-          >
+          <van-field v-if="i.type == 'checkbox'" :label="i.label" :name="i.prop" :rules="getRules(i.prop)" :required="getRequired(i.prop)">
             <template #input>
-              <van-checkbox-group
-                v-model="formData[i.prop]"
-                direction="horizontal"
-              >
-                <van-checkbox
-                  shape="square"
-                  v-for="j in i.data"
-                  :key="j.value"
-                  :name="j.value"
-                  >{{ j.text }}</van-checkbox
-                >
+              <van-checkbox-group v-model="formData[i.prop]" direction="horizontal">
+                <van-checkbox shape="square" v-for="j in i.data" :key="j.value" :name="j.value">{{ j.text }}</van-checkbox>
               </van-checkbox-group>
             </template>
           </van-field>
           <!-- 单选radio -->
-          <van-field
-            v-if="i.type == 'radio'"
-            :label="i.label"
-            :name="i.prop"
-            :rules="getRules(i.prop)"
-            :required="getRequired(i.prop)"
-          >
+          <van-field v-if="i.type == 'radio'" :label="i.label" :name="i.prop" :rules="getRules(i.prop)" :required="getRequired(i.prop)">
             <template #input>
-              <van-radio-group
-                v-model="formData[i.prop]"
-                direction="horizontal"
-              >
-                <van-radio
-                  v-for="j in i.data"
-                  :key="j.value"
-                  :name="j.value || j.id"
-                  >{{ j.label || j.title }}</van-radio
-                >
+              <van-radio-group v-model="formData[i.prop]" direction="horizontal">
+                <van-radio v-for="j in i.data" :key="j.value" :name="j.value || j.id">{{ j.label || j.title }}</van-radio>
               </van-radio-group>
             </template>
           </van-field>
@@ -111,33 +69,16 @@
             is-link
             :readonly="true"
             :placeholder="i.placeholder ? i.placeholder : '请选择'"
-            @click="
-              () =>
-                formOption.readonly || i.readonly ? '' : (i.showPicker = true)
-            "
+            @click="() => (formOption.readonly || i.readonly ? '' : (i.showPicker = true))"
             :rules="getRules(i.prop)"
-            :required="getRequired(i.prop)"
-          >
+            :required="getRequired(i.prop)">
           </van-field>
-          <van-popup
-            v-model:show="i.showPicker"
-            round
-            position="bottom"
-            v-if="i.type == 'picker' && i.itemType == 'onePicker'"
-          >
+          <van-popup v-model:show="i.showPicker" round position="bottom" v-if="i.type == 'picker' && i.itemType == 'onePicker'">
             <van-picker
               :columns="i.data"
-              :columns-field-names="
-                i.fieldNames ? i.fieldNames : onePickerFieldNames
-              "
+              :columns-field-names="i.fieldNames ? i.fieldNames : onePickerFieldNames"
               @cancel="i.showPicker = false"
-              @confirm="
-                (option) =>
-                  i.changeFn
-                    ? i.changeFn(option, i, index)
-                    : onConfirmPicker(option, i, index)
-              "
-            />
+              @confirm="(option) => (i.changeFn ? i.changeFn(option, i, index) : onConfirmPicker(option, i, index))" />
           </van-popup>
           <!-- 多选 -->
           <van-field
@@ -151,29 +92,16 @@
             :placeholder="i.placeholder ? i.placeholder : '请选择'"
             @click="() => (!formOption.readonly ? (i.showPicker = true) : '')"
             :rules="getRules(i.prop)"
-            :required="getRequired(i.prop)"
-          >
+            :required="getRequired(i.prop)">
           </van-field>
           <van-popup
             v-model:show="i.showPicker"
             round
             position="bottom"
             :style="{ height: '40%' }"
-            v-if="i.type == 'multipleChoice' && i.itemType == 'multiple'"
-          >
-            <van-checkbox-group
-              v-model="formData[i.prop]"
-              @change="
-                changeCheckboxGroup(formData, i.prop, i.data, i.fieldNames)
-              "
-              class="multipleChoice"
-            >
-              <van-checkbox
-                v-for="item in i.data"
-                :key="item.value"
-                :name="item.value"
-                >{{ item.text }}</van-checkbox
-              >
+            v-if="i.type == 'multipleChoice' && i.itemType == 'multiple'">
+            <van-checkbox-group v-model="formData[i.prop]" @change="changeCheckboxGroup(formData, i.prop, i.data, i.fieldNames)" class="multipleChoice">
+              <van-checkbox v-for="item in i.data" :key="item.value" :name="item.value">{{ item.text }}</van-checkbox>
             </van-checkbox-group>
           </van-popup>
           <!-- 时间选择器 -->
@@ -187,22 +115,15 @@
             :placeholder="i.placeholder ? i.placeholder : '请选择'"
             @click="() => (!formOption.readonly ? (i.showPicker = true) : '')"
             :rules="getRules(i.prop)"
-            :required="getRequired(i.prop)"
-          >
+            :required="getRequired(i.prop)">
           </van-field>
-          <van-popup
-            v-model:show="i.showPicker"
-            round
-            position="bottom"
-            v-if="i.type == 'picker' && i.itemType == 'datePicker'"
-          >
+          <van-popup v-model:show="i.showPicker" round position="bottom" v-if="i.type == 'picker' && i.itemType == 'datePicker'">
             <van-date-picker
               @confirm="(option) => onConfirmPicker(option, i, index)"
               @cancel="i.showPicker = false"
               :min-date="i.minDate"
               :max-date="i.maxDate"
-              :columns-type="i.columnsType"
-            />
+              :columns-type="i.columnsType" />
           </van-popup>
           <!-- 时间选择器 带时分秒 -->
 
@@ -216,28 +137,12 @@
             :placeholder="i.placeholder ? i.placeholder : '请选择'"
             @click="() => (!formOption.readonly ?i.needDefault? defaultTimeFn(i, index) :i.showPicker=true: '')"
             :rules="getRules(i.prop)"
-            :required="getRequired(i.prop)"
-          >
+            :required="getRequired(i.prop)">
           </van-field>
-          <van-popup
-            v-model:show="i.showPicker"
-            round
-            position="bottom"
-            v-if="i.type == 'picker' && i.itemType == 'datePickerTime'"
-          >
-            <van-picker-group
-              :tabs="['日期', '时间']"
-              @confirm="() => datePickerTimeConfirm(i, index)"
-              @cancel="i.showPicker = false"
-            >
-              <van-date-picker
-                v-model="datePickerDateArr"
-                :columns-type="i.columnsType"
-              />
-              <van-time-picker
-                v-model="datePickerTimeArr"
-                :columns-type="['hour', 'minute', 'second']"
-              />
+          <van-popup v-model:show="i.showPicker" round position="bottom" v-if="i.type == 'picker' && i.itemType == 'datePickerTime'">
+            <van-picker-group :tabs="['日期', '时间']" @confirm="() => datePickerTimeConfirm(i, index)" @cancel="i.showPicker = false">
+              <van-date-picker v-model="datePickerDateArr" :columns-type="i.columnsType" />
+              <van-time-picker v-model="datePickerTimeArr" :columns-type="['hour', 'minute', 'second']" />
             </van-picker-group>
           </van-popup>
           <!-- 级联 城市 -->
@@ -251,25 +156,15 @@
             :placeholder="i.placeholder ? i.placeholder : '请选择'"
             @click="() => (!formOption.readonly ? (i.showPicker = true) : '')"
             :rules="getRules(i.prop)"
-            :required="getRequired(i.prop)"
-          />
-          <van-popup
-            v-if="i.type == 'cascader' && i.itemType == 'city'"
-            v-model:show="i.showPicker"
-            round
-            position="bottom"
-          >
+            :required="getRequired(i.prop)" />
+          <van-popup v-if="i.type == 'cascader' && i.itemType == 'city'" v-model:show="i.showPicker" round position="bottom">
             <van-cascader
               v-model="formData[i.prop]"
               :title="i.title ? i.title : '请选择'"
               :options="cityOption"
               @close="i.showPicker = false"
               @change="(option) => cityOnChange(option, i, index)"
-              @finish="
-                (option) =>
-                  i.finishFn ? i.finishFn(option) : () => (i.showPicker = false)
-              "
-            />
+              @finish="(option) => (i.finishFn ? i.finishFn(option) : () => (i.showPicker = false))" />
           </van-popup>
           <!-- 级联 公共 -->
           <van-field
@@ -282,14 +177,8 @@
             :placeholder="i.placeholder ? i.placeholder : '请选择'"
             @click="() => (!formOption.readonly ? (i.showPicker = true) : '')"
             :rules="getRules(i.prop)"
-            :required="getRequired(i.prop)"
-          />
-          <van-popup
-            v-if="i.type == 'cascader' && i.itemType == 'common'"
-            v-model:show="i.showPicker"
-            round
-            position="bottom"
-          >
+            :required="getRequired(i.prop)" />
+          <van-popup v-if="i.type == 'cascader' && i.itemType == 'common'" v-model:show="i.showPicker" round position="bottom">
             <van-cascader
               v-model="formData[i.prop]"
               :title="i.title ? i.title : '请选择'"
@@ -297,37 +186,16 @@
               :field-names="i.fieldNames ? i.fieldNames : fieldNames"
               @close="i.showPicker = false"
               @change="(option) => commonOnChange(option, i, index)"
-              @finish="
-                (option) =>
-                  i.finishFn ? i.finishFn(i, option) : handleCommonFinish(index)
-              "
-            />
+              @finish="(option) => (i.finishFn ? i.finishFn(i, option) : handleCommonFinish(index))" />
           </van-popup>
           <!-- 文件上传 -->
-          <van-field
-            name="uploader"
-            v-if="i.type == 'upload'"
-            :label="i.label"
-            :readonly="i.readonly ? true : false"
-          >
+          <van-field name="uploader" v-if="i.type == 'upload'" :label="i.label" :readonly="i.readonly ? true : false">
             <template #input>
-              <van-uploader
-                v-model="formData[i.prop]"
-                :after-read="afterRead"
-                multiple
-                :max-count="9"
-                :max-size="5 * 1024 * 1024"
-                @oversize="onOversize"
-              />
+              <van-uploader v-model="formData[i.prop]" :after-read="afterRead" multiple :max-count="9" :max-size="5 * 1024 * 1024" @oversize="onOversize" />
             </template>
           </van-field>
           <!-- 插槽 -->
-          <van-field
-            v-if="i.type == 'slot'"
-            :label="i.label"
-            :rules="getRules(i.prop)"
-            :required="getRequired(i.prop)"
-          >
+          <van-field v-if="i.type == 'slot'" :label="i.label" :rules="getRules(i.prop)" :required="getRequired(i.prop)">
             <template #input>
               <div style="width: 100%">
                 <slot :name="i.slotName"> {{ i.slotName }}插槽占位符 </slot>
@@ -337,11 +205,7 @@
         </div>
       </van-cell-group>
       <!-- 循环业务数据 -->
-      <van-cell-group
-        inset
-        v-for="(item, index) in formData[btnConfigCopy.prop]"
-        :key="index"
-      >
+      <van-cell-group inset v-for="(item, index) in formData[btnConfigCopy.prop]" :key="index">
         <div class="row">
           <div>{{ btnConfigCopy.listTitle || "明细" }}{{ index + 1 }}</div>
           <van-button
@@ -350,9 +214,7 @@
             @click="handleRemove(index, btnConfigCopy)"
             size="mini"
             style="border: none; background: #ecebeb"
-            v-if="
-              formOption.btnConfig !== undefined && formOption.btnConfig.isNeed
-            "
+            v-if="formOption.btnConfig !== undefined && formOption.btnConfig.isNeed"
             >删除</van-button
           >
         </div>
@@ -373,8 +235,7 @@
               (val) => {
                 return i.changeFn ? i.changeFn(index, val) : () => {};
               }
-            "
-          >
+            ">
           </van-field>
           <!-- 单选 -->
           <van-field
@@ -387,22 +248,14 @@
             :placeholder="i.placeholder ? i.placeholder : '请选择'"
             @click="handleListItemClick(i, index, sonIndex)"
             :rules="getRules(i.prop)"
-            :required="getRequired(i.prop)"
-          >
+            :required="getRequired(i.prop)">
             <template #input v-if="i.isShowScanCode">
               <div style="display: flex; height: 24px">
                 <div style="width: calc(100vw - 100px)">
                   {{ formData[btnConfigCopy.prop][index][i.prop + "Name"] }}
                 </div>
                 <div style="width: 100px; float: right; margin-top: -20px">
-                  <van-button
-                    plain
-                    type="primary"
-                    @click.native.stop="i.scanCode(index)"
-                    size="mini"
-                    style="border: none"
-                    >扫码</van-button
-                  >
+                  <van-button plain type="primary" @click.native.stop="i.scanCode(index)" size="mini" style="border: none">扫码</van-button>
                 </div>
               </div>
             </template>
@@ -418,71 +271,44 @@
             :placeholder="i.placeholder ? i.placeholder : '请选择'"
             @click="handleListItemClick(i, index, sonIndex)"
             :rules="getRules(i.prop)"
-            :required="getRequired(i.prop)"
-          >
+            :required="getRequired(i.prop)">
           </van-field>
         </div>
       </van-cell-group>
       <!-- 单独写个循环,保证弹窗唯一 -->
       <div v-for="(item, index) in btnConfigCopy.listConfig" :key="index">
-        <van-popup
-          v-model:show="item.showPicker"
-          round
-          position="bottom"
-          v-if="item.type == 'picker' && item.itemType == 'onePicker'"
-        >
+        <van-popup v-model:show="item.showPicker" round position="bottom" v-if="item.type == 'picker' && item.itemType == 'onePicker'">
           <van-picker
             :columns="item.data"
-            :columns-field-names="
-              item.fieldNames ? item.fieldNames : onePickerFieldNames
-            "
+            :columns-field-names="item.fieldNames ? item.fieldNames : onePickerFieldNames"
             @cancel="item.showPicker = false"
             @confirm="
-              (option) =>
-                item.changeFn
-                  ? item.changeFn(option, item, currentIndex, currentSonIndex, btnConfigCopy.prop)
-                  : onConfirmListPicker(option, item)
-            "
-          />
+              (option) => (item.changeFn ? item.changeFn(option, item, currentIndex, currentSonIndex, btnConfigCopy.prop) : onConfirmListPicker(option, item))
+            " />
           <!-- @confirm="(option) => onConfirmListPicker(option, item)"  -->
         </van-popup>
-        <van-popup
-          v-model:show="item.showPicker"
-          round
-          position="bottom"
-          v-if="item.type == 'picker' && item.itemType == 'datePicker'"
-        >
+        <van-popup v-model:show="item.showPicker" round position="bottom" v-if="item.type == 'picker' && item.itemType == 'datePicker'">
           <van-date-picker
             @confirm="(option) => onConfirmListPicker(option, item)"
             @cancel="item.showPicker = false"
             :min-date="item.minDate"
             :max-date="item.maxDate"
-            :columns-type="item.columnsType"
-          />
+            :columns-type="item.columnsType" />
         </van-popup>
       </div>
 
       <!-- 按钮 -->
-      <div
-        class="btn-box"
-        v-if="formOption.btnConfig !== undefined && formOption.btnConfig.isNeed"
-      >
+      <div class="btn-box" v-if="formOption.btnConfig !== undefined && formOption.btnConfig.isNeed">
         <van-button
           :plain="btnConfigCopy.plain ? btnConfigCopy.plain : false"
           :type="btnConfigCopy.itemType ? btnConfigCopy.itemType : 'primary'"
           :size="btnConfigCopy.size ? btnConfigCopy.size : 'small'"
           style="width: 100%; border: none"
-          @click="handlePush()"
-        >
+          @click="handlePush()">
           <template #icon>
-            <van-icon
-              :name="btnConfigCopy.icon ? btnConfigCopy.icon : 'plus'"
-              :size="12"
-            />
+            <van-icon :name="btnConfigCopy.icon ? btnConfigCopy.icon : 'plus'" :size="12" />
           </template>
-          {{
-            btnConfigCopy.btnName ? btnConfigCopy.btnName : "添加"
-          }}</van-button
+          {{ btnConfigCopy.btnName ? btnConfigCopy.btnName : "添加" }}</van-button
         >
       </div>
       <div style="margin: 16px" v-show="!formOption.hiddenSubmitBtn">
@@ -503,17 +329,8 @@
 import { showLoadingToast, closeToast, showNotify } from "vant";
 import { formatDate } from "@/utils/auth";
 
-import {
-  ref,
-  getCurrentInstance,
-  onMounted,
-  reactive,
-  computed,
-  toRefs,
-  watch,
-  defineExpose,
-} from "vue";
-const submitBtn = ref(null)
+import { ref, getCurrentInstance, onMounted, reactive, computed, toRefs, watch, defineExpose } from "vue";
+const submitBtn = ref(null);
 const props = defineProps({
   modelValue: {
     type: Object,
@@ -612,20 +429,14 @@ const recursionFn = (arr, val, valueAtt, childrenAtt) => {
 };
 const selectDataEcho = (item, val) => {
   if (item.type === "picker" && item.itemType === "onePicker") {
-    const textAtt = item.fieldNames
-      ? item.fieldNames.text
-      : onePickerFieldNames.text;
-    const valueAtt = item.fieldNames
-      ? item.fieldNames.value
-      : onePickerFieldNames.value;
+    const textAtt = item.fieldNames ? item.fieldNames.text : onePickerFieldNames.text;
+    const valueAtt = item.fieldNames ? item.fieldNames.value : onePickerFieldNames.value;
     const current = item.data.find((x) => x[valueAtt] === val);
     return current ? current[textAtt] : "";
   } else if (item.type === "cascader" && item.itemType === "common") {
     const textAtt = item.fieldNames ? item.fieldNames.text : fieldNames.text;
     const valueAtt = item.fieldNames ? item.fieldNames.value : fieldNames.value;
-    const childrenAtt = item.fieldNames
-      ? item.fieldNames.children
-      : fieldNames.children;
+    const childrenAtt = item.fieldNames ? item.fieldNames.children : fieldNames.children;
     const arr = item.data ? item.data : [];
     const current = recursionFn(arr, val, valueAtt, childrenAtt);
     return current ? current[textAtt] : "";
@@ -642,11 +453,7 @@ const formDataListShowLabel = () => {
       const jele = btnConfigCopy.listConfig[j];
       if (jele.type === "picker" && jele.itemType !== "datePicker") {
         if (jele.data && jele.data.length > 0) {
-          formData.value[btnConfigCopy.prop][i][jele.prop + "Name"] =
-            selectDataEcho(
-              jele,
-              formData.value[btnConfigCopy.prop][i][jele.prop]
-            );
+          formData.value[btnConfigCopy.prop][i][jele.prop + "Name"] = selectDataEcho(jele, formData.value[btnConfigCopy.prop][i][jele.prop]);
         } else {
           if (callListNum.value <= 3) {
             setTimeout(() => {
@@ -666,11 +473,7 @@ const formDataListShowLabelOne = () => {
       const jele = btnConfigCopy.listConfig[j];
       if (jele.type === "picker" && jele.itemType !== "datePicker") {
         if (jele.data && jele.data.length > 0) {
-          formData.value[btnConfigCopy.prop][i][jele.prop + "Name"] =
-            selectDataEcho(
-              jele,
-              formData.value[btnConfigCopy.prop][i][jele.prop]
-            );
+          formData.value[btnConfigCopy.prop][i][jele.prop + "Name"] = selectDataEcho(jele, formData.value[btnConfigCopy.prop][i][jele.prop]);
         }
       }
     }
@@ -682,10 +485,7 @@ const formDataShowLabel = () => {
     const element = formConfig.value[i];
     if (element.type === "picker" && element.itemType !== "datePicker") {
       if (element.data && element.data.length > 0) {
-        formData.value[element.prop + "Name"] = selectDataEcho(
-          element,
-          formData.value[element.prop]
-        );
+        formData.value[element.prop + "Name"] = selectDataEcho(element, formData.value[element.prop]);
       } else {
         if (callNum.value <= 3) {
           setTimeout(() => {
@@ -697,10 +497,7 @@ const formDataShowLabel = () => {
       }
     } else if (element.type === "cascader" && element.itemType === "common") {
       if (element.data && element.data.length > 0) {
-        formData.value[element.prop + "Name"] = selectDataEcho(
-          element,
-          formData.value[element.prop]
-        );
+        formData.value[element.prop + "Name"] = selectDataEcho(element, formData.value[element.prop]);
       } else {
         if (callNum.value <= 3) {
           setTimeout(() => {
@@ -719,17 +516,11 @@ const formDataShowLabelOne = () => {
     const element = formConfig.value[i];
     if (element.type === "picker" && element.itemType !== "datePicker") {
       if (element.data && element.data.length > 0) {
-        formData.value[element.prop + "Name"] = selectDataEcho(
-          element,
-          formData.value[element.prop]
-        );
+        formData.value[element.prop + "Name"] = selectDataEcho(element, formData.value[element.prop]);
       }
     } else if (element.type === "cascader" && element.itemType === "common") {
       if (element.data && element.data.length > 0) {
-        formData.value[element.prop + "Name"] = selectDataEcho(
-          element,
-          formData.value[element.prop]
-        );
+        formData.value[element.prop + "Name"] = selectDataEcho(element, formData.value[element.prop]);
       }
     }
   }
@@ -747,10 +538,7 @@ const formDataInit = () => {
     upload: [],
   };
   // 判断是否需要按钮
-  if (
-    formOption.value.btnConfig &&
-    Object.keys(formOption.value.btnConfig).length > 0
-  ) {
+  if (formOption.value.btnConfig && Object.keys(formOption.value.btnConfig).length > 0) {
     btnConfigCopy = { ...formOption.value.btnConfig };
     if (formData.value[btnConfigCopy.prop] === undefined) {
       formData.value[btnConfigCopy.prop] = [];
@@ -760,20 +548,13 @@ const formDataInit = () => {
   let cityStatus = true;
   for (let i = 0; i < formConfig.value.length; i++) {
     const element = formConfig.value[i];
-    if (
-      element.type === "cascader" &&
-      element.itemType === "city" &&
-      cityStatus
-    ) {
+    if (element.type === "cascader" && element.itemType === "city" && cityStatus) {
       cityStatus = false;
       cityOptionInit();
       // formData.value[element.prop] = map[element.type];
       // formData.value[element.prop + "Name"] = map[element.type];
     }
-    if (
-      formData.value[element.prop] === undefined ||
-      formData.value[element.prop] === ""
-    ) {
+    if (formData.value[element.prop] === undefined || formData.value[element.prop] === "") {
       if (element.type === "slot") {
         continue;
       } else if (element.type === "picker" || element.type === "cascader") {
@@ -797,24 +578,12 @@ const onConfirmPicker = (option, item, index) => {
   if (option.selectedOptions[0]) {
     switch (item.itemType) {
       case "onePicker": {
-        formData.value[item.prop + "Name"] =
-          option.selectedOptions[0][
-            item.fieldNames.text
-              ? item.fieldNames.text
-              : onePickerFieldNames.text
-          ];
-        formData.value[item.prop] =
-          option.selectedOptions[0][
-            item.fieldNames.value
-              ? item.fieldNames.value
-              : onePickerFieldNames.value
-          ];
+        formData.value[item.prop + "Name"] = option.selectedOptions[0][item.fieldNames.text ? item.fieldNames.text : onePickerFieldNames.text];
+        formData.value[item.prop] = option.selectedOptions[0][item.fieldNames.value ? item.fieldNames.value : onePickerFieldNames.value];
         formConfig.value[index].showPicker = false;
       }
       case "datePicker": {
-        formData.value[item.prop] = option.selectedValues.join(
-          item.split ? item.split : "-"
-        );
+        formData.value[item.prop] = option.selectedValues.join(item.split ? item.split : "-");
         formConfig.value[index].showPicker = false;
       }
     }
@@ -840,23 +609,14 @@ const handleListItemClick = (i, index, sonIndex) => {
 const onConfirmListPicker = (option, item) => {
   switch (item.itemType) {
     case "onePicker": {
-      formData.value[btnConfigCopy.prop][currentIndex.value][
-        item.prop + "Name"
-      ] =
-        option.selectedOptions[0][
-          item.fieldNames.text ? item.fieldNames.text : onePickerFieldNames.text
-        ];
+      formData.value[btnConfigCopy.prop][currentIndex.value][item.prop + "Name"] =
+        option.selectedOptions[0][item.fieldNames.text ? item.fieldNames.text : onePickerFieldNames.text];
       formData.value[btnConfigCopy.prop][currentIndex.value][item.prop] =
-        option.selectedOptions[0][
-          item.fieldNames.value
-            ? item.fieldNames.value
-            : onePickerFieldNames.value
-        ];
+        option.selectedOptions[0][item.fieldNames.value ? item.fieldNames.value : onePickerFieldNames.value];
       btnConfigCopy.listConfig[currentSonIndex.value].showPicker = false;
     }
     case "datePicker": {
-      formData.value[btnConfigCopy.prop][currentIndex.value][item.prop] =
-        option.selectedValues.join(item.split ? item.split : "-");
+      formData.value[btnConfigCopy.prop][currentIndex.value][item.prop] = option.selectedValues.join(item.split ? item.split : "-");
       btnConfigCopy.listConfig[currentSonIndex.value].showPicker = false;
     }
   }
@@ -879,72 +639,55 @@ const handleRemove = (index, item) => {
 // 拉去城市最近数据及处理
 const getAreaInfo = (selectedOptions, item, index) => {
   showLoadingToast("加载中...");
-  proxy
-    .post("/customizeArea/list", { parentId: selectedOptions.value })
-    .then((res) => {
-      let countryIndex = selectedOptions.selectedOptions[0].index;
-      let provinceIndex =
-        selectedOptions.tabIndex === 1
-          ? selectedOptions.selectedOptions[1].index
-          : null;
-      let cityIndex =
-        selectedOptions.tabIndex === 2
-          ? selectedOptions.selectedOptions[2].index
-          : null;
-      //已经没有下级数据
-      if (res.data.length === 0) {
-        if (selectedOptions.tabIndex === 1) {
-          formData.value[item.prop + "Name"] = selectedOptions.selectedOptions
-            .map((item) => item.text)
-            .join(" ");
-          formConfig.value[index].showPicker = false;
-          formData.value.cityObj = selectedOptions;
-          return;
-        }
-      }
-      if (selectedOptions.tabIndex === 2) {
-        formData.value[item.prop + "Name"] = selectedOptions.selectedOptions
-          .map((item) => item.text)
-          .join(" ");
+  proxy.post("/customizeArea/list", { parentId: selectedOptions.value }).then((res) => {
+    let countryIndex = selectedOptions.selectedOptions[0].index;
+    let provinceIndex = selectedOptions.tabIndex === 1 ? selectedOptions.selectedOptions[1].index : null;
+    let cityIndex = selectedOptions.tabIndex === 2 ? selectedOptions.selectedOptions[2].index : null;
+    //已经没有下级数据
+    if (res.data.length === 0) {
+      if (selectedOptions.tabIndex === 1) {
+        formData.value[item.prop + "Name"] = selectedOptions.selectedOptions.map((item) => item.text).join(" ");
         formConfig.value[index].showPicker = false;
         formData.value.cityObj = selectedOptions;
         return;
       }
-      if (selectedOptions.tabIndex === 0) {
-        cityOption.value[countryIndex].children = res.data.map(
-          (item, index) => {
-            return {
-              ...item,
-              index: index,
-              text: item.name,
-              value: item.id,
-            };
-          }
-        );
-      } else if (selectedOptions.tabIndex === 1) {
-        cityOption.value[countryIndex].children[provinceIndex].children =
-          res.data.map((item, index) => {
-            return {
-              ...item,
-              index: index,
-              text: item.name,
-              value: item.id,
-            };
-          });
-      } else if (selectedOptions.tabIndex === 2) {
-        cityOption.value[countryIndex].children[provinceIndex].children[
-          cityIndex
-        ].children = res.data.map((item, index) => {
-          return {
-            ...item,
-            index: index,
-            text: item.name,
-            value: item.id,
-          };
-        });
-      }
-      closeToast();
-    });
+    }
+    if (selectedOptions.tabIndex === 2) {
+      formData.value[item.prop + "Name"] = selectedOptions.selectedOptions.map((item) => item.text).join(" ");
+      formConfig.value[index].showPicker = false;
+      formData.value.cityObj = selectedOptions;
+      return;
+    }
+    if (selectedOptions.tabIndex === 0) {
+      cityOption.value[countryIndex].children = res.data.map((item, index) => {
+        return {
+          ...item,
+          index: index,
+          text: item.name,
+          value: item.id,
+        };
+      });
+    } else if (selectedOptions.tabIndex === 1) {
+      cityOption.value[countryIndex].children[provinceIndex].children = res.data.map((item, index) => {
+        return {
+          ...item,
+          index: index,
+          text: item.name,
+          value: item.id,
+        };
+      });
+    } else if (selectedOptions.tabIndex === 2) {
+      cityOption.value[countryIndex].children[provinceIndex].children[cityIndex].children = res.data.map((item, index) => {
+        return {
+          ...item,
+          index: index,
+          text: item.name,
+          value: item.id,
+        };
+      });
+    }
+    closeToast();
+  });
 };
 // 城市变动事件
 const cityOnChange = (options, item, index) => {
@@ -953,8 +696,7 @@ const cityOnChange = (options, item, index) => {
 
 const commonOnChange = ({ selectedOptions }, item, index) => {
   const textAtt = item.fieldNames ? item.fieldNames.text : fieldNames.text;
-  formData.value[item.prop + "Name"] =
-    selectedOptions[selectedOptions.length - 1][textAtt];
+  formData.value[item.prop + "Name"] = selectedOptions[selectedOptions.length - 1][textAtt];
 };
 const handleCommonFinish = (index) => {
   formConfig.value[index].showPicker = false;
@@ -1045,12 +787,7 @@ watch(
 watch(
   () => formData.value[btnConfigCopy.prop],
   (val) => {
-    if (
-      formOption.value.btnConfig !== undefined &&
-      !formOption.value.btnConfig.isNeed &&
-      val &&
-      val.length > 0
-    ) {
+    if (formOption.value.btnConfig !== undefined && !formOption.value.btnConfig.isNeed && val && val.length > 0) {
       formDataListShowLabel();
     }
   }
@@ -1074,26 +811,27 @@ const changeCheckboxGroup = (form, label, data, fieldNames) => {
 const datePickerDateArr = ref([]);
 const datePickerTimeArr = ref([]);
 const datePickerTimeConfirm = (item, index) => {
-  formData.value[item.prop] =
-    datePickerDateArr.value.join("-") + " " + datePickerTimeArr.value.join(":");
+  formData.value[item.prop] = datePickerDateArr.value.join("-") + " " + datePickerTimeArr.value.join(":");
   formConfig.value[index].showPicker = false;
 };
 const defaultTimeFn = (item, index) => {
-  datePickerDateArr.value = formatDate(
-    new Date(formData.value[item.prop]),
-    "yyyy-MM-dd"
-  ).split("-");
-  datePickerTimeArr.value = formatDate(
-    new Date(formData.value[item.prop]),
-    "hh:mm:ss"
-  ).split(":");
+  datePickerDateArr.value = formatDate(new Date(formData.value[item.prop]), "yyyy-MM-dd").split("-");
+  datePickerTimeArr.value = formatDate(new Date(formData.value[item.prop]), "hh:mm:ss").split(":");
   formConfig.value[index].showPicker = true;
 };
+const validateForm = async () => {
+  try {
+    const flag = await testForm.value.validate();
+    return flag
+  } catch (err) {
+    return true;
+  }
+};
 defineExpose({
   formDataShowLabelOne,
   formDataListShowLabelOne,
   btnConfigCopy,
-  testForm,
+  validateForm,
 });
 // onMounted(() => {});
 </script>

+ 3 - 1
src/lang/cn.js

@@ -6,7 +6,7 @@ import { cnCZ } from './cnCZ.js'
 export const lang = {
 	common:{
 		//消息,工作台,物联网,我的,请输入关键词,添加没有更多了,释放即可刷新,下拉即可刷新,加载中,加载失败,加载完成,没有更多了,返回,提交,修改成功,新增成功,删除成功,确定,取消,提示,自动,手动,正常,运行,离线,明细,请选择,删除,添加明细,标题,请添加明细
-		//操作成功,产品明细,设备状态,正常,工作模式,自动,设备参数,型号,无匹配数据
+		//操作成功,产品明细,设备状态,正常,工作模式,自动,设备参数,型号,无匹配数据,选择日期,选择时间
 		message:'消息',
 		workbench:'工作台',
 		things:'物联网',
@@ -52,6 +52,8 @@ export const lang = {
 		minutesAgo:'分钟之前',
 		searchResults:'搜索结果',
 		noMatchingData:'无匹配数据',
+		selectDate: '选择日期',
+		selectTime: '选择时间',
 	},
 	processApproval:{
 		//流程办理,流程类型,流程标题,发起人

+ 2 - 0
src/lang/cnLXF.js

@@ -233,6 +233,8 @@ export function cnLXF() {
       shipmentTime: "出货日期",
       shipmentTimeMsg: "请选择出货日期",
       quantityShipment: "出货数量",
+      productRepeat: "商品选择重复",
+      pleaseAddProduct: "请添加商品",
     },
   };
   return cnLXF;

+ 69 - 13
src/views/processApproval/components/Contract.vue

@@ -26,7 +26,7 @@
       </div>
       <div class="common-process-card" v-show="active == 4">
         <div class="common-title">{{ proxy.t("contract.shipmentPlan") }}</div>
-        <testForm v-model="formData.data" :formOption="formShipmentOption" :formConfig="formEmptyConfig" :rules="rules" ref="formDom7"> </testForm>
+        <testForm v-model="formData.data" :formOption="formShipmentOption" :formConfig="formEmptyConfig" :rules="rulesTwo" ref="formDom7"> </testForm>
       </div>
     </van-tabs>
   </div>
@@ -37,6 +37,7 @@ import { ref, getCurrentInstance, onMounted, defineProps, defineExpose, watch, r
 import { useRoute } from "vue-router";
 import testForm from "@/components/testForm/index.vue";
 import { getUserInfo } from "@/utils/auth";
+import { showSuccessToast, showFailToast } from "vant";
 
 // 接收父组件的传值
 const props = defineProps({
@@ -300,7 +301,35 @@ const formGoodsOption = reactive({
         },
         data: [],
         changeFn: (val, data, index, indexTwo, propName) => {
-          proxy.formChangeTwo(val, data, index, indexTwo, propName, formData);
+          let selectList = formData.data[propName].filter((item, itemIndex) => item[data.prop] === val.selectedValues[0] && itemIndex !== index);
+          if (selectList && selectList.length > 0) {
+            return showFailToast(proxy.t("contract.productRepeat"));
+          }
+          formData.data[propName][index][data.prop] = val.selectedValues[0];
+          formData.data.contractShipmentList[index][data.prop] = val.selectedValues[0];
+          let list = data.data.filter((item) => item[data.fieldNames.value] == val.selectedValues[0]);
+          if (list && list.length > 0) {
+            formData.data[propName][index][data.prop + "Name"] = list[0][data.fieldNames.text];
+            let name = list[0].name;
+            if (list[0].standardJson) {
+              let standardJson = JSON.parse(list[0].standardJson);
+              if (standardJson && standardJson.englishName) {
+                name = standardJson.englishName;
+              }
+            }
+            formData.data[propName][index].productName = name;
+            formData.data[propName][index].productModel = list[0].spec;
+            formData.data.contractShipmentList[index].productName = name;
+          } else {
+            formData.data[propName][index][data.prop + "Name"] = "";
+          }
+          formData.data[propName][index].quantity = null;
+          formData.data[propName][index].price = null;
+          formData.data[propName][index].amount = null;
+          formData.data[propName][index].remark = null;
+          formData.data.contractShipmentList[index].shipmentTime = null;
+          formData.data.contractShipmentList[index].quantity = null;
+          formData.data.contractShipmentList[index].remark = null;
           data.showPicker = false;
         },
       },
@@ -639,7 +668,6 @@ const rules = {
   price: [{ required: true, message: proxy.t("contract.priceMsg") }],
   payName: [{ required: true, message: proxy.t("contract.chargeItemMsg") }],
   amount: [{ required: true, message: proxy.t("contract.amountMsg") }],
-  shipmentTime: [{ required: true, message: proxy.t("contract.shipmentTimeMsg") }],
 };
 const rulesTwo = {
   currency: [{ required: true, message: proxy.t("contract.currencyMsg") }],
@@ -703,16 +731,9 @@ const getDict = () => {
   proxy.post("/productInfo/page", { pageNum: 1, pageSize: 9999, definition: "1" }).then((res) => {
     if (res.data.rows && res.data.rows.length > 0) {
       formGoodsOption.btnConfig.listConfig[0].data = res.data.rows.map((item) => {
-        let name = item.name;
-        if (item.standardJson) {
-          let standardJson = JSON.parse(item.standardJson);
-          if (standardJson && standardJson.englishName) {
-            name = standardJson.englishName;
-          }
-        }
         return {
           ...item,
-          label: name,
+          label: item.name,
           value: item.id,
         };
       });
@@ -808,8 +829,43 @@ const handleChangeAmount = () => {
   formData.data.amountProject = amountProject;
 };
 const handleSubmit = async () => {
-  console.log(formDom1.value.testForm.submit());
-  // return formData.data;
+  const flag = await formDom1.value.validateForm().then((status) => {
+    if (status) {
+      active.value = 0;
+      return false;
+    } else {
+      if (!(formData.data.contractProductList && formData.data.contractProductList.length > 0)) {
+        active.value = 1;
+        showFailToast(proxy.t("contract.pleaseAddProduct"));
+        return false;
+      }
+      return formDom2.value.validateForm().then((status1) => {
+        if (status1) {
+          active.value = 1;
+          return false;
+        } else {
+          return formDom4.value.validateForm().then((status2) => {
+            if (status2) {
+              active.value = 2;
+              return false;
+            } else {
+              return formDom6.value.validateForm().then((status3) => {
+                if (status3) {
+                  active.value = 3;
+                  return false;
+                } else {
+                  return true;
+                }
+              });
+            }
+          });
+        }
+      });
+    }
+  });
+  if (flag) {
+    return formData.data;
+  }
 };
 watch(
   props.queryData,