watch.js 8.99 KB
Newer Older
田翔's avatar
田翔 committed
1 2
import { message } from 'antd'
import { isObject } from '../../utils'
3
import { formAutomaticComputation, GetSelectItemList, formFieldHideComputation } from '../../apis/process'
田翔's avatar
田翔 committed
4

5
export const debounce = (fn, wait = 300) => {
田翔's avatar
田翔 committed
6 7 8 9 10 11 12 13
  let t = null
  return function (e) {
    const context = this
    const args = arguments
    if (t) {
      clearTimeout(t)
    }
    t = setTimeout(function () {
田翔's avatar
田翔 committed
14 15 16
      if (typeof fn === 'function') {
        fn.call(context, ...args)
      }
17
    }, wait)
田翔's avatar
田翔 committed
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
  }
}

//json值结构转化为数组值
export const jsonToValues = (data, paths) => {
  let formValue = []
  Object.keys(data).map((k) => {
    if (isObject(data[k])) {
      Object.keys(data[k]).map((key) => {
        formValue.push({ fieldName: key, fieldValue: data[k][key] + '' })
      })
    }
  })
  let values = []
  if (Array.isArray(paths)) {
    paths.forEach(v => {
34
      let fieldName = v.path.split('.')[1]
田翔's avatar
田翔 committed
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
      let fieldValue = '0'
      let item = formValue.find(s => s.fieldName === fieldName)
      if (item) {
        fieldValue = item.fieldValue
      }
      values.push({
        fieldName,
        fieldValue,
      })
    })
  }
  return {
    formValue: values,
    relationForm: data.relationForm
  }
}

52
const getWidgetInfo = (json, widget) => {
田翔's avatar
田翔 committed
53
  let AutoCalculate = []
田翔's avatar
田翔 committed
54 55 56 57 58 59
  let parent = json?.properties
  if (isObject(parent)) {
    for (let v in parent) {
      let child = parent[v]?.properties
      if (isObject(child)) {
        for (let s in child) {
60
          if (child[s].widget === widget) {
田翔's avatar
田翔 committed
61
            AutoCalculate.push({
62
              gorupName: v,
63
              fieldName: s,
田翔's avatar
田翔 committed
64 65
              ...child[s],
              targetPath: `${v}.${s}`,
田翔's avatar
田翔 committed
66
            })
田翔's avatar
田翔 committed
67 68 69 70 71
          }
        }
      }
    }
  }
田翔's avatar
田翔 committed
72
  return AutoCalculate
田翔's avatar
田翔 committed
73 74
}

75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
//获取含有隐藏条件形态
const getHiddenWidget = (json) => {
  let HiddenWidget = []
  let parent = json?.properties
  if (isObject(parent)) {
    for (let v in parent) {
      let child = parent[v]?.properties
      if (isObject(child)) {
        for (let s in child) {
          if (Array.isArray(child[s].hiddenRules) && child[s].hiddenRules.length) {
            HiddenWidget.push({
              gorupName: v,
              fieldName: s,
              ...child[s],
              targetPath: `${v}.${s}`,
            })
          }
        }
      }
    }
  }
  return HiddenWidget
}

田翔's avatar
田翔 committed
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
const getPath = (json, filed) => {
  let parent = json?.properties
  if (isObject(parent)) {
    for (let v in parent) {
      let child = parent[v]?.properties
      if (isObject(child)) {
        for (let s in child) {
          if (s === filed) {
            return `${v}.${s}`
          }
        }
      }
    }
  }
  return ''
}

田翔's avatar
田翔 committed
116
const getFieldName = (configs, tableName) => {
117
  let path = ''
田翔's avatar
田翔 committed
118 119
  configs.forEach(v => {
    if (v['台账名称'] === tableName) {
120
      path = v.$id
田翔's avatar
田翔 committed
121 122
    }
  })
123
  return path
田翔's avatar
田翔 committed
124 125
}

126
const formAutomatic = async (params) => {
田翔's avatar
田翔 committed
127
  if ((new Date().getTime() - params.startTime) < 2000) return
田翔's avatar
田翔 committed
128 129 130
  let param = {
    tableName: params.tableName,
    filedFormulas: params.filedFormulas,
田翔's avatar
田翔 committed
131
    relationForm: params.relationForm,
田翔's avatar
田翔 committed
132 133 134 135 136 137 138 139
    values: jsonToValues(params.form.getValues(), params.paths).formValue
  }
  const { code, data, msg } = await formAutomaticComputation(param)
  if (code === 0) {
    if (Array.isArray(data)) {
      data.forEach(v => {
        let path = getPath(params.schema, v.fieldName)
        if (path) {
140
          params.form.setValueByPath(path, v.fieldValue + '')
田翔's avatar
田翔 committed
141 142 143 144 145 146 147 148
        }
      })
    }
  } else {
    message.error(msg)
  }
}

149 150 151 152 153 154 155 156 157 158 159 160 161 162
//如果该分组下所有字段隐藏那就影隐藏分组
const getGroupHidden = (form, schema, gorupName) => {
  let gorupSchema = schema?.properties?.[gorupName]?.properties || {}
  let hidden = true
  for (let key in gorupSchema) {
    let sunSchema = form.getSchemaByPath(`${gorupName}.${key}`)
    if (!sunSchema.hidden) {
      hidden = false
    }
  }
  return hidden
}

const formFieldHide = async (params) => {
田翔's avatar
田翔 committed
163
  if ((new Date().getTime() - params.startTime) < 2000) return
164 165 166 167 168 169 170 171 172 173
  let param = {
    tableName: params.tableName,
    filedFormulas: params.filedFormulas,
    relationForm: params.relationForm,
    values: jsonToValues(params.form.getValues(), params.paths).formValue
  }
  const { code, data } = await formFieldHideComputation(param)
  if (code === 0) {
    if (Array.isArray(data)) {
      data.forEach(v => {
田翔's avatar
田翔 committed
174
        if (params?.initField?.length === 0 || (params?.initField?.length !== 0 && params?.initField.includes(v.fieldName))) {
175 176 177 178 179 180
          let path = getPath(params.schema, v.fieldName)
          if (path) {
            params?.form?.setSchemaByPath(path, { ...params?.form?.getSchemaByPath(path), hidden: v.isHide, presetValue: v.fieldValue })
            let hidden = getGroupHidden(params?.form, params.schema, params.gorupName)
            params?.form?.setSchemaByPath(params.gorupName, { ...params?.form?.getSchemaByPath(params.gorupName), hidden: hidden })
          }
181 182 183 184 185 186 187 188 189 190
        }
      })
    }
  }
}

const Automatic = debounce(formAutomatic)

const fieldHide = debounce(formFieldHide)

191 192 193 194 195 196 197 198 199 200 201 202 203 204
const getFieldValue = (formValue, fieldName) => {
  let value = ''
  Object.keys(formValue).map(k => {
    if (isObject(formValue[k])) {
      Object.keys(formValue[k]).map(j => {
        if (j === fieldName) {
          value = formValue[k][j]
        }
      })
    }
  })
  return value
}

205
//自动计算监听/隐藏条件监听
206
const getAutoWatch = ({ schema, form, startTime, initField }) => {
田翔's avatar
田翔 committed
207
  let watch = {}
208
  let paths = []
209 210
  let formValue = form?.getValues()
  let { relationForm } = formValue
田翔's avatar
田翔 committed
211
  const configs = relationForm?.configs || []
田翔's avatar
田翔 committed
212
  const AutoCalculate = getWidgetInfo(schema, 'NumberInput')
213
  const HiddenWidget = getHiddenWidget(schema)
田翔's avatar
田翔 committed
214 215
  if (Array.isArray(AutoCalculate)) {
    AutoCalculate.forEach(item => {
216
      const { gorupName, fieldName, rules, calculateRule } = item
田翔's avatar
田翔 committed
217 218 219
      if (Array.isArray(rules)) {
        rules.forEach(s => {
          if (schema.tableName === s.tableName) {
田翔's avatar
田翔 committed
220 221
            if (Array.isArray(s.fields)) {
              s.fields.forEach(v => {
田翔's avatar
田翔 committed
222 223
                let path = getPath(schema, v)
                if (path) {
224
                  paths.push({ gorupName, type: ['AutoCalculate'], path: path, fieldName, formula: calculateRule })
田翔's avatar
田翔 committed
225 226 227
                }
              })
            }
田翔's avatar
田翔 committed
228
          } else {
229 230
            let path = getFieldName(configs, s.tableName)
            if (path) {
231
              paths.push({ gorupName, type: ['AutoCalculate'], path, fieldName, formula: calculateRule })
田翔's avatar
田翔 committed
232 233 234
            }
          }
        })
田翔's avatar
田翔 committed
235 236 237
      }
    })
  }
238 239 240 241 242 243 244 245 246 247 248 249 250 251
  if (Array.isArray(HiddenWidget)) {
    HiddenWidget.forEach(item => {
      const { gorupName, fieldName, hiddenRules, hiddenCondition } = item
      if (Array.isArray(hiddenRules)) {
        hiddenRules.forEach(v => {
          if (Array.isArray(v.fields)) {
            v.fields.forEach(s => {
              let path = getPath(schema, s)
              if (path) {
                paths.push({
                  gorupName,
                  type: ['HiddenWidget'],
                  path,
                  fieldName,
252
                  fieldValue: getFieldValue(formValue, fieldName),
253 254 255 256 257 258 259 260 261
                  formula: hiddenCondition
                })
              }
            })
          }
        })
      }
    })
  }
262 263 264 265
  if (Array.isArray(paths)) {
    paths.forEach(v => {
      watch[v.path] = () => {
        let params = {
266
          ...v,
267 268 269 270 271 272
          tableName: schema.tableName,
          filedFormulas: paths.filter(s => s.path === v.path),
          form: form,
          paths: paths,
          relationForm,
          schema: schema,
273 274
          startTime,
          initField,
275
        }
276 277 278 279 280 281
        if (v.type.includes('AutoCalculate')) {
          Automatic(params)
        }
        if (v.type.includes('HiddenWidget')) {
          fieldHide(params)
        }
282 283 284 285 286 287 288
      }
    })
  }
  return watch
}

const getSelectItemList = async (params) => {
田翔's avatar
田翔 committed
289
  if ((new Date().getTime() - params.startTime) < 2000) return
290 291 292 293 294 295 296 297 298 299 300
  const { sourcePath, form, targetPath, dictionary, value } = params
  const { code, data, msg } = await GetSelectItemList({ nodeName: dictionary })
  if (code === 0) {
    let array = data.filter(v => v.nodeName === value)
    if (Array.isArray(array) && array.length) {
      form.setValueByPath(targetPath, array[0].nodeValue)
    }
  }
}

//关联选择监听
301
const getSelectWatch = ({ schema, form, startTime, initField }) => {
302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
  let watch = {}
  const RelevanceSelect = getWidgetInfo(schema, 'RelevanceSelect')
  if (Array.isArray(RelevanceSelect)) {
    RelevanceSelect.forEach(v => {
      let path = getPath(schema, v.fieldParent)
      if (path) {
        watch[path] = (value) => {
          if (value) {
            let params = {
              startTime,
              sourcePath: path,
              targetPath: v.targetPath,
              form: form,
              dictionary: v.dictionary,
              value
            }
            debounce(getSelectItemList)(params)
          }
        }
321 322 323
      }
    })
  }
田翔's avatar
田翔 committed
324 325 326
  return watch
}

327
export const getWatch = ({ schema, form, startTime, initField }) => {
328
  return {
329 330
    ...getAutoWatch({ schema, form, startTime, initField }),
    ...getSelectWatch({ schema, form, startTime, initField })
331 332
  }
}