From a1d7e81859f554f3a53680cc35f0f49bf1f77098 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期四, 14 五月 2026 14:37:02 +0800
Subject: [PATCH] 导入项目

---
 src/views/bpm/model/form/ExtraSettings.vue |  507 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 507 insertions(+), 0 deletions(-)

diff --git a/src/views/bpm/model/form/ExtraSettings.vue b/src/views/bpm/model/form/ExtraSettings.vue
new file mode 100644
index 0000000..e250eec
--- /dev/null
+++ b/src/views/bpm/model/form/ExtraSettings.vue
@@ -0,0 +1,507 @@
+<template>
+  <el-form ref="formRef" :model="modelData" label-width="130px" class="mt-20px">
+    <el-form-item class="mb-20px">
+      <template #label>
+        <el-text size="large" tag="b">鎻愪氦浜烘潈闄�</el-text>
+      </template>
+      <div class="flex flex-col">
+        <el-checkbox v-model="modelData.allowCancelRunningProcess" label="鍏佽鎾ら攢瀹℃壒涓殑鐢宠" />
+      </div>
+    </el-form-item>
+    <el-form-item class="mb-20px">
+      <template #label>
+        <el-text size="large" tag="b">瀹℃壒浜烘潈闄�</el-text>
+      </template>
+      <div class="flex flex-col">
+        <el-checkbox v-model="modelData.allowWithdrawTask" label="鍏佽瀹℃壒浜烘挙鍥炰换鍔�" />
+        <div class="ml-22px">
+          <el-text type="info"> 瀹℃壒浜哄彲鎾ゅ洖姝e湪瀹℃壒鑺傜偣鐨勫墠涓�鑺傜偣 </el-text>
+        </div>
+      </div>
+    </el-form-item>
+    <el-form-item v-if="modelData.processIdRule" class="mb-20px">
+      <template #label>
+        <el-text size="large" tag="b">娴佺▼缂栫爜</el-text>
+      </template>
+      <div class="flex flex-col">
+        <div>
+          <el-input
+            v-model="modelData.processIdRule.prefix"
+            class="w-130px!"
+            placeholder="鍓嶇紑"
+            :disabled="!modelData.processIdRule.enable"
+          >
+            <template #prepend>
+              <el-checkbox v-model="modelData.processIdRule.enable" />
+            </template>
+          </el-input>
+          <el-select
+            v-model="modelData.processIdRule.infix"
+            class="w-130px! ml-5px"
+            placeholder="涓紑"
+            :disabled="!modelData.processIdRule.enable"
+          >
+            <el-option
+              v-for="item in timeOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            />
+          </el-select>
+          <el-input
+            v-model="modelData.processIdRule.postfix"
+            class="w-80px! ml-5px"
+            placeholder="鍚庣紑"
+            :disabled="!modelData.processIdRule.enable"
+          />
+          <el-input-number
+            v-model="modelData.processIdRule.length"
+            class="w-120px! ml-5px"
+            :min="5"
+            :disabled="!modelData.processIdRule.enable"
+          />
+        </div>
+        <div class="ml-22px" v-if="modelData.processIdRule.enable">
+          <el-text type="info"> 缂栫爜绀轰緥锛歿{ numberExample }} </el-text>
+        </div>
+      </div>
+    </el-form-item>
+    <el-form-item class="mb-20px">
+      <template #label>
+        <el-text size="large" tag="b">鑷姩鍘婚噸</el-text>
+      </template>
+      <div class="flex flex-col">
+        <div>
+          <el-text> 鍚屼竴瀹℃壒浜哄湪娴佺▼涓噸澶嶅嚭鐜版椂锛� </el-text>
+        </div>
+        <el-radio-group v-model="modelData.autoApprovalType">
+          <div class="flex flex-col">
+            <el-radio :value="0">涓嶈嚜鍔ㄩ�氳繃</el-radio>
+            <el-radio :value="1">浠呭鎵逛竴娆★紝鍚庣画閲嶅鐨勫鎵硅妭鐐瑰潎鑷姩閫氳繃</el-radio>
+            <el-radio :value="2">浠呴拡瀵硅繛缁鎵圭殑鑺傜偣鑷姩閫氳繃</el-radio>
+          </div>
+        </el-radio-group>
+      </div>
+    </el-form-item>
+    <el-form-item v-if="modelData.titleSetting" class="mb-20px">
+      <template #label>
+        <el-text size="large" tag="b">鏍囬璁剧疆</el-text>
+      </template>
+      <div class="flex flex-col">
+        <el-radio-group v-model="modelData.titleSetting.enable">
+          <div class="flex flex-col">
+            <el-radio :value="false"
+              >绯荤粺榛樿 <el-text type="info"> 灞曠ず娴佺▼鍚嶇О </el-text></el-radio
+            >
+            <el-radio :value="true">
+              鑷畾涔夋爣棰�
+              <el-text>
+                <el-tooltip content="杈撳叆瀛楃 '{' 鍗冲彲鎻掑叆琛ㄥ崟瀛楁" effect="light" placement="top">
+                  <Icon icon="ep:question-filled" class="ml-5px" />
+                </el-tooltip>
+              </el-text>
+            </el-radio>
+          </div>
+        </el-radio-group>
+        <el-mention
+          v-if="modelData.titleSetting.enable"
+          v-model="modelData.titleSetting.title"
+          type="textarea"
+          prefix="{"
+          split="}"
+          whole
+          :options="formFieldOptions4Title"
+          placeholder="璇锋彃鍏ヨ〃鍗曞瓧娈碉紙杈撳叆 '{' 鍙互閫夋嫨琛ㄥ崟瀛楁锛夋垨杈撳叆鏂囨湰"
+          class="w-600px!"
+        />
+      </div>
+    </el-form-item>
+    <el-form-item
+      v-if="modelData.summarySetting && modelData.formType === BpmModelFormType.NORMAL"
+      class="mb-20px"
+    >
+      <template #label>
+        <el-text size="large" tag="b">鎽樿璁剧疆</el-text>
+      </template>
+      <div class="flex flex-col">
+        <el-radio-group v-model="modelData.summarySetting.enable">
+          <div class="flex flex-col">
+            <el-radio :value="false">
+              绯荤粺榛樿 <el-text type="info"> 灞曠ず琛ㄥ崟鍓� 3 涓瓧娈� </el-text>
+            </el-radio>
+            <el-radio :value="true"> 鑷畾涔夋憳瑕� </el-radio>
+          </div>
+        </el-radio-group>
+        <el-select
+          class="w-500px!"
+          v-if="modelData.summarySetting.enable"
+          v-model="modelData.summarySetting.summary"
+          multiple
+          placeholder="璇烽�夋嫨瑕佸睍绀虹殑琛ㄥ崟瀛楁"
+        >
+          <el-option
+            v-for="item in formFieldOptions4Summary"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
+        </el-select>
+      </div>
+    </el-form-item>
+    <el-form-item class="mb-20px">
+      <template #label>
+        <el-text size="large" tag="b">娴佺▼鍓嶇疆閫氱煡</el-text>
+      </template>
+      <div class="flex flex-col w-100%">
+        <div class="flex">
+          <el-switch
+            v-model="processBeforeTriggerEnable"
+            @change="handleProcessBeforeTriggerEnableChange"
+          />
+          <div class="ml-80px">娴佺▼鍚姩鍚庨�氱煡</div>
+        </div>
+        <HttpRequestSetting
+          v-if="processBeforeTriggerEnable"
+          v-model:setting="modelData.processBeforeTriggerSetting"
+          :responseEnable="true"
+          :formItemPrefix="'processBeforeTriggerSetting'"
+        />
+      </div>
+    </el-form-item>
+    <el-form-item class="mb-20px">
+      <template #label>
+        <el-text size="large" tag="b">娴佺▼鍚庣疆閫氱煡</el-text>
+      </template>
+      <div class="flex flex-col w-100%">
+        <div class="flex">
+          <el-switch
+            v-model="processAfterTriggerEnable"
+            @change="handleProcessAfterTriggerEnableChange"
+          />
+          <div class="ml-80px">娴佺▼缁撴潫鍚庨�氱煡</div>
+        </div>
+        <HttpRequestSetting
+          v-if="processAfterTriggerEnable"
+          v-model:setting="modelData.processAfterTriggerSetting"
+          :responseEnable="true"
+          :formItemPrefix="'processAfterTriggerSetting'"
+        />
+      </div>
+    </el-form-item>
+    <el-form-item class="mb-20px">
+      <template #label>
+        <el-text size="large" tag="b">浠诲姟鍓嶇疆閫氱煡</el-text>
+      </template>
+      <div class="flex flex-col w-100%">
+        <div class="flex">
+          <el-switch
+            v-model="taskBeforeTriggerEnable"
+            @change="handleTaskBeforeTriggerEnableChange"
+          />
+          <div class="ml-80px">浠诲姟鎵ц鏃堕�氱煡</div>
+        </div>
+        <HttpRequestSetting
+          v-if="taskBeforeTriggerEnable"
+          v-model:setting="modelData.taskBeforeTriggerSetting"
+          :responseEnable="true"
+          :formItemPrefix="'taskBeforeTriggerSetting'"
+        />
+      </div>
+    </el-form-item>
+    <el-form-item class="mb-20px">
+      <template #label>
+        <el-text size="large" tag="b">浠诲姟鍚庣疆閫氱煡</el-text>
+      </template>
+      <div class="flex flex-col w-100%">
+        <div class="flex">
+          <el-switch
+            v-model="taskAfterTriggerEnable"
+            @change="handleTaskAfterTriggerEnableChange"
+          />
+          <div class="ml-80px">浠诲姟缁撴潫鍚庨�氱煡</div>
+        </div>
+        <HttpRequestSetting
+          v-if="taskAfterTriggerEnable"
+          v-model:setting="modelData.taskAfterTriggerSetting"
+          :responseEnable="true"
+          :formItemPrefix="'taskAfterTriggerSetting'"
+        />
+      </div>
+    </el-form-item>
+    <el-form-item class="mb-20px">
+      <template #label>
+        <el-text size="large" tag="b">鑷畾涔夋墦鍗版ā鏉�</el-text>
+      </template>
+      <div class="flex flex-col w-100%">
+        <div class="flex">
+          <el-switch
+            v-model="modelData.printTemplateSetting.enable"
+            @change="handlePrintTemplateEnableChange"
+          />
+          <el-button
+            v-if="modelData.printTemplateSetting.enable"
+            class="ml-80px"
+            type="primary"
+            link
+            @click="handleEditPrintTemplate"
+          >
+            缂栬緫妯℃澘
+          </el-button>
+        </div>
+      </div>
+    </el-form-item>
+  </el-form>
+  <print-template ref="printTemplateRef" @confirm="confirmPrintTemplate" />
+</template>
+
+<script setup lang="ts">
+import dayjs from 'dayjs'
+import { BpmAutoApproveType, BpmModelFormType } from '@/utils/constants'
+import * as FormApi from '@/api/bpm/form'
+import { parseFormFields } from '@/components/FormCreate/src/utils'
+import { ProcessVariableEnum } from '@/components/SimpleProcessDesignerV2/src/consts'
+import HttpRequestSetting from '@/components/SimpleProcessDesignerV2/src/nodes-config/components/HttpRequestSetting.vue'
+import PrintTemplate from './PrintTemplate/Index.vue'
+
+const modelData = defineModel<any>()
+
+/** 鑷畾涔� ID 娴佺▼缂栫爜 */
+const timeOptions = ref([
+  {
+    value: '',
+    label: '鏃�'
+  },
+  {
+    value: 'DAY',
+    label: '绮剧‘鍒版棩'
+  },
+  {
+    value: 'HOUR',
+    label: '绮剧‘鍒版椂'
+  },
+  {
+    value: 'MINUTE',
+    label: '绮剧‘鍒板垎'
+  },
+  {
+    value: 'SECOND',
+    label: '绮剧‘鍒扮'
+  }
+])
+const numberExample = computed(() => {
+  if (modelData.value.processIdRule.enable) {
+    let infix = ''
+    switch (modelData.value.processIdRule.infix) {
+      case 'DAY':
+        infix = dayjs().format('YYYYMMDD')
+        break
+      case 'HOUR':
+        infix = dayjs().format('YYYYMMDDHH')
+        break
+      case 'MINUTE':
+        infix = dayjs().format('YYYYMMDDHHmm')
+        break
+      case 'SECOND':
+        infix = dayjs().format('YYYYMMDDHHmmss')
+        break
+      default:
+        break
+    }
+    return (
+      modelData.value.processIdRule.prefix +
+      infix +
+      modelData.value.processIdRule.postfix +
+      '1'.padStart(modelData.value.processIdRule.length - 1, '0')
+    )
+  } else {
+    return ''
+  }
+})
+
+/** 鏄惁寮�鍚祦绋嬪墠缃�氱煡 */
+const processBeforeTriggerEnable = ref(false)
+const handleProcessBeforeTriggerEnableChange = (val: boolean | string | number) => {
+  if (val) {
+    modelData.value.processBeforeTriggerSetting = {
+      url: '',
+      header: [],
+      body: [],
+      response: []
+    }
+  } else {
+    modelData.value.processBeforeTriggerSetting = null
+  }
+}
+
+/** 鏄惁寮�鍚祦绋嬪悗缃�氱煡 */
+const processAfterTriggerEnable = ref(false)
+const handleProcessAfterTriggerEnableChange = (val: boolean | string | number) => {
+  if (val) {
+    modelData.value.processAfterTriggerSetting = {
+      url: '',
+      header: [],
+      body: [],
+      response: []
+    }
+  } else {
+    modelData.value.processAfterTriggerSetting = null
+  }
+}
+
+/** 鏄惁寮�鍚换鍔″墠缃�氱煡 */
+const taskBeforeTriggerEnable = ref(false)
+const handleTaskBeforeTriggerEnableChange = (val: boolean | string | number) => {
+  if (val) {
+    modelData.value.taskBeforeTriggerSetting = {
+      url: '',
+      header: [],
+      body: [],
+      response: []
+    }
+  } else {
+    modelData.value.taskBeforeTriggerSetting = null
+  }
+}
+
+/** 鏄惁寮�鍚换鍔″悗缃�氱煡 */
+const taskAfterTriggerEnable = ref(false)
+const handleTaskAfterTriggerEnableChange = (val: boolean | string | number) => {
+  if (val) {
+    modelData.value.taskAfterTriggerSetting = {
+      url: '',
+      header: [],
+      body: [],
+      response: []
+    }
+  } else {
+    modelData.value.taskAfterTriggerSetting = null
+  }
+}
+
+/** 宸茶В鏋愯〃鍗曞瓧娈� */
+const formFields = ref<Array<{ field: string; title: string }>>([])
+const formFieldOptions4Title = computed(() => {
+  let cloneFormField = formFields.value.map((item) => {
+    return {
+      label: item.title,
+      value: item.field
+    }
+  })
+  // 鍥哄畾娣诲姞鍙戣捣浜� ID 瀛楁
+  cloneFormField.unshift({
+    label: '娴佺▼鍚嶇О',
+    value: ProcessVariableEnum.PROCESS_DEFINITION_NAME
+  })
+  cloneFormField.unshift({
+    label: '鍙戣捣鏃堕棿',
+    value: ProcessVariableEnum.START_TIME
+  })
+  cloneFormField.unshift({
+    label: '鍙戣捣浜�',
+    value: ProcessVariableEnum.START_USER_ID
+  })
+  return cloneFormField
+})
+const formFieldOptions4Summary = computed(() => {
+  return formFields.value.map((item) => {
+    return {
+      label: item.title,
+      value: item.field
+    }
+  })
+})
+
+/** 鏈В鏋愮殑琛ㄥ崟瀛楁 */
+const unParsedFormFields = ref<string[]>([])
+/** 鏆撮湶缁欏瓙缁勪欢 HttpRequestSetting 浣跨敤 */
+provide('formFields', unParsedFormFields)
+provide('formFieldsObj', formFields)
+
+/** 鍏煎浠ュ墠鏈厤缃洿澶氳缃殑娴佺▼ */
+const initData = () => {
+  if (!modelData.value.processIdRule) {
+    modelData.value.processIdRule = {
+      enable: false,
+      prefix: '',
+      infix: '',
+      postfix: '',
+      length: 5
+    }
+  }
+  if (!modelData.value.autoApprovalType) {
+    modelData.value.autoApprovalType = BpmAutoApproveType.NONE
+  }
+  if (!modelData.value.titleSetting) {
+    modelData.value.titleSetting = {
+      enable: false,
+      title: ''
+    }
+  }
+  if (!modelData.value.summarySetting) {
+    modelData.value.summarySetting = {
+      enable: false,
+      summary: []
+    }
+  }
+  if (modelData.value.processBeforeTriggerSetting) {
+    processBeforeTriggerEnable.value = true
+  }
+  if (modelData.value.processAfterTriggerSetting) {
+    processAfterTriggerEnable.value = true
+  }
+  if (modelData.value.taskBeforeTriggerSetting) {
+    taskBeforeTriggerEnable.value = true
+  }
+  if (modelData.value.taskAfterTriggerSetting) {
+    taskAfterTriggerEnable.value = true
+  }
+  if (modelData.value.allowWithdrawTask) {
+    modelData.value.allowWithdrawTask = false
+  }
+  if (!modelData.value.printTemplateSetting) {
+    modelData.value.printTemplateSetting = {
+      enable: false
+    }
+  }
+}
+defineExpose({ initData })
+
+/** 鐩戝惉琛ㄥ崟 ID 鍙樺寲锛屽姞杞借〃鍗曟暟鎹� */
+watch(
+  () => modelData.value.formId,
+  async (newFormId) => {
+    if (newFormId && modelData.value.formType === BpmModelFormType.NORMAL) {
+      const data = await FormApi.getForm(newFormId)
+      const result: Array<{ field: string; title: string }> = []
+      if (data.fields) {
+        unParsedFormFields.value = data.fields
+        data.fields.forEach((fieldStr: string) => {
+          parseFormFields(JSON.parse(fieldStr), result)
+        })
+      }
+      formFields.value = result
+    } else {
+      formFields.value = []
+      unParsedFormFields.value = []
+    }
+  },
+  { immediate: true }
+)
+
+const defaultTemplate =
+  '<p style="text-align: center;"><span data-w-e-type="mention" data-w-e-is-void="" data-w-e-is-inline="" data-value="娴佺▼鍚嶇О" data-info="%7B%22id%22%3A%22processName%22%7D">@娴佺▼鍚嶇О</span></p><p style="text-align: right;">鎵撳嵃浜猴細<span data-w-e-type="mention" data-w-e-is-void="" data-w-e-is-inline="" data-value="鎵撳嵃浜�" data-info="%7B%22id%22%3A%22printUser%22%7D">@鎵撳嵃浜�</span></p><p style="text-align: right;">娴佺▼缂栧彿锛�<span data-w-e-type="mention" data-w-e-is-void="" data-w-e-is-inline="" data-value="娴佺▼缂栧彿" data-info="%7B%22id%22%3A%22processNum%22%7D">@娴佺▼缂栧彿</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;鎵撳嵃鏃堕棿锛�<span data-w-e-type="mention" data-w-e-is-void="" data-w-e-is-inline="" data-value="鎵撳嵃鏃堕棿" data-info="%7B%22id%22%3A%22printTime%22%7D">@鎵撳嵃鏃堕棿</span></p><table style="width: 100%;"><tbody><tr><td colSpan="1" rowSpan="1" width="auto">鍙戣捣浜�</td><td colSpan="1" rowSpan="1" width="auto"><span data-w-e-type="mention" data-w-e-is-void data-w-e-is-inline data-value="鍙戣捣浜�" data-info="%7B%22id%22%3A%22startUser%22%7D">@鍙戣捣浜�</span></td><td colSpan="1" rowSpan="1" width="auto">鍙戣捣鏃堕棿</td><td colSpan="1" rowSpan="1" width="auto"><span data-w-e-type="mention" data-w-e-is-void data-w-e-is-inline data-value="鍙戣捣鏃堕棿" data-info="%7B%22id%22%3A%22startTime%22%7D">@鍙戣捣鏃堕棿</span></td></tr><tr><td colSpan="1" rowSpan="1" width="auto">鎵�灞為儴闂�</td><td colSpan="1" rowSpan="1" width="auto"><span data-w-e-type="mention" data-w-e-is-void data-w-e-is-inline data-value="鍙戣捣浜洪儴闂�" data-info="%7B%22id%22%3A%22startUserDept%22%7D">@鍙戣捣浜洪儴闂�</span></td><td colSpan="1" rowSpan="1" width="auto">娴佺▼鐘舵��</td><td colSpan="1" rowSpan="1" width="auto"><span data-w-e-type="mention" data-w-e-is-void data-w-e-is-inline data-value="娴佺▼鐘舵��" data-info="%7B%22id%22%3A%22processStatus%22%7D">@娴佺▼鐘舵��</span></td></tr></tbody></table><p><span data-w-e-type="process-record" data-w-e-is-void data-w-e-is-inline>娴佺▼璁板綍</span></p>'
+const handlePrintTemplateEnableChange = (val: boolean) => {
+  if (val) {
+    if (!modelData.value.printTemplateSetting.template) {
+      modelData.value.printTemplateSetting.template = defaultTemplate
+    }
+  }
+}
+const printTemplateRef = ref()
+const handleEditPrintTemplate = () => {
+  printTemplateRef.value.open(modelData.value.printTemplateSetting.template)
+}
+const confirmPrintTemplate = (template: any) => {
+  modelData.value.printTemplateSetting.template = template
+}
+</script>

--
Gitblit v1.8.0