<template>
  <div class="form-main" id="form-main">
    <a-card :body-style="{ padding: '24px 32px' }" :bordered="false">
      <!-- <a-form @submit="handleSubmit" :form="form">
        <a-form-item
          label="标题"
          :labelCol="{lg: {span: 7}, sm: {span: 7}}"
          :wrapperCol="{lg: {span: 10}, sm: {span: 17} }">
          <a-input :disabled="disabled"
                   v-decorator="[
            'name',
            {rules: [{ required: true, message: '请输入标题' }]}
          ]"
                   name="name"
                   placeholder="给目标起个名字" />
        </a-form-item>
        <a-form-item v-if="!disabled"
                     :wrapperCol="{ span: 24 }"
                     style="text-align: center"
        >
          <a-button htmlType="submit" type="primary" :disabled="disabled||btndisabled" @click="handleSubmit">保存</a-button>
          <a-button style="margin-left: 8px" :disabled="disabled" @click="close">取消</a-button>
        </a-form-item>
      </a-form>-->
      <k-form-build
        :value="jsonData"
        @change="handleChange"
        :dynamicData="dynamicData"
        ref="KFB"
        @submit="handleSubmit"
      />
      <div style="text-align:center">
        <a-button
          htmlType="submit"
          type="primary"
          :disabled="disabled || btndisabled"
          @click="handleSubmit"
          class="noprint"
        >保存</a-button>
        <todoManageOperation
          v-if="processData.operationType && processData.operationType == '1'"
          :processData="processData"
          :todoManageOperationObject="todoManageOperationObject"
          :disabled="disabled"
          :btndisabled="btndisabled"
          @refreshToDo="refreshToDo"
          @handleSubmit2="handleSubmit2"
        ></todoManageOperation>
        <a-button style="margin-left: 8px;" :disabled="disabled || disabled2" @click="close"   class="noprint">取消</a-button>
        <!-- <a-button  type="primary"  v-if="printDisable" @click="changedd"   class="noprint" style="margin-left:10px">打印</a-button> -->
      </div>
    </a-card>
    <personnel-files-modal ref="personnelFilesModal" @close="closeP"></personnel-files-modal>
    <fixed-zy-modal ref="FixedZyModal" @close="closeP"></fixed-zy-modal>
    <car-sq-modal ref="CarSqModal" @close="closeP"></car-sq-modal>
    <material-sl-modal ref="MaterialSlModal" @close="closeP"></material-sl-modal>
  </div>
</template>

<script>
import pick from 'lodash.pick'
import todoManageOperation from '../operation/todoManageOperation'
import PersonnelFilesModal from './personnelFilesModal'
import CarSqModal from './carSqModal'
import MaterialSlModal from './materialSlModal'
import FixedZyModal from './fixedZyModal'
import { postAction, postFormDataAction} from '@/api/manage'
import {annualLeave} from '@api/oa/cd-personnel-files'
import moment from 'moment'
export default {
    name: 'DemoForm',
    props: {
    /* 全局禁用，可表示查看 */
        disabled: {
            type: Boolean,
            default: false,
            required: false
        },
        /* 流程数据 */
        processData: {
            type: Object,
            default: () => {
                return {}
            },
            required: false
        },
        /* 是否新增 */
        isNew: { type: Boolean, default: false, required: false }
    },
    components: {
        todoManageOperation,
        moment,
        PersonnelFilesModal,
        FixedZyModal,
        CarSqModal,
        MaterialSlModal,
    },
    data () {
        return {
            isSJ: false,
            todoManageOperationObject: {
                isSave: false,
                formData: {},
                jsonData: {}
            },
            leave:0,//剩余年假
            disabled2: false, // 用来取决于表单时不同流程节点填写不同表单信息使用
            jsonData: {}, // 前台任意改变的json
            jsonDataSave: {}, // 保存到数据库的json
            url: {
                getForm: '/actBusiness/getForm',
                addApply: '/actBusiness/add',
                editForm: '/actBusiness/editForm',
                leaveType: '/sys/dict/getDictItems'
            },
            description: '流程表单demo，按例开发表单。需在 activitiMixin.js 中加入写好的表单',
            // form
            form: this.$form.createForm(this),
            /* 表单回显数据 */
            data: {},
            btndisabled: false,
            ceshi_file: null,
            fArr:[],//保存含有help的单个表单信息
            cvarr:[],//保存表单所有的label和key（用来寻找改变字段对应的key）
            bv:[],//保存所有含有help的表单信息
            dynamicData: {
                jsonData: {},
                typeData: [], // 请假类型下拉数据
                reimbursementTypeList: [], // 报销类型下拉数据
                invoiceTypeList: [], // 发票类型下拉数据
                add: this.add,
                gv:this.funName,
                department:[],//技能博物管下拉框信息
                personListJn:[],//技能博物馆人员信息下拉框
            },
            postInfo: {},//职位信息
            deptInfo: {},//部门信息
            itemModelNameList: [], // 子表字段名
            buttonArr:[],
            printDisable:false//打印按钮
        }
    },
    watch: {
    // 'dynamicData.jsonData'(){
    //   console.log("发生改变了")
    // },
        dynamicData: {
            handler (newName, oldName) {
                console.log('obj.a changed')
                console.log(newName)
                console.log(oldName)
                newName.handle = this.funName1
                newName.fixed_zy = this.fixedZy
                newName.fixed_gh =this.fixedGh
                newName.fixed_db=this.fixedDb
                newName.fixed_bf=this.fixedBf
                newName.car_sq = this.carSq
                newName.material_sl = this.materialSl
            },
            immediate: true,
            deep: true
        }
    },
    created () {
        window.deleteRow = this.deleteRow
        // console.log('流程数据', this.processData)
        // 加载一些下拉选择数据等
        // this.getDataList()
        let businessTable = ''
        // 如果没有值则在另一个属性上有值
        if (!this.processData.businessTable) {
            this.processData.businessTable = this.processData.tableName
        }
        this.getAction('/tbTableInfo/query', {
            businessTable: this.processData.businessTable,
            taskNodeId: this.processData.key,
            tableId: this.processData.tableId,
            type: '1'
        }).then(res => {
            var jsonString = JSON.stringify(res.result.jsonContent)
            var index = 1

            var dynamicKeyValueList = []
            for (var index = 1; index !== -1;) {
                // 动态字符位置
                index = jsonString.indexOf('"dynamicKey"', index)
                if (index !== -1) {
                    // 从指定字符的周后一个字符后开始找(")
                    var ihStart = jsonString.indexOf('"', index + 12)
                    // 再从 (") 后面位置还是找下一个 (")
                    var ihEnd = jsonString.indexOf('"', ihStart + 1)
                    // 获取引号之间的字符
                    var dynamicKeyValue = jsonString.substring(ihStart + 1, ihEnd)
                    // 如果动态表示不为空则获取
                    if (dynamicKeyValue != '') {
                        dynamicKeyValueList.push(dynamicKeyValue)
                    }
                    index = ihEnd + 1
                }
            }
            let that = this;
            if (dynamicKeyValueList.length > 0) {
                // 获取数据字典数据源
                postAction('/sys/dict/getDictItems/getDictList', dynamicKeyValueList).then(dictData => {
                    if (dictData.success) {
                        this.dynamicData = dictData.result.dicList
                         //技能博物馆部门信息
                        this.getAction('/sys/sysDepart/queryMyDeptList').then(res => {
                             if (res.success) {
                               var aa=[]
                               res.result.map(item=>{
                               aa.push({value:item.departName,label:item.departName})
                             })
                             this.dynamicData.department = aa
                            } else {
                                 this.$message.error(res.message)
                             }
                        })
                        //技能博物馆人员信息
                        this.getAction('/sys/user/list', { pageSize: -1}).then(res => {
                             if (res.success) {
                                 var aa = []
                                 res.result.records.map(item =>{
                                     aa.push(
                                         {value:item.realname,
                                         label:item.realname,
                                         workNo:item.workNo,
                                         post:item.post,
                                         nInductionTime:item.nInductionTimenInductionTime,
                                         phone:item.phone,
                                         telephone:item.telephone,
                                         departIds_dictText:item.departIds_dictText,
                                         departIds:item.departIds
                                         })
                                 })
                              this.dynamicData.personListJn = aa
                              //技能博物馆 --- 全馆值班   此时无法触碰到handleChange方法  手动触发
                              if(this.processData.businessTable == 'bwg_house_duty'){
                                this.handleChange()
                              }

                            } else {
                                 this.$message.error(res.message)
                             }
                        })
                        // 获取用户下拉数据
                        this.getAction('/sys/user/list2', { pageSize: 20000 }).then(userData => {
                            if (res.success) {
                              
                                if(userData.data != null && userData.data.supplierList != null){
                                    // userData.data.supplierList.forEach(user => {
                                    //      console.log("userDatacode",user.code);
                                    //      console.log("userDataname",user.name);
                                    // })
                                    this.dynamicData.supplierList = userData.data.supplierList
                                }
                              
                                userData.result.records.forEach(user => {
                                    user.label = user.realname
                                    user.value = user.username
                                    that.postInfo[user.username] = user.post
                                    that.deptInfo[user.username] = user.deptName
                                })
                                // 存到动态数据源中
                                this.dynamicData.userList = userData.result.records
                                this.dynamicData.add = this.add // 新增按钮
                                
                                // 获取json
                                this.jsonData = res.result.jsonContent
                                // this.jsonData.list[2].columns[0].list[0].help = "date_1663752082983,date_1663753163575,min"
                                this.cvarr = []
                                this.cvarr = []
                                this.fArr =[]
                                //遍历help
                                this.forHelp(this.jsonData)
                                this.jsonDataSave = JSON.parse(JSON.stringify(res.result.jsonContent))
                                // 获取申请人信息
                                this.getApplicant()
                                // 如果是手机端子表初始化子表model
                                this.listUpdateModel()
                                if (!this.isNew) {
                                    this.init()
                                }
                            } else {
                                this.$message.error(userData.message)
                            }
                        })
                    } else {
                        this.$message.error(dictData.message)
                    }
                })
            } else {
                // 获取json
                this.jsonData = res.result.jsonContent
                // this.jsonData.list[0].trs[5].tds[2].list[0].help = 'input_1662521241170,input_1662521240862,-'
                // this.jsonData.list[0].trs[3].tds[2].list[0].help = 'today'
                 this.cvarr = []
                 this.fArr =[]
                 //遍历help（计算）
                 this.forHelp(this.jsonData)               
                // 获取申请人信息
                this.getApplicant()
                // 如果是手机端子表初始化子表model
                this.listUpdateModel()
                // window.jsonData=this.jsonData;
                if (!this.isNew) {
                    this.init()
                }
            }
            

            // 后台检测到流程节点有关联表单且前台处于我的待办界面打开表单详情
            if (res.result.isSave && this.processData.isSuspended != undefined) {
                this.disabled = false
                this.btndisabled = false
            }
        })
    },
    methods: {
        fixedZy(){
            this.$refs.FixedZyModal.fixedZyModVis = true
            this.$refs.FixedZyModal.personLists('正常')
            this.$refs.FixedZyModal.sat = '转移'

        },
        fixedGh(){
            this.$refs.FixedZyModal.fixedZyModVis = true
            this.$refs.FixedZyModal.personLists('正常')
            this.$refs.FixedZyModal.sat = '归还'
        },
        fixedDb(){
            this.$refs.FixedZyModal.fixedZyModVis = true
            this.$refs.FixedZyModal.personLists('正常')
            this.$refs.FixedZyModal.sat = '调拨'
        },
        fixedBf(){
            this.$refs.FixedZyModal.fixedZyModVis = true
            this.$refs.FixedZyModal.personLists('正常')
            this.$refs.FixedZyModal.sat = '报废'
        },
        carSq(){
             this.$refs.CarSqModal.carSqModVis = true
            this.$refs.CarSqModal.personLists()
        },
        materialSl(){
             this.$refs.MaterialSlModal.materialSlModVis = true
            this.$refs.MaterialSlModal.personLists()
        },
        //获取部门信息
        getDepartment(){
         this.$refs.DepartmentModal.departmentModVis = true
            this.$refs.DepartmentModal.personLists()
        },
        closeP(value){
             var that = this
            this.cvarr.map(item=>{
                for(let key in value){
                    if(item.model == key){
                        setTimeout(function(){
                        that.$refs.KFB.setData({[key]:value[key]})   
                        },0)
                    }
                }
                
            })
           
           
        },
         funName1(){
            this.$refs.personnelFilesModal.declareElementsModVis = true
            this.$refs.personnelFilesModal.personLists()
        },
    // 根据字典名字获取数据源
        getDataListByName (name) {
            this.getAction(this.url.leaveType + '/' + name).then(res => {
                if (res.success) {
                    this.dynamicData[name] = res.result
                    console.log(111)
                } else {
                    this.$message.error(res.message)
                }
            })
        },
        // 获取获取下拉数据等
        getDataList () {
            // 获取请假类型下拉数据
            this.getAction(this.url.leaveType + '/leave_type').then(res => {
                if (res.success) {
                    this.dynamicData.typeData = res.result
                } else {
                    this.$message.error(res.message)
                }
            })
            // 获取报销类型下拉数据
            this.getAction(this.url.leaveType + '/reimbursement_type').then(res => {
                if (res.success) {
                    this.dynamicData.reimbursementTypeList = res.result
                } else {
                    this.$message.error(res.message)
                }
            })
            // 获取发票类型下拉数据
            this.getAction(this.url.leaveType + '/invoice_type').then(res => {
                if (res.success) {
                    this.dynamicData.invoiceTypeList = res.result
                } else {
                    this.$message.error(res.message)
                }
            })
        },
        /* 回显数据 */
        init () {
            this.btndisabled = true
            var r = this.processData
            this.getAction(this.url.getForm, {
                tableId: r.tableId,
                tableName: r.tableName
            }).then(res => {
                // 第一次调接口根据子表数据渲染子表前台效果
                // 只有手机端才执行
                if (this.isSJ) {
                    _.keys(res.result).forEach((e, i) => {
                        if (e.indexOf('child&') != -1) {
                            if (i > 0) {
                                this.add()
                            }
                        }
                    })
                }
                this.getAction(this.url.getForm, {
                    tableId: r.tableId,
                    tableName: r.tableName
                }).then(res => {
                    if (res.success) {
                        let formData = res.result
                        formData.tableName = r.tableName
                        // console.log("taboe",formData);
                        this.data = formData
                        // 如果表单是手机端的子表则
                        if (this.isSJ) {
                            var formModelList = _.keys(this.data)
                                .join(',')
                                .split(',')
                            var itemList = []
                            formModelList.forEach(element => {
                                if (element.indexOf('child&') != -1) {
                                    itemList = JSON.parse(JSON.stringify(this.data[element]))
                                    delete this.data[element]
                                }
                            })
                            // 子表字段名
                            // 子表数据model和值组装
                            itemList.forEach((item, index) => {
                                this.itemModelNameList.forEach(itemModelName => {
                                    this.data[itemModelName + '@' + (index + 1)] = item[itemModelName]
                                })
                            })
                        }
                        // 赋值
                        this.$refs.KFB.setData(this.data)
                        this.btndisabled = false
                    } else {
                        this.$message.error(res.message)
                    }
                })
            })
        },
        //遍历help
        forHelp(obj){
            for(var a in obj){
                if (typeof(obj[a]) == "object"){
                    if(obj[a].help !=='' && obj[a].help){
                        //保存每一项的label和key
                        this.cvarr.push({model:obj[a].model,key:obj[a].key,type:obj[a].type})
                        obj[a].help = obj[a].help.split(',')
                        //保存含有help的item中的label和help里的信息
                        this.fArr=[
                                  {
                                   label:obj[a].model,
                                   value:'',
                                 },
                                 {
                                  label: obj[a].help[0],
                                  value:'',
                                 },
                                {
                                  label: obj[a].help[1],
                                  value:'',
                                 },
                                {
                                   label: obj[a].help[2],
                                   value:'',
                                },
                            ]
                        //保存多各含有help的数据
                        this.bv.push({bn:this.fArr})
                       //默认当天时间
                        this.defualtData(this.fArr)
                    }else if(obj[a].help ==''){
                        this.cvarr.push({model:obj[a].model,key:obj[a].key,type:obj[a].type})
                    }else if(obj[a].type == 'button'){
                        this.buttonArr.push(obj[a])
                         this.buttonShow(obj[a])         
                    }
                    this.forHelp(obj[a])
                }
                }     
                
        },
        buttonShow(obj){
            if(obj.label == '打印'){
                this.printDisable = true
            }
        },
        defualtData(item){
                           if(item[1].label =='today'){
                               item[0].value =moment(new Date().toLocaleDateString()).format('YYYY-MM-DD HH:mm')
                               var that = this
                               setTimeout(function(){
                               that.$refs.KFB.setData({[item[0].label]:item[0].value})   
                                  },0)
                           }else if(item[1].label =='user'){
                              this.$store.getters.userInfo
                               var that = this
                               setTimeout(function(){
                               that.$refs.KFB.setData({[item[0].label]:that.$store.getters.userInfo.username})   
							   
                               if(that.processData.businessTable == 'regular_employee_apply'){//员工转正申请
                                 that.$refs.KFB.setData({apply_department:that.deptInfo[that.$store.getters.userInfo.username]})   
                                 // that.$refs.KFB.setData({job_title:that.postInfo[that.$store.getters.userInfo.username]})   
                               }
                               if(that.processData.businessTable == 'seal_apply'){//用印申请单
                                 that.$refs.KFB.setData({apply_department:that.deptInfo[that.$store.getters.userInfo.username]})   
                               }
                               if(that.processData.businessTable == 'separation_application'){//离职申请
                                 that.$refs.KFB.setData({job_title:that.postInfo[that.$store.getters.userInfo.username]})   
                               }
                          
							   
                                  },0)
                                  annualLeave({username:that.$store.getters.userInfo.username}).then(res => {
                                   if (res.success) {
                                   this.leave = res.result.nannualNowNum
                                  }else{
                                   this.$message.error(res.message);
                                  }
                                })
                           }
        },
        // 获取申请人信息
        getApplicant () {
            console.log('aa', this.$refs.KFB.form.getFieldValue('applicant'))
            // if (this.$refs.KFB.form.getFieldValue('applicant')) {
            //   alert(1)
            //   this.$refs.KFB.setData({
            //     applicant: this.$store.getters.userInfo.username
            //   })
            // }
        },
        changedd(){
         window.print()
        },
        //主子表计算 
         tableCalculation(value){
             var number1 = 0,
                number2 = 0
                //寻找help信息中对应的modol值
               this.bv.map(item=>{
                       this.cvarr.map(vv=>{
                           if(vv.key == item.bn[1].label){
                               number1 = vv.model
                           }else if(vv.key == item.bn[2].label){
                               number2 = vv.model
                           }
                   })
                   //表中每一行分别计算
                   var sum = 0
                    value.map(b=>{
                      b[item.bn[0].label] = b[number1]*b[number2]  
                      sum += b[item.bn[0].label]   //计算出表格内的总价总和
                      if(this.$store.getters.nickname=='崔崇杰'){
                           b['procurement_type']='1'
                      }else{
                          b['procurement_type']='2'
                      } 
                    })  
                    this.$refs.KFB.setData({sum:sum})   

               })
         },
         specialTerms(value,key){
            var that = this
            //剩余年假
            if(key == 'employe_name'){
                setTimeout(function(){
                    annualLeave({username:value}).then(res => {
                    if (res.success) {
                      //选择姓名获取页面的请假类型和时间间隔
                      that.leave = res.result.nannualNowNum
                      var category = that.$refs.KFB.form.getFieldValue('leave_category')
                      var time1 = that.$refs.KFB.form.getFieldValue('start_date')
                      var time2 = that.$refs.KFB.form.getFieldValue('end_date')
                      var timeC=that.timeDifference(time1,time2,'min') //获取时间差
                      //事假，超过180分钟，年假大于0.5
                      if(category == 1 &&timeC>=180&&that.leave>=0.5){
                          that.$refs.KFB.setData({unit:'2'})
                          that.$refs.KFB.setData({leave_category:'2'})
                        }else if(category == 2 && that.leave<0.5){   //类型为年假，剩余年假小于0.5
                             that.$refs.KFB.setData({unit:'1'}) 
                             that.$refs.KFB.setData({leave_category:''})
                             that.$message.error('剩余年假不足！');
                        }
                    }else{
                       that.$message.error(res.message); 
                       
                    }
                })
                },0)
            }
             //请假类型与单位
            //事假
            if(key == 'leave_category' && value == '1'){
                setTimeout(function(){
                var time1 = that.$refs.KFB.form.getFieldValue('start_date')
                var time2 = that.$refs.KFB.form.getFieldValue('end_date')
                var timeC=that.timeDifference(time1,time2,'min') //获取时间差
                if(timeC>=180 && that.leave>=0.5){ //事假，时间差大于180，剩余年假大于0.5
                    that.$refs.KFB.setData({unit:'2'})
                    that.$refs.KFB.setData({leave_category:'2'})
                }else{
                    that.$refs.KFB.setData({unit:'1'})   
                }
                },0)
            }else if(key == 'leave_category' && value == '3'){  //病假
                setTimeout(function(){
                 that.$refs.KFB.setData({unit:'1'})   
                },0)
            }else if(key == 'leave_category' && value == '2'){//年假
                 setTimeout(function(){
                    if(that.leave >=0.5){  //剩余年假大于0.5
                        that.$refs.KFB.setData({unit:'2'})  
                    }else{ //剩余年假小于0.5
                         that.$refs.KFB.setData({unit:'1'}) 
                         that.$refs.KFB.setData({leave_category:''})
                         that.$message.error('剩余年假不足！');
                    }

                },0)

            }else if(key == 'leave_category'){
                setTimeout(function(){
                    that.$refs.KFB.setData({unit:'2'})   
                },0)
            }
            //时间间隔和类型
            if(key =='start_date' || key =='end_date'){
                setTimeout(function(){
                    var time2 = that.$refs.KFB.form.getFieldValue('end_date')
                    var time1 = that.$refs.KFB.form.getFieldValue('start_date')
                    var timeC=that.timeDifference(time1,time2,'min')
                    var lx=that.$refs.KFB.form.getFieldValue('leave_category')
                    if(timeC>=180&&lx=='1'&&that.leave>=0.5){ //事假，时间差大于180，剩余年假大于0.5
                        that.$refs.KFB.setData({unit:'2'})
                          that.$refs.KFB.setData({leave_category:'2'})
                     }
                },0)
                
            }
         },
        // 表单字段数值发生改变事件
        handleChange (value, key) { 
          if(key == 'proposer' && this.processData.businessTable == 'regular_employee_apply'){//员工转正申请：申请人部门
            this.$refs.KFB.setData({apply_department:this.deptInfo[value]})   
          }
          if(key == 'regular_employee' && this.processData.businessTable == 'regular_employee_apply'){//员工转正申请：转正人员岗位
            this.$refs.KFB.setData({job_title:this.postInfo[value]})   
          }
          if(key == 'proposer' && this.processData.businessTable == 'seal_apply'){//用印申请单
            this.$refs.KFB.setData({apply_department:this.deptInfo[value]})   
          }
          if(key == 'employee_name' && this.processData.businessTable == 'separation_application'){//离职申请
            this.$refs.KFB.setData({job_title:this.postInfo[value]})   
          }
          //技能博物馆-----退休录入
          if(key == 'name' && this.processData.businessTable == 'bwg_retire_input'){//技能博物馆 ---- 退休录入
              this.dynamicData.personListJn.map(item =>{
                  if(item.label == value){
                      this.$refs.KFB.setData({employee_number:item.workNo}) 
                      this.$refs.KFB.setData({post:item.post}) 
                      this.$refs.KFB.setData({rz_date:item.nInductionTim}) 
                  }
              })
            // this.$refs.KFB.setData({employee_number:this.postInfo[value]})   
          }
         //技能博物馆 ---- 全馆值班 （根据登录姓名带出其他字段的值）
         if(this.processData.businessTable == 'bwg_house_duty'){
                var that = this
                 setTimeout(function(){
                   that.dynamicData.personListJn.map(item =>{
                     if(item.label == that.$store.getters.nickname){
                      that.$refs.KFB.setData({department_id:item.departIds}) 
                      that.$refs.KFB.setData({department_name:item.departIds_dictText}) 
                      that.$refs.KFB.setData({telephone:item.telephone}) 
                      that.$refs.KFB.setData({mobile_telephone:item.phone}) 
                     }
                   })
                 },200)
         }

         //技能博物馆 ----- 费用报销
        if(key == 'expense_person' && this.processData.businessTable == 'bwg_expense_apply'){
            this.dynamicData.personListJn.map(item =>{
                  if(item.label == value){
                      this.$refs.KFB.setData({expense_department:item.departIds_dictText}) 
                  }
              })
        }
           
                 
            //改变的表单是主子表类型时
            if((value instanceof Array) && (key.indexOf('child&')!==-1)){
                this.tableCalculation(value)
            }
            //特别字段
            this.specialTerms(value,key)

            //代码赘余，日后维护
            //保存发生改变字段名对应的key 
            var cc ='',
                type = ''
                this.cvarr.map(k =>{
                     if(k.model ==key){
                        cc=k.key
                        type = k.type
                      }})
            //根据数值改变计算
            var that =this
            setTimeout(function(){
              that.bv.map(event =>{
                 if(event.bn[1].label == cc || event.bn[2].label == cc){
                    that.cvarr.map(k=>{
                        if(k.key == event.bn[1].label){
                                 event.bn[1].value = that.$refs.KFB.form.getFieldValue(k.model)
                        }else if(k.key == event.bn[2].label){
                                 event.bn[2].value = that.$refs.KFB.form.getFieldValue(k.model)
                        }
                    })
                    if(type == 'date'){
                        if(event.bn[1].value!=='' && event.bn[2].value!==''){
                            var state = ''
                            state = event.bn[3].label
                            event.bn[0].value = that.timeDifference(event.bn[1].value,event.bn[2].value,state)
                        }
                       }else{
                        if(event.bn[3].label =="+"){
                           event.bn[0].value = Number(event.bn[1].value)+Number(event.bn[2].value)  
                        }else if(event.bn[3].label =="-"){
                           event.bn[0].value = Number(event.bn[1].value)-Number(event.bn[2].value)  
                        }else if(event.bn[3].label =="*"){
                            event.bn[0].value = Number(event.bn[1].value)*Number(event.bn[2].value)  
                        }
                    }         
                    that.$refs.KFB.setData({[event.bn[0].label]:event.bn[0].value})
                 }
              })     
 
            },0)
                     // // 数据变化时触发
            // // 如果开始时间发生变化
            // if (key == 'start_time') {
            //     // 判断结束时间是否存在
            //     if (this.$refs.KFB.form.getFieldValue('end_time')) {
            //         // 获取时间差
            //         let duration = startEndFun(value, this.$refs.KFB.form.getFieldValue('end_time'))
            //         if (duration) {
            //             // 使用k-form-design组件的form属性修改表单数据
            //             this.$refs.KFB.setData({
            //                 duration: duration
            //             })
            //         }
            //     }
            // }
            // // 如果结束时间发生变化
            // if (key == 'end_time') {
            //     // 判断结束时间是否存在
            //     if (this.$refs.KFB.form.getFieldValue('start_time')) {
            //         // 获取时间差
            //         let duration = startEndFun(this.$refs.KFB.form.getFieldValue('start_time'), value)
            //         if (duration) {
            //             // 使用k-form-design组件的form属性修改表单数据
            //             this.$refs.KFB.setData({
            //                 duration: duration
            //             })
            //         }
            //     }
            // }
        },
        // handler
        handleSubmit (e) {
            // return new Promise((resolve)=>{
            // 通过函数获取数据
            this.$refs.KFB.getData()
                .then(res => {
                  let formData1 = JSON.parse(JSON.stringify(res))
                  console.log("orl",formData1)
                    // 处理手机端子表数据
                    if (this.isSJ) {
                        this.itemData(res)
                    }
                    // 清除为空的表单数据
                    _.keys(res).forEach(r => {
                        if (!res[r]) {
                            delete res[r]
                        }
                    })
                    // 获取数据成功
                    let formData = JSON.parse(JSON.stringify(res))
                    console.log(formData)
                    formData.id = this.data.id
                    formData.procDefId = this.processData.id
                    formData.procDeTitle = this.processData.name

                    if (!formData.tableName) formData.tableName = this.processData.businessTable
                    formData.filedNames = _.keys(res).join(',')
                    formData.filedNames = getFiledNames(formData) // 获取主表字段，排除子表标识
                    var url = this.url.addApply
                    if (!this.isNew) {
                        url = this.url.editForm
                    }
                    // 是否存在子表
                    let ischild = false
                    // 循环表单字段属性判断是否属性中包含数组对象
                    let i = 0 // 子表数量
                    _.keys(res)
                        .join(',')
                        .split(',')
                        .forEach(element => {
                            if (formData[element] instanceof Array) {
                                // 判断是否符合子表命名规则
                                if (element.indexOf('&') != -1) {
                                    let tableChildNameList = element.split('&')
                                    // 判断是否能拆分两个字符，子表标识和子表数据库名称
                                    if (tableChildNameList.length == 2) {
                                        i++
                                        let childName = tableChildNameList[1] // 子表数据库名称
                                        if (!formData.table_name_children) {
                                            // 第一次拼接
                                            formData.table_name_children = childName // 表名
                                        } else {
                                            // 后面的表明拼接用“,”隔开
                                            formData.table_name_children = formData.table_name_children + ',' + childName // 表名
                                        }
                                        // 定义属性名和值
                                        formData['childFiledNames' + i] = _.keys(formData[element][0]).join(',') // 子表字段名
                                        formData['childList' + i] = JSON.stringify(formData[element]) // 子表数据
                                        ischild = true
                                    }
                                } else {
                                    // 如果不是子表则是上传文件，则转字符串
                                    formData[element] = JSON.stringify(formData[element])
                                }
                            }
                            // formData[element];
                        })
                    // 判断需不需要存子表
                    if (ischild) {
                        formData.filedNames = formData.filedNames + ',table_name_children'
                    }

                    console.log(formData)
                    // 子表数据
                    // 调用保存接口
                    this.btndisabled = true
                    this.todoManageOperationObject.formData = formData
                    this.todoManageOperationObject.url = url
                    // formData.jsonContent=JSON.stringify(this.jsonData).toString()
                    // 获取是否部门负责人
                    formData.filedNames = formData.filedNames + ',is_leaders'
                    // formData.is_leaders = this.$store.getters.userInfo.identity
                    formData.is_leaders = this.$store.getters.userInfo.isPossess
                    // 清除子表规则的属性
                    _.keys(formData).forEach(r => {
                        if (r.indexOf('child&') != -1) {
                            delete formData[r]
                        }
                    })
                    // 如果手机端子表得则需要修改json
                    // var jsonPamats = JSON.parse(JSON.stringify(this.jsonData))
                    var jsonPamats = JSON.parse(JSON.stringify(this.jsonDataSave))
                    if (!this.isSJ && this.isNew) {
                        jsonPamats = null
                    }
                    this.todoManageOperationObject.jsonData = jsonPamats
                    // 非我的待办节点打卡表单界面
                    postFormDataAction(url, formData, { jsonContent: jsonPamats })
                        .then(res => {
                            if (res.success) {
                                this.todoManageOperationObject.isSave = true
                                this.$message.success('保存成功！')
                                console.log('123')
                                this.$emit('afterSubmit', formData)
                                this.$emit('close')
                                // resolve(true);
                            } else {
                                this.$message.error(res.message)
                                // resolve(false);
                            }
                        })
                        .finally(() => {
                            this.btndisabled = false
                            // resolve(false);
                        })
                })
                .catch(err => {
                    console.log(err, '校验失败')
                    // resolve(false);
                })
            // })
        },
        // 我的待办点击通过保存专用
        handleSubmit2 (e) {
            // return new Promise((resolve)=>{
            // 通过函数获取数据
            this.$refs.KFB.getData()
                .then(res => {
                    // 处理手机端子表数据
                    if (this.isSJ) {
                        this.itemData(res)
                    }
                    // 清除为空的表单数据
                    _.keys(res).forEach(r => {
                        if (!res[r]) {
                            delete res[r]
                        }
                    })
                    // 获取数据成功
                    let formData = JSON.parse(JSON.stringify(res))
                    console.log(formData)
                    formData.id = this.data.id
                    formData.procDefId = this.processData.id
                    formData.procDeTitle = this.processData.name
                    // formData.jsonContent=JSON.stringify(this.jsonData)
                    if (!formData.tableName) formData.tableName = this.processData.businessTable
                    formData.filedNames = _.keys(res).join(',')
                    formData.filedNames = getFiledNames(formData) // 获取主表字段，排除子表标识
                    var url = this.url.addApply
                    if (!this.isNew) {
                        url = this.url.editForm
                    }
                    // 是否存在子表
                    let ischild = false
                    // 循环表单字段属性判断是否属性中包含数组对象
                    let i = 0 // 子表数量
                    _.keys(res)
                        .join(',')
                        .split(',')
                        .forEach(element => {
                            if (formData[element] instanceof Array) {
                                // 判断是否符合子表命名规则
                                if (element.indexOf('&') != -1) {
                                    let tableChildNameList = element.split('&')
                                    // 判断是否能拆分两个字符，子表标识和子表数据库名称
                                    if (tableChildNameList.length == 2) {
                                        i++
                                        let childName = tableChildNameList[1] // 子表数据库名称
                                        if (!formData.table_name_children) {
                                            // 第一次拼接
                                            formData.table_name_children = childName // 表名
                                        } else {
                                            // 后面的表明拼接用“,”隔开
                                            formData.table_name_children = formData.table_name_children + ',' + childName // 表名
                                        }
                                        // 定义属性名和值
                                        formData['childFiledNames' + i] = _.keys(formData[element][0]).join(',') // 子表字段名
                                        formData['childList' + i] = JSON.stringify(formData[element]) // 子表数据
                                        ischild = true
                                    }
                                } else {
                                    // 如果不是子表则是上传文件，则转字符串
                                    formData[element] = JSON.stringify(formData[element])
                                }
                            }
                            // formData[element];
                        })
                    // 判断需不需要存子表
                    if (ischild) {
                        formData.filedNames = formData.filedNames + ',table_name_children'
                    }

                    console.log(formData)
                    // 子表数据
                    // 调用保存接口
                    this.btndisabled = true
                    this.todoManageOperationObject.formData = formData
                    this.todoManageOperationObject.url = url
                    // 获取是否部门负责人
                    formData.filedNames = formData.filedNames + ',is_leaders'
                    // formData.is_leaders = this.$store.getters.userInfo.identity
                    formData.is_leaders = this.$store.getters.userInfo.isPossess
                    // 清除子表规则的属性
                    _.keys(formData).forEach(r => {
                        if (r.indexOf('child&') != -1) {
                            delete formData[r]
                        }
                    })
                    // 如果手机端子表得则需要修改json
                    // var jsonPamats = JSON.parse(JSON.stringify(this.jsonData))
                    var jsonPamats = JSON.parse(JSON.stringify(this.jsonDataSave))
                    if (!this.isSJ && this.isNew) {
                        jsonPamats = null
                    }
                    this.todoManageOperationObject.jsonData = jsonPamats
                })
                .catch(err => {
                    console.log(err, '校验失败')
                    // resolve(false);
                })
            // })
        },
        close () {
            this.$emit('close')
        },
        getData () {
            // 通过函数获取数据
            this.$refs.KFB.getData()
                .then(res => {
                    // 获取数据成功
                    alert(JSON.stringify(res))
                })
                .catch(err => {
                    console.log(err, '校验失败')
                })
        },
        // 刷新待办列表
        refreshToDo () {
            this.close()
            this.$emit('getDataList')
        },
        itemData (res) {
            var childName = '' // 子表规则名称
            var itemIndex = 0
            this.jsonData.list.forEach((element, index) => {
                if (element.label.indexOf('child&') != -1) {
                    childName = element.label // 获取规则名
                    itemIndex = itemIndex + 1
                }
            })
            var itemList = [] // 封装子表数据
            for (var i = 1; i <= itemIndex; i++) {
                var itemObject = {} // 子表对象
                this.itemModelNameList.forEach(name => {
                    // 获取子表得值和封装对象
                    itemObject[name] = res[name + '@' + i]
                    delete res[name + '@' + i]
                })
                itemList.push(itemObject)
            }
            res[childName] = itemList // 完成子表数据封装
            console.log(res)
        },
        deleteRow (idIndex) {
            // 删除
            this.jsonData.list.splice(idIndex, 1)
            // 删除掉得json之后 重新处理model 和value
            let childIndex = 0
            this.jsonData.list.forEach((element, index) => {
                if (element.label.indexOf('child&') != -1) {
                    childIndex = childIndex + 1
                    // 只有当前删除的对象json的后面对象json才进行修改
                    if (index >= idIndex) {
                        // 修改删除按钮的index
                        element.columns[0].list[1].options.defaultValue =
              '<a href="javascript:void(0);" \n onclick="deleteRow(' + childIndex + ')">删除</a>'
                        // 修改model
                        updateModel(element, childIndex)
                        // 需要调整的子表值
                        var updateModelObject = {}
                        // 修改value
                        this.$refs.KFB.getData().then(res => {
                            // 根据原始字段名拼接带规则的
                            this.itemModelNameList.forEach(modelName => {
                                updateModelObject[modelName + '@' + childIndex] = res[modelName + '@' + (childIndex + 1)]
                            })
                            this.$refs.KFB.setData(updateModelObject)
                        })
                    }
                }
            })
            console.log(JSON.stringify(this.jsonData.list))
        },
        add () {
            let childLable = '' // 子表json标题
            let childValue = {} // 新增子表json
            let isReturn = false
            let childIndex = 0
            var itemList = []
            this.jsonData.list.forEach((element, index) => {
                if (element.label.indexOf('child&') != -1) {
                    childValue = JSON.parse(JSON.stringify(element))
                    childLable = element.label
                    // 处理删除按钮
                    childIndex = childIndex + 1
                    // element.columns[0].list[1].options.dynamicFun = 'delete' + childIndex
                    console.log(element.columns[0].list[1].options)
                    element.columns[0].list[1].options.defaultValue =
            '<a href="javascript:void(0);" \n onclick="deleteRow(' + childIndex + ')">删除</a>'
                    updateModel(childValue, childIndex)
                }

                if (!isReturn && childLable != '' && element.label != childLable) {
                    isReturn = true
                    // 处理删除按钮
                    childIndex = childIndex + 1
                    // childValue.columns[0].list[1].options.dynamicFun = 'delete' + childIndex
                    childValue.columns[0].list[1].options.defaultValue =
            '<a href="javascript:void(0);" \n onclick="deleteRow(' + childIndex + ')">删除</a>'
                    updateModel(childValue, childIndex)
                    // this.jsonData.list.splice(index, 0, childValue)
                    itemList.push(childValue)
                }
                itemList.push(element)
            })
            this.jsonData.list = itemList
            console.log(JSON.stringify(this.jsonData.list))
        },
        // 把整个子表json的model进行规则修改
        async listUpdateModel () {
            let modelIndex = 0 // 子表model自增
            // 循环整个json的表单
            this.jsonData.list.forEach((element, index) => {
                // 找到为子表的json
                if (element.label.indexOf('child&') != -1) {
                    this.isSJ = true
                    // 获取子表原始得model字段名
                    if (modelIndex == 0) {
                        var i = 1
                        var itemString = JSON.stringify(element)
                        var itemModelNameList = [] // 储存子表字段名
                        for (var i = 1; i !== -1;) {
                            // 动态字符位置
                            i = itemString.indexOf('"model"', i)
                            if (i !== -1) {
                                // 从指定字符的周后一个字符后开始找(")
                                var ihStart = itemString.indexOf('"', i + 7)
                                // 再从 (") 后面位置还是找下一个 (")
                                var ihEnd = itemString.indexOf('"', ihStart + 1)
                                // 获取引号之间的字符
                                var model = itemString.substring(ihStart + 1, ihEnd)
                                // 如果动态表示不为空则获取
                                if (model != '') {
                                    if (model.indexOf('@') != -1) {
                                        model = model.substring(0, model.length - 2)
                                    }
                                    itemModelNameList.push(model)
                                }
                                i = ihEnd + 1
                            }
                        }
                        this.itemModelNameList = itemModelNameList
                    }
                    modelIndex = modelIndex + 1
                    // 修改model
                    updateModel(element, modelIndex)
                }
            })
        },
        //计算时间差
        timeDifference(start, end,state){
            // if(start>end){
            //    this.$message.error('起始时间不可大于结束时间');
            // }else{
              let beginTime = (new Date(start).getTime()) / 1000;
              let endTime = (new Date(end).getTime()) / 1000;
               //计算天数
              var timediff = endTime - beginTime;
              var days = parseInt(timediff / 86400);  //60*60*24
             //计算小时数
             var remain = timediff % 86400 ;
             var hours = parseInt(remain / 3600);
             //计算分钟数
             var remain = remain % 3600;
             var mins = parseInt(remain / 60);
             var res = days + '天' + hours + '小时' + mins + '分';
             if(state == 'min'){
                return days*24*60+hours*60+mins
             }else if(state == 'hour'){
                 return days*24+hours+mins/60
             }else if(state == 'day'){
                 if(start.split(' ').length==1 && end.split(' ').length == 1){
                      return days+1+hours/24+mins/60/24
                 }else{
                     return days+hours/24+mins/60/24
                 }
                  
             }else if(state == 'day/hour/min'){
                 return days+'天'+hours+'小时'+mins+'分'
             }else if(state == 'hour/min'){
                 return (days*24+hours)+'小时'+mins+'分'
             }
            }
             
      }
    // }
}

// 获取主表字段，排除子表标识
function getFiledNames (formData) {
    let filedNames = ''
    let list = formData.filedNames.split(',') // 获取表单属性名集合
    list.forEach(element => {
        if (element.indexOf('&') == -1) {
            // 查询是否有这个字段
            if (filedNames == '') {
                // 第一次则直接等于
                filedNames = element
            } else {
                // 后面用逗号隔开
                filedNames = filedNames + ',' + element
            }
        }
    })
    return filedNames
}
// 根据开始时间 结束时间计算天数
function startEndFun (start, end) {
    let startTime = new Date(start)
    let endTime = new Date(end)
    if (startTime >= endTime) {
        return 0
        }
    // 1,分钟取整
    startTime = carryTime(startTime)
    endTime = carryTime(endTime)
    // 2，计算总天数
    var totalTime = 0 // 工时，天数
    if (startTime.getDay() == 6 || startTime.getDay() == 0) {
        totalTime = endTime.getDate() - startTime.getDate()
    } else {
        totalTime = Math.floor((endTime - startTime) / (3600 * 1000) / 24)
    }
    // 3,拿初始值赋值给一个临时变量
    var tempStartTime = new Date()
    tempStartTime.setTime(startTime.getTime())
    // 4,计算出总天数
    while (tempStartTime.getDate() < endTime.getDate()) {
        if (tempStartTime.getDay() == 6 || tempStartTime.getDay() == 0) {
            // 周六或者周日减去
            totalTime--
        }
        tempStartTime.setDate(tempStartTime.getDate() + 1)
    }

    // 5,计算出总小时数
    var temp = 0 // 工时，小时
    do {
        if (startTime.getDay() == 6 || startTime.getDay() == 0) {
            // 周六周日
            startTime.setDate(startTime.getDate() + 1)
            //* ********周六周日直接跳过，初始化为早晨9点
            startTime.setHours(9)
            startTime.setMinutes(0)
            continue
        }

        if (endTime.getDay() == 6 || endTime.getDay() == 0) {
            // 周六周日
            endTime.setDate(endTime.getDate() + 1)
            //* ********周六周日直接跳过，初始化为早晨9点
            endTime.setHours(9)
            endTime.setMinutes(0)
            continue
        }

        let tempMinutes = startTime.getHours() * 60 + startTime.getMinutes()
        // 上午9点到12点半，算工时
        if (tempMinutes >= 9 * 60 && tempMinutes < 12 * 60) {
            temp += 0.05
        }
        // 上午14点到18点半，算工时
        if (tempMinutes >= 13 * 60 && tempMinutes < 18 * 60) {
            temp += 0.05
        }
        startTime.setTime(startTime.getTime() + 0.5 * 3600 * 1000) // 每次增加半个小时
    } while (startTime.getHours() * 60 + startTime.getMinutes() != endTime.getHours() * 60 + endTime.getMinutes())
    {
        totalTime += Math.floor(temp / 0.8)
        totalTime += temp % 0.8
        totalTime = Math.round(totalTime * 100) / 100
    }
    var days = Math.floor(totalTime)
    var hours = Math.round((totalTime - days) * 100) / 10
    console.log(days + '天', hours + '小时')
    return days * 8 + hours

    // if (start && end) {
    //   let startTime = new Date(start) // 开始时间
    //   let endTime = new Date(end) // 结束时间
    //   let usedTime = endTime - startTime // 相差的毫秒数
    //   let days = (usedTime / 1000 / 60 / 60).toFixed(2) // 计算出天数
    //   return days
    // } else {
    //   return null
    // }
}

// 格式化时间
function formatDate (date, fmt) {
    if (/(y+)/.test(fmt)) {
        fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
    }
    let o = {
        'M+': date.getMonth() + 1,
        'd+': date.getDate(),
        'h+': date.getHours(),
        'm+': date.getMinutes(),
        's+': date.getSeconds()
    }
    for (let k in o) {
        if (new RegExp(`(${k})`).test(fmt)) {
            let str = o[k] + ''
            fmt = fmt.replace(RegExp.$1, RegExp.$1.length === 1 ? str : padLeftZero(str))
        }
    }
    return fmt
}

function padLeftZero (str) {
    return ('00' + str).substr(str.length)
}

/*
 * 0-15分不算工时
 * 15-45算半个小时
 * 45-60算一个小时
 * */
function carryTime (date) {
    if (date.getMinutes() > 0 && date.getMinutes() < 15) {
        date.setMinutes(0)
    }
    if (date.getMinutes() >= 15 && date.getMinutes() < 30) {
        date.setMinutes(30)
    }
    if (date.getMinutes() > 30 && date.getMinutes() < 45) {
        date.setMinutes(30)
    }
    if (date.getMinutes() >= 45) {
        date.setHours(date.getHours() + 1)
        date.setMinutes(0)
    }
    return date
}

// function

/**
 * 修改model绑定值
 */
function updateModel (object, childIndex) {
    let keyString = _.keys(object).join(',')
    if (keyString.indexOf('model') != -1) {
    // 如果没有修改过则直接修改
        if (object['model'].indexOf('@') == -1) {
            object['model'] = object['model'] + '@' + childIndex
        } else {
            // 修改过则截取修改前的再进行修改
            var m = object['model'].substring(0, object['model'].length - 2)
            object['model'] = m + '@' + childIndex
        }
    }
    // 递归
    _.keys(object)
        .join(',')
        .split(',')
        .forEach(l => {
            if (object[l] instanceof Array) {
                object[l].forEach(element => {
                    updateModel(element, childIndex)
                })
            }
        })
}
</script>
<style lang="less" scoped>
@media print {
    @page {
    /* 横向 */
    size: landscape;
    /* 去除浏览器默认页眉页脚 */
    margin: 0;
  }
   .noprint {
    display: none;
  }
  /deep/.ant-input{
      border: none !important;
  }
  /deep/ .ant-modal-header{
       display: none !important;
  }
   /deep/ .ant-modal-content{
      box-shadow:none !important
  }
}
 /deep/ .anticon-question-circle-o {
    display: none !important;
}
</style>
