Selaa lähdekoodia

部分oa审批功能

cz 1 vuosi sitten
vanhempi
commit
a5fafbb6f3

+ 131 - 121
src/components/testForm/index.vue

@@ -3,133 +3,137 @@
     <van-form @submit="onSubmit" :disabled="formOption.disabled" :readonly="formOption.readonly" :label-width="formOption.labelWidth"
               :label-align="formOption.labelAlign || 'top'" :scroll-to-error="formOption.scroll" ref="testForm">
       <van-cell-group inset>
-        <div v-for="(i, index) in formConfig" :key="index" :style="i.style || ''">
-          <van-field v-if="i.type == 'title'" style="border-bottom:1px solid #0084ff;width:45%">
-            <template #input>
-              <div class="_title">
-                <div class="line"></div>
-                <div> {{ i.title }}</div>
-              </div>
-            </template>
-          </van-field>
-          <van-field v-if="i.type == 'input'" v-model="formData[i.prop]" :label="i.label" :name="i.prop" :type="i.itemType ? i.itemType : 'text'"
-                     :placeholder="i.placeholder ? i.placeholder : '请输入'" :clearable="i.clearable ? i.clearable : false"
-                     :readonly="getFieldReadonly(i)" :rules="getRules(i)" :required="getRequired(i)" :right-icon="i.isNeedRightBtn ? i.rightIcon : ''"
-                     @click-right-icon="i.isNeedRightBtn ? i.rightIconClick() : () => {}"
-                     @blur="i.isNeedBlurMethon ? i.blurMethon(formData[i.prop]) : () => {}" @input="
+        <template v-for="(i, index) in formConfig" :key="index">
+          <div :style="i.style || ''" v-if="i.isShow!=undefined ? i.isShow :true">
+            <van-field v-if="i.type == 'title'" style="border-bottom:1px solid #0084ff;width:45%">
+              <template #input>
+                <div class="_title">
+                  <div class="line"></div>
+                  <div> {{ i.title }}</div>
+                </div>
+              </template>
+            </van-field>
+            <van-field v-if="i.type == 'input'" v-model="formData[i.prop]" :label="i.label" :name="i.prop" :type="i.itemType ? i.itemType : 'text'"
+                       :placeholder="i.placeholder ? i.placeholder : '请输入'" :clearable="i.clearable ? i.clearable : false"
+                       :readonly="getFieldReadonly(i)" :rules="getRules(i)" :required="getRequired(i)"
+                       :right-icon="i.isNeedRightBtn ? i.rightIcon : ''" @click-right-icon="i.isNeedRightBtn ? i.rightIconClick() : () => {}"
+                       @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)">
-            <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)" :required="getRequired(i)">
-            <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>
-            </template>
-          </van-field>
-          <!-- 单选radio -->
-          <van-field v-if="i.type == 'radio'" :label="i.label" :name="i.prop" :rules="getRules(i)" :required="getRequired(i)">
-            <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>
-            </template>
-          </van-field>
-          <!-- 单选 -->
-          <van-field v-if="i.type == 'picker' && i.itemType == 'onePicker'" v-show="!i.showStatus" :label="i.label" :name="i.prop"
-                     v-model="formData[i.prop + 'Name']" is-link :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
-                     @click="() => (formOption.readonly || i.readonly ? '' : (i.showPicker = true))" :rules="getRules(i)" :required="getRequired(i)">
-          </van-field>
-          <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" @cancel="i.showPicker = false"
-                        @confirm="(option) => (i.changeFn ? i.changeFn(option, i, index) : onConfirmPicker(option, i, index))" />
-          </van-popup>
-          <!-- 多选 -->
-          <van-field v-if="i.type == 'multipleChoice' && i.itemType == 'multiple'" v-show="!i.showStatus" :label="i.label" :name="i.prop"
-                     v-model="formData[i.prop + 'Name']" is-link :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
-                     @click="() => (!formOption.readonly ? (i.showPicker = true) : '')" :rules="getRules(i)" :required="getRequired(i)">
-          </van-field>
-          <van-popup v-model:show="i.showPicker" round position="bottom" :style="{ height: '60%' }"
-                     v-if="i.type == 'multipleChoice' && i.itemType == 'multiple'">
-            <div style="padding: 10px; height: calc(100% - 40px)">
-              <div style="display: flex; justify-content: space-between">
-                <van-button plain type="primary" @click="i.showPicker = false" style="border: none">关闭</van-button>
-                <van-button plain type="primary" style="border: none" @click="i.showPicker = false">确定</van-button>
-              </div>
-              <div style="height: calc(100% - 30px); overflow: auto">
-                <van-checkbox-group v-model="formData[i.prop]" @change="changeCheckboxGroup(formData, i.prop, i.data, i.fieldNames)">
-                  <van-checkbox v-for="item in i.data" :key="item.value" :name="item.value" style="margin-top: 5px">{{ item.text }}</van-checkbox>
+            </van-field>
+            <!-- switch -->
+            <van-field v-if="i.type == 'switch'" :label="i.label" :name="i.prop" :required="getRequired(i)">
+              <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)" :required="getRequired(i)">
+              <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>
+              </template>
+            </van-field>
+            <!-- 单选radio -->
+            <van-field v-if="i.type == 'radio'" :label="i.label" :name="i.prop" :rules="getRules(i)" :required="getRequired(i)">
+              <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>
+              </template>
+            </van-field>
+            <!-- 单选 -->
+            <van-field v-if="i.type == 'picker' && i.itemType == 'onePicker'" v-show="!i.showStatus" :label="i.label" :name="i.prop"
+                       v-model="formData[i.prop + 'Name']" is-link :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
+                       @click="() => (formOption.readonly || i.readonly ? '' : (i.showPicker = true))" :rules="getRules(i)"
+                       :required="getRequired(i)">
+            </van-field>
+            <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" @cancel="i.showPicker = false"
+                          @confirm="(option) => (i.changeFn ? i.changeFn(option, i, index) : onConfirmPicker(option, i, index))" />
+            </van-popup>
+            <!-- 多选 -->
+            <van-field v-if="i.type == 'multipleChoice' && i.itemType == 'multiple'" v-show="!i.showStatus" :label="i.label" :name="i.prop"
+                       v-model="formData[i.prop + 'Name']" is-link :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
+                       @click="() => (!formOption.readonly ? (i.showPicker = true) : '')" :rules="getRules(i)" :required="getRequired(i)">
+            </van-field>
+            <van-popup v-model:show="i.showPicker" round position="bottom" :style="{ height: '60%' }"
+                       v-if="i.type == 'multipleChoice' && i.itemType == 'multiple'">
+              <div style="padding: 10px; height: calc(100% - 40px)">
+                <div style="display: flex; justify-content: space-between">
+                  <van-button plain type="primary" @click="i.showPicker = false" style="border: none">关闭</van-button>
+                  <van-button plain type="primary" style="border: none" @click="i.showPicker = false">确定</van-button>
+                </div>
+                <div style="height: calc(100% - 30px); overflow: auto">
+                  <van-checkbox-group v-model="formData[i.prop]" @change="changeCheckboxGroup(formData, i.prop, i.data, i.fieldNames)">
+                    <van-checkbox v-for="item in i.data" :key="item.value" :name="item.value" style="margin-top: 5px">{{ item.text }}</van-checkbox>
+                  </van-checkbox-group>
+                </div>
               </div>
-            </div>
 
-          </van-popup>
-          <!-- 时间选择器 -->
-          <van-field v-if="i.type == 'picker' && i.itemType == 'datePicker'" :label="i.label" :name="i.prop" v-model="formData[i.prop]" is-link
-                     :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
-                     @click="() => (!formOption.readonly ? (i.showPicker = true) : '')" :rules="getRules(i)" :required="getRequired(i)">
-          </van-field>
-          <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" />
-          </van-popup>
-          <!-- 时间选择器 带时分秒 -->
+            </van-popup>
+            <!-- 时间选择器 -->
+            <van-field v-if="i.type == 'picker' && i.itemType == 'datePicker'" :label="i.label" :name="i.prop" v-model="formData[i.prop]" is-link
+                       :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
+                       @click="() => (!formOption.readonly ? (i.showPicker = true) : '')" :rules="getRules(i)" :required="getRequired(i)">
+            </van-field>
+            <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" />
+            </van-popup>
+            <!-- 时间选择器 带时分秒 -->
+
+            <van-field v-if="i.type == 'picker' && i.itemType == 'datePickerTime'" :label="i.label" :name="i.prop" v-model="formData[i.prop]" is-link
+                       :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
+                       @click="() => (!formOption.readonly ? (i.needDefault ? defaultTimeFn(i, index) : (i.showPicker = true)) : '')"
+                       :rules="getRules(i)" :required="getRequired(i)">
+            </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-picker-group>
+            </van-popup>
+            <!-- 级联 城市 -->
+            <van-field v-if="i.type == 'cascader' && i.itemType == 'city'" :label="i.label" :name="i.prop" v-model="formData[i.prop + 'Name']" is-link
+                       :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
+                       @click="() => (!formOption.readonly ? (i.showPicker = true) : '')" :rules="getRules(i)" :required="getRequired(i)" />
+            <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))" />
+            </van-popup>
+            <!-- 级联 公共 -->
+            <van-field v-if="i.type == 'cascader' && i.itemType == 'common'" :label="i.label" :name="i.prop" v-model="formData[i.prop + 'Name']"
+                       is-link :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'" @click="() => getFieldReadonly(i)"
+                       :rules="getRules(i)" :required="getRequired(i)" />
+            <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 : '请选择'" :options="i.data"
+                            :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))" />
+            </van-popup>
+            <!-- 文件上传 -->
+            <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="10 * 1024 * 1024"
+                              @oversize="onOversize" />
+              </template>
+            </van-field>
+            <!-- 插槽 -->
+            <van-field v-if="i.type == 'slot'" :label="i.label" :rules="getRules(i)" :required="getRequired(i)">
+              <template #input>
+                <div style="width: 100%">
+                  <slot :name="i.slotName"> {{ i.slotName }}插槽占位符 </slot>
+                </div>
+              </template>
+            </van-field>
+          </div>
+        </template>
 
-          <van-field v-if="i.type == 'picker' && i.itemType == 'datePickerTime'" :label="i.label" :name="i.prop" v-model="formData[i.prop]" is-link
-                     :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
-                     @click="() => (!formOption.readonly ? (i.needDefault ? defaultTimeFn(i, index) : (i.showPicker = true)) : '')"
-                     :rules="getRules(i)" :required="getRequired(i)">
-          </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-picker-group>
-          </van-popup>
-          <!-- 级联 城市 -->
-          <van-field v-if="i.type == 'cascader' && i.itemType == 'city'" :label="i.label" :name="i.prop" v-model="formData[i.prop + 'Name']" is-link
-                     :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
-                     @click="() => (!formOption.readonly ? (i.showPicker = true) : '')" :rules="getRules(i)" :required="getRequired(i)" />
-          <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))" />
-          </van-popup>
-          <!-- 级联 公共 -->
-          <van-field v-if="i.type == 'cascader' && i.itemType == 'common'" :label="i.label" :name="i.prop" v-model="formData[i.prop + 'Name']" is-link
-                     :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'" @click="() => getFieldReadonly(i)" :rules="getRules(i)"
-                     :required="getRequired(i)" />
-          <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 : '请选择'" :options="i.data"
-                          :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))" />
-          </van-popup>
-          <!-- 文件上传 -->
-          <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="10 * 1024 * 1024"
-                            @oversize="onOversize" />
-            </template>
-          </van-field>
-          <!-- 插槽 -->
-          <van-field v-if="i.type == 'slot'" :label="i.label" :rules="getRules(i)" :required="getRequired(i)">
-            <template #input>
-              <div style="width: 100%">
-                <slot :name="i.slotName"> {{ i.slotName }}插槽占位符 </slot>
-              </div>
-            </template>
-          </van-field>
-        </div>
       </van-cell-group>
       <!-- 循环业务数据 -->
       <template v-if="formData[btnConfigCopy.prop] && formData[btnConfigCopy.prop].length>0">
@@ -341,7 +345,11 @@ const recursionFn = (arr, val, valueAtt, childrenAtt) => {
   }
 };
 const selectDataEcho = (item, val) => {
-  if (item.type === "picker" && item.itemType === "onePicker" && val) {
+  if (
+    item.type === "picker" &&
+    item.itemType === "onePicker" &&
+    (val || val == 0)
+  ) {
     const textAtt = item.fieldNames
       ? item.fieldNames.text
       : onePickerFieldNames.text;
@@ -513,7 +521,9 @@ const formDataInit = () => {
       }
     }
   }
-  formDataShowLabel();
+  setTimeout(() => {
+    formDataShowLabel();
+  }, 1000);
   emit("update:modelValue", formData.value);
 };
 

+ 4 - 1
src/main.js

@@ -13,7 +13,8 @@ import {
   formChange,
   formChangeTwo,
   deepClone,
-  getFile
+  getFile,
+  onPreviewFile
 } from "@/utils/util";
 import {
   handleTree
@@ -62,6 +63,8 @@ app.config.globalProperties.deepClone = deepClone;
 app.config.globalProperties.handleTree = handleTree;
 
 app.config.globalProperties.getFile = getFile;
+app.config.globalProperties.onPreviewFile = onPreviewFile;
+
 app.config.globalProperties.uploadUrl = uploadUrl;
 
 

+ 31 - 0
src/router/index.js

@@ -630,6 +630,37 @@ const routes = [{
 				name: "开发中",
 				component: () => import("../views/home/coming.vue"),
 			},
+			// oa
+			{
+				path: "educationSubsidy",
+				name: "学历补贴申请",
+				component: () => import("../views/oa/educationSubsidy/index.vue"),
+			},
+			{
+				path: "useSeal",
+				name: "用印申请",
+				component: () => import("../views/oa/useSeal/index.vue"),
+			},
+			{
+				path: "medicalAndsocialSecurity",
+				name: "医社保申请",
+				component: () => import("../views/oa/medicalAndsocialSecurity/index.vue"),
+			},
+			{
+				path: "encodingCombination",
+				name: "ERP编码组合申请",
+				component: () => import("../views/oa/encodingCombination/index.vue"),
+			},
+			{
+				path: "activityPriceInventory",
+				name: "活动、价格、库存申请",
+				component: () => import("../views/oa/activityPriceInventory/index.vue"),
+			},
+			{
+				path: "invoicingApplication",
+				name: "开票申请",
+				component: () => import("../views/oa/invoicingApplication/index.vue"),
+			},
 			// 
 
 		]

+ 11 - 0
src/utils/util.js

@@ -26,6 +26,17 @@ export function getFile(businessIdList, dataSource, att = 'id', fileAtt = 'fileL
   }
   return false
 }
+// 打开文件
+
+export function onPreviewFile(name, url) {
+  uni.postMessage({
+    data: {
+      type: "file",
+      url: url,
+      name: name,
+    },
+  });
+};
 
 export function getDictOne(key) {
   return new Promise((resolve, reject) => {

+ 189 - 0
src/views/oa/activityPriceInventory/index.vue

@@ -0,0 +1,189 @@
+<template>
+  <van-nav-bar :title="'活动、价格、库存申请'" left-text="" left-arrow @click-left="onClickLeft" @click-right="onClickRight">
+    <!-- <template #right>
+      {{ $t("common.add") }}
+    </template> -->
+  </van-nav-bar>
+  <van-search v-model="req.keyword" :placeholder="$t('common.pleaseEnterKeywords')" @search="onRefresh" />
+  <van-pull-refresh v-model="loading" @refresh="onRefresh">
+    <div class="list">
+      <van-list v-model:loading="loading" :finished="finished" :finished-text="$t('common.noMore')" @load="getList" style="margin-bottom: 60px">
+        <commonList :data="listData" @onClick="toDtl" :config="listConfig">
+
+          <template #isPlatformActivity="{row}">
+            <div style="width:100%">
+              {{dictValueLabel(row.isPlatformActivity,isData)}}
+            </div>
+          </template>
+
+          <template #isProductSupport="{row}">
+            <div style="width:100%">
+              {{dictValueLabel(row.isProductSupport,isData)}}
+            </div>
+          </template>
+
+          <template #isInventorySupport="{row}">
+            <div style="width:100%">
+              {{dictValueLabel(row.isInventorySupport,isData)}}
+            </div>
+          </template>
+
+          <template #status="{row}">
+            <div style="width:100%">
+              {{dictValueLabel(row.status,statusData)}}
+            </div>
+          </template>
+
+        </commonList>
+      </van-list>
+    </div>
+  </van-pull-refresh>
+  <!-- <van-action-sheet v-model:show="actionType" :actions="actions" @select="onSelect" /> -->
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import commonList from "@/components/common-list.vue";
+import { getAllDict } from "@/utils/auth";
+
+const proxy = getCurrentInstance().proxy;
+const sealIsContract = getAllDict()["seal_is_contract"];
+const onClickLeft = () => proxy.$router.push("/main/working");
+const onClickRight = () => {
+  proxy.$router.push({
+    path: "/main/processDtl",
+    query: {
+      flowKey: "contract_flow",
+    },
+  });
+};
+const actionType = ref(false);
+const isData = ref([
+  {
+    label: "是",
+    value: 1,
+  },
+  {
+    label: "否",
+    value: 0,
+  },
+]);
+const req = ref({
+  pageNum: 1,
+  keyword: null,
+});
+const finished = ref(false);
+const onRefresh = () => {
+  req.value.pageNum = 1;
+  finished.value = false;
+  getList("refresh");
+};
+const loading = ref(false);
+const listData = ref([]);
+const getList = (type) => {
+  loading.value = true;
+  proxy
+    .post("/activityPriceInventory/page", req.value)
+    .then((res) => {
+      listData.value =
+        type === "refresh"
+          ? res.data.rows
+          : listData.value.concat(res.data.rows);
+      if (req.value.pageNum * 10 >= res.data.total) {
+        finished.value = true;
+      }
+      req.value.pageNum++;
+      loading.value = false;
+    })
+    .catch(() => {
+      loading.value = false;
+    });
+};
+let rowData = ref({});
+
+const toDtl = (row) => {
+  proxy.$router.push({
+    path: "/main/processDtl",
+    query: {
+      flowKey: "activity_price_inventory_flow",
+      id: row.flowId,
+      processType: 20,
+      businessId: row.id,
+    },
+  });
+};
+
+const useMethodData = ref([
+  {
+    dictValue: "借章",
+    dictKey: "1",
+  },
+  {
+    dictValue: "盖章",
+    dictKey: "2",
+  },
+]);
+
+const statusData = ref([
+  {
+    label: "草稿",
+    value: 0,
+  },
+  {
+    label: "审批中",
+    value: 10,
+  },
+  {
+    label: "审批驳回",
+    value: 20,
+  },
+  {
+    label: "审批通过",
+    value: 30,
+  },
+  {
+    label: "作废",
+    value: 88,
+  },
+]);
+
+const listConfig = ref([
+  {
+    label: "流水号",
+    prop: "code",
+  },
+  {
+    label: "申请人",
+    prop: "createUserName",
+  },
+  {
+    label: "申请日期",
+    prop: "applyTime",
+  },
+  {
+    type: "slot",
+    label: "是否平台活动",
+    slotName: "isPlatformActivity",
+  },
+  {
+    type: "slot",
+    label: "是否产品支持",
+    slotName: "isProductSupport",
+  },
+  {
+    type: "slot",
+    label: "是否库存支持",
+    slotName: "isInventorySupport",
+  },
+  {
+    type: "slot",
+    label: "审批状态",
+    slotName: "status",
+  },
+]);
+</script>
+
+<style lang="scss" scoped>
+.list {
+  min-height: 70vh;
+}
+</style>

+ 153 - 0
src/views/oa/educationSubsidy/index.vue

@@ -0,0 +1,153 @@
+<template>
+  <van-nav-bar :title="'学历补贴申请'" left-text="" left-arrow @click-left="onClickLeft" @click-right="onClickRight">
+    <!-- <template #right>
+      {{ $t("common.add") }}
+    </template> -->
+  </van-nav-bar>
+  <van-search v-model="req.keyword" :placeholder="$t('common.pleaseEnterKeywords')" @search="onRefresh" />
+  <van-pull-refresh v-model="loading" @refresh="onRefresh">
+    <div class="list">
+      <van-list v-model:loading="loading" :finished="finished" :finished-text="$t('common.noMore')" @load="getList" style="margin-bottom: 60px">
+        <commonList :data="listData" @onClick="toDtl" :config="listConfig">
+          <template #status="{row}">
+            <div style="width:100%">
+              {{dictValueLabel(row.status,statusData)}}
+            </div>
+          </template>
+        </commonList>
+      </van-list>
+    </div>
+  </van-pull-refresh>
+  <!-- <van-action-sheet v-model:show="actionType" :actions="actions" @select="onSelect" /> -->
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import commonList from "@/components/common-list.vue";
+import { getAllDict } from "@/utils/auth";
+
+const proxy = getCurrentInstance().proxy;
+const onClickLeft = () => proxy.$router.push("/main/working");
+const onClickRight = () => {
+  proxy.$router.push({
+    path: "/main/processDtl",
+    query: {
+      flowKey: "contract_flow",
+    },
+  });
+};
+const actionType = ref(false);
+const actions = ref([
+  {
+    name: proxy.t("common.view"),
+    type: "1",
+  },
+  {
+    name: proxy.t("common.contractChange"),
+    type: "2",
+  },
+  {
+    name: proxy.t("common.cancel"),
+  },
+]);
+const req = ref({
+  pageNum: 1,
+  keyword: null,
+});
+const finished = ref(false);
+const onRefresh = () => {
+  req.value.pageNum = 1;
+  finished.value = false;
+  getList("refresh");
+};
+const loading = ref(false);
+const listData = ref([]);
+const getList = (type) => {
+  loading.value = true;
+  proxy
+    .post("/educationSubsidy/page", req.value)
+    .then((res) => {
+      listData.value =
+        type === "refresh"
+          ? res.data.rows
+          : listData.value.concat(res.data.rows);
+      if (req.value.pageNum * 10 >= res.data.total) {
+        finished.value = true;
+      }
+      req.value.pageNum++;
+      loading.value = false;
+    })
+    .catch(() => {
+      loading.value = false;
+    });
+};
+let rowData = ref({});
+
+const toDtl = (row) => {
+  proxy.$router.push({
+    path: "/main/processDtl",
+    query: {
+      flowKey: "education_subsidy_flow",
+      id: row.flowId,
+      processType: 20,
+      businessId: row.id,
+    },
+  });
+};
+
+const statusData = ref([
+  {
+    label: "草稿",
+    value: 0,
+  },
+  {
+    label: "审批中",
+    value: 10,
+  },
+  {
+    label: "审批驳回",
+    value: 20,
+  },
+  {
+    label: "审批通过",
+    value: 30,
+  },
+  {
+    label: "作废",
+    value: 88,
+  },
+]);
+
+const listConfig = ref([
+  {
+    label: "流水号",
+    prop: "code",
+  },
+  {
+    label: "申请人",
+    prop: "createUserName",
+  },
+  {
+    label: "申请日期",
+    prop: "applyTime",
+  },
+  {
+    label: "学历",
+    prop: "educationName",
+  },
+  {
+    label: "学历补贴金额",
+    prop: "amount",
+  },
+  {
+    type: "slot",
+    label: "审批状态",
+    slotName: "status",
+  },
+]);
+</script>
+
+<style lang="scss" scoped>
+.list {
+  min-height: 70vh;
+}
+</style>

+ 186 - 0
src/views/oa/encodingCombination/index.vue

@@ -0,0 +1,186 @@
+<template>
+  <van-nav-bar :title="'ERP编码组合申请'" left-text="" left-arrow @click-left="onClickLeft" @click-right="onClickRight">
+    <!-- <template #right>
+      {{ $t("common.add") }}
+    </template> -->
+  </van-nav-bar>
+  <van-search v-model="req.keyword" :placeholder="$t('common.pleaseEnterKeywords')" @search="onRefresh" />
+  <van-pull-refresh v-model="loading" @refresh="onRefresh">
+    <div class="list">
+      <van-list v-model:loading="loading" :finished="finished" :finished-text="$t('common.noMore')" @load="getList" style="margin-bottom: 60px">
+        <commonList :data="listData" @onClick="toDtl" :config="listConfig">
+
+          <template #useMethod="{row}">
+            <div style="width:100%">
+              {{dictKeyValue(row.useMethod,useMethodData)}}
+            </div>
+          </template>
+
+          <template #isContract="{row}">
+            <div style="width:100%">
+              {{dictKeyValue(row.isContract,sealIsContract)}}
+            </div>
+          </template>
+
+          <template #status="{row}">
+            <div style="width:100%">
+              {{dictValueLabel(row.status,statusData)}}
+            </div>
+          </template>
+
+        </commonList>
+      </van-list>
+    </div>
+  </van-pull-refresh>
+  <!-- <van-action-sheet v-model:show="actionType" :actions="actions" @select="onSelect" /> -->
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import commonList from "@/components/common-list.vue";
+import { getAllDict } from "@/utils/auth";
+
+const proxy = getCurrentInstance().proxy;
+const sealIsContract = getAllDict()["seal_is_contract"];
+const onClickLeft = () => proxy.$router.push("/main/working");
+const onClickRight = () => {
+  proxy.$router.push({
+    path: "/main/processDtl",
+    query: {
+      flowKey: "contract_flow",
+    },
+  });
+};
+const actionType = ref(false);
+const actions = ref([
+  {
+    name: proxy.t("common.view"),
+    type: "1",
+  },
+  {
+    name: proxy.t("common.contractChange"),
+    type: "2",
+  },
+  {
+    name: proxy.t("common.cancel"),
+  },
+]);
+const req = ref({
+  pageNum: 1,
+  keyword: null,
+});
+const finished = ref(false);
+const onRefresh = () => {
+  req.value.pageNum = 1;
+  finished.value = false;
+  getList("refresh");
+};
+const loading = ref(false);
+const listData = ref([]);
+const getList = (type) => {
+  loading.value = true;
+  proxy
+    .post("/erpCodingGroup/page", req.value)
+    .then((res) => {
+      listData.value =
+        type === "refresh"
+          ? res.data.rows
+          : listData.value.concat(res.data.rows);
+      if (req.value.pageNum * 10 >= res.data.total) {
+        finished.value = true;
+      }
+      req.value.pageNum++;
+      loading.value = false;
+    })
+    .catch(() => {
+      loading.value = false;
+    });
+};
+let rowData = ref({});
+
+const toDtl = (row) => {
+  proxy.$router.push({
+    path: "/main/processDtl",
+    query: {
+      flowKey: "erp_coding_group_flow",
+      id: row.flowId,
+      processType: 20,
+      businessId: row.id,
+    },
+  });
+};
+
+const useMethodData = ref([
+  {
+    dictValue: "借章",
+    dictKey: "1",
+  },
+  {
+    dictValue: "盖章",
+    dictKey: "2",
+  },
+]);
+
+const statusData = ref([
+  {
+    label: "草稿",
+    value: 0,
+  },
+  {
+    label: "审批中",
+    value: 10,
+  },
+  {
+    label: "审批驳回",
+    value: 20,
+  },
+  {
+    label: "审批通过",
+    value: 30,
+  },
+  {
+    label: "作废",
+    value: 88,
+  },
+]);
+
+const listConfig = ref([
+  {
+    label: "流水号",
+    prop: "code",
+  },
+  {
+    label: "申请人",
+    prop: "createUserName",
+  },
+  {
+    label: "申请日期",
+    prop: "applyTime",
+  },
+  {
+    label: "商品编码组合",
+    prop: "remark",
+  },
+
+  // {
+  //   type: "slot",
+  //   label: "使用方式",
+  //   slotName: "useMethod",
+  // },
+  // {
+  //   type: "slot",
+  //   label: "是否销售合同",
+  //   slotName: "isContract",
+  // },
+  {
+    type: "slot",
+    label: "审批状态",
+    slotName: "status",
+  },
+]);
+</script>
+
+<style lang="scss" scoped>
+.list {
+  min-height: 70vh;
+}
+</style>

+ 194 - 0
src/views/oa/invoicingApplication/index.vue

@@ -0,0 +1,194 @@
+<template>
+  <van-nav-bar :title="'开票申请'" left-text="" left-arrow @click-left="onClickLeft" @click-right="onClickRight">
+    <!-- <template #right>
+      {{ $t("common.add") }}
+    </template> -->
+  </van-nav-bar>
+  <van-search v-model="req.keyword" :placeholder="$t('common.pleaseEnterKeywords')" @search="onRefresh" />
+  <van-pull-refresh v-model="loading" @refresh="onRefresh">
+    <div class="list">
+      <van-list v-model:loading="loading" :finished="finished" :finished-text="$t('common.noMore')" @load="getList" style="margin-bottom: 60px">
+        <commonList :data="listData" @onClick="toDtl" :config="listConfig">
+
+          <template #useMethod="{row}">
+            <div style="width:100%">
+              {{dictKeyValue(row.useMethod,useMethodData)}}
+            </div>
+          </template>
+
+          <template #isContract="{row}">
+            <div style="width:100%">
+              {{dictKeyValue(row.isContract,sealIsContract)}}
+            </div>
+          </template>
+
+          <template #status="{row}">
+            <div style="width:100%">
+              {{dictValueLabel(row.status,statusData)}}
+            </div>
+          </template>
+
+        </commonList>
+      </van-list>
+    </div>
+  </van-pull-refresh>
+  <!-- <van-action-sheet v-model:show="actionType" :actions="actions" @select="onSelect" /> -->
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import commonList from "@/components/common-list.vue";
+import { getAllDict } from "@/utils/auth";
+
+const proxy = getCurrentInstance().proxy;
+const sealIsContract = getAllDict()["seal_is_contract"];
+const onClickLeft = () => proxy.$router.push("/main/working");
+const onClickRight = () => {
+  proxy.$router.push({
+    path: "/main/processDtl",
+    query: {
+      flowKey: "contract_flow",
+    },
+  });
+};
+const actionType = ref(false);
+const actions = ref([
+  {
+    name: proxy.t("common.view"),
+    type: "1",
+  },
+  {
+    name: proxy.t("common.contractChange"),
+    type: "2",
+  },
+  {
+    name: proxy.t("common.cancel"),
+  },
+]);
+const req = ref({
+  pageNum: 1,
+  keyword: null,
+});
+const finished = ref(false);
+const onRefresh = () => {
+  req.value.pageNum = 1;
+  finished.value = false;
+  getList("refresh");
+};
+const loading = ref(false);
+const listData = ref([]);
+const getList = (type) => {
+  loading.value = true;
+  proxy
+    .post("/invoiceApply/page", req.value)
+    .then((res) => {
+      listData.value =
+        type === "refresh"
+          ? res.data.rows
+          : listData.value.concat(res.data.rows);
+      if (req.value.pageNum * 10 >= res.data.total) {
+        finished.value = true;
+      }
+      req.value.pageNum++;
+      loading.value = false;
+    })
+    .catch(() => {
+      loading.value = false;
+    });
+};
+let rowData = ref({});
+
+const toDtl = (row) => {
+  proxy.$router.push({
+    path: "/main/processDtl",
+    query: {
+      flowKey: "invoice_apply_flow",
+      id: row.flowId,
+      processType: 20,
+      businessId: row.id,
+    },
+  });
+};
+
+const useMethodData = ref([
+  {
+    dictValue: "借章",
+    dictKey: "1",
+  },
+  {
+    dictValue: "盖章",
+    dictKey: "2",
+  },
+]);
+
+const statusData = ref([
+  {
+    label: "草稿",
+    value: 0,
+  },
+  {
+    label: "审批中",
+    value: 10,
+  },
+  {
+    label: "审批驳回",
+    value: 20,
+  },
+  {
+    label: "审批通过",
+    value: 30,
+  },
+  {
+    label: "作废",
+    value: 88,
+  },
+]);
+
+const listConfig = ref([
+  {
+    label: "流水号",
+    prop: "code",
+  },
+  {
+    label: "申请人",
+    prop: "createUserName",
+  },
+  {
+    label: "申请日期",
+    prop: "applyTime",
+  },
+  {
+    label: "销售方",
+    prop: "sellerCompanyName",
+  },
+  {
+    label: "税点(%)",
+    prop: "taxPointSettle",
+  },
+  {
+    label: "税点结算金额",
+    prop: "taxPointSettleAmount",
+  },
+
+  // {
+  //   type: "slot",
+  //   label: "申请场景",
+  //   slotName: "applyScenario",
+  // },
+  // {
+  //   type: "slot",
+  //   label: "下单渠道",
+  //   slotName: "orderingChannels",
+  // },
+  {
+    type: "slot",
+    label: "审批状态",
+    slotName: "status",
+  },
+]);
+</script>
+
+<style lang="scss" scoped>
+.list {
+  min-height: 70vh;
+}
+</style>

+ 186 - 0
src/views/oa/medicalAndsocialSecurity/index.vue

@@ -0,0 +1,186 @@
+<template>
+  <van-nav-bar :title="'医社保申请'" left-text="" left-arrow @click-left="onClickLeft" @click-right="onClickRight">
+    <!-- <template #right>
+      {{ $t("common.add") }}
+    </template> -->
+  </van-nav-bar>
+  <van-search v-model="req.keyword" :placeholder="$t('common.pleaseEnterKeywords')" @search="onRefresh" />
+  <van-pull-refresh v-model="loading" @refresh="onRefresh">
+    <div class="list">
+      <van-list v-model:loading="loading" :finished="finished" :finished-text="$t('common.noMore')" @load="getList" style="margin-bottom: 60px">
+        <commonList :data="listData" @onClick="toDtl" :config="listConfig">
+
+          <template #useMethod="{row}">
+            <div style="width:100%">
+              {{dictKeyValue(row.useMethod,useMethodData)}}
+            </div>
+          </template>
+
+          <template #isContract="{row}">
+            <div style="width:100%">
+              {{dictKeyValue(row.isContract,sealIsContract)}}
+            </div>
+          </template>
+
+          <template #status="{row}">
+            <div style="width:100%">
+              {{dictValueLabel(row.status,statusData)}}
+            </div>
+          </template>
+
+        </commonList>
+      </van-list>
+    </div>
+  </van-pull-refresh>
+  <!-- <van-action-sheet v-model:show="actionType" :actions="actions" @select="onSelect" /> -->
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import commonList from "@/components/common-list.vue";
+import { getAllDict } from "@/utils/auth";
+
+const proxy = getCurrentInstance().proxy;
+const sealIsContract = getAllDict()["seal_is_contract"];
+const onClickLeft = () => proxy.$router.push("/main/working");
+const onClickRight = () => {
+  proxy.$router.push({
+    path: "/main/processDtl",
+    query: {
+      flowKey: "contract_flow",
+    },
+  });
+};
+const actionType = ref(false);
+const actions = ref([
+  {
+    name: proxy.t("common.view"),
+    type: "1",
+  },
+  {
+    name: proxy.t("common.contractChange"),
+    type: "2",
+  },
+  {
+    name: proxy.t("common.cancel"),
+  },
+]);
+const req = ref({
+  pageNum: 1,
+  keyword: null,
+});
+const finished = ref(false);
+const onRefresh = () => {
+  req.value.pageNum = 1;
+  finished.value = false;
+  getList("refresh");
+};
+const loading = ref(false);
+const listData = ref([]);
+const getList = (type) => {
+  loading.value = true;
+  proxy
+    .post("/medicalInsurance/page", req.value)
+    .then((res) => {
+      listData.value =
+        type === "refresh"
+          ? res.data.rows
+          : listData.value.concat(res.data.rows);
+      if (req.value.pageNum * 10 >= res.data.total) {
+        finished.value = true;
+      }
+      req.value.pageNum++;
+      loading.value = false;
+    })
+    .catch(() => {
+      loading.value = false;
+    });
+};
+let rowData = ref({});
+
+const toDtl = (row) => {
+  proxy.$router.push({
+    path: "/main/processDtl",
+    query: {
+      flowKey: "medical_insurance_flow",
+      id: row.flowId,
+      processType: 20,
+      businessId: row.id,
+    },
+  });
+};
+
+const useMethodData = ref([
+  {
+    dictValue: "借章",
+    dictKey: "1",
+  },
+  {
+    dictValue: "盖章",
+    dictKey: "2",
+  },
+]);
+
+const statusData = ref([
+  {
+    label: "草稿",
+    value: 0,
+  },
+  {
+    label: "审批中",
+    value: 10,
+  },
+  {
+    label: "审批驳回",
+    value: 20,
+  },
+  {
+    label: "审批通过",
+    value: 30,
+  },
+  {
+    label: "作废",
+    value: 88,
+  },
+]);
+
+const listConfig = ref([
+  {
+    label: "流水号",
+    prop: "code",
+  },
+  {
+    label: "申请人",
+    prop: "createUserName",
+  },
+  {
+    label: "申请日期",
+    prop: "applyTime",
+  },
+  {
+    label: "申请项目",
+    prop: "applyItem",
+  },
+
+  // {
+  //   type: "slot",
+  //   label: "使用方式",
+  //   slotName: "useMethod",
+  // },
+  // {
+  //   type: "slot",
+  //   label: "是否销售合同",
+  //   slotName: "isContract",
+  // },
+  {
+    type: "slot",
+    label: "审批状态",
+    slotName: "status",
+  },
+]);
+</script>
+
+<style lang="scss" scoped>
+.list {
+  min-height: 70vh;
+}
+</style>

+ 181 - 0
src/views/oa/useSeal/index.vue

@@ -0,0 +1,181 @@
+<template>
+  <van-nav-bar :title="'用印申请'" left-text="" left-arrow @click-left="onClickLeft" @click-right="onClickRight">
+    <!-- <template #right>
+      {{ $t("common.add") }}
+    </template> -->
+  </van-nav-bar>
+  <van-search v-model="req.keyword" :placeholder="$t('common.pleaseEnterKeywords')" @search="onRefresh" />
+  <van-pull-refresh v-model="loading" @refresh="onRefresh">
+    <div class="list">
+      <van-list v-model:loading="loading" :finished="finished" :finished-text="$t('common.noMore')" @load="getList" style="margin-bottom: 60px">
+        <commonList :data="listData" @onClick="toDtl" :config="listConfig">
+
+          <template #useMethod="{row}">
+            <div style="width:100%">
+              {{dictKeyValue(row.useMethod,useMethodData)}}
+            </div>
+          </template>
+
+          <template #isContract="{row}">
+            <div style="width:100%">
+              {{dictKeyValue(row.isContract,sealIsContract)}}
+            </div>
+          </template>
+
+          <template #status="{row}">
+            <div style="width:100%">
+              {{dictValueLabel(row.status,statusData)}}
+            </div>
+          </template>
+
+        </commonList>
+      </van-list>
+    </div>
+  </van-pull-refresh>
+  <!-- <van-action-sheet v-model:show="actionType" :actions="actions" @select="onSelect" /> -->
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import commonList from "@/components/common-list.vue";
+import { getAllDict } from "@/utils/auth";
+
+const proxy = getCurrentInstance().proxy;
+const sealIsContract = getAllDict()["seal_is_contract"];
+const onClickLeft = () => proxy.$router.push("/main/working");
+const onClickRight = () => {
+  proxy.$router.push({
+    path: "/main/processDtl",
+    query: {
+      flowKey: "contract_flow",
+    },
+  });
+};
+const actionType = ref(false);
+const actions = ref([
+  {
+    name: proxy.t("common.view"),
+    type: "1",
+  },
+  {
+    name: proxy.t("common.contractChange"),
+    type: "2",
+  },
+  {
+    name: proxy.t("common.cancel"),
+  },
+]);
+const req = ref({
+  pageNum: 1,
+  keyword: null,
+});
+const finished = ref(false);
+const onRefresh = () => {
+  req.value.pageNum = 1;
+  finished.value = false;
+  getList("refresh");
+};
+const loading = ref(false);
+const listData = ref([]);
+const getList = (type) => {
+  loading.value = true;
+  proxy
+    .post("/sealUse/page", req.value)
+    .then((res) => {
+      listData.value =
+        type === "refresh"
+          ? res.data.rows
+          : listData.value.concat(res.data.rows);
+      if (req.value.pageNum * 10 >= res.data.total) {
+        finished.value = true;
+      }
+      req.value.pageNum++;
+      loading.value = false;
+    })
+    .catch(() => {
+      loading.value = false;
+    });
+};
+let rowData = ref({});
+
+const toDtl = (row) => {
+  proxy.$router.push({
+    path: "/main/processDtl",
+    query: {
+      flowKey: "seal_use_flow",
+      id: row.flowId,
+      processType: 20,
+      businessId: row.id,
+    },
+  });
+};
+
+const useMethodData = ref([
+  {
+    dictValue: "借章",
+    dictKey: "1",
+  },
+  {
+    dictValue: "盖章",
+    dictKey: "2",
+  },
+]);
+
+const statusData = ref([
+  {
+    label: "草稿",
+    value: 0,
+  },
+  {
+    label: "审批中",
+    value: 10,
+  },
+  {
+    label: "审批驳回",
+    value: 20,
+  },
+  {
+    label: "审批通过",
+    value: 30,
+  },
+  {
+    label: "作废",
+    value: 88,
+  },
+]);
+
+const listConfig = ref([
+  {
+    label: "流水号",
+    prop: "code",
+  },
+  {
+    label: "申请人",
+    prop: "createUserName",
+  },
+  {
+    label: "申请日期",
+    prop: "applyTime",
+  },
+  {
+    type: "slot",
+    label: "使用方式",
+    slotName: "useMethod",
+  },
+  {
+    type: "slot",
+    label: "是否销售合同",
+    slotName: "isContract",
+  },
+  {
+    type: "slot",
+    label: "审批状态",
+    slotName: "status",
+  },
+]);
+</script>
+
+<style lang="scss" scoped>
+.list {
+  min-height: 70vh;
+}
+</style>

+ 443 - 0
src/views/processApproval/components/ActivityPriceInventory.vue

@@ -0,0 +1,443 @@
+<template>
+  <div class="form">
+    <van-tabs v-model:active="active">
+      <van-tab :title="'基本信息'" :name="0" />
+      <van-tab title="平台活动信息" :name="1" v-if="formData.data.isPlatformActivity==1" />
+      <van-tab title="产品价格支持信息" :name="2" v-if="formData.data.isProductSupport==1" />
+      <van-tab title="库存支持信息" :name="3" v-if="formData.data.isInventorySupport==1" />
+    </van-tabs>
+
+    <testForm v-model="formData.data" :formOption="formOption" :formConfig="formConfig" :rules="rules" ref="formDom" v-show="active==0">
+
+    </testForm>
+    <testForm v-model="formData.data" :formOption="formOption" :formConfig="formConfig1" :rules="rules" ref="formDom1" v-show="active==1">
+      <template #detail>
+        <div style="width:100%">
+          <div style="width:100%;overflow-x:auto;">
+            <table border class="table">
+              <thead>
+                <tr>
+                  <th style="min-width:130px;">产品名称</th>
+                  <th style="min-width:90px">颜色</th>
+                  <th style="min-width:100px">规格尺寸(cm)</th>
+                  <th style="min-width:70px">产品分销价</th>
+                  <th style="min-width:70px">原销售价格</th>
+                  <th style="min-width:70px">活动价格</th>
+                </tr>
+              </thead>
+              <tbody v-if="formData.data.activityPriceInventoryDetailList && formData.data.activityPriceInventoryDetailList.length>0">
+                <tr v-for="(item,index) in formData.data.activityPriceInventoryDetailList" :key="index">
+                  <td>{{item.productName}}</td>
+                  <td>{{item.productColor}}</td>
+                  <td> {{item.productLength}} * {{item.productWidth}} * {{item.productHeight}}</td>
+                  <td>{{item.distributionPrice}}</td>
+                  <td>
+                    {{item.salesPrice}}
+                  </td>
+                  <td>{{item.activityPrice}}</td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </div>
+      </template>
+    </testForm>
+    <testForm v-model="formData.data" :formOption="formOption" :formConfig="formConfig2" :rules="rules" ref="formDom2" v-show="active==2">
+      <template #supporterFileList>
+        <div style="width:100%">
+          <div v-for="file in formData.data.supporterFileList" :key="file.id" style="color: #409eff;cursor: pointer;"
+               @click="onPreviewFile(file.fileName,file.fileUrl)">
+            {{file.fileName}}
+          </div>
+        </div>
+      </template>
+    </testForm>
+    <testForm v-model="formData.data" :formOption="formOption" :formConfig="formConfig3" :rules="rules" ref="formDom3" v-show="active==3">
+      <template #stockFileList>
+        <div style="width:100%">
+          <div v-for="file in formData.data.stockFileList" :key="file.id" style="color: #409eff;cursor: pointer;"
+               @click="onPreviewFile(file.fileName,file.fileUrl)">
+            {{file.fileName}}
+          </div>
+        </div>
+      </template>
+    </testForm>
+  </div>
+</template>
+
+<script setup>
+import {
+  ref,
+  getCurrentInstance,
+  onMounted,
+  defineProps,
+  defineExpose,
+  watch,
+  reactive,
+  toRefs,
+  computed,
+} from "vue";
+import { useRoute } from "vue-router";
+import testForm from "@/components/testForm/index.vue";
+import { getUserInfo } from "@/utils/auth";
+import { showFailToast } from "vant";
+// 接收父组件的传值
+const props = defineProps({
+  queryData: Object,
+});
+const refProps = toRefs(props);
+const proxy = getCurrentInstance().proxy;
+const route = useRoute();
+const active = ref(0);
+const tabsChange = () => {
+  active.value++;
+};
+const selectData = ref([]);
+const isData = ref([
+  {
+    label: "是",
+    value: 1,
+  },
+  {
+    label: "否",
+    value: 0,
+  },
+]);
+const formData = reactive({
+  data: {},
+});
+const formDom = ref(null);
+const formOption = reactive({
+  readonly: false,
+  disabled: false,
+  labelAlign: "top",
+  scroll: true,
+  labelWidth: "62pk",
+  hiddenSubmitBtn: true,
+});
+const formConfig = computed(() => [
+  {
+    type: "title",
+    title: "基本信息",
+  },
+  {
+    type: "input",
+    label: "流水号",
+    prop: "code",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "申请日期",
+    prop: "applyTime",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "申请人",
+    prop: "createUserName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "所属公司",
+    prop: "companyName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "所属部门",
+    prop: "deptName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "title",
+    title: "店铺信息",
+  },
+  {
+    type: "input",
+    label: "店铺名称",
+    prop: "shopName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "店铺平台",
+    prop: "shopPlatform",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "店铺品牌",
+    prop: "shopBrand",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "title",
+    title: "申请内容",
+  },
+  {
+    type: "picker",
+    label: "是否平台活动",
+    prop: "isPlatformActivity",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "label",
+      value: "value",
+    },
+    data: isData.value,
+    readonly: false,
+  },
+  {
+    type: "picker",
+    label: "是否需要产品价格支持",
+    prop: "isProductSupport",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "label",
+      value: "value",
+    },
+    data: isData.value,
+    readonly: false,
+  },
+  {
+    type: "picker",
+    label: "是否需要库存支持",
+    prop: "isInventorySupport",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "label",
+      value: "value",
+    },
+    data: isData.value,
+    readonly: false,
+  },
+]);
+
+const formConfig1 = computed(() => [
+  {
+    type: "input",
+    label: "活动名称",
+    prop: "activityName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "活动天数",
+    prop: "activityDays",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "活动开始日期",
+    prop: "activityStartTime",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "活动结束日期",
+    prop: "activityEndTime",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "slot",
+    label: "活动明细(表格可左右滚动)",
+    slotName: "detail",
+  },
+]);
+const formConfig2 = computed(() => [
+  {
+    type: "input",
+    label: "支持方",
+    prop: "supporterName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "支持周期",
+    prop: "supportCycle",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "支持起始日期",
+    prop: "supporterStartTime",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "支持结束日期",
+    prop: "supporterEndTime",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "slot",
+    label: "附件",
+    slotName: "supporterFileList",
+  },
+  {
+    type: "input",
+    label: "商品报价人",
+    prop: "productQuotationUser",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "picker",
+    label: "是否提报总经理",
+    prop: "isReportGm",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "label",
+      value: "value",
+    },
+    data: isData.value,
+    readonly: false,
+  },
+]);
+const formConfig3 = computed(() => [
+  {
+    type: "picker",
+    label: "是否新品",
+    prop: "isNewProduct",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "label",
+      value: "value",
+    },
+    data: isData.value,
+    readonly: false,
+  },
+  {
+    type: "slot",
+    label: "库存明细附件",
+    slotName: "stockFileList",
+  },
+]);
+const rules = {};
+
+const getDict = () => {
+  proxy
+    .post("/educationConfig/page", {
+      pageNum: 1,
+      pageSize: 999,
+    })
+    .then((res) => {
+      selectData.value = res.data.rows.map((x) => ({
+        ...x,
+        label: x.name,
+        value: x.id,
+      }));
+    });
+};
+// getDict();
+
+const status = ref(true);
+const handleSubmit = async () => {
+  if (status.value) {
+    return formData.data;
+  }
+};
+
+onMounted(() => {
+  if (route.query && route.query.businessId) {
+    formOption.readonly = true;
+    formOption.hiddenSubmitBtn = true;
+    let businessId = route.query.businessId;
+    proxy
+      .post("/activityPriceInventory/detail", { id: businessId })
+      .then((res) => {
+        formData.data = res.data;
+        // setTimeout(() => {
+        //   formDom.value.formDataShowLabelOne();
+        // }, 100);
+        formData.data.isNewProduct = Number(formData.data.isNewProduct);
+        proxy
+          .post("/fileInfo/getList", { businessIdList: [businessId] })
+          .then((res) => {
+            let fileObj = res.data;
+            if (fileObj[businessId] && fileObj[businessId].length > 0) {
+              formData.data.supporterFileList = fileObj[businessId]
+                .filter((x) => x.businessType == "10")
+                .map((item) => {
+                  return {
+                    ...item,
+                    name: item.fileName,
+                    url: item.fileUrl,
+                  };
+                });
+              formData.data.stockFileList = fileObj[businessId]
+                .filter((x) => x.businessType == "20")
+                .map((item) => {
+                  return {
+                    ...item,
+                    name: item.fileName,
+                    url: item.fileUrl,
+                  };
+                });
+            } else {
+              formData.data.supporterFileList = [];
+              formData.data.stockFileList = [];
+            }
+          });
+      });
+  }
+});
+
+defineExpose({
+  handleSubmit,
+  tabsChange,
+});
+onMounted(() => {});
+</script>
+<style lang="scss" scoped>
+._title {
+  display: flex;
+  align-items: center;
+  font-size: 14px;
+  font-weight: 700;
+  margin-left: -10px;
+  .line {
+    width: 4px;
+    background-color: #0084ff;
+    height: 15px;
+    margin-right: 8px;
+  }
+}
+.table {
+  border-collapse: collapse;
+  border-spacing: 0;
+  width: 100%;
+  border-color: #ebeef5;
+  color: #606266;
+  thead tr th {
+    padding: 6px;
+    text-align: left;
+  }
+  td {
+    text-align: left;
+    padding: 6px;
+  }
+}
+</style>

+ 190 - 0
src/views/processApproval/components/EducationSubsidy.vue

@@ -0,0 +1,190 @@
+<template>
+  <div class="form">
+    <testForm v-model="formData.data" :formOption="formOption" :formConfig="formConfig" :rules="rules" ref="formDom">
+      <template #file>
+        <div style="width:100%">
+          <div v-for="file in formData.data.fileList" :key="file.id" style="color: #409eff;cursor: pointer;"
+               @click="onPreviewFile(file.fileName,file.fileUrl)">
+            {{file.fileName}}
+          </div>
+        </div>
+      </template>
+    </testForm>
+  </div>
+</template>
+
+<script setup>
+import {
+  ref,
+  getCurrentInstance,
+  onMounted,
+  defineProps,
+  defineExpose,
+  watch,
+  reactive,
+  toRefs,
+} from "vue";
+import { useRoute } from "vue-router";
+import testForm from "@/components/testForm/index.vue";
+import { getUserInfo } from "@/utils/auth";
+import { showFailToast } from "vant";
+// 接收父组件的传值
+const props = defineProps({
+  queryData: Object,
+});
+const refProps = toRefs(props);
+const proxy = getCurrentInstance().proxy;
+const route = useRoute();
+const active = ref(0);
+const tabsChange = () => {
+  active.value++;
+};
+const selectData = ref([]);
+const formData = reactive({
+  data: {},
+});
+const formDom = ref(null);
+const formOption = reactive({
+  readonly: false,
+  disabled: false,
+  labelAlign: "top",
+  scroll: true,
+  labelWidth: "62pk",
+  hiddenSubmitBtn: true,
+});
+const formConfig = reactive([
+  {
+    type: "title",
+    title: "基本信息",
+  },
+  {
+    type: "input",
+    label: "流水号",
+    prop: "code",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "申请日期",
+    prop: "applyTime",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "申请人",
+    prop: "createUserName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "所属公司",
+    prop: "companyName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "所属部门",
+    prop: "deptName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "学历",
+    prop: "educationName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "学历补贴金额",
+    prop: "amount",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "slot",
+    label: "学历证明附件",
+    slotName: "file",
+  },
+]);
+
+const rules = {};
+
+const getDict = () => {
+  proxy
+    .post("/educationConfig/page", {
+      pageNum: 1,
+      pageSize: 999,
+    })
+    .then((res) => {
+      selectData.value = res.data.rows.map((x) => ({
+        ...x,
+        label: x.name,
+        value: x.id,
+      }));
+    });
+};
+getDict();
+
+const status = ref(true);
+const handleSubmit = async () => {
+  if (status.value) {
+    return formData.data;
+  }
+};
+
+onMounted(() => {
+  if (route.query && route.query.businessId) {
+    formOption.readonly = true;
+    formOption.hiddenSubmitBtn = true;
+    let businessId = route.query.businessId;
+    proxy.post("/educationSubsidy/detail", { id: businessId }).then((res) => {
+      formData.data = res.data;
+      proxy
+        .post("/fileInfo/getList", { businessIdList: [businessId] })
+        .then((res) => {
+          let fileObj = res.data;
+          if (fileObj[businessId] && fileObj[businessId].length > 0) {
+            formData.data.fileList = fileObj[businessId]
+              .filter((x) => x.businessType == "0")
+              .map((item) => {
+                return {
+                  ...item,
+                  name: item.fileName,
+                  url: item.fileUrl,
+                };
+              });
+          } else {
+            formData.data.fileList = [];
+          }
+        });
+    });
+  }
+});
+
+defineExpose({
+  handleSubmit,
+  tabsChange,
+});
+onMounted(() => {});
+</script>
+<style lang="scss" scoped>
+._title {
+  display: flex;
+  align-items: center;
+  font-size: 14px;
+  font-weight: 700;
+  margin-left: -10px;
+  .line {
+    width: 4px;
+    background-color: #0084ff;
+    height: 15px;
+    margin-right: 8px;
+  }
+}
+</style>

+ 184 - 0
src/views/processApproval/components/EncodingCombination.vue

@@ -0,0 +1,184 @@
+<template>
+  <div class="form">
+    <testForm v-model="formData.data" :formOption="formOption" :formConfig="formConfig" :rules="rules" ref="formDom">
+      <template #file>
+        <div style="width:100%">
+          <div v-for="file in formData.data.fileList" :key="file.id" style="color: #409eff;cursor: pointer;"
+               @click="onPreviewFile(file.fileName,file.fileUrl)">
+            {{file.fileName}}
+          </div>
+        </div>
+      </template>
+    </testForm>
+  </div>
+</template>
+
+<script setup>
+import {
+  ref,
+  getCurrentInstance,
+  onMounted,
+  defineProps,
+  defineExpose,
+  watch,
+  reactive,
+  toRefs,
+} from "vue";
+import { useRoute } from "vue-router";
+import testForm from "@/components/testForm/index.vue";
+import { getUserInfo } from "@/utils/auth";
+import { showFailToast } from "vant";
+// 接收父组件的传值
+const props = defineProps({
+  queryData: Object,
+});
+const refProps = toRefs(props);
+const proxy = getCurrentInstance().proxy;
+const route = useRoute();
+const active = ref(0);
+const tabsChange = () => {
+  active.value++;
+};
+const selectData = ref([]);
+const formData = reactive({
+  data: {},
+});
+const formDom = ref(null);
+const formOption = reactive({
+  readonly: false,
+  disabled: false,
+  labelAlign: "top",
+  scroll: true,
+  labelWidth: "62pk",
+  hiddenSubmitBtn: true,
+});
+const formConfig = reactive([
+  {
+    type: "title",
+    title: "基本信息",
+  },
+  {
+    type: "input",
+    label: "流水号",
+    prop: "code",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "申请日期",
+    prop: "applyTime",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "申请人",
+    prop: "createUserName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "所属公司",
+    prop: "companyName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "所属部门",
+    prop: "deptName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "描述商品编码组合",
+    prop: "remark",
+    itemType: "text",
+    readonly: true,
+  },
+
+  {
+    type: "slot",
+    label: "申请附件",
+    slotName: "file",
+  },
+]);
+
+const rules = {};
+
+const getDict = () => {
+  proxy
+    .post("/educationConfig/page", {
+      pageNum: 1,
+      pageSize: 999,
+    })
+    .then((res) => {
+      selectData.value = res.data.rows.map((x) => ({
+        ...x,
+        label: x.name,
+        value: x.id,
+      }));
+    });
+};
+// getDict();
+
+const status = ref(true);
+const handleSubmit = async () => {
+  if (status.value) {
+    return formData.data;
+  }
+};
+
+onMounted(() => {
+  if (route.query && route.query.businessId) {
+    formOption.readonly = true;
+    formOption.hiddenSubmitBtn = true;
+    let businessId = route.query.businessId;
+    proxy.post("/erpCodingGroup/detail", { id: businessId }).then((res) => {
+      formData.data = res.data;
+      proxy
+        .post("/fileInfo/getList", { businessIdList: [businessId] })
+        .then((res) => {
+          let fileObj = res.data;
+          if (fileObj[businessId] && fileObj[businessId].length > 0) {
+            formData.data.fileList = fileObj[businessId]
+              .filter((x) => x.businessType == "0")
+              .map((item) => {
+                return {
+                  ...item,
+                  name: item.fileName,
+                  url: item.fileUrl,
+                };
+              });
+          } else {
+            formData.data.fileList = [];
+          }
+        });
+    });
+  }
+});
+
+defineExpose({
+  handleSubmit,
+  tabsChange,
+});
+onMounted(() => {});
+</script>
+<style lang="scss" scoped>
+._title {
+  display: flex;
+  align-items: center;
+  font-size: 14px;
+  font-weight: 700;
+  margin-left: -10px;
+  .line {
+    width: 4px;
+    background-color: #0084ff;
+    height: 15px;
+    margin-right: 8px;
+  }
+}
+</style>

+ 595 - 0
src/views/processApproval/components/InvoicingApplication.vue

@@ -0,0 +1,595 @@
+<template>
+  <div class="form">
+    <van-tabs v-model:active="active">
+      <van-tab :title="'基本信息'" :name="0" />
+      <van-tab title="开票信息&税点结算" :name="1" />
+      <van-tab title="开票内容" :name="2" />
+    </van-tabs>
+
+    <testForm v-model="formData.data" :formOption="formOption" :formConfig="formConfig" :rules="rules" ref="formDom" v-show="active==0">
+      <template #fileList>
+        <div style="width:100%">
+          <div v-for="file in formData.data.fileList" :key="file.id" style="color: #409eff;cursor: pointer;"
+               @click="onPreviewFile(file.fileName,file.fileUrl)">
+            {{file.fileName}}
+          </div>
+        </div>
+      </template>
+      <template #jstOrderFileList>
+        <div style="width:100%">
+          <div v-for="file in formData.data.jstOrderFileList" :key="file.id" style="color: #409eff;cursor: pointer;"
+               @click="onPreviewFile(file.fileName,file.fileUrl)">
+            {{file.fileName}}
+          </div>
+        </div>
+      </template>
+      <template #shopTradeFileList>
+        <div style="width:100%">
+          <div v-for="file in formData.data.shopTradeFileList" :key="file.id" style="color: #409eff;cursor: pointer;"
+               @click="onPreviewFile(file.fileName,file.fileUrl)">
+            {{file.fileName}}
+          </div>
+        </div>
+      </template>
+
+      <template #detail>
+        <div style="width:100%">
+          <div style="width:100%;overflow-x:auto;">
+            <table border class="table">
+              <thead>
+                <tr>
+                  <th style="min-width:130px;">合同号</th>
+                  <th style="min-width:70px">收款金额</th>
+                  <th style="min-width:70px">已开票金额</th>
+                  <th style="min-width:70px">未开票金额</th>
+                  <th style="min-width:70px">开票金额</th>
+                </tr>
+              </thead>
+              <tbody v-if="formData.data.invoiceApplyContractDetailList && formData.data.invoiceApplyContractDetailList.length>0">
+                <tr v-for="(item,index) in formData.data.invoiceApplyContractDetailList" :key="index">
+                  <td>{{item.contractCode}}</td>
+                  <td>{{item.sumClaimMoney}}</td>
+                  <td> {{item.invoiceAmount}} </td>
+                  <td>{{item.unInvoiceAmount}}</td>
+                  <td>
+                    {{item.amount}}
+                  </td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </div>
+      </template>
+    </testForm>
+    <testForm v-model="formData.data" :formOption="formOption" :formConfig="formConfig1" :rules="rules" ref="formDom1" v-show="active==1">
+
+    </testForm>
+    <testForm v-model="formData.data" :formOption="formOption" :formConfig="formConfig2" :rules="rules" ref="formDom2" v-show="active==2">
+      <template #detail1>
+        <div style="width:100%">
+          <div style="width:100%;overflow-x:auto;">
+            <table border class="table">
+              <thead>
+                <tr>
+                  <th style="min-width:150px;">货物或应税劳务名称、服务名称</th>
+                  <th style="min-width:100px">规格型号</th>
+                  <th style="min-width:70px">单位</th>
+                  <th style="min-width:70px">数量</th>
+                  <th style="min-width:70px">单价(含税)</th>
+                  <th style="min-width:70px">金额(含税)</th>
+                  <th style="min-width:70px">税率(%)</th>
+                  <th style="min-width:70px">税额</th>
+                </tr>
+              </thead>
+              <tbody v-if="formData.data.invoiceApplyDetailList && formData.data.invoiceApplyDetailList.length>0">
+                <tr v-for="(item,index) in formData.data.invoiceApplyDetailList" :key="index">
+                  <td>{{item.name}}</td>
+                  <td>{{item.spec}}</td>
+                  <td>{{item.unit}}</td>
+                  <td>{{item.quantity}}</td>
+                  <td> {{item.priceIncludingTax}} </td>
+                  <td>{{item.amountIncludingTax}}</td>
+                  <td>
+                    {{item.taxRate}}
+                  </td>
+                  <td>{{item.taxAmount}}</td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </div>
+      </template>
+      <template #invoicerFileList>
+        <div style="width:100%">
+          <div v-for="file in formData.data.invoicerFileList" :key="file.id" style="color: #409eff;cursor: pointer;"
+               @click="onPreviewFile(file.fileName,file.fileUrl)">
+            {{file.fileName}}
+          </div>
+        </div>
+      </template>
+    </testForm>
+
+  </div>
+</template>
+
+<script setup>
+import {
+  ref,
+  getCurrentInstance,
+  onMounted,
+  defineProps,
+  defineExpose,
+  watch,
+  reactive,
+  toRefs,
+  computed,
+} from "vue";
+import { useRoute } from "vue-router";
+import testForm from "@/components/testForm/index.vue";
+import { getUserInfo } from "@/utils/auth";
+import { showFailToast } from "vant";
+import { getAllDict } from "@/utils/auth";
+
+// 接收父组件的传值
+const props = defineProps({
+  queryData: Object,
+});
+const refProps = toRefs(props);
+const proxy = getCurrentInstance().proxy;
+const internalOrderChannels = getAllDict()["internal_order_channels"];
+const applicatioScenario = getAllDict()["applicatio_scenario"];
+const paymentSituation = getAllDict()["payment_situation"];
+const invoiceType = ref([
+  {
+    label: "1%电子普票",
+    value: 1,
+  },
+  {
+    label: "1%纸质普票",
+    value: 0,
+  },
+]);
+
+const route = useRoute();
+const active = ref(0);
+const tabsChange = () => {
+  active.value++;
+};
+const selectData = ref([]);
+const isData = ref([
+  {
+    label: "是",
+    value: 1,
+  },
+  {
+    label: "否",
+    value: 0,
+  },
+]);
+const formData = reactive({
+  data: {},
+});
+const formDom = ref(null);
+const formOption = reactive({
+  readonly: false,
+  disabled: false,
+  labelAlign: "top",
+  scroll: true,
+  labelWidth: "62pk",
+  hiddenSubmitBtn: true,
+});
+const formConfig = computed(() => [
+  // {
+  //   type: "title",
+  //   title: "基本信息",
+  // },
+  {
+    type: "input",
+    label: "申请单号",
+    prop: "code",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "申请人",
+    prop: "createUserName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "开票部门",
+    prop: "deptName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "申请日期",
+    prop: "applyTime",
+    itemType: "text",
+    readonly: true,
+  },
+
+  {
+    type: "picker",
+    label: "申请场景",
+    prop: "applyScenario",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "dictValue",
+      value: "dictKey",
+    },
+    data: applicatioScenario,
+    readonly: false,
+  },
+  {
+    type: "picker",
+    label: "内部下单渠道",
+    prop: "orderingChannels",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "dictValue",
+      value: "dictKey",
+    },
+    data: internalOrderChannels,
+    readonly: false,
+  },
+  {
+    type: "slot",
+    label: "相关审批附件",
+    slotName: "fileList",
+  },
+  {
+    type: "slot",
+    label: "关联系统销售合同(表格可左右滚动)",
+    slotName: "detail",
+    isShow: formData.data.orderingChannels == "10",
+  },
+  {
+    type: "input",
+    label: "合同开票总金额",
+    prop: "contractAmount",
+    itemType: "text",
+    readonly: true,
+    isShow: formData.data.orderingChannels == "10",
+  },
+  {
+    type: "picker",
+    label: "是否匹配订单",
+    prop: "isMatchOrder",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "label",
+      value: "value",
+    },
+    data: isData.value,
+    readonly: false,
+    isShow: formData.data.orderingChannels == "30",
+  },
+  {
+    type: "picker",
+    label: "收款情况",
+    prop: "paymentSituation",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "dictValue",
+      value: "dictKey",
+    },
+    data: paymentSituation,
+    readonly: false,
+    isShow: formData.data.orderingChannels == "30",
+  },
+  {
+    type: "input",
+    label: "关联聚水潭单号",
+    prop: "jstOrderCode",
+    itemType: "text",
+    readonly: true,
+    isShow: ["20", "30", "40", "50"].includes(formData.data.orderingChannels),
+  },
+  {
+    type: "slot",
+    label: "聚水潭订单界面金额截图(需有订单号和金额)",
+    slotName: "jstOrderFileList",
+    isShow: ["20", "30", "40", "50"].includes(formData.data.orderingChannels),
+  },
+  {
+    type: "slot",
+    label: "店铺交易截图(含店铺名称、订单编号)",
+    slotName: "shopTradeFileList",
+    isShow: ["20", "40"].includes(formData.data.orderingChannels),
+  },
+  {
+    type: "input",
+    label: "开票要求备注",
+    prop: "askRemark",
+    itemType: "textarea",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "是否在票面备注上‘现金’两个字",
+    prop: "isCashNoted",
+    itemType: "text",
+    readonly: true,
+    isShow: ["20", "40"].includes(formData.data.orderingChannels),
+  },
+]);
+
+const formConfig1 = computed(() => [
+  {
+    type: "input",
+    label: "税点结算(%)",
+    prop: "taxPointSettle",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "税点结算金额",
+    prop: "taxPointSettleAmount",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "picker",
+    label: "开票类型",
+    prop: "billingType",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "dictValue",
+      value: "dictKey",
+    },
+    data: invoiceType.value,
+    readonly: false,
+  },
+  {
+    type: "input",
+    label: "客户开票信息",
+    prop: "buyerCompanyName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "纳税人识别号(购买方)",
+    prop: "buyerTaxpayerCode",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "地址、电话(购买方)",
+    prop: "buyerAddress",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "开户行及账号(购买方)",
+    prop: "buyerAccountBank",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "名称(销售方)",
+    prop: "sellerCompanyName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "纳税人识别号(销售方)",
+    prop: "sellerTaxpayerCode",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "地址、电话(销售方)",
+    prop: "sellerAddress",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "开户行及账号(销售方)",
+    prop: "sellerAccountBank",
+    itemType: "text",
+    readonly: true,
+  },
+]);
+
+const formConfig2 = computed(() => [
+  {
+    type: "slot",
+    label: "开票明细(表格可左右滚动)",
+    slotName: "detail1",
+  },
+  {
+    type: "input",
+    label: "合计开票总金额(含税)",
+    prop: "amountIncludingTax",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "票面备注内容",
+    prop: "ticketRemark",
+    itemType: "text",
+    readonly: true,
+  },
+
+  {
+    type: "slot",
+    label: "开票员上传发票附件",
+    slotName: "invoicerFileList",
+  },
+]);
+
+const rules = {};
+
+const getDict = () => {
+  proxy
+    .post("/educationConfig/page", {
+      pageNum: 1,
+      pageSize: 999,
+    })
+    .then((res) => {
+      selectData.value = res.data.rows.map((x) => ({
+        ...x,
+        label: x.name,
+        value: x.id,
+      }));
+    });
+};
+// getDict();
+
+const status = ref(true);
+const handleSubmit = async () => {
+  if (status.value) {
+    return formData.data;
+  }
+};
+const amountChange = () => {
+  let money = 0;
+  if (
+    formData.data.invoiceApplyContractDetailList &&
+    formData.data.invoiceApplyContractDetailList.length > 0
+  ) {
+    for (
+      let i = 0;
+      i < formData.data.invoiceApplyContractDetailList.length;
+      i++
+    ) {
+      let row = formData.data.invoiceApplyContractDetailList[i];
+
+      money = parseFloat(Number(money) + Number(row.amount)).toFixed(2);
+    }
+  }
+  formData.data.contractAmount = money;
+};
+
+onMounted(() => {
+  if (route.query && route.query.businessId) {
+    formOption.readonly = true;
+    formOption.hiddenSubmitBtn = true;
+    let businessId = route.query.businessId;
+    proxy.post("/invoiceApply/detail", { id: businessId }).then((res) => {
+      formData.data = res.data;
+      amountChange();
+      // setTimeout(() => {
+      //   formDom.value.formDataShowLabelOne();
+      // }, 100);
+      formData.data.isNewProduct = Number(formData.data.isNewProduct);
+      proxy
+        .post("/fileInfo/getList", { businessIdList: [businessId] })
+        .then((res) => {
+          let fileObj = res.data;
+          if (fileObj[businessId] && fileObj[businessId].length > 0) {
+            formData.data.fileList = fileObj[businessId]
+              .filter((x) => x.businessType == "10")
+              .map((item) => {
+                return {
+                  ...item,
+                  name: item.fileName,
+                  url: item.fileUrl,
+                };
+              });
+            formData.data.jstOrderFileList = fileObj[businessId]
+              .filter((x) => x.businessType == "20")
+              .map((item) => {
+                return {
+                  ...item,
+                  name: item.fileName,
+                  url: item.fileUrl,
+                };
+              });
+            if (
+              formData.data.jstOrderFileList &&
+              formData.data.jstOrderFileList.length > 0
+            ) {
+              formData.data.imageUrl =
+                formData.data.jstOrderFileList[0].fileUrl;
+            }
+            formData.data.shopTradeFileList = fileObj[businessId]
+              .filter((x) => x.businessType == "30")
+              .map((item) => {
+                return {
+                  ...item,
+                  name: item.fileName,
+                  url: item.fileUrl,
+                };
+              });
+            if (
+              formData.data.shopTradeFileList &&
+              formData.data.shopTradeFileList.length > 0
+            ) {
+              formData.data.imageUrlOne =
+                formData.data.shopTradeFileList[0].fileUrl;
+            }
+            formData.data.invoicerFileList = fileObj[businessId]
+              .filter((x) => x.businessType == "40")
+              .map((item) => {
+                return {
+                  ...item,
+                  name: item.fileName,
+                  url: item.fileUrl,
+                };
+              });
+          } else {
+            formData.data.fileList = [];
+            formData.data.jstOrderFileList = [];
+            formData.data.shopTradeFileList = [];
+            formData.data.invoicerFileList = [];
+          }
+        });
+    });
+  }
+});
+
+defineExpose({
+  handleSubmit,
+  tabsChange,
+});
+onMounted(() => {});
+</script>
+<style lang="scss" scoped>
+._title {
+  display: flex;
+  align-items: center;
+  font-size: 14px;
+  font-weight: 700;
+  margin-left: -10px;
+  .line {
+    width: 4px;
+    background-color: #0084ff;
+    height: 15px;
+    margin-right: 8px;
+  }
+}
+.table {
+  border-collapse: collapse;
+  border-spacing: 0;
+  width: 100%;
+  border-color: #ebeef5;
+  color: #606266;
+  thead tr th {
+    padding: 6px;
+    text-align: left;
+  }
+  td {
+    text-align: left;
+    padding: 6px;
+  }
+}
+</style>

+ 201 - 0
src/views/processApproval/components/MedicalAndsocialSecurity.vue

@@ -0,0 +1,201 @@
+<template>
+  <div class="form">
+    <testForm v-model="formData.data" :formOption="formOption" :formConfig="formConfig" :rules="rules" ref="formDom">
+      <template #file>
+        <div style="width:100%">
+          <div v-for="file in formData.data.fileList" :key="file.id" style="color: #409eff;cursor: pointer;"
+               @click="onPreviewFile(file.fileName,file.fileUrl)">
+            {{file.fileName}}
+          </div>
+        </div>
+      </template>
+    </testForm>
+  </div>
+</template>
+
+<script setup>
+import {
+  ref,
+  getCurrentInstance,
+  onMounted,
+  defineProps,
+  defineExpose,
+  watch,
+  reactive,
+  toRefs,
+} from "vue";
+import { useRoute } from "vue-router";
+import testForm from "@/components/testForm/index.vue";
+import { getUserInfo } from "@/utils/auth";
+import { showFailToast } from "vant";
+// 接收父组件的传值
+const props = defineProps({
+  queryData: Object,
+});
+const refProps = toRefs(props);
+const proxy = getCurrentInstance().proxy;
+const route = useRoute();
+const active = ref(0);
+const tabsChange = () => {
+  active.value++;
+};
+const selectData = ref([]);
+const formData = reactive({
+  data: {},
+});
+const formDom = ref(null);
+const formOption = reactive({
+  readonly: false,
+  disabled: false,
+  labelAlign: "top",
+  scroll: true,
+  labelWidth: "62pk",
+  hiddenSubmitBtn: true,
+});
+const formConfig = reactive([
+  {
+    type: "title",
+    title: "基本信息",
+  },
+  {
+    type: "input",
+    label: "流水号",
+    prop: "code",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "申请日期",
+    prop: "applyTime",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "申请人",
+    prop: "createUserName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "所属公司",
+    prop: "companyName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "所属部门",
+    prop: "deptName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "申请项目",
+    prop: "applyItem",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "入职日期",
+    prop: "entryTime",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "转正日期",
+    prop: "regularTime",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "费用承担",
+    prop: "costBearing",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "抵扣方式",
+    prop: "deductionMethod",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "备注栏",
+    prop: "remark",
+    itemType: "text",
+    readonly: true,
+  },
+
+  // {
+  //   type: "slot",
+  //   label: "学历证明附件",
+  //   slotName: "file",
+  // },
+]);
+
+const rules = {};
+
+const getDict = () => {
+  proxy
+    .post("/educationConfig/page", {
+      pageNum: 1,
+      pageSize: 999,
+    })
+    .then((res) => {
+      selectData.value = res.data.rows.map((x) => ({
+        ...x,
+        label: x.name,
+        value: x.id,
+      }));
+    });
+};
+// getDict();
+
+const status = ref(true);
+const handleSubmit = async () => {
+  if (status.value) {
+    return formData.data;
+  }
+};
+
+onMounted(() => {
+  if (route.query && route.query.businessId) {
+    formOption.readonly = true;
+    formOption.hiddenSubmitBtn = true;
+    let businessId = route.query.businessId;
+    proxy.post("/medicalInsurance/detail", { id: businessId }).then((res) => {
+      formData.data = res.data;
+    });
+  }
+});
+
+defineExpose({
+  handleSubmit,
+  tabsChange,
+});
+onMounted(() => {});
+</script>
+<style lang="scss" scoped>
+._title {
+  display: flex;
+  align-items: center;
+  font-size: 14px;
+  font-weight: 700;
+  margin-left: -10px;
+  .line {
+    width: 4px;
+    background-color: #0084ff;
+    height: 15px;
+    margin-right: 8px;
+  }
+}
+</style>

+ 348 - 0
src/views/processApproval/components/UseSeal.vue

@@ -0,0 +1,348 @@
+<template>
+  <div class="form">
+    <testForm v-model="formData.data" :formOption="formOption" :formConfig="formConfig" :rules="rules" ref="formDom">
+      <template #file>
+        <div style="width:100%">
+          <div v-for="file in formData.data.fileList" :key="file.id" style="color: #409eff;cursor: pointer;"
+               @click="onPreviewFile(file.fileName,file.fileUrl)">
+            {{file.fileName}}
+          </div>
+        </div>
+      </template>
+      <template #fileOne>
+        <div style="width:100%">
+          <div v-for="file in formData.data.companyFileList" :key="file.id" style="color: #409eff;cursor: pointer;"
+               @click="onPreviewFile(file.fileName,file.fileUrl)">
+            {{file.fileName}}
+          </div>
+        </div>
+      </template>
+      <template #fileTwo>
+        <div style="width:100%">
+          <div v-for="file in formData.data.customerFileList" :key="file.id" style="color: #409eff;cursor: pointer;"
+               @click="onPreviewFile(file.fileName,file.fileUrl)">
+            {{file.fileName}}
+          </div>
+        </div>
+      </template>
+    </testForm>
+  </div>
+</template>
+
+<script setup>
+import {
+  ref,
+  getCurrentInstance,
+  onMounted,
+  defineProps,
+  defineExpose,
+  watch,
+  reactive,
+  toRefs,
+  computed,
+} from "vue";
+import { useRoute } from "vue-router";
+import testForm from "@/components/testForm/index.vue";
+import { getUserInfo } from "@/utils/auth";
+import { showFailToast } from "vant";
+import { getAllDict } from "@/utils/auth";
+
+// 接收父组件的传值
+const props = defineProps({
+  queryData: Object,
+});
+const refProps = toRefs(props);
+const proxy = getCurrentInstance().proxy;
+const route = useRoute();
+const active = ref(0);
+const tabsChange = () => {
+  active.value++;
+};
+const selectData = ref([]);
+const sealType = getAllDict()["seal_type"];
+const sealCategory = getAllDict()["seal_category"];
+const sealIsContract = getAllDict()["seal_is_contract"];
+
+const formData = reactive({
+  data: {},
+});
+const formDom = ref(null);
+const formOption = reactive({
+  readonly: false,
+  disabled: false,
+  labelAlign: "top",
+  scroll: true,
+  labelWidth: "62pk",
+  hiddenSubmitBtn: true,
+});
+const formConfig = computed(() => [
+  {
+    type: "title",
+    title: "基本信息",
+  },
+  {
+    type: "input",
+    label: "流水号",
+    prop: "code",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "申请人",
+    prop: "createUserName",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "input",
+    label: "申请日期",
+    prop: "applyTime",
+    itemType: "text",
+    readonly: true,
+  },
+  {
+    type: "picker",
+    label: "印章名称",
+    prop: "sealIds",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "label",
+      value: "value",
+    },
+    data: selectData.value,
+    readonly: false,
+  },
+  {
+    type: "picker",
+    label: "使用方式",
+    prop: "useMethod",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "label",
+      value: "value",
+    },
+    data: [
+      {
+        label: "借章",
+        value: "1",
+      },
+      {
+        label: "盖章",
+        value: "2",
+      },
+    ],
+    readonly: false,
+  },
+  {
+    type: "picker",
+    label: "印章类型",
+    prop: "sealType",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "dictValue",
+      value: "dictKey",
+    },
+    data: sealType,
+    readonly: false,
+    isShow: formData.data.useMethod == "2",
+  },
+  {
+    type: "picker",
+    label: "是否盖过章",
+    prop: "isStamped",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "label",
+      value: "value",
+    },
+    data: [
+      {
+        label: "是",
+        value: 1,
+      },
+      {
+        label: "否",
+        value: 0,
+      },
+    ],
+    readonly: false,
+  },
+  {
+    type: "picker",
+    label: "盖章类别",
+    prop: "stampedType",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "dictValue",
+      value: "dictKey",
+    },
+    data: sealCategory,
+    readonly: false,
+  },
+  {
+    type: "picker",
+    label: "是否销售合同",
+    prop: "isContract",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "dictValue",
+      value: "dictKey",
+    },
+    data: sealIsContract,
+    readonly: false,
+    isShow: formData.data.useMethod == "2",
+  },
+  {
+    type: "input",
+    label: "关联销售合同",
+    prop: "contractCode",
+    itemType: "text",
+    readonly: true,
+    isShow: formData.data.useMethod == "2" && formData.data.isContract == "10",
+  },
+  {
+    type: "input",
+    label: "借出日期",
+    prop: "borrowTime",
+    itemType: "text",
+    readonly: true,
+    isShow: formData.data.useMethod == "1",
+  },
+  {
+    type: "input",
+    label: "归还日期",
+    prop: "returnedTime",
+    itemType: "text",
+    readonly: true,
+    isShow: formData.data.useMethod == "1",
+  },
+  {
+    type: "input",
+    label: "借出用途说明",
+    prop: "remark",
+    itemType: "text",
+    readonly: true,
+    isShow: formData.data.useMethod == "1",
+  },
+  {
+    type: "slot",
+    label: "需盖章文件",
+    slotName: "file",
+    isShow: formData.data.useMethod == "2",
+  },
+  {
+    type: "slot",
+    label: "公司已盖章文件",
+    slotName: "fileOne",
+    isShow: formData.data.useMethod == "2",
+  },
+  {
+    type: "slot",
+    label: "客户已盖章文件",
+    slotName: "fileTwo",
+    isShow: formData.data.useMethod == "2",
+  },
+]);
+
+const rules = {};
+
+const getDict = () => {
+  proxy
+    .post("/sealConfig/page", {
+      pageNum: 1,
+      pageSize: 999,
+    })
+    .then((res) => {
+      selectData.value = res.data.rows.map((x) => ({
+        ...x,
+        label: x.name,
+        value: x.id,
+      }));
+    });
+};
+getDict();
+
+const status = ref(true);
+const handleSubmit = async () => {
+  if (status.value) {
+    return formData.data;
+  }
+};
+
+onMounted(() => {
+  if (route.query && route.query.businessId) {
+    formOption.readonly = true;
+    formOption.hiddenSubmitBtn = true;
+    let businessId = route.query.businessId;
+    proxy.post("/sealUse/detail", { id: businessId }).then((res) => {
+      formData.data = res.data;
+      proxy
+        .post("/fileInfo/getList", { businessIdList: [businessId] })
+        .then((res) => {
+          let fileObj = res.data;
+          if (fileObj[businessId] && fileObj[businessId].length > 0) {
+            formData.data.fileList = fileObj[businessId]
+              .filter((x) => x.businessType == "10")
+              .map((item) => {
+                return {
+                  ...item,
+                  name: item.fileName,
+                  url: item.fileUrl,
+                };
+              });
+            formData.data.companyFileList = fileObj[businessId]
+              .filter((x) => x.businessType == "20")
+              .map((item) => {
+                return {
+                  ...item,
+                  name: item.fileName,
+                  url: item.fileUrl,
+                };
+              });
+            formData.data.customerFileList = fileObj[businessId]
+              .filter((x) => x.businessType == "30")
+              .map((item) => {
+                return {
+                  ...item,
+                  name: item.fileName,
+                  url: item.fileUrl,
+                };
+              });
+          } else {
+            formData.data.fileList = [];
+            formData.data.companyFileList = [];
+            formData.data.customerFileList = [];
+          }
+        });
+    });
+  }
+});
+
+defineExpose({
+  handleSubmit,
+  tabsChange,
+});
+onMounted(() => {});
+</script>
+<style lang="scss" scoped>
+._title {
+  display: flex;
+  align-items: center;
+  font-size: 14px;
+  font-weight: 700;
+  margin-left: -10px;
+  .line {
+    width: 4px;
+    background-color: #0084ff;
+    height: 15px;
+    margin-right: 8px;
+  }
+}
+</style>

+ 42 - 1
src/views/processApproval/processDtl.vue

@@ -113,7 +113,12 @@ import EhsdSampleChange from "./components/EhsdSampleChange";
 import EhsdPurchase from "./components/EhsdPurchase";
 import EhsdPurchaseChange from "./components/EhsdPurchaseChange";
 import EhsdPriceSheet from "./components/EhsdPriceSheet";
-
+import EducationSubsidy from "./components/EducationSubsidy";
+import UseSeal from "./components/UseSeal";
+import MedicalAndsocialSecurity from "./components/MedicalAndsocialSecurity";
+import EncodingCombination from "./components/EncodingCombination";
+import ActivityPriceInventory from "./components/ActivityPriceInventory";
+import InvoicingApplication from "./components/InvoicingApplication";
 import SendPurchase from "./components/SendPurchase";
 import SendPurchasePayment from "./components/SendPurchasePayment";
 import ContractAlteration from "./components/ContractAlteration";
@@ -228,6 +233,42 @@ let componentObj = ref({
     backUrl: "/main/working",
     tabsNum: 0,
   },
+  education_subsidy_flow: {
+    title: "学历补贴发起流程",
+    component: EducationSubsidy,
+    backUrl: "/main/working",
+    tabsNum: 0,
+  },
+  seal_use_flow: {
+    title: "用印申请发起流程",
+    component: UseSeal,
+    backUrl: "/main/working",
+    tabsNum: 0,
+  },
+  medical_insurance_flow: {
+    title: "医社保申请发起流程",
+    component: MedicalAndsocialSecurity,
+    backUrl: "/main/working",
+    tabsNum: 0,
+  },
+  erp_coding_group_flow: {
+    title: "ERP编码组合申请发起流程",
+    component: EncodingCombination,
+    backUrl: "/main/working",
+    tabsNum: 0,
+  },
+  activity_price_inventory_flow: {
+    title: "活动、价格、库存申请发起流程",
+    component: ActivityPriceInventory,
+    backUrl: "/main/working",
+    tabsNum: 0,
+  },
+  invoice_apply_flow: {
+    title: "开票申请发起流程",
+    component: InvoicingApplication,
+    backUrl: "/main/working",
+    tabsNum: 0,
+  },
 });
 
 let dialogVisible = ref(false);