Browse Source

fix: 必填校验弹窗提醒

liuc 4 months ago
parent
commit
c24e8addd2

+ 27 - 3
src/views/flow/stFlowDesign/components/ConfigPanel/ConfigNode/index.vue

@@ -98,7 +98,7 @@
           </a-col>
         </a-row>
       </a-collapse-panel>
-      <a-collapse-panel v-if='globalGridAttr.nodeType==="2"||globalGridAttr.nodeType==="3"' key='3' header='数据权限'>
+      <a-collapse-panel v-if='globalGridAttr.nodeType==="2"' key='3' header='数据权限'>
         <a-table
             :columns='DataPowerColumns'
             :data-source='globalGridAttr.dataPowerData'
@@ -119,7 +119,27 @@
           </template>
         </a-table>
       </a-collapse-panel>
-      <a-collapse-panel v-if='globalGridAttr.nodeType==="2"||globalGridAttr.nodeType==="3"' key='4' header='操作权限'>
+      <a-collapse-panel v-if='globalGridAttr.nodeType==="3"' key='4' header='数据权限'>
+        <a-table
+            :columns='DataPowerColumnsView'
+            :data-source='globalGridAttr.dataPowerData'
+            :pagination="false"
+            :scroll="{ y: 500 }"
+        >
+          <template #bodyCell="{ column, record }">
+            <template v-if='column.dataIndex=="view"'>
+              <a-checkbox v-model:checked='record.view'></a-checkbox>
+            </template>
+            <template v-else-if='column.dataIndex=="write"'>
+              <a-checkbox v-model:checked='record.write'></a-checkbox>
+            </template>
+            <template v-else-if='column.dataIndex=="require"'>
+              <a-checkbox v-model:checked='record.require'></a-checkbox>
+            </template>
+          </template>
+        </a-table>
+      </a-collapse-panel>
+      <a-collapse-panel v-if='globalGridAttr.nodeType==="2"||globalGridAttr.nodeType==="3"' key='5' header='操作权限'>
         <a-checkbox v-model:checked='globalGridAttr.operatePowerData.circulation' @change="circulationChange">传阅
         </a-checkbox>
         <a-checkbox v-if="globalGridAttr.nodeType==='2'" v-model:checked='globalGridAttr.operatePowerData.forward'
@@ -301,7 +321,10 @@ const DataPowerColumns = [
   {title: '可写', dataIndex: 'write', align: "center", scopedSlots: {customRender: 'write'}},
   {title: '必填', dataIndex: 'require', align: "center", scopedSlots: {customRender: 'require'}}
 ]
-
+const DataPowerColumnsView = [
+  {title: '数据项', dataIndex: 'field', key: 'field', width: "150px", scopedSlots: {customRender: 'field'}},
+  {title: '可见', dataIndex: 'view', align: "center", scopedSlots: {customRender: 'view'}},
+]
 
 import {nodeOpt} from './method'
 import selectParticipant from '/@/views/flow/stFlowDesign/components/ConfigPanel/selectParticipant.vue'
@@ -333,6 +356,7 @@ export default {
     return {
       test: '',
       DataPowerColumns,
+      DataPowerColumnsView,
       curCel: '',
       flowModules: [],
       mainFieldOptions: [],

+ 3 - 3
src/views/flow/stFormDesign/packages/StBatch/batch.vue

@@ -32,9 +32,9 @@
           <div v-if="scope.column.dataIndex === 'sequence_index_number'">
             {{ getSerialNumber(scope.index) }}
           </div>
-          <div v-else-if="
-          record.list.find((item) => item.disableIndex ==getSerialNumber(scope.index))
-          &&record.list.find((item) => item.disableColumn ==scope.column.dataIndex)">
+          <div v-else-if="record.list.find((item) =>item.disableColumn&& item.disableColumn ==scope.column.dataIndex)&&
+          record.list.find((item) =>Array.isArray(item.disableIndex)&&item.disableIndex.includes(getSerialNumber(scope.index)))
+          ">
             <StFormModelItem
                 :record="record.list.find((item) => item.model == scope.column.dataIndex)"
                 :config="config"

+ 4 - 1
src/views/flow/stFormDesign/packages/StBatch/module/StFormModelItem.vue

@@ -2,7 +2,7 @@
  * @Description: 传入record数据,通过判断record.type,来渲染对应的组件
  -->
 <template>
-  <a-form-item
+  <a-form-item  :class="{ 'red-label': record?.options?.requiredFirst ||record?.rules?.find(f=>f.required)}"
     v-if="
       [
         'input',
@@ -268,4 +268,7 @@ export default {
     width: 70px;
   }
 }
+::v-deep(.red-label .ant-form-item-label > label) {
+  color: red;
+}
 </style>

+ 48 - 3
src/views/flow/stFormDesign/packages/StFormBuild/index.vue

@@ -28,12 +28,52 @@
       />
     </a-form>
   </a-config-provider>
+  <a-modal v-model:open="requiredOpen" title="表单校验不通过" :footer="null" :afterClose="requiredClose">
+    <div v-for="(item,index) in requireComputed">
+      <p>{{ item }}</p>
+    </div>
+  </a-modal>
 </template>
 <script setup>
 import {ref, reactive, toRefs, watch, onMounted, nextTick, computed} from "vue";
 import buildBlocks from "./buildBlocks.vue";
 import zhCN from "ant-design-vue/es/locale/zh_CN";
 
+const requiredOpen = ref(false)
+
+const requiredContents = ref([])
+const requiredChildContents = ref([])
+const requireComputed = computed(() => {
+  const result = []
+  for (let item of requiredContents.value) {
+    if (Array.isArray(item.name) && Array.isArray(item.errors)
+        && item.name.length > 0 && item.errors.length > 0) {
+      if (item.errors[0] == '必填项') {
+        result.push(props.fieldMap[item.name[0]].name + ' 是【' + item.errors[0] + '】')
+      } else {
+        result.push(props.fieldMap[item.name[0]].name + ' 应【' + item.errors[0] + '】')
+      }
+    }
+  }
+  for (let item of requiredChildContents.value) {
+    if (Array.isArray(item.name) && Array.isArray(item.errors)
+        && item.name.length > 2 && item.errors.length > 0) {
+      for (const key in props.fieldMap) {
+        if (props.fieldMap.hasOwnProperty(key) && props.fieldMap[key].type == 'CHILDREN') { // 检查是否是对象自身的属性
+          const find = props.fieldMap[key].children.find(f => f.code === item.name[2]);
+          if (find) {
+            result.push('子表【' + props.fieldMap[key].name + '】的第' + (item.name[1] + 1) + '行:' + find.name + ' 是【' + item.errors[0] + '】')
+          }
+        }
+      }
+    }
+  }
+  return result
+});
+const requiredClose = () => {
+  requiredContents.value = []
+  requiredChildContents.value = []
+}
 const formRef = ref(null);
 
 const buildBlocksRef = ref(null);
@@ -65,6 +105,10 @@ const props = defineProps({
     type: Object,
     default: () => ({}),
   },
+  fieldMap: {
+    type: Object,
+    default: () => ({}),
+  },
 });
 
 const emit = defineEmits(["submit", "change"]);
@@ -85,7 +129,6 @@ const getDynamicData = computed(() => {
 const handleSubmit = (e) => {
   e.preventDefault();
   emit("submit", getData);
-
 };
 
 const reset = () => {
@@ -97,7 +140,6 @@ const reset = () => {
       for (const key in formData) {
         formData[key] = props.defaultValue[key] || undefined;
       }
-
       resolve(true);
     }, 100)
   })
@@ -125,11 +167,15 @@ const getData = () => {
         return Promise.all(buildBlocksRef.value.map(item => item.validationSubform())).then(res => {
           resolve(formData);
         }).catch(err => {
+          requiredOpen.value = open
           validatorError.value = err;
+          requiredChildContents.value = err.errorFields
           reject(err);
         });
       }
     }).catch(err => {
+      requiredOpen.value = open
+      requiredContents.value = err.errorFields
       validatorError.value = err;
       reject(err);
     })
@@ -377,7 +423,6 @@ const findObjectsByOption = (json, option, value) => {
           } else {
             results.push(item);
           }
-
         }
       }
 

+ 14 - 2
src/views/flow/stFormDesign/packages/StFormDesign/module/jsModal.vue

@@ -486,6 +486,18 @@ const commonMethods = [
     "fieldCode": "this.show('XXX')",
     "children": null
   },
+  {
+    "type": "基本操作",
+    "field": "可编辑",
+    "fieldCode": "this.enable('XXX')",
+    "children": null
+  },
+  {
+    "type": "基本操作",
+    "field": "不可编辑",
+    "fieldCode": "this.disable('XXX')",
+    "children": null
+  },
   {
     "type": "网络交互",
     "field": "POST请求",
@@ -664,10 +676,10 @@ const commonMethods = [
   {
     "type": "复杂逻辑",
     "field": "子表单元格不可编辑",
-    "fieldCode": "const childModel = this.getFieldByModel('test_flow2_child')\n" +
+    "fieldCode": "        const childModel = this.getFieldByModel('test_flow2_child')\n" +
         "        const columnIndex = 1;//表示第几列隐藏\n" +
         "        childModel.list[columnIndex].disableColumn = childModel.list[columnIndex].model//固定写法\n" +
-        "        childModel.list[1].disableIndex = 3; //3表示序号,从1开始",
+        "        childModel.list[columnIndex].disableIndex = [1, 3]//隐藏1、3行",
     "children": null
   },
   {

+ 5 - 2
src/views/flow/stFormDesign/packages/StFormItem/index.vue

@@ -3,7 +3,7 @@
  -->
 <template>
   <div v-show="labelVisible">
-    <a-form-item v-if="
+    <a-form-item :class="{ 'red-label': record?.options?.requiredFirst ||record?.rules?.find(f=>f.required)}" v-if="
       [
         'input',
         'textarea',
@@ -107,7 +107,7 @@
                  :placeholder="(disabled || record.options.disabled) ? '' : record.options.placeholder"></component>
     </a-form-item>
     <!-- 可隐藏label -->
-    <a-form-item v-else-if="['batch', 'selectInputList'].includes(record.type)"
+    <a-form-item :class="{ 'red-label': record?.options?.requiredFirst ||record?.rules?.find(f=>f.required)}" v-else-if="['batch', 'selectInputList'].includes(record.type)"
                  :label="!record.options.showLabel ? '' : record.label" :label-col="formConfig.layout === 'horizontal' && record.options.showLabel
         ? formConfig.labelLayout === 'flex'
           ? { style: `width:${formConfig.labelWidth}px` }
@@ -413,4 +413,7 @@ export default {
 .anticon.anticon-question-circle-o {
   margin-left: 5px;
 }
+::v-deep(.red-label .ant-form-item-label > label) {
+  color: red;
+}
 </style>

+ 46 - 74
src/views/flow/stFormWork/formWork.vue

@@ -14,6 +14,7 @@
                 :value="formModel.formData"
                 :disabled="formModel.disabled"
                 :config="formModel.config"
+                :fieldMap="fieldMap"
                 @change="change"
                 :dynamicData="dynamicData"
                 @btn-click="btnClick"
@@ -397,40 +398,10 @@ const {
 } =
     useActions();
 onBeforeMount(() => {
-  console.log(route, 'markRoute1')
   if (route.query.isMobile) {
     isMobile.value = route.query.isMobile
   }
-
-  // const loginName = route.query.loginName;
-  // const redirect_uri = route.query.url
-  // // 单点登录
-  // useUserStore().autoLogin(loginName).then((res) => {
-
-  //   localSave(LocalStorageKeyConst.USER_TOKEN, res.data.token ? res.data.token : '');
-  //   SmartLoading.hide();
-  //   //更新用户信息到pinia
-  //   useUserStore().setUserLoginInfo(res.data);
-  //   //构建系统的路由
-  //   buildRoutes();
-  //   // 在单点登录成功后
-  //   checkUserToken(redirect_uri);
-  // });
-  // const checkUserToken = (redirect_uri) => {
-  //   const userToken = localRead(LocalStorageKeyConst.USER_TOKEN);
-  //   if (userToken === null || userToken === '') {
-  //     // 如果为空,等待 1 秒后继续判断
-  //     setTimeout(() => {
-  //       checkUserToken(redirect_uri)
-  //     }, 1000);
-  //   } else {
-  //     setTimeout(() => {
-  //       router.push(redirect_uri);
-  //     }, 1000);
-  //   }
-  // }
-
-})
+  })
 onMounted(async () => {
   window.hiwebSocket = {
     hasIo: function hasIo(t) {
@@ -1141,50 +1112,51 @@ const handleCancel = () => {
 };
 // 提交动作
 const handleSubmit = () => {
-  Modal.confirm({
-    title: (tag.value == 'START' || taskObj.value.activityCode == 'Task2') ? "确认要提交吗?" : "确认审核通过吗?",
-    onOk() {
-      try {
-        beforeSubmit(dynamicMethods).then(
-            (res) => {
-              const socketMap = {};
-              socketMap.userId = userStore.employeeId;
-              socketMap.type = 'REFRESH';
-              socketMap.message = '提交';
-              WebSocketStore.send(JSON.stringify(socketMap));
-              submitService().then((s) => {
-                if (s.success === true) {
-                  if (taskObj.value.activityCode == 'Task2') {
-                    //提交后 保持当前页面
-                    const routerAfter = router.resolve({
-                      path: '/MvcSheet/formWork',
-                      query: {
-                        flowCode: s.data.flowCode,
-                        flowVersion: s.data.flowVersion,
-                        bizObjectID: s.data.bizObjectid,
-                        taskID: s.data.taskid,
-                        retrieve: '1'//只有从已办列表查看时,才显示取回
-                      }
-                    })
-                    window.open(routerAfter.href, '_self')
-                    location.reload();
-                  } else {
-                    window.close();
+  stbRef.value.getData().then((res) => {
+    Modal.confirm({
+      title: (tag.value == 'START' || taskObj.value.activityCode == 'Task2') ? "确认要提交吗?" : "确认审核通过吗?",
+      onOk() {
+        try {
+          beforeSubmit(dynamicMethods).then(
+              (res) => {
+                const socketMap = {};
+                socketMap.userId = userStore.employeeId;
+                socketMap.type = 'REFRESH';
+                socketMap.message = '提交';
+                WebSocketStore.send(JSON.stringify(socketMap));
+                submitService().then((s) => {
+                  if (s.success === true) {
+                    if (taskObj.value.activityCode == 'Task2') {
+                      //提交后 保持当前页面
+                      const routerAfter = router.resolve({
+                        path: '/MvcSheet/formWork',
+                        query: {
+                          flowCode: s.data.flowCode,
+                          flowVersion: s.data.flowVersion,
+                          bizObjectID: s.data.bizObjectid,
+                          taskID: s.data.taskid,
+                          retrieve: '1'//只有从已办列表查看时,才显示取回
+                        }
+                      })
+                      window.open(routerAfter.href, '_self')
+                      location.reload();
+                    } else {
+                      window.close();
+                    }
                   }
-                }
-              });
-            },
-            (err) => {
-              //message.error(err);
-            }
-        );
-      } catch (e) {
-        message.warning('提交/审核时报错' + e.toString());
-      }
-    },
-    onCancel() {
-      message.warning('已取消操作');
-    },
+                });
+              },
+              (err) => {
+              }
+          );
+        } catch (e) {
+          message.warning('提交/审核时报错' + e.toString());
+        }
+      },
+      onCancel() {
+        message.warning('已取消操作');
+      },
+    });
   });
 };
 // 提交和保存前的检查

+ 1 - 0
src/views/process/todo-task/index.vue

@@ -105,6 +105,7 @@ const tableConfig = ref({
                 isBatches: true,
               };
               const res = await useSubmitService(paramsData);
+
               if (res.data.errorMessage) {
                 errorCount += 1;
                 errorMessage.value.push(errorCount + "、【" + subData[i].instance_name + "】审核失败原因:" + res.data.errorMessage);

+ 1 - 1
vite.config.js

@@ -39,7 +39,7 @@ export default {
     port: 8081,
     proxy: {
       '/api': {
-        target: 'http://localhost:6008',
+        target: 'http://localhost:9000',
         // target: 'http://192.168.17.209:2024',
         changeOrigin: true,
         ws: true,