Parcourir la source

保存接口增加流程审批意见参数,调整流程快照生成时机

cfort il y a 2 ans
Parent
commit
b5c6cb3102

+ 208 - 208
src/api/platform/bpmn/bpmTask.js

@@ -5,63 +5,63 @@ import { BPMN_URL } from '@/api/baseUrl'
  * 查询列表数据
  * @param {*} params
  */
-export function queryPageList(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/query',
-    method: 'post',
-    data: params
-  })
+export function queryPageList (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/query',
+        method: 'post',
+        data: params
+    })
 }
 
 /**
  * 删除数据
  * @param {*} params
  */
-export function remove(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/remove',
-    method: 'post',
-    isLoading: true,
-    params: params
-  })
+export function remove (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/remove',
+        method: 'post',
+        isLoading: true,
+        params: params
+    })
 }
 
 /**
  * 获取数据
  * @param {*} params
  */
-export function get(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/get',
-    method: 'get',
-    params: params
-  })
+export function get (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/get',
+        method: 'get',
+        params: params
+    })
 }
 
 /**
  * 锁定任务
  * @param {*} params
  */
-export function lock(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/lock',
-    method: 'post',
-    isLoading: true,
-    params: params
-  })
+export function lock (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/lock',
+        method: 'post',
+        isLoading: true,
+        params: params
+    })
 }
 
 /**
  * 解锁任务
  * @param {*} params
  */
-export function unlock(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/unlock',
-    method: 'post',
-    isLoading: true,
-    params: params
-  })
+export function unlock (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/unlock',
+        method: 'post',
+        isLoading: true,
+        params: params
+    })
 }
 
 /**
@@ -69,328 +69,328 @@ export function unlock(params) {
  * @param  {[type]} params 参数对象
  * @deprecated 废弃,职责不清
  */
-export function complete(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/complete',
-    method: 'post',
-    isLoading: true,
-    data: ActionUtils.formatParams(params)
-  })
+export function complete (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/complete',
+        method: 'post',
+        isLoading: true,
+        data: ActionUtils.formatParams(params)
+    })
 }
 
 /**
  * 终止流程
  * @param  {[type]} params 参数对象
  */
-export function doEndProcess(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/doEndProcess',
-    method: 'post',
-    isLoading: true,
-    params: params
-  })
+export function doEndProcess (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/doEndProcess',
+        method: 'post',
+        isLoading: true,
+        params: params
+    })
 }
 
 /**
  * 挂起流程
  * @param {*} params
  */
-export function suspendProcess(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/suspendProcess',
-    method: 'post',
-    isLoading: true,
-    params: params
-  })
+export function suspendProcess (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/suspendProcess',
+        method: 'post',
+        isLoading: true,
+        params: params
+    })
 }
 
 /**
  * 恢复流程
  * @param {*} params
  */
-export function recoverProcess(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/recoverProcess',
-    method: 'post',
-    isLoading: true,
-    params: params
-  })
+export function recoverProcess (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/recoverProcess',
+        method: 'post',
+        isLoading: true,
+        params: params
+    })
 }
 
 /**
  * 保存加签
  * @param  {[type]} data 参数对象
  */
-export function doAddSignTask(data) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/doAddSignTask',
-    method: 'post',
-    isLoading: true,
-    data: data
-  })
+export function doAddSignTask (data) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/doAddSignTask',
+        method: 'post',
+        isLoading: true,
+        data: data
+    })
 }
 
 /**
  * 补签
  * @param  {[type]} data 参数对象
  */
-export function saveTaskChange(data) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/chage/save',
-    method: 'post',
-    isLoading: true,
-    data: data
-  })
+export function saveTaskChange (data) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/chage/save',
+        method: 'post',
+        isLoading: true,
+        data: data
+    })
 }
 
 /**
  * 节点审批历史
  * @param {*} params
  */
-export function getNodeApproval(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/nodeApproval',
-    method: 'get',
-    params: params
-  })
+export function getNodeApproval (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/nodeApproval',
+        method: 'get',
+        params: params
+    })
 }
 
 /**
  * 批量同意任务
  * @param {*} params
  */
-export function agreeBatch(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/agree/batch',
-    method: 'post',
-    isLoading: true,
-    data: params
-  })
+export function agreeBatch (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/agree/batch',
+        method: 'post',
+        isLoading: true,
+        data: params
+    })
 }
 
 /**
  * 批量挂起任务
  * @param {*} params
  */
-export function batchSuspendProcess(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/batchSuspendProcess',
-    method: 'post',
-    isLoading: true,
-    params: params
-  })
+export function batchSuspendProcess (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/batchSuspendProcess',
+        method: 'post',
+        isLoading: true,
+        params: params
+    })
 }
 
 /**
  * 批量恢复任务
  * @param {*} params
  */
-export function batchRecoverProcess(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/batchRecoverProcess',
-    method: 'post',
-    isLoading: true,
-    params: params
-  })
+export function batchRecoverProcess (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/batchRecoverProcess',
+        method: 'post',
+        isLoading: true,
+        params: params
+    })
 }
 
 /**
  * 保存数据
  * @param {*} params
  */
-export function save(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/save',
-    method: 'post',
-    isLoading: true,
-    data: params
-  })
+export function save (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/save',
+        method: 'post',
+        isLoading: true,
+        data: params
+    })
 }
 
 /**
  * 分配人员
  * @param {*} params
  */
-export function assignee(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/assignee',
-    method: 'post',
-    isLoading: true,
-    params: params
-  })
+export function assignee (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/assignee',
+        method: 'post',
+        isLoading: true,
+        params: params
+    })
 }
 
 /**
  * 流程任务获取表单数据
  * @param {*} params
  */
-export function getTaskFormData(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/getFormData',
-    method: 'get',
-    params: params
-  })
+export function getTaskFormData (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/getFormData',
+        method: 'get',
+        params: params
+    })
 }
 
 /**
  * 任务办理数据(同意、反对、弃权)
  * @param {*} data
  */
-export function agreeData(data) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/agreeData/vo',
-    method: 'post',
-    data: data
-  })
+export function agreeData (data) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/agreeData/vo',
+        method: 'post',
+        data: data
+    })
 }
 
 /**
  * 获取驳回数据
  * @param {*} params
  */
-export function toReject(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/toReject',
-    method: 'get',
-    params: params
-  })
+export function toReject (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/toReject',
+        method: 'get',
+        params: params
+    })
 }
 
 /**
  * 获取驳回上一步
  * @param {*} params
  */
-export function toRejectToPrevious(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/toRejectToPrevious',
-    method: 'get',
-    params: params
-  })
+export function toRejectToPrevious (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/toRejectToPrevious',
+        method: 'get',
+        params: params
+    })
 }
 /**
  * 获取驳回发起人
  * @param {*} params
  */
-export function toRejectToStart(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/toRejectStarter',
-    method: 'get',
-    params: params
-  })
+export function toRejectToStart (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/toRejectStarter',
+        method: 'get',
+        params: params
+    })
 }
 
 /**
  * 获取补签数据
  * @param {*} params
  */
-export function toAddSignTask(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/toAddSignTask',
-    method: 'get',
-    params: params
-  })
+export function toAddSignTask (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/toAddSignTask',
+        method: 'get',
+        params: params
+    })
 }
 
 /**
  * 处理任务-同意
  * @param  {[type]} params 参数对象
  */
-export function agree(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/agree',
-    method: 'post',
-    isLoading: true,
-    data: params
-  })
+export function agree (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/agree',
+        method: 'post',
+        isLoading: true,
+        data: params
+    })
 }
 
 /**
  * 处理任务-反对
  * @param  {[type]} params 参数对象
  */
-export function oppose(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/oppose',
-    method: 'post',
-    isLoading: true,
-    data: params
-  })
+export function oppose (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/oppose',
+        method: 'post',
+        isLoading: true,
+        data: params
+    })
 }
 
 /**
  * 处理任务-弃权
  * @param  {[type]} params 参数对象
  */
-export function abandon(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/abandon',
-    method: 'post',
-    isLoading: true,
-    data: params
-  })
+export function abandon (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/abandon',
+        method: 'post',
+        isLoading: true,
+        data: params
+    })
 }
 
 /**
  * 处理任务-撤销
  * @param  {[type]} params 参数对象
  */
-export function revoke(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/revoke',
-    method: 'post',
-    isLoading: true,
-    data: params
-  })
+export function revoke (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/revoke',
+        method: 'post',
+        isLoading: true,
+        data: params
+    })
 }
 
 /**
  * 处理任务-驳回
  * @param  {[type]} params 参数对象
  */
-export function reject(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/reject',
-    method: 'post',
-    isLoading: true,
-    data: params
-  })
+export function reject (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/reject',
+        method: 'post',
+        isLoading: true,
+        data: params
+    })
 }
 
 /**
  * 处理任务-驳回发起人
  * @param  {[type]} params 参数对象
  */
-export function rejectToStarter(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/reject/starter',
-    method: 'post',
-    isLoading: true,
-    data: params
-  })
+export function rejectToStarter (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/reject/starter',
+        method: 'post',
+        isLoading: true,
+        data: params
+    })
 }
 
 /**
  * 处理任务-驳回上一步
  * @param  {[type]} params 参数对象
  */
-export function rejectToPrevious(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/reject/previous',
-    method: 'post',
-    isLoading: true,
-    data: params
-  })
+export function rejectToPrevious (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/reject/previous',
+        method: 'post',
+        isLoading: true,
+        data: params
+    })
 }
 /**
  * 节点按钮设置-保存
  * @param  {[type]} params 参数对象
  */
-export function bpmTaskSave(params) {
-  return request({
-    url: BPMN_URL() + '/bpm/task/save/task',
-    method: 'post',
-    isLoading: true,
-    data: params
-  })
+export function bpmTaskSave (params) {
+    return request({
+        url: BPMN_URL() + '/bpm/task/save/task',
+        method: 'post',
+        isLoading: true,
+        data: params
+    })
 }
 

+ 324 - 321
src/business/platform/bpmn/components/approval-opinion/index.vue

@@ -1,105 +1,106 @@
 <template>
-  <div>
-     <!--
-    <div v-if="enableCommon">
-     <template v-if="!disabled && commonStatments && commonStatments.length>0">
+    <div>
+        <!-- <div v-if="enableCommon">
+            <template v-if="!disabled && commonStatments && commonStatments.length>0">
+                <el-dropdown
+                    placement="bottom-start"
+                    @command="handleCommonStatment"
+                >
+                    <el-link class="el-dropdown-link" type="primary" :underline="false">
+                        常用语<i class="el-icon-arrow-down el-icon--right" />
+                    </el-link>
+                    <el-dropdown-menu slot="dropdown" style="width:500px;">
+                        <template v-if="commonStatments && commonStatments.length>0">
+                            <template v-for="(item,i) in commonStatments">
+                                <el-dropdown-item
+                                    :key="i"
+                                    :command="item"
+                                >{{ item.value }}&nbsp;</el-dropdown-item>
+                            </template>
+                            <el-dropdown-item
+                                v-if="totalCount >5"
+                                divided
+                                command="more"
+                            >
+                                <span class="el-dropdown-link">>>更多...</span>
+                            </el-dropdown-item>
+                        </template>
+                        <template v-else>
+                            <el-dropdown-item
+                                command="none"
+                            >
+                                <span>未设置常用语</span>
+                            </el-dropdown-item>
+                        </template>
+                    </el-dropdown-menu>
+                </el-dropdown>
+            </template>
+            <span v-else class="el-dropdown-link" @click="handleNoData">
+                常用语<i class="el-icon-arrow-down el-icon--right" />
+            </span>
+            <!== 快捷常用语 ==>
+            <el-link
+                v-for="(shortcut,i) in shortcutTags"
+                :key="i"
+                :type="shortcut.type"
+                @click="handleShortcut(shortcut)"
+            >{{ shortcut.label }}</el-link>
+        </div> -->
+
         <el-dropdown
-          placement="bottom-start"
-          @command="handleCommonStatment"
+            style="width: 100%;"
+            size="mini"
+            placement="top-start"
+            trigger="click"
+            @click.native="reqPhrase($store.getters.userInfo.employee.groupID,elFormItem)"
+            @command="handleCommand"
         >
-          <el-link class="el-dropdown-link" type="primary" :underline="false">
-            常用语<i class="el-icon-arrow-down el-icon--right" />
-          </el-link>
-          <el-dropdown-menu slot="dropdown" style="width:500px;">
-            <template v-if="commonStatments && commonStatments.length>0">
-              <template v-for="(item,i) in commonStatments">
+            <el-input
+                ref="input"
+                v-model="data"
+                type="textarea"
+                rows="2"
+                maxlength="2000"
+                show-word-limit
+                :disabled="disabled"
+                :placeholder="placeholder"
+            />
+            <el-button
+                size="mini"
+                title="添加短语"
+                plain
+                icon="el-icon-folder-add"
+                align="center"
+                class="elButtonPlace"
+                @click.stop="addDict($store.getters.userInfo.employee.groupID,elFormItem)"
+            />
+            <el-dropdown-menu v-show="menuHide" slot="dropdown">
                 <el-dropdown-item
-                  :key="i"
-                  :command="item"
-                >{{ item.value }}&nbsp;</el-dropdown-item>
-              </template>
-              <el-dropdown-item
-                v-if="totalCount >5"
-                divided
-                command="more"
-              >
-                <span class="el-dropdown-link">>>更多...</span>
-              </el-dropdown-item>
-            </template>
-            <template v-else>
-              <el-dropdown-item
-                command="none"
-              >
-                <span>未设置常用语</span>
-              </el-dropdown-item>
-            </template>
-          </el-dropdown-menu>
-        </el-dropdown>
-      </template>
-      <span v-else class="el-dropdown-link" @click="handleNoData">
-        常用语<i class="el-icon-arrow-down el-icon--right" />
-      </span> -->
-      <!--快捷常用语
-         <el-link
-        v-for="(shortcut,i) in shortcutTags"
-        :key="i"
-        :type="shortcut.type"
-        @click="handleShortcut(shortcut)"
-      >{{ shortcut.label }}</el-link>
-    </div>
-        -->
-
-   <el-dropdown  style="width: 100%;" size="mini"
-    	   @click.native="reqPhrase($store.getters.userInfo.employee.groupID,elFormItem)"
-    	   placement="top-start"
-    	   trigger="click"
-    	   @command="handleCommand"
-    	   >
+                    v-for="(item,index) in selectModel"
+                    :key="index"
+                    :command="item.contextName"
+                >
+                    {{ index+1 }}. {{ item.contextName | ellipsis }}
 
-    		 <el-input
-    		   ref="input"
-    		   v-model="data"
-    		   type="textarea"
-    		   rows="2"
-    		   maxlength="2000"
-    		   show-word-limit
-    		   :disabled="disabled"
-    		   :placeholder="placeholder"
-    		 />
-
-    		 <el-button
-    			@click.stop="addDict($store.getters.userInfo.employee.groupID,elFormItem)"
-    			size="mini"
-    			title='添加短语'
-    			plain
-    			icon="el-icon-folder-add"
-    			align="center"
-    			class="elButtonPlace"
-    			/>
-
-    		<el-dropdown-menu slot="dropdown" v-show="menuHide" >
-    			  <el-dropdown-item v-for="(item,index) in selectModel"
-    			  :key="index" :command="item.contextName">
-    			  {{index+1}}. {{item.contextName | ellipsis}}
-
-    			  <span style="float: right;margin-left:50px ;color: #EB6709;"
-    				  @click.stop="deleteDicts(item.uuId,data)">删</span>
-    			  </el-dropdown-item>
-    		</el-dropdown-menu>
-
-    </el-dropdown>
+                    <span
+                        style="float: right;margin-left:50px ;color: #EB6709;"
+                        @click.stop="deleteDicts(item.uuId,data)"
+                    >删</span>
+                </el-dropdown-item>
+            </el-dropdown-menu>
+        </el-dropdown>
 
-     <Dictionaryitem v-if="dict_add" @proceedCont="proceedCont()"  ref='dict_add'> </Dictionaryitem>
+        <Dictionaryitem v-if="dict_add" ref="dict_add" @proceedCont="proceedCont()" />
 
-    <common-statment-dialog
-      :visible="commonStatmentVisible"
-      :title="title"
-      :action="action"
-      label-key="value"
-      @close="visible => commonStatmentVisible= visible"
-      @action-event="handleActionEvent"
-    />
-  </div>
+        <common-statment-dialog
+            :visible="commonStatmentVisible"
+            :title="title"
+            :action="action"
+            label-key="value"
+            @close="visible => commonStatmentVisible= visible"
+            @action-event="handleActionEvent"
+        />
+    </div>
 </template>
 <script>
 import { queryIncludeNull } from '@/api/platform/bpmn/bpmCommonStatment'
@@ -108,248 +109,250 @@ import emitter from '@/plugins/element-ui/src/mixins/emitter'
 import ActionUtils from '@/utils/action'
 import CommonStatmentDialog from '@/business/platform/bpmn/components/common-statment/dialog'
 import request from '@/utils/request'
-import { BPMN_URL } from'@/api/baseUrl'
+import { BPMN_URL } from '@/api/baseUrl'
 import Dictionaryitem from '@/business/platform/form/formrender/dynamic-form/addCont/dictionaryitem-add'
 
 export default {
-  components: {
-    CommonStatmentDialog,
-    Dictionaryitem
-  },
-  mixins: [emitter],
-  props: {
-    value: {
-      type: String
-    },
-    action: {
-      type: String
+    components: {
+        CommonStatmentDialog,
+        Dictionaryitem
     },
-    enableCommon: {
-      type: Boolean,
-      default: true
-    },
-    disabled: {
-      type: Boolean,
-      default: false
-    },
-    placeholder: {
-      type: String,
-      default: '请输入审批意见'
-    }
-  },
-  inject: {
-    elForm: {
-      default: ''
+    filters: { // 定义过滤器
+        ellipsis (value) {
+            if (!value) return ''
+            if (value.length > 80) {
+                return value.slice(0, 80) + '...'
+            }
+            return value
+        }
     },
-    elFormItem: {
-      default: ''
-    }
-  },
-  data() {
-    return {
-      commonStatmentVisible: false,
-      title: '',
-      shortcutTags: [{
-        type: 'success',
-        label: '同意'
-      },
-      {
-        type: 'danger',
-        label: '反对'
-      },
-      {
-        type: 'warning',
-        label: '拒绝'
-      }],
-      commonStatments: [],
-      totalCount: 0,
-       selectModel:[],
-       menuHide:true,
-       watchKey:false,
-       inputKey:"",
-       dict_add:false,
-       data: ''
-    }
-  },
-  filters: { //定义过滤器
-    ellipsis(value) {
-      if (!value) return ''
-      if (value.length > 80) {
-        return value.slice(0, 80) + '...'
-      }
-      return value
-    }
-  },
-  created(){
-    setTimeout(()=> {
-        this.data = this.value ? this.value : '同意'
-    },500)
-  },
-  watch: {
-    data:{
-        handler(){
-          this.$emit('input', this.data)
+    mixins: [emitter],
+    props: {
+        value: {
+            type: String
         },
-        immediate: true
-    },
-    value: {
-      handler(val, oldVal) {
-        if (!valueEquals(val, oldVal)) {
-          this.dispatch('ElFormItem', 'el.form.change', val)
+        action: {
+            type: String
+        },
+        enableCommon: {
+            type: Boolean,
+            default: true
+        },
+        disabled: {
+            type: Boolean,
+            default: false
+        },
+        placeholder: {
+            type: String,
+            default: '请输入审批意见'
+        },
+        unCompleteOpinion: {
+            type: String,
+            default: '同意'
         }
-      },
-      immediate: true
     },
-    action: {
-      handler(val, oldVal) {
-        if (this.enableCommon && !this.disabled) {
-          this.$nextTick(() => {
-            this.loadCommonStatment()
-          })
+    inject: {
+        elForm: {
+            default: ''
+        },
+        elFormItem: {
+            default: ''
         }
-      },
-      immediate: true
-    }
-  },
-  methods: {
-    loadCommonStatment() {
-      this.commonStatments = []
-      let action = this.action
-      if (action === 'endProcess' || this.action === 'stop') {
-        action = 'manualend'
-      }
-      queryIncludeNull(ActionUtils.formatParams({
-        'Q^ACTION_^S': action,
-        'Q^CREATE_BY_^S': this.$store.getters.userId
-      }, {
-        limit: 5
-      })).then(response => {
-        const data = response.data
-        this.commonStatments = data.dataResult || []
-        this.totalCount = data.pageResult ? data.pageResult.totalCount : 0
-      })
     },
-    handleShortcut({ label }) {
-      if (this.disabled) {
-        return
-      }
-      this.data = label
-    },
-    handleCommonStatment(command) {
-      if (this.disabled) {
-        return
-      }
-      if (this.$utils.isString(command) && command === 'none') {
-        return
-      }
-      if (this.$utils.isString(command) && command === 'more') {
-        this.commonStatmentVisible = true
-        this.title = '常用语列表'
-        return
-      }
-      this.data = command.value
-    },
-    handleNoData() {
-      ActionUtils.warning('未有更多常用语!')
+    data () {
+        return {
+            commonStatmentVisible: false,
+            title: '',
+            shortcutTags: [{
+                type: 'success',
+                label: '同意'
+            },
+            {
+                type: 'danger',
+                label: '反对'
+            },
+            {
+                type: 'warning',
+                label: '拒绝'
+            }],
+            commonStatments: [],
+            totalCount: 0,
+            selectModel: [],
+            menuHide: true,
+            watchKey: false,
+            inputKey: '',
+            dict_add: false,
+            data: ''
+        }
     },
-    getCursorPos(pTextArea) {
-      let cursurPosition = -1
-      if (pTextArea.selectionStart) { // 非IE浏览器
-        cursurPosition = pTextArea.selectionStart
-      } else { // IE
-        var range = document.selection.createRange()
-        range.moveStart('character', -pTextArea.value.length)
-        cursurPosition = range.text.length
-      }
-      return cursurPosition
+    watch: {
+        data: {
+            handler (val) {
+                this.$emit('input', this.data)
+            },
+            immediate: true
+        },
+        value: {
+            handler (val, oldVal) {
+                if (!valueEquals(val, oldVal)) {
+                    this.dispatch('ElFormItem', 'el.form.change', val)
+                }
+            },
+            immediate: true
+        },
+        action: {
+            handler (val, oldVal) {
+                if (this.enableCommon && !this.disabled) {
+                    this.$nextTick(() => {
+                        this.loadCommonStatment()
+                    })
+                }
+            },
+            immediate: true
+        }
     },
-    handleActionEvent(key, data) {
-      // console.log(key, data)
-      if (key === 'confirm') {
-        this.data = data.value
-        this.commonStatmentVisible = false
-      }
+    created () {
+        setTimeout(() => {
+            this.data = this.unCompleteOpinion || this.value
+        }, 500)
     },
-    /* 请求记忆数据库 */
-    reqPhrase(orderId,action){
-    if(!this.watchKey || this.inputKey!=action.labelFor){
-        this.watchKey = true
-      	this.inputKey = action.labelFor
-            request({
-                url:BPMN_URL()+'/sys/SysDataContext/getDataContext',
-                method: 'post',
-                data:  JSON.stringify({
-                     'attrName':this.inputKey,
-                      'orderId':orderId,
-                       })
-              }).then(response => {
-                if(response.state===200){
+    methods: {
+        loadCommonStatment () {
+            this.commonStatments = []
+            let action = this.action
+            if (action === 'endProcess' || this.action === 'stop') {
+                action = 'manualend'
+            }
+            queryIncludeNull(ActionUtils.formatParams({
+                'Q^ACTION_^S': action,
+                'Q^CREATE_BY_^S': this.$store.getters.userId
+            }, {
+                limit: 5
+            })).then(response => {
+                const data = response.data
+                this.commonStatments = data.dataResult || []
+                this.totalCount = data.pageResult ? data.pageResult.totalCount : 0
+            })
+        },
+        handleShortcut ({ label }) {
+            if (this.disabled) {
+                return
+            }
+            this.data = label
+        },
+        handleCommonStatment (command) {
+            if (this.disabled) {
+                return
+            }
+            if (this.$utils.isString(command) && command === 'none') {
+                return
+            }
+            if (this.$utils.isString(command) && command === 'more') {
+                this.commonStatmentVisible = true
+                this.title = '常用语列表'
+                return
+            }
+            this.data = command.value
+        },
+        handleNoData () {
+            ActionUtils.warning('未有更多常用语!')
+        },
+        getCursorPos (pTextArea) {
+            let cursurPosition = -1
+            if (pTextArea.selectionStart) { // 非IE浏览器
+                cursurPosition = pTextArea.selectionStart
+            } else { // IE
+                var range = document.selection.createRange()
+                range.moveStart('character', -pTextArea.value.length)
+                cursurPosition = range.text.length
+            }
+            return cursurPosition
+        },
+        handleActionEvent (key, data) {
+            // console.log(key, data)
+            if (key === 'confirm') {
+                this.data = data.value
+                this.commonStatmentVisible = false
+            }
+        },
+        /* 请求记忆数据库 */
+        reqPhrase (orderId, action) {
+            if (!this.watchKey || this.inputKey != action.labelFor) {
+                this.watchKey = true
+                this.inputKey = action.labelFor
+                request({
+                    url: BPMN_URL() + '/sys/SysDataContext/getDataContext',
+                    method: 'post',
+                    data: JSON.stringify({
+                        'attrName': this.inputKey,
+                        'orderId': orderId
+                    })
+                }).then(response => {
+                    if (response.state === 200) {
     				 this.selectModel = response.variables.page
-                }
-                }).catch(error => {
+                    }
+                }).catch(() => {
                     this.$message.error('系统忙、或数据错误,请稍后再试')
                 })
-              }
-          },
-       //选定短语
-       handleCommand(val){
-        if(!this.data){
-         this.data = val
-         }else{
-            this.data = this.data + val
-         }
-       },
-       //删除字典内容
-       deleteDicts(id,name){
-         this.menuHide=false
-         this.$confirm(
-           `确定对[ ${name} ]进行 [ 删除操作 ]?`,
-           "提示",
-           {
-             confirmButtonText: "确定",
-             cancelButtonText: "取消",
-             type: "warning"
-           }
-         ).then(() => {
-            this.watchKey = false
-             request({
-                 url:BPMN_URL()+'/sys/SysDataContext/deleteDataContext',
-                 method: 'post',
-                 data:  JSON.stringify({
-                 'uuId':id,
-                   })
-               }).then(response => {
-                 this.menuHide=true
-               if(response.state===200){
-              this.$message({
-                message: '删除成功!',
-                type: 'success',
-                duration: 800,
-                onClose: () => {
-                  this.visible = false
-                   this.$emit("proceedCont")
+            }
+        },
+        // 选定短语
+        handleCommand (val) {
+            if (!this.data) {
+                this.data = val
+            } else {
+                this.data = this.data + val
+            }
+        },
+        // 删除字典内容
+        deleteDicts (id, name) {
+            this.menuHide = false
+            this.$confirm(
+                `确定对[ ${name} ]进行 [ 删除操作 ]?`,
+                '提示',
+                {
+                    confirmButtonText: '确定',
+                    cancelButtonText: '取消',
+                    type: 'warning'
                 }
-              })
-                 }
-                 }).catch(error => {
-                     this.$message.error('系统忙、或数据错误,请稍后再试')
-                 })
-         }).catch(() => {
-                  });
-       },
-       // 添加字典
-       addDict (orderId,action) {
-         this.dict_add = true
-         this.$nextTick(() => {
-           this.$refs.dict_add.init(orderId,action.labelFor,action.label)
-         })
-       },
-       //回调进行再次点击开关
-       proceedCont(){
-         this.watchKey = false//防止恶意查询 。 为空表示可以点击了
-       }
-
-
-  }
+            ).then(() => {
+                this.watchKey = false
+                request({
+                    url: BPMN_URL() + '/sys/SysDataContext/deleteDataContext',
+                    method: 'post',
+                    data: JSON.stringify({
+                        'uuId': id
+                    })
+                }).then(response => {
+                    this.menuHide = true
+                    if (response.state === 200) {
+                        this.$message({
+                            message: '删除成功!',
+                            type: 'success',
+                            duration: 800,
+                            onClose: () => {
+                                this.visible = false
+                                this.$emit('proceedCont')
+                            }
+                        })
+                    }
+                }).catch(() => {
+                    this.$message.error('系统忙、或数据错误,请稍后再试')
+                })
+            }).catch(() => {
+            })
+        },
+        // 添加字典
+        addDict (orderId, action) {
+            this.dict_add = true
+            this.$nextTick(() => {
+                this.$refs.dict_add.init(orderId, action.labelFor, action.label)
+            })
+        },
+        // 回调进行再次点击开关
+        proceedCont () {
+            this.watchKey = false// 防止恶意查询 。 为空表示可以点击了
+        }
+    }
 }
 </script>

+ 22 - 16
src/business/platform/bpmn/form/action.js

@@ -154,6 +154,7 @@ export default {
         // 是否保存[节点-按钮设置-保存]
         handleSave () {
             const formData = this.getFormData()
+            const opinion = this.hasFormOpinion() ? this.getFormOpinionData() : ''
             const loading = this.$loading({
                 lock: true,
                 text: this.$t('common.saving')
@@ -161,7 +162,8 @@ export default {
             if (!formData) return
             bpmTaskSave({
                 taskId: this.taskId,
-                data: JSON.stringify(formData)
+                data: JSON.stringify(formData),
+                opinion
             }).then(response => {
                 loading.close()
                 this.$alert(`已保存表单内容!`, {
@@ -317,7 +319,7 @@ export default {
             if (actionName === 'agree') {
                 agree(params).then(response => {
                     this.handleResponse(actionName, loading, response)
-                    this.createSnapshot()
+                    // this.createSnapshot()
                 }).catch(() => {
                     loading.close()
                 })
@@ -364,6 +366,9 @@ export default {
                 } else if (actionName === 'rejectToPrevious' || actionName === 'rejectToStart' || actionName === 'reject') {
                     this.rejectDialogVisible = false
                 }
+                if (actionName === 'agree') {
+                    this.createSnapshot()
+                }
                 // 后置事件
                 this.afterScript(this.actionName, {
                     data: response.data,
@@ -643,22 +648,23 @@ export default {
             if (!code) {
                 return
             }
-            // 轮询流程是否结束,流程未结束不生成快照,每2秒查询一次,最多等待10秒钟
-            let timeout = 10000
-            const intervalTime = 2000
-            while (!(await this.isFinish(proId || proInstId))) {
-                timeout -= intervalTime
-                if (timeout <= 0) {
-                    // 超时,流程还未结束,结束生成快照
-                    console.log('流程未结束,无法生成快照')
-                    return
-                }
-                // 等待一段时间后再次查询
-                await new Promise(resolve => setTimeout(resolve, intervalTime))
-            }
+            
             const sql = `select * from t_lcidglbdbb where shi_fou_zi_biao_ = 't_${code}' and ti_jiao_kuai_zhao = '是' and gui_dang_lei_xing = 'process'`
-            request('sql', sql).then(res => {
+            request('sql', sql).then(async res => {
                 const { data = [] } = res.variables || {}
+                // 轮询流程是否结束,流程未结束不生成快照,每2秒查询一次,最多等待10秒钟
+                let timeout = 10000
+                const intervalTime = 2000
+                while (!(await this.isFinish(proId || proInstId))) {
+                    timeout -= intervalTime
+                    if (timeout <= 0) {
+                        // 超时,流程还未结束,结束生成快照
+                        console.log('流程未结束,无法生成快照')
+                        return
+                    }
+                    // 等待一段时间后再次查询
+                    await new Promise(resolve => setTimeout(resolve, intervalTime))
+                }
                 if (!data.length) {
                     // this.updateState(id, code, '1', null)
                     return

+ 125 - 117
src/business/platform/form/formrender/dynamic-form/components/approval-opinion/index.vue

@@ -35,7 +35,7 @@
                                     <span style="color: red;">退回、重新编辑</span>
                                 </span>
                                 <span v-else-if="row[options[2].value] !== '反对'">
-                                    {{ row[options[2].value]}}
+                                    {{ row[options[2].value] }}
                                 </span>
                             </el-tag>
                         </template>
@@ -65,7 +65,7 @@
                 <!-- 审批时间 -->
                 <el-table-column :label="options[1].label" width="135">
                     <template slot-scope="{row, $index}">
-                        {{ row[options[1].value]}}
+                        {{ row[options[1].value] }}
                     </template>
                 </el-table-column>
                 <!-- 审批意见 -->
@@ -82,7 +82,8 @@
                             </small>
                             <small
                                 v-if="!limitHeight[$index]"
-                                slot="after" class="el-dropdown-link"
+                                slot="after"
+                                class="el-dropdown-link"
                                 @click="onShowMore($index, true)"
                             >收起</small>
                         </ibps-text-ellipsis>
@@ -94,7 +95,8 @@
             <template v-else>
                 <el-card
                     v-for="(row, i) in opinionData"
-                    :key="i" shadow="hover"
+                    :key="i"
+                    shadow="hover"
                     class="ibps-mb-10"
                 >
                     <el-row
@@ -145,139 +147,145 @@
         <ibps-approval-opinion
             v-if="!readonly"
             v-model="data"
+            :un-complete-opinion.sync="unComplate"
             :enable-common="commonCtatment"
             :placeholder="placeholder"
         />
     </div>
 </template>
 <script>
-    import Utils from '@/utils/util'
-    import { format, dateDealFmt } from '@/utils/fecha'
-    import IbpsApprovalOpinion from '@/business/platform/bpmn/components/approval-opinion'
-    import IbpsTextEllipsis from '@/components/ibps-text-ellipsis'
-    export default {
-        components: {
-            IbpsApprovalOpinion,
-            IbpsTextEllipsis
-        },
-        filters: {
-            filterData (val, config, data) {
-                // 审批人
-                if (config.value === 'auditorName') {
-                    if (Utils.isEmpty(data.auditor) && Utils.isNotEmpty(data.qualifiedExecutor)) {
-                        // 会签  审批人处理
-                        const name = []
-                        for (var i = 0; i < data.qualifiedExecutor.length; i++) {
-                            name.push(data.qualifiedExecutor[i].executor)
-                        }
-                        val = name.join(' ')
+import Utils from '@/utils/util'
+import { format, dateDealFmt } from '@/utils/fecha'
+import IbpsApprovalOpinion from '@/business/platform/bpmn/components/approval-opinion'
+import IbpsTextEllipsis from '@/components/ibps-text-ellipsis'
+export default {
+    components: {
+        IbpsApprovalOpinion,
+        IbpsTextEllipsis
+    },
+    filters: {
+        filterData (val, config, data) {
+            // 审批人
+            if (config.value === 'auditorName') {
+                if (Utils.isEmpty(data.auditor) && Utils.isNotEmpty(data.qualifiedExecutor)) {
+                    // 会签  审批人处理
+                    const name = []
+                    for (var i = 0; i < data.qualifiedExecutor.length; i++) {
+                        name.push(data.qualifiedExecutor[i].executor)
                     }
-                } else if (config.value === 'completeTime') {
-                    // 审批时间
-                    if (Utils.isNotEmpty(val)) {
-                        let dateObj = val
-                        const dateFormat = 'yyyy-MM-dd HH:mm:ss'
-                        try {
-                            if (typeof dateObj === 'number') {
-                                dateObj = new Date(dateObj)
-                            }
-                            if (Object.prototype.toString.call(dateObj) !== '[object Date]' || isNaN(dateObj.getTime())) {
-                                // 需要把字符串转换日期格式
-                                dateObj = dateDealFmt.dealFmt(dateObj, dateFormat)
-                            }
-                            val = format(dateObj, dateFormat)
-                        } catch (error) {
-                            console.error('转换日期格式错误:', error)
-                            val = ''
+                    val = name.join(' ')
+                }
+            } else if (config.value === 'completeTime') {
+                // 审批时间
+                if (Utils.isNotEmpty(val)) {
+                    let dateObj = val
+                    const dateFormat = 'yyyy-MM-dd HH:mm:ss'
+                    try {
+                        if (typeof dateObj === 'number') {
+                            dateObj = new Date(dateObj)
+                        }
+                        if (Object.prototype.toString.call(dateObj) !== '[object Date]' || isNaN(dateObj.getTime())) {
+                            // 需要把字符串转换日期格式
+                            dateObj = dateDealFmt.dealFmt(dateObj, dateFormat)
                         }
+                        val = format(dateObj, dateFormat)
+                    } catch (error) {
+                        console.error('转换日期格式错误:', error)
+                        val = ''
                     }
                 }
-                return val
             }
+            return val
+        }
+    },
+    inject: {
+        elForm: {
+            default: ''
+        }
+    },
+    props: {
+        value: String,
+        // 字段
+        field: Object,
+        // 只读
+        readonly: {
+            type: Boolean,
+            default: false
         },
-        inject: {
-            elForm: {
-                default: ''
-            }
+        // 只读样式
+        readonlyStyle: String,
+        // 审批意见
+        opinionData: {
+            type: Array
         },
-        props: {
-            value: String,
-            // 字段
-            field: Object,
-            // 只读
-            readonly: {
-                type: Boolean,
-                default: false
-            },
-            // 只读样式
-            readonlyStyle: String,
-            // 审批意见
-            opinionData: {
-                type: Array
-            },
-            params: Object
+        // 未提交的审批意见
+        unComplate: {
+            type: String
         },
-        data () {
-            return {
-                data: '',
-                isLimitHeight: {}
-            }
+        params: Object
+    },
+    data () {
+        return {
+            data: '',
+            isLimitHeight: {}
+        }
+    },
+    computed: {
+        commonCtatment () {
+            return this.field ? this.field.field_options.common_statment : true
         },
-        computed: {
-            commonCtatment () {
-                return this.field ? this.field.field_options.common_statment : true
-            },
-            layout () {
-                return this.field ? this.field.field_options.arrangement : 'horizontal'
-            },
-            options () {
-                return this.field ? this.field.field_options.options : []
-            },
-            optionsCheckedLength () {
-                let k = 0
-                for (let i = 0; i < this.options.length; i++) {
-                    const option = this.options[i]
-                    if (option.checked) {
-                        k = i
-                    }
+        layout () {
+            return this.field ? this.field.field_options.arrangement : 'horizontal'
+        },
+        options () {
+            return this.field ? this.field.field_options.options : []
+        },
+        optionsCheckedLength () {
+            let k = 0
+            for (let i = 0; i < this.options.length; i++) {
+                const option = this.options[i]
+                if (option.checked) {
+                    k = i
                 }
-                return k
-            },
-            placeholder () {
-                return this.field ? this.field.field_options.placeholder : ''
-            },
-            limitHeight () {
-                return this.isLimitHeight
             }
+            return k
         },
-        watch: {
-            value (val) {
-                this.data = val
-            },
-            data: {
-                handler (val) {
-                    this.$emit('update:value', val)
-                },
-                deep: true
+        placeholder () {
+            return this.field ? this.field.field_options.placeholder : ''
+        },
+        limitHeight () {
+            return this.isLimitHeight
+        }
+    },
+    watch: {
+        value (val) {
+            this.data = val
+        },
+        data: {
+            handler (val) {
+                this.$emit('update:value', val || this.unComplate)
             },
-            opinionData: {
-                handler (val) {
-                    if (this.$utils.isNotEmpty(val)) {
-                        for (let i = 0; i < this.opinionData.length; i++) {
-                            this.isLimitHeight[i] = true
-                        }
-                    }
-                },
-                immediate: true
-            }
+            deep: true,
+            immediate: true
         },
-        methods: {
-            onShowMore (i, isLimitHeight) {
-                const limitHeight = JSON.parse(JSON.stringify(this.isLimitHeight))
-                limitHeight[i] = isLimitHeight
-                this.isLimitHeight = {}
-                this.isLimitHeight = limitHeight
-            }
+        opinionData: {
+            handler (val) {
+                if (this.$utils.isNotEmpty(val)) {
+                    for (let i = 0; i < this.opinionData.length; i++) {
+                        this.isLimitHeight[i] = true
+                    }
+                }
+            },
+            immediate: true
+        }
+    },
+    methods: {
+        onShowMore (i, isLimitHeight) {
+            const limitHeight = JSON.parse(JSON.stringify(this.isLimitHeight))
+            limitHeight[i] = isLimitHeight
+            this.isLimitHeight = {}
+            this.isLimitHeight = limitHeight
         }
     }
+}
 </script>

+ 302 - 300
src/business/platform/form/formrender/dynamic-form/dynamic-form-item.vue

@@ -1,73 +1,74 @@
 <template>
-  <div v-if="!hidden">
-    <!-- 只读类型-->
-    <ibps-dynamic-form-other
-      v-if="isOtherFieldType"
-      :models="models"
-      :field="field"
-      :params="params"
-    />
-    <template v-else>
-      <el-form-item
-        ref="formItem"
-        :prop="prop"
-        :rules="rules"
-        v-if="fieldType!=='approval_opinion' || ( fieldType==='approval_opinion' && (formOpinionData[fieldName] && formOpinionData[fieldName].length>0 || !readonly))"
-        :label="fieldType==='table'?null:label"
-        :label-width="labelWidth"
-        :class="field.field_options.custom_class"
-      >
-        <template v-if="fieldType!=='table'" slot="label">{{ label + labelSuffix }}
-          <ibps-help v-if="field && field.desc && descPosition==='lableIcon'" type="tooltip" :content="$utils.formatText(field.desc)" />
-        </template>
-        <!-- 表单意见-->
-        <ibps-dynamic-form-opinion
-          v-if="fieldType==='approval_opinion'"
-          ref="formField"
-          :value.sync="dataModel"
-          :field="field"
-          :readonly="readonly"
-          :readonly-style="readonlyStyle"
-          :opinion-data="formOpinionData[fieldName]"
-          :params="params"
-          v-on="listeners"
-        />
-        <!--子表-->
-        <ibps-dynamic-form-table
-          v-else-if="fieldType==='table'"
-          ref="formField"
-          :value.sync="dataModel"
-          :form-data="$utils.isNotEmpty(row)?formData:models"
-          :main-code="code"
-          :field="field"
-          :rights="fieldRights"
-          :readonly="readonly"
-          :params="params"
-          v-on="listeners"
-        />
-        <!--字段-->
-        <ibps-dynamic-form-field
-          v-else
-          ref="formField"
-          :value.sync="dataModel"
-          :field="field"
-          :form-data="models"
-          :readonly="readonly"
-          :readonly-style="readonlyStyle"
-          :row="row"
-          :code="code"
-          :params="params"
-          v-on="listeners"
+    <div v-if="!hidden">
+        <!-- 只读类型-->
+        <ibps-dynamic-form-other
+            v-if="isOtherFieldType"
+            :models="models"
+            :field="field"
+            :params="params"
         />
-        <!-- ######描述属性###### -->
-        <div
-          v-if="field && field.desc && descPosition==='inline'"
-          class="ibps-help-block"
-          v-html="$utils.formatText(field.desc )"
-        />
-      </el-form-item>
-    </template>
-  </div>
+        <template v-else>
+            <el-form-item
+                v-if="fieldType!=='approval_opinion' || ( fieldType==='approval_opinion' && (formOpinionData[fieldName] && formOpinionData[fieldName].length>0 || !readonly))"
+                ref="formItem"
+                :prop="prop"
+                :rules="rules"
+                :label="fieldType==='table'?null:label"
+                :label-width="labelWidth"
+                :class="field.field_options.custom_class"
+            >
+                <template v-if="fieldType!=='table'" slot="label">{{ label + labelSuffix }}
+                    <ibps-help v-if="field && field.desc && descPosition==='lableIcon'" type="tooltip" :content="$utils.formatText(field.desc)" />
+                </template>
+                <!-- 表单意见-->
+                <ibps-dynamic-form-opinion
+                    v-if="fieldType==='approval_opinion'"
+                    ref="formField"
+                    :value.sync="dataModel"
+                    :field="field"
+                    :readonly="readonly"
+                    :readonly-style="readonlyStyle"
+                    :opinion-data="formOpinionData[fieldName]"
+                    :un-complate="unComplateOpinion"
+                    :params="params"
+                    v-on="listeners"
+                />
+                <!--子表-->
+                <ibps-dynamic-form-table
+                    v-else-if="fieldType==='table'"
+                    ref="formField"
+                    :value.sync="dataModel"
+                    :form-data="$utils.isNotEmpty(row)?formData:models"
+                    :main-code="code"
+                    :field="field"
+                    :rights="fieldRights"
+                    :readonly="readonly"
+                    :params="params"
+                    v-on="listeners"
+                />
+                <!--字段-->
+                <ibps-dynamic-form-field
+                    v-else
+                    ref="formField"
+                    :value.sync="dataModel"
+                    :field="field"
+                    :form-data="models"
+                    :readonly="readonly"
+                    :readonly-style="readonlyStyle"
+                    :row="row"
+                    :code="code"
+                    :params="params"
+                    v-on="listeners"
+                />
+                <!-- ######描述属性###### -->
+                <div
+                    v-if="field && field.desc && descPosition==='inline'"
+                    class="ibps-help-block"
+                    v-html="$utils.formatText(field.desc )"
+                />
+            </el-form-item>
+        </template>
+    </div>
 </template>
 <script>
 import FormUtil from '@/business/platform/form/utils/formUtil'
@@ -75,248 +76,249 @@ import FormOptions from '../../constants/formOptions'
 import { otherFieldTypes } from '@/business/platform/form/constants/fieldTypes'
 
 export default {
-  props: {
-    models: [Object, Array], // 当前字段数据
-    rights: [String, Object], // 字段权限
-    formData: [Array, Object], // 表单数据(包含子表)
-    field: Object, // 字段
-    code: String, // 表名
-    mainCode: String, // 主表名
-    row: [String, Number], // 子表行数
-    params: Object // 参数
-  },
-  inject: {
-    elForm: {
-      default: ''
-    },
-    elFormItem: {
-      default: ''
-    }
-  },
-  data() {
-    let defaultVal = ''
-    if (this.field.field_type === 'table') {
-      // 一对多,是数组,一对一是对象
-      defaultVal = this.field.field_options.relation === 'one2one' ? {} : []
-    } else {
-      defaultVal = ''
-    }
-
-    return {
-      dataModel: this.models[this.field.name] || defaultVal,
-      fieldRights: this.rights[this.field.name] || 'e'
-    }
-  },
-  computed: {
-    fieldName() {
-      return this.field.name
-    },
-    prop() {
-      if (this.$utils.isNotEmpty(this.row)) {
-        return this.code + '.' + this.row + '.' + this.fieldName
-      }
-      return this.fieldName
-    },
-    label() { // 显示的文本
-      if (this.fieldType === 'table' || this.field.field_options.hide_label) return null
-      return this.$utils.isNotEmpty(this.field.field_options.units) ? this.field.label + '(' + this.field.field_options.units + ')' : this.field.label
-    },
-    labelSuffix() {
-      return this.params.labelSuffix
-    },
-    labelWidth() { // 字段宽度
-      if (this.fieldType === 'table' || this.field.field_options.hide_label) { return '0' }
-      return this.field.field_options.is_label_width ? this.field.field_options.label_width + (this.field.field_options.label_width_unit || 'px') : this.defaultLabelWidth
-    },
-
-    fieldType() {
-      return this.field.field_type
-    },
-    subTableRights() { // 子表权限
-      if (this.fieldType === 'table' && this.$utils.isNotEmpty(this.fieldRights) &&
-      this.$utils.isPlainObject(this.fieldRights)) {
-        return this.fieldRights['rights']
-      }
-      return false
-    },
-    hidden() { // 是否隐藏
-      if (this.subTableRights) {
-        return this.subTableRights === FormOptions.t.PERMISSIONS.HIDE
-      }
-      return this.fieldRights === FormOptions.t.PERMISSIONS.HIDE || this.fieldType === 'hidden' ||
-      (this.fieldType === 'approval_opinion' && (this.$utils.isNotEmpty(this.defId) || this.hiddenApprovalOpinion))
+    props: {
+        models: [Object, Array], // 当前字段数据
+        rights: [String, Object], // 字段权限
+        formData: [Array, Object], // 表单数据(包含子表)
+        field: Object, // 字段
+        code: String, // 表名
+        mainCode: String, // 主表名
+        row: [String, Number], // 子表行数
+        params: Object // 参数
     },
-    readonly() { // 是否只读
-      if (this.subTableRights) {
-        return this.subTableRights === FormOptions.t.PERMISSIONS.READ
-      }
-      return this.readonlyRights ? true : this.fieldRights === FormOptions.t.PERMISSIONS.READ
-    },
-    required() { // 必填  【只读隐藏,都设置非必填】
-      if (this.readonly || this.hidden) {
-        return false
-      }
-      if (this.subTableRights) {
-        return this.subTableRights === FormOptions.t.PERMISSIONS.REQUIRED
-      }
-      return this.fieldRights === FormOptions.t.PERMISSIONS.REQUIRED ? true : this.field.field_options.required || false
-    },
-    isOtherFieldType() {
-      return otherFieldTypes.includes(this.fieldType)
-    },
-    rules() { // 表单字段规则
-      if (this.readonly || this.hidden) { return [] }
-      return FormUtil.buildFormRules(this.field, this.required, this.models)
-    },
-    descPosition() {
-      return this.params.descPosition || 'inline'
-    },
-    defaultLabelWidth() {
-      return this.params.labelWidth
-    },
-    readonlyRights() {
-      return this.params.readonly
-    },
-    readonlyStyle() {
-      return this.params.readonlyStyle
-    },
-    formula() {
-      return this.params.responseFormula
-    },
-    linkages() {
-      return this.params.responseLinkages
-    },
-    formOpinionData() {
-      return this.params.responseFormOpinionData || {}
-    },
-    listeners() {
-      return {
-        ...this.$listeners,
-        change: (data) => { // 在 Input 值改变时触发
-          // 值改变进行数据联动
-          this.runLinkage()
-          this.emitEvent('change', data)
+    inject: {
+        elForm: {
+            default: ''
         },
-        focus: (event) => { this.emitEvent('focus', event) }, // 在 Input 获得焦点时触发
-        blur: (event) => { this.emitEvent('blur', event) }, // 在 Input 失去焦点时触发
-        // click: (event) => { this.emitEvent('click', event) } // 在 Input 点击时触发
-        'change-data': this.handleModels // 数据改变
-      }
-    }
-  },
-  watch: {
-   dataModel: {
-      handler(val) {
-        if (FormOptions.t.NON_MODEL_FIELD_TYPES.includes(this.fieldType)) {
-          return
-        }
-        this.handleModels(this.fieldName, val)
-        this.$nextTick(() => {
-          // 值改变进行公式计算
-          this.runCalFormula()
-        })
-      },
-     /* deep: false, */
-       immediate: true
-    },
-    models: {
-      handler(val, oldVal) {
-      this.dataModel =  val[this.fieldName]
-      },
-     deep: true
-    },
-    fieldRights: {
-      handler(val) {
-        this.handleFieldRights(this.fieldName, val)
-      },
-      deep: true,
-      immediate: true
-    },
-    rights: {
-      handler(val, oldVal) {
-        this.fieldRights = val[this.fieldName]
-      },
-      deep: true,
-      immediate: true
-    }
-  },
-  methods: {
-    handleModels(name, val) {
-      if (this.$utils.isEmpty(name)) {
-        return
-      }
-      this.models[name] = val
-      this.$emit('update:models', {
-        ...this.models,
-        [name]: val
-      })
-    },
-    handleFieldRights(name, val) {
-      if (this.$utils.isEmpty(name)) {
-        return
-      }
-      this.rights[name] = val
-      this.$emit('update:rights', {
-        ...this.rights,
-        [name]: val
-      })
-    },
-    setFieldData(name, val) {
-      setTimeout(() => {
-        this.$emit('update-form-data', name, val)
-      }, 10)
-    },
-    /**
-     * 进行公式计算
-     */
-    runCalFormula() {
-      if (!this.formula) return
-      const { field, code, mainCode, row } = this
-      if (field.field_type === 'table') {
-        const columns = field.field_options.columns || []
-        for (let i = 0; i < columns.length; i++) {
-          const column = columns[i]
-          this.calFormula(field.name, column.name, mainCode, row)
+        elFormItem: {
+            default: ''
         }
-      } else {
-        this.calFormula(code, field.name, mainCode, row)
-      }
     },
-    calFormula(code, name, mainCode, row) {
-      const key = code + '.' + name
-      const formulas = this.formula[key]
-      if (formulas) {
-        if (mainCode) {
-          FormUtil.runSubCalFormula(this, formulas, code, mainCode, row)
+    data () {
+        let defaultVal = ''
+        if (this.field.field_type === 'table') {
+            // 一对多,是数组,一对一是对象
+            defaultVal = this.field.field_options.relation === 'one2one' ? {} : []
         } else {
-          FormUtil.runMainCalFormula(this, formulas, code)
+            defaultVal = ''
+        }
+
+        return {
+            dataModel: this.models[this.field.name] || defaultVal,
+            fieldRights: this.rights[this.field.name] || 'e'
         }
-      }
     },
-    /**
-     * 进行联动数据
-     */
-    runLinkage() {
-      if (!this.linkages) return
-      const { field, code } = this
-      if (field.isSub) { // 子表
-        const key = code + '.' + field.name
-        const linkages = this.linkages ? this.linkages[key] : null
-        if (linkages) {
-          FormUtil.runLinkage(this, linkages, field, field.row)
+    computed: {
+        fieldName () {
+            return this.field.name
+        },
+        prop () {
+            if (this.$utils.isNotEmpty(this.row)) {
+                return this.code + '.' + this.row + '.' + this.fieldName
+            }
+            return this.fieldName
+        },
+        label () { // 显示的文本
+            if (this.fieldType === 'table' || this.field.field_options.hide_label) return ''
+            return this.$utils.isNotEmpty(this.field.field_options.units) ? this.field.label + '(' + this.field.field_options.units + ')' : this.field.label
+        },
+        labelSuffix () {
+            return this.params.labelSuffix
+        },
+        labelWidth () { // 字段宽度
+            if (this.fieldType === 'table' || this.field.field_options.hide_label) { return '0' }
+            return this.field.field_options.is_label_width ? this.field.field_options.label_width + (this.field.field_options.label_width_unit || 'px') : this.defaultLabelWidth
+        },
+
+        fieldType () {
+            return this.field.field_type
+        },
+        subTableRights () { // 子表权限
+            if (this.fieldType === 'table' && this.$utils.isNotEmpty(this.fieldRights) && this.$utils.isPlainObject(this.fieldRights)) {
+                return this.fieldRights['rights']
+            }
+            return false
+        },
+        hidden () { // 是否隐藏
+            if (this.subTableRights) {
+                return this.subTableRights === FormOptions.t.PERMISSIONS.HIDE
+            }
+            return this.fieldRights === FormOptions.t.PERMISSIONS.HIDE || this.fieldType === 'hidden' || (this.fieldType === 'approval_opinion' && (this.$utils.isNotEmpty(this.defId) || this.hiddenApprovalOpinion))
+        },
+        readonly () { // 是否只读
+            if (this.subTableRights) {
+                return this.subTableRights === FormOptions.t.PERMISSIONS.READ
+            }
+            return this.readonlyRights ? true : this.fieldRights === FormOptions.t.PERMISSIONS.READ
+        },
+        required () { // 必填  【只读隐藏,都设置非必填】
+            if (this.readonly || this.hidden) {
+                return false
+            }
+            if (this.subTableRights) {
+                return this.subTableRights === FormOptions.t.PERMISSIONS.REQUIRED
+            }
+            return this.fieldRights === FormOptions.t.PERMISSIONS.REQUIRED ? true : this.field.field_options.required || false
+        },
+        isOtherFieldType () {
+            return otherFieldTypes.includes(this.fieldType)
+        },
+        rules () { // 表单字段规则
+            if (this.readonly || this.hidden) { return [] }
+            return FormUtil.buildFormRules(this.field, this.required, this.models)
+        },
+        descPosition () {
+            return this.params.descPosition || 'inline'
+        },
+        defaultLabelWidth () {
+            return this.params.labelWidth
+        },
+        readonlyRights () {
+            return this.params.readonly
+        },
+        readonlyStyle () {
+            return this.params.readonlyStyle
+        },
+        formula () {
+            return this.params.responseFormula
+        },
+        linkages () {
+            return this.params.responseLinkages
+        },
+        formOpinionData () {
+            return this.params.responseFormOpinionData || {}
+        },
+        unComplateOpinion () {
+            return this.params.unComplateOpinion || ''
+        },
+        listeners () {
+            return {
+                ...this.$listeners,
+                change: (data) => { // 在 Input 值改变时触发
+                    // 值改变进行数据联动
+                    this.runLinkage()
+                    this.emitEvent('change', data)
+                },
+                focus: (event) => { this.emitEvent('focus', event) }, // 在 Input 获得焦点时触发
+                blur: (event) => { this.emitEvent('blur', event) }, // 在 Input 失去焦点时触发
+                // click: (event) => { this.emitEvent('click', event) } // 在 Input 点击时触发
+                'change-data': this.handleModels // 数据改变
+            }
         }
-      } else {
-        field.code = code
-        const key = field.code + '.' + field.name
-        const linkages = this.linkages ? this.linkages[key] : null
-        if (linkages) {
-          FormUtil.runLinkage(this, linkages, field)
+    },
+    watch: {
+        dataModel: {
+            handler (val) {
+                if (FormOptions.t.NON_MODEL_FIELD_TYPES.includes(this.fieldType)) {
+                    return
+                }
+                this.handleModels(this.fieldName, val)
+                this.$nextTick(() => {
+                    // 值改变进行公式计算
+                    this.runCalFormula()
+                })
+            },
+            // deep: false,
+            immediate: true
+        },
+        models: {
+            handler (val, oldVal) {
+                this.dataModel = val[this.fieldName]
+            },
+            deep: true
+        },
+        fieldRights: {
+            handler (val) {
+                this.handleFieldRights(this.fieldName, val)
+            },
+            deep: true,
+            immediate: true
+        },
+        rights: {
+            handler (val, oldVal) {
+                this.fieldRights = val[this.fieldName]
+            },
+            deep: true,
+            immediate: true
         }
-      }
     },
-    emitEvent(event) {
-      this.$emit(event, ...Array.from(arguments).slice(1))
+    methods: {
+        handleModels (name, val) {
+            if (this.$utils.isEmpty(name)) {
+                return
+            }
+            this.models[name] = val
+            this.$emit('update:models', {
+                ...this.models,
+                [name]: val
+            })
+        },
+        handleFieldRights (name, val) {
+            if (this.$utils.isEmpty(name)) {
+                return
+            }
+            this.rights[name] = val
+            this.$emit('update:rights', {
+                ...this.rights,
+                [name]: val
+            })
+        },
+        setFieldData (name, val) {
+            setTimeout(() => {
+                this.$emit('update-form-data', name, val)
+            }, 10)
+        },
+        /**
+         * 进行公式计算
+         */
+        runCalFormula () {
+            if (!this.formula) return
+            const { field, code, mainCode, row } = this
+            if (field.field_type === 'table') {
+                const columns = field.field_options.columns || []
+                for (let i = 0; i < columns.length; i++) {
+                    const column = columns[i]
+                    this.calFormula(field.name, column.name, mainCode, row)
+                }
+            } else {
+                this.calFormula(code, field.name, mainCode, row)
+            }
+        },
+        calFormula (code, name, mainCode, row) {
+            const key = code + '.' + name
+            const formulas = this.formula[key]
+            if (formulas) {
+                if (mainCode) {
+                    FormUtil.runSubCalFormula(this, formulas, code, mainCode, row)
+                } else {
+                    FormUtil.runMainCalFormula(this, formulas, code)
+                }
+            }
+        },
+        /**
+         * 进行联动数据
+         */
+        runLinkage () {
+            if (!this.linkages) return
+            const { field, code } = this
+            if (field.isSub) { // 子表
+                const key = code + '.' + field.name
+                const linkages = this.linkages ? this.linkages[key] : null
+                if (linkages) {
+                    FormUtil.runLinkage(this, linkages, field, field.row)
+                }
+            } else {
+                field.code = code
+                const key = field.code + '.' + field.name
+                const linkages = this.linkages ? this.linkages[key] : null
+                if (linkages) {
+                    FormUtil.runLinkage(this, linkages, field)
+                }
+            }
+        },
+        emitEvent (event) {
+            this.$emit(event, ...Array.from(arguments).slice(1))
+        }
     }
-  }
 }
 </script>

+ 5 - 1
src/business/platform/form/formrender/dynamic-form/dynamic-form.vue

@@ -8,7 +8,7 @@
                     {{ formDef.processName ? formDef.processName : formDef.name }}
                     <span v-if="formDef && formDef.flowName">{{ formDef.flowName }}</span>
                     <relevance-table
-                        v-if="titleList.length > 0 && formParams.formAttrs.customClass.includes('true')"
+                        v-if="titleList.length > 0 && (formParams.formAttrs.customClass && formParams.formAttrs.customClass.includes('true'))"
                         :list="titleList"
                         :form="form"
                         class="relevanceTable"
@@ -168,6 +168,7 @@
                 responseOpinionFields: {}, // 表单的意见字段
                 responseFormOpinionData: {}, // 已填写的表单意见
                 responseLabelFields: {}, // 表单的文本字段
+                unComplateOpinion: '', // 未提交的审批意见
                 invalidFields: {},
                 activeStep: 0,
                 titleList: [],
@@ -241,6 +242,7 @@
                     responseFormula: this.responseFormula,
                     responseLinkages: this.responseLinkages,
                     responseFormOpinionData: this.responseFormOpinionData,
+                    unComplateOpinion: this.unComplateOpinion,
                     readonly: this.readonly,
                     readonlyStyle: this.readonlyStyle,
                     labelWidth: this.labelWidth,
@@ -461,10 +463,12 @@
             // 初始化表单意见
             initResponseOpinionData() {
                 this.responseFormOpinionData = {}
+                this.unComplateOpinion = null
                 const opinionData = this.params ? this.params.formOpinionData || {} : {}
                 if (this.$utils.isEmpty(opinionData) || !this.hasFormOpinion()) {
                     return
                 }
+                this.unComplateOpinion = opinionData.unComplateOpinion
                 const hasBindNode = opinionData.hasBindNode
                 const formOpinionConfig = opinionData.formOpinionConfig
                 if (hasBindNode) {

+ 934 - 931
src/business/platform/form/utils/formUtil.js

@@ -19,971 +19,974 @@ import store from '@/store' // store
 window.FormulaUtil = FormulaUtil
 window.Utils = Utils
 const FormUtil = {
-  TABLE_SEPARATOR: '.', // 表分隔符
-  EVAL_FORMULA: '',
-  NOT_NEED_FIELD: '#not_need_field#', // 不需要通过字段计算的字段
-  CACHE_DYNAMIC_VALUE: {},
-  CACHE_CURRENT_USER_DATA: {}, // 缓存的用户数据值,包含组织、岗位部门,以后缓存到store 或者缓存
-  setResponseFormula(responseFormula, model, code) {
-    if (model.field_type === 'table') { //  判断是否是主表,子表他自己处理
-      const columns = model.field_options.columns
-      if (columns && columns.length > 0) {
-        model.field_options.columns.forEach((item) => {
-          this.setChangeFormulaData(responseFormula, item, model.name)
-        })
-      }
-    } else { // 主表
-      this.setChangeFormulaData(responseFormula, model, code)
-    }
-  },
+    TABLE_SEPARATOR: '.', // 表分隔符
+    EVAL_FORMULA: '',
+    NOT_NEED_FIELD: '#not_need_field#', // 不需要通过字段计算的字段
+    CACHE_DYNAMIC_VALUE: {},
+    CACHE_CURRENT_USER_DATA: {}, // 缓存的用户数据值,包含组织、岗位部门,以后缓存到store 或者缓存
+    setResponseFormula (responseFormula, model, code) {
+        if (model.field_type === 'table') { //  判断是否是主表,子表他自己处理
+            const columns = model.field_options.columns
+            if (columns && columns.length > 0) {
+                model.field_options.columns.forEach((item) => {
+                    this.setChangeFormulaData(responseFormula, item, model.name)
+                })
+            }
+        } else { // 主表
+            this.setChangeFormulaData(responseFormula, model, code)
+        }
+    },
 
-  setChangeFormulaData(responseFormula, model, code) {
-    const fieldOptions = model.field_options
-    if (Utils.isEmpty(fieldOptions)) {
-      return {}
-    }
-    const formula = fieldOptions.default_value
-    if (fieldOptions.default_value_type !== 'formula' || !formula) {
-      return {}
-    }
-    const changename = code + this.TABLE_SEPARATOR + model.name
-    // eslint-disable-next-line no-useless-escape
-    const d = formula.split(/(\$[0-9a-zA-Z\._]+#[0-9A-Fa-f]*)/g)
-    const z = this.NOT_NEED_FIELD
-    const changFormula = {
-      changename: changename,
-      formula: formula
-    }
-    let isHasField = false
+    setChangeFormulaData (responseFormula, model, code) {
+        const fieldOptions = model.field_options
+        if (Utils.isEmpty(fieldOptions)) {
+            return {}
+        }
+        const formula = fieldOptions.default_value
+        if (fieldOptions.default_value_type !== 'formula' || !formula) {
+            return {}
+        }
+        const changename = code + this.TABLE_SEPARATOR + model.name
+        // eslint-disable-next-line no-useless-escape
+        const d = formula.split(/(\$[0-9a-zA-Z\._]+#[0-9A-Fa-f]*)/g)
+        const z = this.NOT_NEED_FIELD
+        const changFormula = {
+            changename: changename,
+            formula: formula
+        }
+        let isHasField = false
 
-    d.forEach(n => {
-      if (/^\$(_widget_)/.test(n)) { // 对字段进行处理
-        const f = n.replace('$_widget_', '').split('#')
-        const g = f[0]
-        const h = f[1]
-        if (Utils.isEmpty(h)) {
-          if (!responseFormula[g]) { responseFormula[g] = [] }
-          responseFormula[g].push(changFormula)
-        }
-        isHasField = true
-      }
-    })
-    // 未有要计算改变字段
-    if (!isHasField) {
-      if (!responseFormula[z]) { responseFormula[z] = [] }
-      responseFormula[z].push(changFormula)
-    }
-  },
-  runCalFormula(self, responseFormulas, curCode, row) {
-    if (Utils.isEmpty(responseFormulas)) { return self.models }
-    responseFormulas.forEach((formula) => {
-      const changename = formula.changename // 修改字段
-      const changeObj = changename ? changename.split(this.TABLE_SEPARATOR) : []// 改变的对象
-      const changeCode = changeObj[0]
-      const changeField = changeObj[1] // 修改的字段
-      const formData = JSON.parse(JSON.stringify(self.models))
-      const v = this.getCalFormulaValue(formula, formData, curCode, curCode)
-      if (Utils.isNotEmpty(row)) { // 子表
-        self.setRowData(row, changeField, v)
-      } else {
-        if (curCode === changeCode) {
-          self.setFieldData(changeField, v)
-        } else { // 子表
-          const rowData = this.getCalFormulaSubValue(formula, formData, changeField, changeCode, curCode)
-          self.setFieldData(changeCode, rowData)
-        }
-      }
-    })
-  },
-  /**
-   * 进行主表公式计算
-   * @param {*} responseFormulas
-   * @param {*} field
-   * @param {*} curCode
-   */
-  runMainCalFormula(self, responseFormulas, curCode) {
-    if (Utils.isEmpty(responseFormulas)) { return }
+        d.forEach(n => {
+            if (/^\$(_widget_)/.test(n)) { // 对字段进行处理
+                const f = n.replace('$_widget_', '').split('#')
+                const g = f[0]
+                const h = f[1]
+                if (Utils.isEmpty(h)) {
+                    if (!responseFormula[g]) { responseFormula[g] = [] }
+                    responseFormula[g].push(changFormula)
+                }
+                isHasField = true
+            }
+        })
+        // 未有要计算改变字段
+        if (!isHasField) {
+            if (!responseFormula[z]) { responseFormula[z] = [] }
+            responseFormula[z].push(changFormula)
+        }
+    },
+    runCalFormula (self, responseFormulas, curCode, row) {
+        if (Utils.isEmpty(responseFormulas)) { return self.models }
+        responseFormulas.forEach((formula) => {
+            const changename = formula.changename // 修改字段
+            const changeObj = changename ? changename.split(this.TABLE_SEPARATOR) : []// 改变的对象
+            const changeCode = changeObj[0]
+            const changeField = changeObj[1] // 修改的字段
+            const formData = JSON.parse(JSON.stringify(self.models))
+            const v = this.getCalFormulaValue(formula, formData, curCode, curCode)
+            if (Utils.isNotEmpty(row)) { // 子表
+                self.setRowData(row, changeField, v)
+            } else {
+                if (curCode === changeCode) {
+                    self.setFieldData(changeField, v)
+                } else { // 子表
+                    const rowData = this.getCalFormulaSubValue(formula, formData, changeField, changeCode, curCode)
+                    self.setFieldData(changeCode, rowData)
+                }
+            }
+        })
+    },
+    /**
+     * 进行主表公式计算
+     * @param {*} responseFormulas
+     * @param {*} field
+     * @param {*} curCode
+     */
+    runMainCalFormula (self, responseFormulas, curCode) {
+        if (Utils.isEmpty(responseFormulas)) { return }
 
-    responseFormulas.forEach((formula) => {
-      const changename = formula.changename // 修改字段
-      const changeObj = changename ? changename.split(this.TABLE_SEPARATOR) : []// 改变的对象
-      const changeCode = changeObj[0] || ''// 修改的表
-      const changeField = changeObj[1] || '' // 修改的字段
-      const formData = JSON.parse(JSON.stringify(self.models))
-      if (curCode === changeCode) {
-        const v = this.getCalFormulaValue(formula, formData, curCode, curCode)
-        self.handleModels(changeField, v)
-      } else { // 子表 主表修改子表
-        if (formData[changeCode]) { // 修改其他子表
-          const v = this.getCalFormulaSubValue(formula, formData, changeField, changeCode, curCode)
-          self.handleModels(changeCode, v)
-        } else { // 修改主表表
-          const v = this.getCalFormulaValue(formula, formData, changeCode, changeCode)
-          if (formData[changeField]) {
-            self.handleModels(changeField, v)
-          }
-        }
-      }
-    })
-  },
-  runSubCalFormula(self, responseFormulas, curCode, mainCode, row) {
-    if (Utils.isEmpty(self.formData)) {
-      return
-    }
-    const formData = JSON.parse(JSON.stringify(self.formData))
-    responseFormulas.forEach((formula) => {
-      const changename = formula.changename // 修改字段
-      const changeObj = changename ? changename.split(FormUtil.TABLE_SEPARATOR) : []// 改变的对象
-      const changeCode = changeObj[0] || ''// 修改的表
-      const changeField = changeObj[1] || '' // 修改的字段
-      // 获取公式计算的值
-      const v = FormUtil.getCalFormulaValue(formula, formData, curCode, mainCode, row)
-      // 回填值
-      if (changeCode === curCode) { // 是否相同子表 则取1列
-        self.handleModels(changeField, v)
-      } else { // 不同表
-        if (mainCode === changeCode) { // 修改是主表
-          self.setFieldData(changeField, v)
-        } else {
-          if (formData[changeCode]) { // 修改其他子表
-            const rowData = this.getCalFormulaSubValue(formula, formData, changeField, changeCode, curCode)
-            self.setFieldData(changeCode, rowData)
-          } else { // 修改主表表
-            if (formData[changeField]) {
-              self.handleModels(changeField, v)
+        responseFormulas.forEach((formula) => {
+            const changename = formula.changename // 修改字段
+            const changeObj = changename ? changename.split(this.TABLE_SEPARATOR) : []// 改变的对象
+            const changeCode = changeObj[0] || ''// 修改的表
+            const changeField = changeObj[1] || '' // 修改的字段
+            const formData = JSON.parse(JSON.stringify(self.models))
+            if (curCode === changeCode) {
+                const v = this.getCalFormulaValue(formula, formData, curCode, curCode)
+                self.handleModels(changeField, v)
+            } else { // 子表 主表修改子表
+                if (formData[changeCode]) { // 修改其他子表
+                    const v = this.getCalFormulaSubValue(formula, formData, changeField, changeCode, curCode)
+                    self.handleModels(changeCode, v)
+                } else { // 修改主表表
+                    const v = this.getCalFormulaValue(formula, formData, changeCode, changeCode)
+                    if (formData[changeField]) {
+                        self.handleModels(changeField, v)
+                    }
+                }
             }
-          }
-        }
-      }
-    })
-  },
-  getCalFormulaSubValue(formula, formData, changeField, changeCode, curCode) {
-    const rowData = JSON.parse(JSON.stringify(formData[changeCode]))
-    if (Utils.isArray(rowData)) {
-      const res = []
-      for (let i = 0; i < rowData.length; i++) {
-        const row = rowData[i]
-        const obj = {}
-        for (const key in row) {
-          if (row.hasOwnProperty(key)) {
-            let val = row[key]
-            if (key === changeField) {
-              val = this.getCalFormulaValue(formula, formData, changeCode, curCode, i)
+        })
+    },
+    runSubCalFormula (self, responseFormulas, curCode, mainCode, row) {
+        if (Utils.isEmpty(self.formData)) {
+            return
+        }
+        const formData = JSON.parse(JSON.stringify(self.formData))
+        responseFormulas.forEach((formula) => {
+            const changename = formula.changename // 修改字段
+            const changeObj = changename ? changename.split(FormUtil.TABLE_SEPARATOR) : []// 改变的对象
+            const changeCode = changeObj[0] || ''// 修改的表
+            const changeField = changeObj[1] || '' // 修改的字段
+            // 获取公式计算的值
+            const v = FormUtil.getCalFormulaValue(formula, formData, curCode, mainCode, row)
+            // 回填值
+            if (changeCode === curCode) { // 是否相同子表 则取1列
+                self.handleModels(changeField, v)
+            } else { // 不同表
+                if (mainCode === changeCode) { // 修改是主表
+                    self.setFieldData(changeField, v)
+                } else {
+                    if (formData[changeCode]) { // 修改其他子表
+                        const rowData = this.getCalFormulaSubValue(formula, formData, changeField, changeCode, curCode)
+                        self.setFieldData(changeCode, rowData)
+                    } else { // 修改主表表
+                        if (formData[changeField]) {
+                            self.handleModels(changeField, v)
+                        }
+                    }
+                }
             }
-            obj[key] = val
-          }
-        }
-        res.push(obj)
-      }
-      return res
-    } else {
-      // TODO: 一对一
-      if (Utils.isNotEmpty(rowData[changeField])) {
-        rowData[changeField] = this.getCalFormulaValue(formula, formData, changeCode, curCode)
-      }
-      return rowData
-    }
-  },
-  /**
-   * 通过计算的值
-   */
-  getCalFormulaValue(responseFormula, data, curCode, mainCode, row) {
-    const formula = responseFormula.formula
-    const changename = responseFormula.changename// 修改字段
-    const changeObj = changename ? changename.split(this.TABLE_SEPARATOR) : [] // 改变的对象
-    const isSameTable = changeObj[0] === curCode // 是否相同的表
-    // eslint-disable-next-line no-useless-escape
-    const d = formula.split(/(\$[0-9a-zA-Z\._]+#[0-9A-Fa-f]*)/g)
-    const e = []
-    let v = ''
-    d.forEach(n => {
-      if (/^\$(_widget_)/.test(n)) {
-        const f = n.replace('$_widget_', '').split('#')
-        const g = f[0]
-        const h = f[1]
-        if (Utils.isEmpty(h)) {
-          // 获取公式的值 数字
-          const t = g.split(this.TABLE_SEPARATOR)
-          let origVal = ''
-          const calCode = t[0] // 当前计算的code
-          const key = t[1]
-          if (mainCode === calCode) { // 主表
-            origVal = this.getValueByKey(data, key)
-          } else { // 其他子表
-            if (isSameTable && Utils.isNotEmpty(row)) { // 相同的子表
-              origVal = this.getValueByKey(data, key, calCode, row)
-            } else { // 如果改变的是主表,则取一列的值
-              origVal = this.getColumnValue(data, calCode, key)
+        })
+    },
+    getCalFormulaSubValue (formula, formData, changeField, changeCode, curCode) {
+        const rowData = JSON.parse(JSON.stringify(formData[changeCode]))
+        if (Utils.isArray(rowData)) {
+            const res = []
+            for (let i = 0; i < rowData.length; i++) {
+                const row = rowData[i]
+                const obj = {}
+                for (const key in row) {
+                    if (row.hasOwnProperty(key)) {
+                        let val = row[key]
+                        if (key === changeField) {
+                            val = this.getCalFormulaValue(formula, formData, changeCode, curCode, i)
+                        }
+                        obj[key] = val
+                    }
+                }
+                res.push(obj)
             }
-          }
-          // 修复 特殊字符的bug
-          let val = ''
-          val = (val = (val = (val = JSON.stringify(origVal) + '').replace(/\\\\(?=.+)/g, '"+CHAR(92)+"')).replace(/\\\"(?=.+)/g, '"+CHAR(34)+"')).replace(/\\n(?=.+)/g, '"+CHAR(10)+"')
-          if (!isNaN(origVal) && origVal < 0) {
-            val = '(' + val + ')'
-          }
-          e.push(val)
+            return res
         } else {
-          e.push('"' + n + '"')
-        }
-      } else {
-        e.push(n)
-      }
-    })
-    // console.error(e.join(''))
-    try {
-      v = this.evalFormula(e.join(''))
-    } catch (e) {
-      v = ''
-    }
-    return v
-  },
-  getValueByKey(data, key, code, row) {
-    if (!data) {
-      return this.getRealValue()
-    }
-    if (Utils.isNotEmpty(code)) {
-      return this.getRealValue(data[code][row][key])
-    } else {
-      return this.getRealValue(data[key])
-    }
-  },
-  // 获取一行数据
-  getColumnValue(data, code, key) {
-    const tableData = data[code]
-    if (Utils.isEmpty(tableData)) {
-      return ''
-    }
-    const v = tableData.map((d) => {
-      return this.getRealValue(d[key])
-    })
-    return JSON.stringify(v)
-  },
-  // TODO: 需要传递类型,判断类型不同进行进行计算,默认是字符串
-  // 暂时处理把能转数字类型转数字
-  getRealValue(val) {
-    if (Utils.isEmpty(val)) return ''
-    if (Utils.isNum(val)) {
-      return Number(val)
-    } else {
-      return val
-    }
-  },
+            // TODO: 一对一
+            if (Utils.isNotEmpty(rowData[changeField])) {
+                rowData[changeField] = this.getCalFormulaValue(formula, formData, changeCode, curCode)
+            }
+            return rowData
+        }
+    },
+    /**
+     * 通过计算的值
+     */
+    getCalFormulaValue (responseFormula, data, curCode, mainCode, row) {
+        const formula = responseFormula.formula
+        const changename = responseFormula.changename// 修改字段
+        const changeObj = changename ? changename.split(this.TABLE_SEPARATOR) : [] // 改变的对象
+        const isSameTable = changeObj[0] === curCode // 是否相同的表
+        // eslint-disable-next-line no-useless-escape
+        const d = formula.split(/(\$[0-9a-zA-Z\._]+#[0-9A-Fa-f]*)/g)
+        const e = []
+        let v = ''
+        d.forEach(n => {
+            if (/^\$(_widget_)/.test(n)) {
+                const f = n.replace('$_widget_', '').split('#')
+                const g = f[0]
+                const h = f[1]
+                if (Utils.isEmpty(h)) {
+                    // 获取公式的值 数字
+                    const t = g.split(this.TABLE_SEPARATOR)
+                    let origVal = ''
+                    const calCode = t[0] // 当前计算的code
+                    const key = t[1]
+                    if (mainCode === calCode) { // 主表
+                        origVal = this.getValueByKey(data, key)
+                    } else { // 其他子表
+                        if (isSameTable && Utils.isNotEmpty(row)) { // 相同的子表
+                            origVal = this.getValueByKey(data, key, calCode, row)
+                        } else { // 如果改变的是主表,则取一列的值
+                            origVal = this.getColumnValue(data, calCode, key)
+                        }
+                    }
+                    // 修复 特殊字符的bug
+                    let val = ''
+                    val = (val = (val = (val = JSON.stringify(origVal) + '').replace(/\\\\(?=.+)/g, '"+CHAR(92)+"')).replace(/\\\"(?=.+)/g, '"+CHAR(34)+"')).replace(/\\n(?=.+)/g, '"+CHAR(10)+"')
+                    if (!isNaN(origVal) && origVal < 0) {
+                        val = '(' + val + ')'
+                    }
+                    e.push(val)
+                } else {
+                    e.push('"' + n + '"')
+                }
+            } else {
+                e.push(n)
+            }
+        })
+        // console.error(e.join(''))
+        try {
+            v = this.evalFormula(e.join(''))
+        } catch (e) {
+            v = ''
+        }
+        return v
+    },
+    getValueByKey (data, key, code, row) {
+        if (!data) {
+            return this.getRealValue()
+        }
+        if (Utils.isNotEmpty(code)) {
+            return this.getRealValue(data[code][row][key])
+        } else {
+            return this.getRealValue(data[key])
+        }
+    },
+    // 获取一行数据
+    getColumnValue (data, code, key) {
+        const tableData = data[code]
+        if (Utils.isEmpty(tableData)) {
+            return ''
+        }
+        const v = tableData.map((d) => {
+            return this.getRealValue(d[key])
+        })
+        return JSON.stringify(v)
+    },
+    // TODO: 需要传递类型,判断类型不同进行进行计算,默认是字符串
+    // 暂时处理把能转数字类型转数字
+    getRealValue (val) {
+        if (Utils.isEmpty(val)) return ''
+        if (Utils.isNum(val)) {
+            return Number(val)
+        } else {
+            return val
+        }
+    },
 
-  getEvalFormula: function() {
-    if (Utils.isEmpty(this.EVAL_FORMULA)) {
-      // 做缓存避免运算
-      const b = []
-      Object.keys(FormulaUtil).forEach(n => {
-        b.push('var ' + n + '=FormulaUtil.' + n)
-      })
+    getEvalFormula: function () {
+        if (Utils.isEmpty(this.EVAL_FORMULA)) {
+            // 做缓存避免运算
+            const b = []
+            Object.keys(FormulaUtil).forEach(n => {
+                b.push('var ' + n + '=FormulaUtil.' + n)
+            })
 
-      this.EVAL_FORMULA = b.join(';') + ';'
-    }
-    return this.EVAL_FORMULA
-  },
-  evalFormula: function(a) {
-    let c = null
-    let env = null
-    try {
-      env = this.getEvalFormula()
-      c = new Function(env + 'return ' + a + ';')()
-    } catch (e) {
-      console.error(e)
-      c = null
-    }
-    return c
-  },
-  /**
-   * 表单提交校验
-   * @param {*} formula 计算的公式
-   * @param {*} data 数据
-   * @param {*} mainCode  主表code
-   */
-  runFormSubmitVerify(formula, data, mainCode) {
-    // eslint-disable-next-line no-useless-escape
-    const d = formula.split(/(\$[0-9a-zA-Z\._]+#[0-9A-Fa-f]*)/g)
-    const e = []
-    let v = true
+            this.EVAL_FORMULA = b.join(';') + ';'
+        }
+        return this.EVAL_FORMULA
+    },
+    evalFormula: function (a) {
+        let c = null
+        let env = null
+        try {
+            env = this.getEvalFormula()
+            c = new Function(env + 'return ' + a + ';')()
+        } catch (e) {
+            console.error(e)
+            c = null
+        }
+        return c
+    },
+    /**
+     * 表单提交校验
+     * @param {*} formula 计算的公式
+     * @param {*} data 数据
+     * @param {*} mainCode  主表code
+     */
+    runFormSubmitVerify (formula, data, mainCode) {
+        // eslint-disable-next-line no-useless-escape
+        const d = formula.split(/(\$[0-9a-zA-Z\._]+#[0-9A-Fa-f]*)/g)
+        const e = []
+        let v = true
 
-    d.forEach(n => {
-      if (/^\$(_widget_)/.test(n)) {
-        const f = n.replace('$_widget_', '').split('#')
-        const g = f[0]
-        const h = f[1]
-        if (Utils.isEmpty(h)) {
-          // 获取公式的值 数字
-          const t = g.split(this.TABLE_SEPARATOR)
-          let val = '""'
-          const calCode = t[0] // 当前计算的code
-          const key = t[1]
-          const isMainTable = calCode === mainCode// 是否主表
-          if (isMainTable) { // 主表
-            val = this.getValueByKey(data, key)
-          } else { // 子表  是主表,则取一列的值
-            val = this.getColumnValue(data, calCode, key)
-          }
-          e.push(val)
-        } else {
-          e.push('"' + n + '"')
-        }
-      } else {
-        e.push(n)
-      }
-    })
-    try {
-      v = this.evalFormula(e.join(''))
-    } catch (e) {
-      console.warn(e)
-      v = true
-    }
+        d.forEach(n => {
+            if (/^\$(_widget_)/.test(n)) {
+                const f = n.replace('$_widget_', '').split('#')
+                const g = f[0]
+                const h = f[1]
+                if (Utils.isEmpty(h)) {
+                    // 获取公式的值 数字
+                    const t = g.split(this.TABLE_SEPARATOR)
+                    let val = '""'
+                    const calCode = t[0] // 当前计算的code
+                    const key = t[1]
+                    const isMainTable = calCode === mainCode// 是否主表
+                    if (isMainTable) { // 主表
+                        val = this.getValueByKey(data, key)
+                    } else { // 子表  是主表,则取一列的值
+                        val = this.getColumnValue(data, calCode, key)
+                    }
+                    e.push(val)
+                } else {
+                    e.push('"' + n + '"')
+                }
+            } else {
+                e.push(n)
+            }
+        })
+        try {
+            v = this.evalFormula(e.join(''))
+        } catch (e) {
+            console.warn(e)
+            v = true
+        }
 
-    return v
-  },
-  getSelectorValue(store, val) {
-    if (Utils.isEmpty(val)) return ''
-    if (store === 'json') {
-      return JSON.stringify(val)
-    } else if (store === 'id') {
-      return val.map((d) => { return d.id }).join(',')
-    } else if (store === 'bind') {
-      return val.map((d) => { return d.name }).join(',')
-    }
-  },
-  getCurrentDataValue({ selectorType, bindId, fieldName, storeType }) {
-    const userInfo = store.getters.userInfo
-    // 缓存用户
-    if (userInfo.employee && userInfo.employee.id) {
-      const selectors = [{
-        'id': userInfo.employee.id,
-        'name': userInfo.employee.name
-      }]
-      this.CACHE_CURRENT_USER_DATA['user'] = selectors
-    }
+        return v
+    },
+    getSelectorValue (store, val) {
+        if (Utils.isEmpty(val)) return ''
+        if (store === 'json') {
+            return JSON.stringify(val)
+        } else if (store === 'id') {
+            return val.map((d) => { return d.id }).join(',')
+        } else if (store === 'bind') {
+            return val.map((d) => { return d.name }).join(',')
+        }
+    },
+    getCurrentDataValue ({ selectorType, bindId, fieldName, storeType }) {
+        const userInfo = store.getters.userInfo
+        // 缓存用户
+        if (userInfo.employee && userInfo.employee.id) {
+            const selectors = [{
+                'id': userInfo.employee.id,
+                'name': userInfo.employee.name
+            }]
+            this.CACHE_CURRENT_USER_DATA['user'] = selectors
+        }
 
-    // 当前组织
-    if (userInfo.org && userInfo.org.id) {
-      const selectors = [{
-        'id': userInfo.org.id,
-        'name': userInfo.org.name
-      }]
-      this.CACHE_CURRENT_USER_DATA['org'] = selectors
-    }
-    // 岗位
-    if (Utils.isNotEmpty(userInfo.positions)) {
-      const selectors = []
-      userInfo.positions.forEach((item) => {
-        if (Utils.isNotEmpty(item) && Utils.isNotEmpty(item.id)) {
-          selectors.push({
-            'id': item.id,
-            'name': item.name
-          })
-        }
-      })
-      this.CACHE_CURRENT_USER_DATA['position'] = selectors
-    }
-    // 角色
-    if (Utils.isNotEmpty(userInfo.role)) {
-      const selectors = []
-      userInfo.role.forEach((item) => {
-        if (Utils.isNotEmpty(item) && Utils.isNotEmpty(item.id)) {
-          selectors.push({
-            'id': item.id,
-            'name': item.name
-          })
-        }
-      })
-      this.CACHE_CURRENT_USER_DATA['role'] = selectors
-    }
-    // 回调数据
-    return this.getSelectorValue(storeType, this.CACHE_CURRENT_USER_DATA[selectorType])
-  },
-  /**
-   * 绑定值回调
-   * @param {*} store
-   * @param {*} bindId
-   * @param {*} value
-   * @param {*} callback
-   */
-  bindIdCallback(store, bindId, value, callback) {
-    if (store === 'bind') {
-      callback(bindId, this.getSelectorValue('id', value))
-    }
-  },
-  /**
-   * 获取子表字段默认值
-   */
-  async getTableDefaultData(field) {
-    const columns = field.field_options.columns
-    const tableDefaultValue = {}
-    if (columns && columns.length > 0) {
-      const subColumns = FormFieldUtil.getColumns(columns)
-      for (let i = 0; i < subColumns.length; i++) {
-        const column = subColumns[i]
-        const defaultValue = await FormUtil.getFieldDefaultValue(column)
-        tableDefaultValue[column.name] = defaultValue
-      }
-    }
-    return tableDefaultValue
-  },
-  /**
-   * 获取子表空数据
-   * @param {*} field
-   */
-  getTableDefaultColumnData(field) {
-    const columns = field.field_options.columns
-    const defaultValue = {}
-    if (columns && columns.length > 0) {
-      const subColumns = FormFieldUtil.getColumns(columns)
-      for (let i = 0; i < subColumns.length; i++) {
-        const column = subColumns[i]
-        defaultValue[column.name] = ''
-      }
-    }
-    return defaultValue
-  },
-  /**
-   * 获取字段默认值
-   */
-  async getFieldDefaultValue(field) {
-    const fieldName = field.name
-    const fieldOptions = field.field_options
-    const fieldType = field.field_type
-    const defaultValueType = fieldOptions.default_value_type || 'fixed'
-    const defaultValue = fieldOptions.default_value
-    let result = ''
-    // ================= 固定值   =================
-    if (defaultValueType === 'fixed') {
-      if (fieldType === 'radio' || fieldType === 'checkbox' || fieldType === 'select') { // 单选,复选,下拉
-        const checkedValue = []
-        if (Utils.isNotEmpty(fieldOptions.options)) {
-          fieldOptions.options.forEach(option => {
-            if (option['checked']) {
-              checkedValue.push(option['val'])
+        // 当前组织
+        if (userInfo.org && userInfo.org.id) {
+            const selectors = [{
+                'id': userInfo.org.id,
+                'name': userInfo.org.name
+            }]
+            this.CACHE_CURRENT_USER_DATA['org'] = selectors
+        }
+        // 岗位
+        if (Utils.isNotEmpty(userInfo.positions)) {
+            const selectors = []
+            userInfo.positions.forEach((item) => {
+                if (Utils.isNotEmpty(item) && Utils.isNotEmpty(item.id)) {
+                    selectors.push({
+                        'id': item.id,
+                        'name': item.name
+                    })
+                }
+            })
+            this.CACHE_CURRENT_USER_DATA['position'] = selectors
+        }
+        // 角色
+        if (Utils.isNotEmpty(userInfo.role)) {
+            const selectors = []
+            userInfo.role.forEach((item) => {
+                if (Utils.isNotEmpty(item) && Utils.isNotEmpty(item.id)) {
+                    selectors.push({
+                        'id': item.id,
+                        'name': item.name
+                    })
+                }
+            })
+            this.CACHE_CURRENT_USER_DATA['role'] = selectors
+        }
+        // 回调数据
+        return this.getSelectorValue(storeType, this.CACHE_CURRENT_USER_DATA[selectorType])
+    },
+    /**
+     * 绑定值回调
+     * @param {*} store
+     * @param {*} bindId
+     * @param {*} value
+     * @param {*} callback
+     */
+    bindIdCallback (store, bindId, value, callback) {
+        if (store === 'bind') {
+            callback(bindId, this.getSelectorValue('id', value))
+        }
+    },
+    /**
+     * 获取子表字段默认值
+     */
+    async getTableDefaultData (field) {
+        const columns = field.field_options.columns
+        const tableDefaultValue = {}
+        if (columns && columns.length > 0) {
+            const subColumns = FormFieldUtil.getColumns(columns)
+            for (let i = 0; i < subColumns.length; i++) {
+                const column = subColumns[i]
+                const defaultValue = await FormUtil.getFieldDefaultValue(column)
+                tableDefaultValue[column.name] = defaultValue
             }
-          })
-        }
-        result = checkedValue.join(',')
-      } else if (fieldType === 'currentDate' || fieldType === 'currentTime') { // 当前时间,当前日期
-        result = this.getFieldDatefmtValue(fieldOptions)
-      } else if (fieldType === 'autoNumber') { // 自动编号
-        if (Utils.toBoolean(fieldOptions.init, false)) {
-          await getNextIdByAlias({
-            alias: fieldOptions.identity
-          }).then(response => {
-            result = response.data
-          }).catch(() => {})
-        }
-      } else if (fieldType === 'currentUser' || fieldType === 'currentOrg') { // 当前用户、组织
-        result = this.getCurrentDataValue({
-          selectorType: fieldType === 'currentUser' ? 'user' : 'org',
-          bindId: fieldOptions.bind_id,
-          name: fieldName,
-          storeType: fieldOptions.store
-        })
-      } else if (fieldType === 'address') { // 地址 固定值
-        result = defaultValue ? this.getAddressValue(defaultValue, '', fieldOptions) : ''
-      } else { // 默认值
-        result = defaultValue || ''
-      }
-      // ================= 预设值   =================
-    } else if (defaultValueType === 'present') {
-      if (fieldType === 'selector' || fieldType === 'currentUser' || fieldType === 'currentOrg') { // 当前用户、组织
-        result = this.getCurrentDataValue({
-          selectorType: fieldOptions.selector_type || 'user',
-          bindId: fieldOptions.bind_id,
-          storeType: fieldOptions.store,
-          fieldName: fieldName
-        })
-      }
-      // ================= 动态值   =================
-    } else if (defaultValueType === 'dynamic') {
-      if (Utils.isEmpty(defaultValue)) {
-        return
-      }
-      // 缓存之前的值
-      await this.getDynamicValue(defaultValue).then(data => {
-        result = data
-      })
-    // =================  当前时间   =================
-    } else if (defaultValueType === 'today') { // 当前时间
-      result = this.getFieldDatefmtValue(fieldOptions)
-    }
+        }
+        return tableDefaultValue
+    },
+    /**
+     * 获取子表空数据
+     * @param {*} field
+     */
+    getTableDefaultColumnData (field) {
+        const columns = field.field_options.columns
+        const defaultValue = {}
+        if (columns && columns.length > 0) {
+            const subColumns = FormFieldUtil.getColumns(columns)
+            for (let i = 0; i < subColumns.length; i++) {
+                const column = subColumns[i]
+                defaultValue[column.name] = ''
+            }
+        }
+        return defaultValue
+    },
+    /**
+     * 获取字段默认值
+     */
+    async getFieldDefaultValue (field) {
+        const fieldName = field.name
+        const fieldOptions = field.field_options
+        const fieldType = field.field_type
+        const defaultValueType = fieldOptions.default_value_type || 'fixed'
+        const defaultValue = fieldOptions.default_value
+        let result = ''
+        // ================= 固定值   =================
+        if (defaultValueType === 'fixed') {
+            if (fieldType === 'radio' || fieldType === 'checkbox' || fieldType === 'select') { // 单选,复选,下拉
+                const checkedValue = []
+                if (Utils.isNotEmpty(fieldOptions.options)) {
+                    fieldOptions.options.forEach(option => {
+                        if (option['checked']) {
+                            checkedValue.push(option['val'])
+                        }
+                    })
+                }
+                result = checkedValue.join(',')
+            } else if (fieldType === 'currentDate' || fieldType === 'currentTime') { // 当前时间,当前日期
+                result = this.getFieldDatefmtValue(fieldOptions)
+            } else if (fieldType === 'autoNumber') { // 自动编号
+                if (Utils.toBoolean(fieldOptions.init, false)) {
+                    await getNextIdByAlias({
+                        alias: fieldOptions.identity
+                    }).then(response => {
+                        result = response.data
+                    }).catch(() => { })
+                }
+            } else if (fieldType === 'currentUser' || fieldType === 'currentOrg') { // 当前用户、组织
+                result = this.getCurrentDataValue({
+                    selectorType: fieldType === 'currentUser' ? 'user' : 'org',
+                    bindId: fieldOptions.bind_id,
+                    name: fieldName,
+                    storeType: fieldOptions.store
+                })
+            } else if (fieldType === 'address') { // 地址 固定值
+                result = defaultValue ? this.getAddressValue(defaultValue, '', fieldOptions) : ''
+            } else { // 默认值
+                result = defaultValue || ''
+            }
+            // ================= 预设值   =================
+        } else if (defaultValueType === 'present') {
+            if (fieldType === 'selector' || fieldType === 'currentUser' || fieldType === 'currentOrg') { // 当前用户、组织
+                result = this.getCurrentDataValue({
+                    selectorType: fieldOptions.selector_type || 'user',
+                    bindId: fieldOptions.bind_id,
+                    storeType: fieldOptions.store,
+                    fieldName: fieldName
+                })
+            }
+            // ================= 动态值   =================
+        } else if (defaultValueType === 'dynamic') {
+            if (Utils.isEmpty(defaultValue)) {
+                return
+            }
+            // 缓存之前的值
+            await this.getDynamicValue(defaultValue).then(data => {
+                result = data
+            })
+            // =================  当前时间   =================
+        } else if (defaultValueType === 'today') { // 当前时间
+            result = this.getFieldDatefmtValue(fieldOptions)
+        }
 
-    return result
-  },
-  /**
-   * 获取当前格式化日期
-   * @param {*} fieldOptions
-   */
-  getFieldDatefmtValue(fieldOptions) {
-    let datefmt = FormOptions.t.DATE_FORMATS['datetime']
-    if (fieldOptions['datefmt_type'] && fieldOptions['datefmt_type'] !== 'custom') {
-      datefmt = FormOptions.t.DATE_FORMATS[fieldOptions['datefmt_type']] || FormOptions.t.DATE_FORMATS['date']
-    } else {
-      datefmt = fieldOptions['datefmt'] || FormOptions.t.DATE_FORMATS['date']
-    }
-    return fecha.format(new Date(), datefmt)
-  },
-  // 地址顶部的值
-  getAddressTopVal(fieldOptions) {
-    const top = fieldOptions.top || 'country'
-    const topval = fieldOptions.topval
-    if (Utils.isEmpty(topval)) {
-      if (top === 'country') { return '0' }
-      return '' // 异常配置
-    }
-    if (top === 'country') {
-      return '0'
-    } else if (top === 'province' || top === 'city' || top === 'district') {
-      return topval[topval.length - 1]
-    }
-    return ''
-  },
-  // 地址的值
-  getAddressValue(value, model, fieldOptions) {
-    const topIndex = AddressUtls.getLevelIndex(fieldOptions.top || 'country')
-    const levelIndex = AddressUtls.getLevelIndex(fieldOptions.level || 'district')
-    let data = {
-      street: fieldOptions.street || ''
-    }
-    if (Utils.isNotEmpty(model)) {
-      data = Utils.parseJSON(model)
-    }
-    let v = 0
-    for (let i = topIndex; i < levelIndex + 1; i++) {
-      const key = AddressUtls.levelArr[i]
-      data[key] = value[v] || ''
-      v++
-    }
+        return result
+    },
+    /**
+     * 获取当前格式化日期
+     * @param {*} fieldOptions
+     */
+    getFieldDatefmtValue (fieldOptions) {
+        let datefmt = FormOptions.t.DATE_FORMATS['datetime']
+        if (fieldOptions['datefmt_type'] && fieldOptions['datefmt_type'] !== 'custom') {
+            datefmt = FormOptions.t.DATE_FORMATS[fieldOptions['datefmt_type']] || FormOptions.t.DATE_FORMATS['date']
+        } else {
+            datefmt = fieldOptions['datefmt'] || FormOptions.t.DATE_FORMATS['date']
+        }
+        return fecha.format(new Date(), datefmt)
+    },
+    // 地址顶部的值
+    getAddressTopVal (fieldOptions) {
+        const top = fieldOptions.top || 'country'
+        const topval = fieldOptions.topval
+        if (Utils.isEmpty(topval)) {
+            if (top === 'country') { return '0' }
+            return '' // 异常配置
+        }
+        if (top === 'country') {
+            return '0'
+        } else if (top === 'province' || top === 'city' || top === 'district') {
+            return topval[topval.length - 1]
+        }
+        return ''
+    },
+    // 地址的值
+    getAddressValue (value, model, fieldOptions) {
+        const topIndex = AddressUtls.getLevelIndex(fieldOptions.top || 'country')
+        const levelIndex = AddressUtls.getLevelIndex(fieldOptions.level || 'district')
+        let data = {
+            street: fieldOptions.street || ''
+        }
+        if (Utils.isNotEmpty(model)) {
+            data = Utils.parseJSON(model)
+        }
+        let v = 0
+        for (let i = topIndex; i < levelIndex + 1; i++) {
+            const key = AddressUtls.levelArr[i]
+            data[key] = value[v] || ''
+            v++
+        }
 
-    return JSON.stringify(data)
-  },
-  // 控件地址值
-  getAddressControlValue(model, fieldOptions) {
-    if (Utils.isEmpty(model)) {
-      return []
-    }
-    const data = Utils.parseJSON(model)
-    const topIndex = AddressUtls.getLevelIndex(fieldOptions.top || 'country')
-    const levelIndex = AddressUtls.getLevelIndex(fieldOptions.level || 'district')
-    const val = []
-    for (let i = topIndex; i < levelIndex + 1; i++) {
-      const key = AddressUtls.levelArr[i]
-      if (data[key]) {
-        val.push(data[key])
-      }
-    }
-    return val
-  },
-  // 获得动态值
-  getDynamicValue(value, vars) {
-    return new Promise((resolve, reject) => {
-      const params = {
-        script: value,
-        vars: vars || ''
-      }
-      remoteRequest('getScriptValue', params, () => {
-        return new Promise((rev, rej) => {
-          getScriptValue(params).then(response => {
-            rev(response)
-          }).catch(error => {
-            rej(error)
-          })
+        return JSON.stringify(data)
+    },
+    // 控件地址值
+    getAddressControlValue (model, fieldOptions) {
+        if (Utils.isEmpty(model)) {
+            return []
+        }
+        const data = Utils.parseJSON(model)
+        const topIndex = AddressUtls.getLevelIndex(fieldOptions.top || 'country')
+        const levelIndex = AddressUtls.getLevelIndex(fieldOptions.level || 'district')
+        const val = []
+        for (let i = topIndex; i < levelIndex + 1; i++) {
+            const key = AddressUtls.levelArr[i]
+            if (data[key]) {
+                val.push(data[key])
+            }
+        }
+        return val
+    },
+    // 获得动态值
+    getDynamicValue (value, vars) {
+        return new Promise((resolve, reject) => {
+            const params = {
+                script: value,
+                vars: vars || ''
+            }
+            remoteRequest('getScriptValue', params, () => {
+                return new Promise((rev, rej) => {
+                    getScriptValue(params).then(response => {
+                        rev(response)
+                    }).catch(error => {
+                        rej(error)
+                    })
+                })
+            }, true).then(response => {
+                const data = response.data
+                this.CACHE_DYNAMIC_VALUE[value] = data
+                resolve(data)
+            }).catch(() => {
+            })
         })
-      }, true).then(response => {
-        const data = response.data
-        this.CACHE_DYNAMIC_VALUE[value] = data
-        resolve(data)
-      }).catch(() => {
-      })
-    })
-  },
-  setResponseLinkages: function(responseLinkages, model, code) {
-    if (model.field_type === 'table') { //  判断是否是主表,子表他自己处理
-      model.field_options.columns.forEach((item) => {
-        this.setChangeLinkagesData(responseLinkages, item, model.name)
-      })
-    } else { // 主表
-      this.setChangeLinkagesData(responseLinkages, model, code)
-    }
-  },
-  setChangeLinkagesData: function(responseLinkages, model, code) {
-    const fieldOptions = model.field_options
-    if (Utils.isEmpty(fieldOptions)) {
-      return
-    }
-    const type = fieldOptions.default_value_type
-    const linkage = fieldOptions.default_value
-    if (type !== 'linkage' || Utils.isEmpty(linkage)) { return }
-    const changename = code + this.TABLE_SEPARATOR + model.name
-    const changFormula = {
-      changename: changename,
-      linkage: linkage
-    }
-    const key = code + this.TABLE_SEPARATOR + linkage.field
-    if (!responseLinkages[key]) { responseLinkages[key] = [] }
-    responseLinkages[key].push(changFormula)
-  },
-  // TODO:数据联动
-  // 1、主表数据联动 (完成)
-  // 2、子表的数据联动
-  // 3、不同控件间的数据联动
-  // 4、支持不同控件进行联动
-  // 5、实现多级联动
-  runLinkage: function(self, responseLinkages, field, row) {
-    if (!responseLinkages) { return }
-    const curCode = field.code
-    const key = field.name
-    for (let i = 0; i < responseLinkages.length; i++) {
-      const responseLinkage = responseLinkages[i]
-      const linkage = responseLinkage.linkage
-      const changename = responseLinkage.changename// 修改字段
-      const changeObj = changename ? changename.split(this.TABLE_SEPARATOR) : []// 改变的对象
+    },
+    setResponseLinkages: function (responseLinkages, model, code) {
+        if (model.field_type === 'table') { //  判断是否是主表,子表他自己处理
+            model.field_options.columns.forEach((item) => {
+                this.setChangeLinkagesData(responseLinkages, item, model.name)
+            })
+        } else { // 主表
+            this.setChangeLinkagesData(responseLinkages, model, code)
+        }
+    },
+    setChangeLinkagesData: function (responseLinkages, model, code) {
+        const fieldOptions = model.field_options
+        if (Utils.isEmpty(fieldOptions)) {
+            return
+        }
+        const type = fieldOptions.default_value_type
+        const linkage = fieldOptions.default_value
+        if (type !== 'linkage' || Utils.isEmpty(linkage)) { return }
+        const changename = code + this.TABLE_SEPARATOR + model.name
+        const changFormula = {
+            changename: changename,
+            linkage: linkage
+        }
+        const key = code + this.TABLE_SEPARATOR + linkage.field
+        if (!responseLinkages[key]) { responseLinkages[key] = [] }
+        responseLinkages[key].push(changFormula)
+    },
+    // TODO:数据联动
+    // 1、主表数据联动 (完成)
+    // 2、子表的数据联动
+    // 3、不同控件间的数据联动
+    // 4、支持不同控件进行联动
+    // 5、实现多级联动
+    runLinkage: function (self, responseLinkages, field, row) {
+        if (!responseLinkages) { return }
+        const curCode = field.code
+        const key = field.name
+        for (let i = 0; i < responseLinkages.length; i++) {
+            const responseLinkage = responseLinkages[i]
+            const linkage = responseLinkage.linkage
+            const changename = responseLinkage.changename// 修改字段
+            const changeObj = changename ? changename.split(this.TABLE_SEPARATOR) : []// 改变的对象
 
-      const formParams = {
-        key: linkage.dataSource,
-        [`Q^${linkage.relyData}^S`]: this.getFieldDataValue(Utils.isEmpty(row), changeObj[0] === curCode, self.models, key, curCode, row)
-      }
+            const formParams = {
+                key: linkage.dataSource,
+                [`Q^${linkage.relyData}^S`]: this.getFieldDataValue(Utils.isEmpty(row), changeObj[0] === curCode, self.models, key, curCode, row)
+            }
 
-      // 加载数据
-      queryLinkageData(ActionUtils.formatParams(formParams)).then(response => {
-        const dataResult = response.data
-        if (Utils.isNotEmpty(dataResult)) {
-          const resultVal = dataResult[linkage.dataField]
-          self.models[changeObj[1]] = resultVal
-        }
-      }).catch((e) => {
-        console.error(e)
-      })
-    }
-  },
-  getFieldDataValue: function(isMainTable, isSameTable, data, key, code, row) {
-    let val = ''
-    if (isMainTable) { // 主表
-      val = data[key]
-    } else { // 子表
-      if (isSameTable) { // 相同的表
-        val = data[code][row][key]
-      } else { // 如果改变的是主表,则取一列的值
-        const tableData = data[code]
-        if (Utils.isEmpty(tableData)) {
-          return ''
+            // 加载数据
+            queryLinkageData(ActionUtils.formatParams(formParams)).then(response => {
+                const dataResult = response.data
+                if (Utils.isNotEmpty(dataResult)) {
+                    const resultVal = dataResult[linkage.dataField]
+                    self.models[changeObj[1]] = resultVal
+                }
+            }).catch((e) => {
+                console.error(e)
+            })
+        }
+    },
+    getFieldDataValue: function (isMainTable, isSameTable, data, key, code, row) {
+        let val = ''
+        if (isMainTable) { // 主表
+            val = data[key]
+        } else { // 子表
+            if (isSameTable) { // 相同的表
+                val = data[code][row][key]
+            } else { // 如果改变的是主表,则取一列的值
+                const tableData = data[code]
+                if (Utils.isEmpty(tableData)) {
+                    return ''
+                }
+                const v = tableData.map((d) => {
+                    return d[key]
+                })
+                val = JSON.stringify(v) + ''
+            }
         }
-        const v = tableData.map((d) => {
-          return d[key]
-        })
-        val = JSON.stringify(v) + ''
-      }
-    }
 
-    return val
-  },
-  /**
-   * 默认权限
-   */
-  getDefaultRigths(field) {
-    if (Utils.isEmpty(field) || Utils.isEmpty(field.field_options)) {
-      return
-    }
-    const hideRights = field.field_options.hide_rights
-    if (Utils.isNotEmpty(hideRights) && hideRights) {
-      return FormOptions.t.PERMISSIONS.HIDE
-    }
-    const readRights = field.field_options.read_rights
-    if (Utils.isNotEmpty(readRights) && readRights) {
-      return FormOptions.t.PERMISSIONS.READ
-    }
-  },
-  /**
-   *  表单意见权限
-   * @param {*} field
-   * @param {*} params
-   */
-  getDefaultApprovalOpinionRigths(field, params) {
-    if (!params) {
-      return
-    }
-    if (Utils.isNotEmpty(params.defId)) {
-      return FormOptions.t.PERMISSIONS.HIDE
-    }
-    if (this.readApprovalOpinionRigths(field, params)) {
-      return FormOptions.t.PERMISSIONS.READ
-    }
-  },
-  /**
-   * 表单意见读权限
-   * @param {*} field
-   * @param {*} params
-   */
-  readApprovalOpinionRigths(field, params) {
-    if (!params) {
-      return false
-    }
-    if (Utils.isNotEmpty(params.nodeId)) {
-      const formOpinionConfig = params.formOpinionData.formOpinionConfig
-      if (!formOpinionConfig) { return false }
-      const bindNode = formOpinionConfig[field.name] || []
-      return (Utils.isNotEmpty(bindNode) && !(bindNode.includes('') || bindNode.includes(params.nodeId)))
-    } else {
-      return false
-    }
-  },
+        return val
+    },
+    /**
+     * 默认权限
+     */
+    getDefaultRigths (field) {
+        if (Utils.isEmpty(field) || Utils.isEmpty(field.field_options)) {
+            return
+        }
+        const hideRights = field.field_options.hide_rights
+        if (Utils.isNotEmpty(hideRights) && hideRights) {
+            return FormOptions.t.PERMISSIONS.HIDE
+        }
+        const readRights = field.field_options.read_rights
+        if (Utils.isNotEmpty(readRights) && readRights) {
+            return FormOptions.t.PERMISSIONS.READ
+        }
+    },
+    /**
+     *  表单意见权限
+     * @param {*} field
+     * @param {*} params
+     */
+    getDefaultApprovalOpinionRigths (field, params) {
+        if (!params) {
+            return
+        }
+        if (Utils.isNotEmpty(params.defId)) {
+            return FormOptions.t.PERMISSIONS.HIDE
+        }
+        if (this.readApprovalOpinionRigths(field, params)) {
+            return FormOptions.t.PERMISSIONS.READ
+        }
+    },
+    /**
+     * 表单意见读权限
+     * @param {*} field
+     * @param {*} params
+     */
+    readApprovalOpinionRigths (field, params) {
+        if (!params) {
+            return false
+        }
+        if (Utils.isNotEmpty(params.nodeId)) {
+            const formOpinionConfig = params.formOpinionData.formOpinionConfig
+            if (!formOpinionConfig) { return false }
+            const bindNode = formOpinionConfig[field.name] || []
+            return (Utils.isNotEmpty(bindNode) && !(bindNode.includes('') || bindNode.includes(params.nodeId)))
+        } else {
+            return false
+        }
+    },
 
-  /**
-   * 构建表单验证规则
-   * @param {*} field
-   * @param {*} required
-   */
-  buildFormRules(field, required, models) {
-    const rules = []
-    const fieldOptions = field.field_options || {}
-    // 必填验证
-    if (required) {
-      rules.push({ required: true, message: I18n.t('validate.required') })
-      rules.push({ validator: validateRequired, message: I18n.t('validate.required') })
-    }
-    // 整型验证
-    if (fieldOptions.integer) {
-      rules.push({ validator: validateInteger, message: I18n.t('validate.integer') })
-    }
-    // 小数验证
-    if (fieldOptions.decimal) {
-      rules.push({
-        validator: validateDecimal,
-        decimal: fieldOptions.decimal
-      })
-    }
+    /**
+     * 构建表单验证规则
+     * @param {*} field
+     * @param {*} required
+     */
+    buildFormRules (field, required, models) {
+        const rules = []
+        const fieldOptions = field.field_options || {}
+        // 必填验证
+        if (required) {
+            rules.push({ required: true, message: I18n.t('validate.required') })
+            rules.push({ validator: validateRequired, message: I18n.t('validate.required') })
+        }
+        // 整型验证
+        if (fieldOptions.integer) {
+            rules.push({ validator: validateInteger, message: I18n.t('validate.integer') })
+        }
+        // 小数验证
+        if (fieldOptions.decimal) {
+            rules.push({
+                validator: validateDecimal,
+                decimal: fieldOptions.decimal
+            })
+        }
 
-    //  最大、最小字符串长度验证
-    if ((fieldOptions['is_min_length'] && Utils.isNotEmpty(fieldOptions['min_length'])) ||
-     (fieldOptions['is_max_length'] && Utils.isNotEmpty(fieldOptions['max_length']))) {
-      rules.push({
-        validator: validateLengthRange,
-        format: field.field_type === 'editor' ? (v) => {
-          let content = v.replace(/<\/?[^>]*>/g, '') // 去除HTML Tag
-          content = content.replace(/[|]*\n/, '') // 去除行尾空格
-          content = content.replace(/&npsp;/ig, '') // 去掉npsp
-          return content
-        } : false,
-        min: fieldOptions['is_min_length'] ? fieldOptions['min_length'] : null,
-        max: fieldOptions['is_max_length'] ? fieldOptions['max_length'] : null
-      })
-    }
+        //  最大、最小字符串长度验证
+        if ((fieldOptions['is_min_length'] && Utils.isNotEmpty(fieldOptions['min_length'])) ||
+            (fieldOptions['is_max_length'] && Utils.isNotEmpty(fieldOptions['max_length']))) {
+            rules.push({
+                validator: validateLengthRange,
+                format: field.field_type === 'editor' ? (v) => {
+                    let content = v.replace(/<\/?[^>]*>/g, '') // 去除HTML Tag
+                    content = content.replace(/[|]*\n/, '') // 去除行尾空格
+                    content = content.replace(/&npsp;/ig, '') // 去掉npsp
+                    return content
+                } : false,
+                min: fieldOptions['is_min_length'] ? fieldOptions['min_length'] : null,
+                max: fieldOptions['is_max_length'] ? fieldOptions['max_length'] : null
+            })
+        }
 
-    //  最大、最小值验证[数字]
-    if ((fieldOptions['is_min'] && Utils.isNotEmpty(fieldOptions['min'])) ||
-         (fieldOptions['is_max'] && Utils.isNotEmpty(fieldOptions['max']))) {
-      rules.push({
-        validator: validateNumberRange,
-        min: fieldOptions['is_min'] ? fieldOptions['min'] : null,
-        max: fieldOptions['is_max'] ? fieldOptions['max'] : null
-      })
-    }
+        //  最大、最小值验证[数字]
+        if ((fieldOptions['is_min'] && Utils.isNotEmpty(fieldOptions['min'])) ||
+            (fieldOptions['is_max'] && Utils.isNotEmpty(fieldOptions['max']))) {
+            rules.push({
+                validator: validateNumberRange,
+                min: fieldOptions['is_min'] ? fieldOptions['min'] : null,
+                max: fieldOptions['is_max'] ? fieldOptions['max'] : null
+            })
+        }
 
-    // 日期验证 date_format 不需要
+        // 日期验证 date_format 不需要
 
-    // 日期范围验证-开始、结束时间 date_between
-    if (Utils.isNotEmpty(fieldOptions['start_date_type']) ||
-       Utils.isNotEmpty(fieldOptions['end_date_type'])) {
-      rules.push({
-        validator: validateDateBetween,
-        fieldOptions: fieldOptions,
-        models: models
-      })
-    }
+        // 日期范围验证-开始、结束时间 date_between
+        if (Utils.isNotEmpty(fieldOptions['start_date_type']) ||
+            Utils.isNotEmpty(fieldOptions['end_date_type'])) {
+            rules.push({
+                validator: validateDateBetween,
+                fieldOptions: fieldOptions,
+                models: models
+            })
+        }
 
-    //  最多、最少选项验证
-    if ((fieldOptions['is_min_mum'] && Utils.isNotEmpty(fieldOptions['min_mum'])) ||
-     (fieldOptions['is_max_mum'] && Utils.isNotEmpty(fieldOptions['max_mum']))) {
-      rules.push({
-        validator: validateOptions,
-        min: fieldOptions['is_min_mum'] ? fieldOptions['min_mum'] : null,
-        max: fieldOptions['is_max_mum'] ? fieldOptions['max_mum'] : null
-      })
-    }
-    // 正则表达式
-    if (fieldOptions['data_format']) {
-      let dataFormatValue = fieldOptions['data_format_value']
-      let dataFormatMsg = fieldOptions['data_format_msg']
-      if (fieldOptions['data_format'] !== 'custom') {
-        dataFormatValue = dataFormatMap[fieldOptions['data_format']].regexp
-        dataFormatMsg = I18n.t('validate.' + fieldOptions['data_format'])
-      }
-      rules.push({
-        pattern: dataFormatValue,
-        message: dataFormatMsg
-      })
-    }
-    return rules
-  },
-  /**
-   * 初始化表单意见
-   */
-  initFormOpinionData: function(attrs) {
-    if (Utils.isEmpty(attrs)) { return null }
-    const opinionList = attrs.opinionList // 表单意见列表
-    const formOpinionConfig = attrs.formOpinion // 表单意见配置
-    if (Utils.isEmpty(opinionList)) { return null }
-    const opinionData = {
-      hasBindNode: false, // 是否包含节点
-      opinionList: [], // 表单意见数据list
-      formOpinionNodeData: {}, // 表单意见节点的数据
-      formOpinionConfig: {} // 表单意见配置
-    }
-    const formOpinionList = [] // 过滤掉待审批的
-    for (let i = 0; i < opinionList.length; i++) {
-      const opinion = opinionList[i]
-      if (Utils.isEmpty(opinion.completeTime)) { continue }
-      formOpinionList.push(opinion)
-    }
+        //  最多、最少选项验证
+        if ((fieldOptions['is_min_mum'] && Utils.isNotEmpty(fieldOptions['min_mum'])) ||
+            (fieldOptions['is_max_mum'] && Utils.isNotEmpty(fieldOptions['max_mum']))) {
+            rules.push({
+                validator: validateOptions,
+                min: fieldOptions['is_min_mum'] ? fieldOptions['min_mum'] : null,
+                max: fieldOptions['is_max_mum'] ? fieldOptions['max_mum'] : null
+            })
+        }
+        // 正则表达式
+        if (fieldOptions['data_format']) {
+            let dataFormatValue = fieldOptions['data_format_value']
+            let dataFormatMsg = fieldOptions['data_format_msg']
+            if (fieldOptions['data_format'] !== 'custom') {
+                dataFormatValue = dataFormatMap[fieldOptions['data_format']].regexp
+                dataFormatMsg = I18n.t('validate.' + fieldOptions['data_format'])
+            }
+            rules.push({
+                pattern: dataFormatValue,
+                message: dataFormatMsg
+            })
+        }
+        return rules
+    },
+    /**
+     * 初始化表单意见
+     */
+    initFormOpinionData: function (attrs) {
+        if (Utils.isEmpty(attrs)) { return null }
+        const opinionList = attrs.opinionList // 表单意见列表
+        const formOpinionConfig = attrs.formOpinion // 表单意见配置
+        if (Utils.isEmpty(opinionList)) { return null }
+        const opinionData = {
+            hasBindNode: false, // 是否包含节点
+            opinionList: [], // 表单意见数据list
+            formOpinionNodeData: {}, // 表单意见节点的数据
+            formOpinionConfig: {} // 表单意见配置
+        }
+        const formOpinionList = [] // 过滤掉待审批的
+        for (let i = 0; i < opinionList.length; i++) {
+            const opinion = opinionList[i]
+            if (Utils.isEmpty(opinion.completeTime)) { continue }
+            formOpinionList.push(opinion)
+        }
+        // 筛选出已保存未提交的审批意见
+        const unComplateOpinion = opinionList.find(i => i.completeTime === null).opinion
+        opinionData.unComplateOpinion = unComplateOpinion
 
-    if (Utils.isEmpty(formOpinionConfig)) { // 没有绑定节点的
-      opinionData.hasBindNode = false
-      opinionData.opinionList = formOpinionList
-    } else {
-      const opinionMap = {}
-      for (let i = 0; i < formOpinionList.length; i++) {
-        const opinion = formOpinionList[i]
-        const nodeId = opinion.taskKey
-        const opinionMapList = opinionMap[nodeId]
-        if (Utils.isEmpty(opinionMapList)) {
-          opinionMap[nodeId] = []
-        }
-        opinionMap[nodeId].push(opinion)
-      }
-      const formOpinionNodeData = {}
-      for (const k in formOpinionConfig) {
-        const nodes = formOpinionConfig[k]
-        if (Utils.isEmpty(nodes) || nodes.includes('')) { // 全局节点
-          formOpinionNodeData[k] = formOpinionList
+        if (Utils.isEmpty(formOpinionConfig)) { // 没有绑定节点的
+            opinionData.hasBindNode = false
+            opinionData.opinionList = formOpinionList
         } else {
-          for (let i = 0; i < nodes.length; i++) {
-            const node = nodes[i]
-            const oList = opinionMap[node] || []
-            let list = formOpinionNodeData[k] || []
-            list = list.concat(oList)
-            formOpinionNodeData[k] = list
-          }
-        }
-      }
-      // 审批按时间排序
-      for (const key in formOpinionNodeData) {
-        let list = formOpinionNodeData[key]
-        list = list.sort((obj1, obj2) => {
-          const val1 = obj1.completeTime
-          const val2 = obj2.completeTime
-          return val1 < val2 ? -1 : val1 > val2 ? 1 : 0
-        })
-        formOpinionNodeData[key] = list
-      }
+            const opinionMap = {}
+            for (let i = 0; i < formOpinionList.length; i++) {
+                const opinion = formOpinionList[i]
+                const nodeId = opinion.taskKey
+                const opinionMapList = opinionMap[nodeId]
+                if (Utils.isEmpty(opinionMapList)) {
+                    opinionMap[nodeId] = []
+                }
+                opinionMap[nodeId].push(opinion)
+            }
+            const formOpinionNodeData = {}
+            for (const k in formOpinionConfig) {
+                const nodes = formOpinionConfig[k]
+                if (Utils.isEmpty(nodes) || nodes.includes('')) { // 全局节点
+                    formOpinionNodeData[k] = formOpinionList
+                } else {
+                    for (let i = 0; i < nodes.length; i++) {
+                        const node = nodes[i]
+                        const oList = opinionMap[node] || []
+                        let list = formOpinionNodeData[k] || []
+                        list = list.concat(oList)
+                        formOpinionNodeData[k] = list
+                    }
+                }
+            }
+            // 审批按时间排序
+            for (const key in formOpinionNodeData) {
+                let list = formOpinionNodeData[key]
+                list = list.sort((obj1, obj2) => {
+                    const val1 = obj1.completeTime
+                    const val2 = obj2.completeTime
+                    return val1 < val2 ? -1 : val1 > val2 ? 1 : 0
+                })
+                formOpinionNodeData[key] = list
+            }
 
-      opinionData.hasBindNode = true
-      opinionData.formOpinionNodeData = formOpinionNodeData
-      opinionData.formOpinionConfig = formOpinionConfig
-      opinionData.opinionList = formOpinionList
-    }
-    return opinionData
-  },
+            opinionData.hasBindNode = true
+            opinionData.formOpinionNodeData = formOpinionNodeData
+            opinionData.formOpinionConfig = formOpinionConfig
+            opinionData.opinionList = formOpinionList
+        }
+        return opinionData
+    },
 
-  hasLinkDynamicParams(fieldOptions) {
-    const conditions = fieldOptions['link_condition'] ? fieldOptions['link_condition'] : []
-    if (Utils.isNotEmpty(conditions)) { return true }
-    return false
-  },
-  getDynamicParamsConfing(fieldOptions) {
-    const conditions = fieldOptions['link_condition'] ? fieldOptions['link_condition'] : []
-    if (Utils.isEmpty(conditions)) { return {} }
-    const dynamicParams = {}
-    for (let i = 0; i < conditions.length; i++) {
-      const condition = conditions[i]
-      dynamicParams[condition.fieldName] = condition
-    }
-    return dynamicParams
-  },
-  /**
-   * 获取联动参数数据
-   * @param {*} fieldOptions
-   * @param {*} data
-   * @param {*} row
-   */
-  getLinkDynamicParams(fieldOptions, data = {}, code, row) {
-    const conditions = fieldOptions['link_condition'] ? fieldOptions['link_condition'] : []
-    if (Utils.isEmpty(conditions)) { return {} }
-    const dynamicParams = {}
-    for (let i = 0; i < conditions.length; i++) {
-      const condition = conditions[i]
-      let val = ''
-      const changeValueName = condition.value
-      if (Utils.isNotEmpty(changeValueName) && condition.mode === 'bind') { // 绑定表单
-        const changeObj = changeValueName.split('.')// 改变的对象
-        if (changeObj.length > 1) {
-          const changeName = changeObj[changeObj.length - 1]
-          if (Utils.isNotEmpty(row)) {
-            if (Array.isArray(data)) {
-              val = data[code] && data[code][row] ? data[code][row][changeName] : (data[changeName] || '')
-            } else {
-              val = (data[changeName] || '')
-            }
-          } else { // 弹窗模式
-            const changeCode = changeObj[changeObj.length - 2]
-            // 判断 相同表.避免出现重复表名取值问题
-            if (changeCode === code) {
-              val = data[changeName] || ''
+    hasLinkDynamicParams (fieldOptions) {
+        const conditions = fieldOptions['link_condition'] ? fieldOptions['link_condition'] : []
+        if (Utils.isNotEmpty(conditions)) { return true }
+        return false
+    },
+    getDynamicParamsConfing (fieldOptions) {
+        const conditions = fieldOptions['link_condition'] ? fieldOptions['link_condition'] : []
+        if (Utils.isEmpty(conditions)) { return {} }
+        const dynamicParams = {}
+        for (let i = 0; i < conditions.length; i++) {
+            const condition = conditions[i]
+            dynamicParams[condition.fieldName] = condition
+        }
+        return dynamicParams
+    },
+    /**
+     * 获取联动参数数据
+     * @param {*} fieldOptions
+     * @param {*} data
+     * @param {*} row
+     */
+    getLinkDynamicParams (fieldOptions, data = {}, code, row) {
+        const conditions = fieldOptions['link_condition'] ? fieldOptions['link_condition'] : []
+        if (Utils.isEmpty(conditions)) { return {} }
+        const dynamicParams = {}
+        for (let i = 0; i < conditions.length; i++) {
+            const condition = conditions[i]
+            let val = ''
+            const changeValueName = condition.value
+            if (Utils.isNotEmpty(changeValueName) && condition.mode === 'bind') { // 绑定表单
+                const changeObj = changeValueName.split('.')// 改变的对象
+                if (changeObj.length > 1) {
+                    const changeName = changeObj[changeObj.length - 1]
+                    if (Utils.isNotEmpty(row)) {
+                        if (Array.isArray(data)) {
+                            val = data[code] && data[code][row] ? data[code][row][changeName] : (data[changeName] || '')
+                        } else {
+                            val = (data[changeName] || '')
+                        }
+                    } else { // 弹窗模式
+                        const changeCode = changeObj[changeObj.length - 2]
+                        // 判断 相同表.避免出现重复表名取值问题
+                        if (changeCode === code) {
+                            val = data[changeName] || ''
+                        }
+                    }
+                } else {
+                    val = data[changeObj[0]]
+                }
+            } else { // 固定值
+                val = changeValueName
             }
-          }
-        } else {
-          val = data[changeObj[0]]
+            dynamicParams[condition.fieldName] = val || ''
         }
-      } else { // 固定值
-        val = changeValueName
-      }
-      dynamicParams[condition.fieldName] = val || ''
-    }
-    return dynamicParams
-  },
-  getSwitchOptions(fieldOptions, valueKey = 'val', labelKey = 'label') {
-    const options = []
-    const activeValue = fieldOptions.active_value
-    const activeText = Utils.isNotEmpty(fieldOptions.active_text) ? fieldOptions.active_text : activeValue
-    const inactiveValue = fieldOptions.inactive_value
-    const inactiveText = Utils.isNotEmpty(fieldOptions.inactive_text) ? fieldOptions.inactive_text : inactiveValue
+        return dynamicParams
+    },
+    getSwitchOptions (fieldOptions, valueKey = 'val', labelKey = 'label') {
+        const options = []
+        const activeValue = fieldOptions.active_value
+        const activeText = Utils.isNotEmpty(fieldOptions.active_text) ? fieldOptions.active_text : activeValue
+        const inactiveValue = fieldOptions.inactive_value
+        const inactiveText = Utils.isNotEmpty(fieldOptions.inactive_text) ? fieldOptions.inactive_text : inactiveValue
 
-    options.push({
-      [valueKey]: activeValue,
-      [labelKey]: activeText
-    })
-    options.push({
-      [valueKey]: inactiveValue,
-      [labelKey]: inactiveText
-    })
-    return options
-  },
-  getLinkValueKey(fieldOptions, data) {
-    return fieldOptions['link_config'] ? fieldOptions['link_config'].id || '' : ''
-  },
-  getLinkLabelType(fieldOptions, data) {
-    return fieldOptions['link_config'] ? fieldOptions['link_config'].type || 'first' : 'first'
-  },
-  getLinkLabelKey(fieldOptions, data) {
-    return fieldOptions['link_config'] ? fieldOptions['link_config'].text || '' : ''
-  },
-  getLinkStructure(fieldOptions, data) {
-    return fieldOptions['link_config'] ? fieldOptions['link_config'].structure || 'list' : 'list'
-  },
-  getLinkConfig(fieldOptions, data) {
-    return fieldOptions['link_config'] ? fieldOptions['link_config'] || {} : {}
-  },
-  /**
-   * 处理流程关联
-   */
-  getBpmLinkData: function(attrs) {
-    if (Utils.isEmpty(attrs)) { return null }
-    return {
-      currentBpmLink: attrs.currentFormInst,
-      postBpmLink: attrs.postFormInst
+        options.push({
+            [valueKey]: activeValue,
+            [labelKey]: activeText
+        })
+        options.push({
+            [valueKey]: inactiveValue,
+            [labelKey]: inactiveText
+        })
+        return options
+    },
+    getLinkValueKey (fieldOptions, data) {
+        return fieldOptions['link_config'] ? fieldOptions['link_config'].id || '' : ''
+    },
+    getLinkLabelType (fieldOptions, data) {
+        return fieldOptions['link_config'] ? fieldOptions['link_config'].type || 'first' : 'first'
+    },
+    getLinkLabelKey (fieldOptions, data) {
+        return fieldOptions['link_config'] ? fieldOptions['link_config'].text || '' : ''
+    },
+    getLinkStructure (fieldOptions, data) {
+        return fieldOptions['link_config'] ? fieldOptions['link_config'].structure || 'list' : 'list'
+    },
+    getLinkConfig (fieldOptions, data) {
+        return fieldOptions['link_config'] ? fieldOptions['link_config'] || {} : {}
+    },
+    /**
+     * 处理流程关联
+     */
+    getBpmLinkData: function (attrs) {
+        if (Utils.isEmpty(attrs)) { return null }
+        return {
+            currentBpmLink: attrs.currentFormInst,
+            postBpmLink: attrs.postFormInst
+        }
     }
-  }
 }
 
 export default FormUtil