<template>
	<view>
		<u-subsection
			:list="procInsId?['表单信息', '流转记录']:['表单信息']"
			mode="button"
			:fontSize="16"
			:current="tabIndex"
			@change="tabSelect"
		></u-subsection>
		<view v-show="0 === tabIndex">
			<scroll-view scroll-y>
			<view class=" bg-white ">
				
				<TestActivitiLeaveForm  v-if="formUrl.endsWith('TestActivitiLeaveForm')" :formReadOnly="formReadOnly" :class="formReadOnly?'readonly':''"  ref="form" :businessId="businessId"></TestActivitiLeaveForm>
				<DisposeRubbishForm  v-if="formUrl.endsWith('DisposeRubbishForm')" :formReadOnly="formReadOnly" :class="formReadOnly?'readonly':''"  ref="form" :businessId="businessId"></DisposeRubbishForm>
				  <!-- <component :formReadOnly="formReadOnly" :class="formReadOnly?'readonly':''"  ref="form" :businessId="businessId" :is="form"></component> -->
				  <PreviewForm :formData="formData"  v-if="formType !== '2'"  :processDefinitionId="procDefId" :edit="true" ref="form"></PreviewForm>
			</view>
			<view class=" bg-white margin-top" v-if="!procInsId || taskId">
				<u--form :model="auditForm" labelWidth="130px" class="u-form" labelPosition="left" :rules="rules" ref="auditForm">
					<u-form-item v-if="!procInsId" label="流程标题" borderBottom prop="title">
						<u--input v-model="title" placeholder="请输入流程标题" border="none"></u--input>
					</u-form-item>
					<u-form-item  v-if="taskId" label="审批意见" borderBottom prop="message">
						<u--textarea v-model="auditForm.message"  placeholder="请输入审批意见" border="none"></u--textarea>
					</u-form-item>
					<!--<u-form-item label="是否抄送" borderBottom prop="isCC">
						<u-switch v-model="isCC" ></u-switch>
					</u-form-item>
					<u-form-item label="抄送给"  v-if="isCC">
						<user-select  v-model="auditForm.userIds" ></user-select>
					</u-form-item>
					<u-form-item label="指定下一步处理者" borderBottom prop="isAssign">
						<u-switch v-model="isAssign" ></u-switch>
					</u-form-item>
					<u-form-item label="指定" v-if="isAssign">
						<user-select v-model="auditForm.assignee"  ></user-select>
					</u-form-item>-->
						<user-select-dialog title="选择转办用户" ref="transferUserSelectDialog" :showRadio="true" :showCheckBox="false" @doSubmit="selectUsersToTransferTask"></user-select-dialog>
						<user-select-dialog title="选择委派用户" ref="delegateUserSelectDialog" :showRadio="true" :showCheckBox="false" @doSubmit="selectUsersToDelateTask"></user-select-dialog>
						<user-select-dialog title="选择加签用户" ref="addSignTaskUserSelectDialog"  @doSubmit="selectUsersToAddSignTask"></user-select-dialog>
						<task-back-nodes ref="taskBackNodes" @getBackTaskDefKey="back"></task-back-nodes>
					<view class="bottom-wrap  flex">
						<view class="flex-sub"  v-show="button.isHide === '0'"
						 v-for="(button, index) in buttons" :key="index" >
						 <u-button type="primary" class=" buttonBox" :color="colors[index]" @click="submit(button, buttons)" :text="button.name"></u-button>
						</view>						
					</view>
				</u--form>
			</view>
			<u-gap height="70"></u-gap>
		</scroll-view>
		</view>
		<view v-show="1 === tabIndex">
			<view class="padding bg-white">
	
				<view class="cu-timeline" :key="index" v-for="(act, index) in historicTaskList">
					<view class="cu-time">{{act.histIns.startTime |formatDate('MM-DD')}}</view>
					<view class="cu-item text-blue">
						<view class="content">
							<view class="cu-capsule radius">
								<view class="cu-tag bg-cyan">{{act.histIns.activityName}}</view>
								<!-- <view class="cu-tag line-cyan">{{act.histIns.activityName}}</view> -->
							</view>
							
							<view class="margin-top">
								审批人 ： {{act.assigneeName}}
							</view>
							<view class="margin-top">
								办理状态 ：<view class="cu-tag bg-blue">{{act.comment.status}}</view> 
							</view>
							<view class="margin-top">
								审批意见 ： {{act.comment.message}}
							</view>
							<view class="margin-top">
								开始时间 : {{act.histIns.startTime |formatDate}}
							</view>
							<view class="margin-top">
								结束时间 : {{act.histIns.endTime |formatDate}}
							</view>
							<view class="margin-top">
								用时 : {{act.durationTime || '0秒'}}
							</view>
						</view>
					</view>
				</view>
			</view>
		</view>
	</view>
</template>

<script>
	import userSelect from '@/components/user-select/user-select.vue'
	import userSelectDialog from '@/components/user-select/user-select-dialog.vue'
	import PreviewForm from '../form/GenerateFlowableForm'
	import TaskBackNodes from './components/TaskBackNodes.vue'
	import TestActivitiLeaveForm from '@/pages/test/activiti/TestActivitiLeaveForm.vue'
	import DisposeRubbishForm from '@/pages/edt/DisposeRubbishForm.vue'
	import moment from 'moment'
	import taskService from "@/api/flowable/taskService"
	import formService from "@/api/flowable/formService"
	import processService from "@/api/flowable/processService"
	import flowCopyService from "@/api/flowable/flowCopyService"
	import taskDefExtensionService from "@/api/flowable/taskDefExtensionService"
	var  graceChecker = require("@/common/graceChecker.js");
	export default {
		onLoad: function (option) {
		    this.flow = JSON.parse(decodeURIComponent(option.flow));
			this.procDefId = this.flow.procDefId
			this.procDefKey = this.flow.procDefKey
			this.formType = this.flow.formType
			this.formUrl = this.flow.formUrl
			this.taskId = this.flow.taskId
			this.taskDefKey = this.flow.taskDefKey
			this.status = this.flow.status
			this.title = this.flow.formTitle
			this.businessId = this.flow.businessId
			this.procInsId = this.flow.procInsId
			this.formReadOnly = this.flow.formReadOnly !== undefined && this.flow.formReadOnly !== 'false' && this.flow.formReadOnly !== false
			this.isCC = false
			this.isAssign = false
			this.auditForm.assignee = null
			this.auditForm.userIds = null
			this.auditForm.message = ''
			uni.setNavigationBarTitle({
			    title: this.title
			});
		},
		async mounted () {
			  if (this.formType === '2') { //外置表单
				if (this.formUrl === '/404') {
				  this.form = null
				  uni.showToast({ title: '没有关联流程表单!', icon: "none" });
				} else {
				  // uniapp 不支持动态组件，所以通过名称匹配决定调用的表单组件
				  if(this.formUrl.endsWith('TestActivitiLeaveForm')){ 
					  this.form = TestActivitiLeaveForm
				  }
				  // uniapp 不支持动态组件，所以通过名称匹配决定调用的表单组件
				  if(this.formUrl.endsWith('DisposeRubbishForm')){
					  this.form = DisposeRubbishForm
				  }else{
					  uni.showToast({ title: '没有关联流程表单!', icon: "none" });
				  }
				    
				}
			  } else { // 动态表单
			  // 读取流程表单
				if (this.formUrl === '/404') {
				   uni.showToast({ title: '没有关联流程表单!', icon: "none" });
				} else {
				  let data = await formService.getMobileForm(this.formUrl);
				 // 初始化动态表单
				  data.forEach((item)=>{ //挂载 writable，readable,value 属性，是为了触发对这三个属性的监听
					  item.writable = true
					  item.readable = true
					  if(this.isObjectValue(item)){
						  item.value = null
					  }else{
						  item.value = ''
					  }
					  let input = JSON.parse(JSON.stringify(item))
					  this.formData.push(input)
				  })
				  if (this.status === 'start') {
				    // 读取启动表单配置
				    let data = await formService.getStartFormData({processDefinitionId: this.procDefId})
				    this.setData(data, 'start')
				  } else {
				    // 读取任务表单配置
				    let data = await formService.getTaskFormData({taskId: this.taskId})
				    this.setData(data, 'audit')
				  }
				}
			  }
			   // 读取按钮配置
			  if (this.status === 'start') {
				this.buttons = [{code: '_flow_start', name: '启动', isHide: '0'}]
			  } else if (this.procDefKey && this.taskDefKey) {
				// 读取按钮
				taskDefExtensionService.queryByDefIdAndTaskId({
				  processDefId: this.procDefKey,
				  taskDefId: this.taskDefKey
				}).then((data) => {
					this.buttons = data.flowButtonList
				})
			  }
			// 读取历史任务列表
			  taskService.historicTaskList(this.procInsId).then((data) => {
				this.historicTaskList = data.reverse()
			  })
		},
		components:{
		  userSelect,
		  userSelectDialog,
		  TestActivitiLeaveForm,
		  DisposeRubbishForm,
		  TaskBackNodes,
		  PreviewForm
		},
		data() {
			return {
				flow: null,
				tabIndex: 0,
				form: null,
				formType: '',
				formUrl: '',
				taskSelectedTab: 'frist',
				historicTaskList: [],
				procDefId: '',
				procInsId: '',
				formReadOnly: false,
				procDefKey: '',
				taskId: '',
				formData: [],
				taskDefKey: '',
				status: '',
				title: '',
				businessId: '',
				buttons: [],
				isCC: false,
				isAssign: false,
				colors: [ '#3c9cff', '#f56c6c', '#5ac725', '#f9ae3d', '#89c152',  
						  '#c38cc1', '#448aca', '#73d1f1', '#ffb34b', '#f18080', 
						  '#88a867', '#bfbf39', '#94d554', '#f19ec2', '#afaae4',
						  '#86cefa', '#98d1ee', '#72dcdc', '#9acdcb', '#77b1cc', '#80a7dc'
				],
				auditForm: {
				  message: '',
				  type: '',
				  status: '',
				  userIds: null,
				  assignee: null
				},
				rules: {
					'title': [
						{
							required: true,
							message: '流程标题',
							trigger: ['blur', 'change']
						}
					],
					'messsage': [
						{
							required: true,
							message: '审批内容',
							trigger: ['blur', 'change']
						}
					]
				}
			}
		},
		methods:{
			tabSelect (index) {
				this.tabIndex = index
			},
			// 为任务表单赋值
			setData (taskFormData, status) {
				this.formData.forEach((input)=>{
					let item = taskFormData.filter((item)=>{
						if(input.model === item.id){
							return true
						}else{
							return false
						}
					})[0]
					if(item){
						if(status === 'start'){
							this.isFixParam(input)
							if(this.isObjectValue(input)){
								  if(input.options.defaultValue && typeof input.options.defaultValue=== 'string'){
									  input.value =  JSON.parse(input.options.defaultValue)
								  }else{
									  input.value =  input.options.defaultValue
								  } 
							}else{
								
								 input.value =  input.options.defaultValue || ''
							}
						}else{
							if(this.isObjectValue(input)){
								  if(item.value && typeof item.value=== 'string'){
									   input.value =  JSON.parse(item.value)
								   }else {
									   input.value = item.value
								   }
							   }else{
								   input.value = item.value
							  }
						}
						
						input.readable = item.readable
						input.writable = item.writable
					}else{
						input.readable = false
					}
				})
			},
			// 默认参数赋值替换 ${user.name}...
			isFixParam (input) {
			   if(/^[$][{].*[}]$/.test(input.options.defaultValue)){
				  let params = input.options.defaultValue.substring(2, input.options.defaultValue.length-1)
				  if(params === "new Date()"){
					input.options.defaultValue = moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
				  }else{
					let value = {user: this.$store.state.user.userInfo}
					params.split('.').forEach((param)=>{
					  value = value?.[param]
					})
					input.options.defaultValue = value
				  }
				}
			},
			// 判断数据类型是否是非String类型
			isObjectValue (input) {
				if(input.type === 'checkbox' ||
				   input.type === 'slider' ||
				   input.type === 'switch' ||
				   input.type === 'rate' ||
				   input.type === 'fileupload'	   ||
				   input.type === 'imgupload' ||
				   input.type === 'select' && input.options.multiple ){
					   return true
				  }
				  return false
			},
			// 抄送
			cc (procInsId) {
				if (this.isCC && this.auditForm.userIds) {
					  flowCopyService.save({
						userIds: this.auditForm.userIds,
						procDefId: this.procDefId,
						procInsId: procInsId,
						procDefName: '',
						procInsName: this.title,
						taskName: ''
					  })
				}
			  },
			// 暂存草稿
			 save () {
	  
			 },
			// 启动流程
			start (vars) {
			  if (this.formType === '2') { // 外置表单启动
				this.$refs.form.saveForm((businessTable, businessId,disposeType) => {
					console.log('start方法disposeType',disposeType)
				  taskService.start({
					procDefKey: this.procDefKey,
					businessTable: businessTable,
					businessId: businessId,
					...vars,
					title: this.title,
					assignee: this.auditForm.assignee,
				    disposeType: disposeType
				  }).then((data) => {
					  uni.showToast({ title: "启动成功", icon: "success" });
					  /*uni.navigateTo({
						  //url: '/pages/workbench/task/TodoList'
						  //url: '/pages/workbench/workbench'
						  url: '/pages/index/index'
					  })*/
					  uni.reLaunch({
						  //url: '/pages/workbench/task/TodoList'
						  //url: '/pages/workbench/workbench'
						  url: '/pages/index/index'
					  })
					  this.cc(data)
				  })
				})
			  } else { //动态表单启动
				this.$refs.form.submitStartFormData({
				  processDefinitionId: this.procDefId,
				  ...vars,
				  title: this.title,
				  assignee: this.auditForm.assignee
				}, (data) => {
					uni.showToast({ title: "启动成功", icon: "success" });
					uni.navigateTo({
						url: '/pages/workbench/task/TodoList'
					})
					this.cc(data)
				})
			  }
			},
			// 同意
			agree () {
			  this.commit() // 同意
			},
			// 驳回
			reject () {
				uni.showModal({
				    title: '提示',
				    content: '确定驳回流程吗？',
				    success: (res) => {
				        if (res.confirm) {
							uni.showLoading()
							taskService.backNodes(this.taskId).then((data) => {
				            	let backNodes = data
				            	if (backNodes.length > 0) {
				            	  let backTaskDefKey = backNodes[backNodes.length - 1].taskDefKey
				            	  this.back(backTaskDefKey)
				            	}
				             })
				        } else if (res.cancel) {
				           uni.hideLoading()
				        }
				    }
				});
			},
			// 驳回到任意节点
			turnBack () {
			  this.$refs.taskBackNodes.init(this.taskId)
			},
			// 回退到任意节点
			back (backTaskDefKey) {
			  taskService.back({
				taskId: this.taskId,
				backTaskDefKey: backTaskDefKey,
				...this.auditForm
			  }).then((data) => {
				  uni.showToast({ title: "驳回成功", icon: "success" });
				  uni.navigateTo({
				  	url: '/pages/workbench/task/TodoList'
				  })
				  this.cc(data)
			  })
			},
			// 加签
			addMultiInstance () {
			  // this.$refs.addSignTaskUserSelectDialog.showModal()
			},
			selectUsersToAddSignTask (users) {
			  let userIds = users.map((user) => {
				return user.id
			  }).join(',')
			  taskService.addSignTask({taskId: this.taskId, userIds: JSON.stringify(userIds), message: '', flag: false}).then((data) => {
				uni.showToast({ title: data, icon: "success" });
			  })
			},
			// 减签
			delMultiInstance () {
	  
			},
			// 转办
			transfer () {
			  this.$refs.transferUserSelectDialog.showModal()
			},
			selectUsersToTransferTask (userId) {
				alert(userId)
			  if(!userId){
				  uni.showToast({ title: '没有选择任何用户!', icon: "none" });
				  return
			  }
			  taskService.transfer(this.taskId, userId).then((data) => {
				uni.showToast({ title: data, icon: "success" });
				uni.navigateTo({
					url: '/pages/workbench/task/TodoList'
				})
			  })
			},
			// 委托
			delegate () {
			  this.$refs.delegateUserSelectDialog.showModal()
			},
			selectUsersToDelateTask (userId) {
			  if(!userId){
				  uni.showToast({ title: '没有选择任何用户!', icon: "none" });
				  return
			  }
			  taskService.delegate(this.taskId, userId).then((data) => {
				uni.showToast({ title: data, icon: "success" });
				uni.navigateTo({
					url: '/pages/workbench/task/TodoList'
				})
			  })
			},
			// 终止
			stop () {
				//uni.showLoading()
				uni.showModal({
				    title: '提示',
				    content: '确定终止流程吗？',
				    success: (res) => {
				        if (res.confirm) {
							processService.stop(this.procInsId, this.auditForm.message).then((data) => {
								console.log(data)
				              uni.showToast({ title: data, icon: "success" });
				              uni.reLaunch({
								  //url: '/pages/workbench/task/TodoList'
								  //url: '/pages/workbench/workbench'
								  url: '/pages/index/index'
				              })
				            })
				        } else if (res.cancel) {
				           uni.hideLoading()
				        }
				    }
				});
			},
			// 打印
			print () {
	  
			},
			// 自定义按钮提交
			commit (vars) {
				//定义表单规则
				 var rule = [
					/*{name:"message", checkType : "notnull", checkRule:"",  errorMsg:"审批意见不能为空!"}*/
				 ];
				 //进行表单检查
				 var formData = this.auditForm;
				 var checkRes = graceChecker.check(formData, rule);
				 if(!checkRes){
				  uni.showToast({ title: graceChecker.error, icon: "none" });
				  return;
				}
				 if (this.formType === '2') { //外置表单审批
					this.$refs.form.saveForm((businessTable, businessId) => {
					  taskService.audit({
						taskId: this.taskId,
						taskDefKey: this.taskDefKey,
						procInsId: this.procInsId,
						procDefId: this.procDefId,
						vars: vars,
						comment: this.auditForm,
						assignee: this.auditForm.assignee
				  }).then((data) => {
						uni.showToast({ title: "审批成功", icon: "success" });
						uni.reLaunch({
							//url: '/pages/workbench/task/TodoList'
							//url: '/pages/workbench/workbench'
							url: '/pages/index/index'
						})
					  this.cc(data)
				  })
				})
			 } else { // 动态表单启动
				this.$refs.form.submitTaskFormData(vars, this.procInsId, this.taskId, this.auditForm.assignee, this.auditForm, (data) => {
					uni.showToast({ title: "启动成功", icon: "success" });
					uni.navigateTo({
						url: '/pages/workbench/task/TodoList'
					})
					//抄送
					this.cc(data)
				})
			 }
		},
			submit (currentBtn, buttons) {
			  let vars = {} // 存储流程变量
	  
			  // 把当前操作对应的自定义按钮(以_flow_开头的是系统按钮，排除在外）的编码，存储为对应的流程变量，值设置为true，其余自定义按钮编码对应的流程变量值为false。
			  buttons.forEach((btn) => {
				if (btn.code && !btn.code.startsWith('_flow_')) {
				  vars[btn.code] = false
				}
			  })
			  if (currentBtn.code && !currentBtn.code.startsWith('_flow_')) {
				vars[currentBtn.code] = true
			  }
			  vars.title = this.title // 标题
			  vars.assignee = this.auditForm.assignee // 指定的下一步骤处理人
			  this.auditForm.type = currentBtn.code // 提交类型
			  this.auditForm.status = currentBtn.name // 按钮文字
			  
			  switch (currentBtn.code) {
				case '_flow_start': // 自动流程
				  this.start(vars)
				  break
				case '_flow_save': // 保存草稿
				  this.save()
				  break
				case '_flow_agree': // 同意
				  this.agree()
				  break
				case '_flow_reject': // 驳回
				  this.reject()
				  break
				case '_flow_back': // 驳回到任意步骤
				  this.turnBack()
				  break
				case '_flow_add_multi_instance': // 加签
				  this.addMultiInstance()
				  break
				case '_flow_del_multi_instance': // 减签
				  this.delMultiInstance()
				  break
				case '_flow_transfer': // 转办
				  this.transfer()
				  break
				case '_flow_delegate':// 外派
				  this.delegate()
				  break
				case '_flow_stop':// 终止
				  this.stop()
				  break
				case '_flow_print':// 打印
				  this.print()
				  break
				default:
				  this.commit(vars) // 自定义按钮提交
			  }
			}
		}
	}
</script>
