index.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. <template>
  2. <view>
  3. <uni-card margin="10px" spacing="0">
  4. <uni-forms label-position="left" :label-width="110" :border="true">
  5. <uni-forms-item v-for="(item, index) in formElements" :label="item.elementName" :key="index">
  6. <uni-easyinput v-if="'多少小时' == item.elementName" :disabled="true" placeholder="请输入内容"
  7. :value="diffHours"></uni-easyinput>
  8. <!-- 输入框 -->
  9. <uni-easyinput v-else-if="'0' == item.type" :disabled="'0' == item.canEdit" placeholder="请输入内容"
  10. :value="item.defaultValue"></uni-easyinput>
  11. <!-- 下拉框 -->
  12. <!-- <uni-data-select v-else-if="'2'==item.type" :disabled="'0'==item.canEdit" placeholder="请选择内容" :value="item.defaultValue || 0" :localdata="item.typeDetail.enum"></uni-data-select> -->
  13. <!-- <button @click="openPopup">打开弹窗</button> -->
  14. <!-- <uni-popup ref="popup" type="bottom" border-radius="10px 10px 0 0">底部弹出 Popup 自定义圆角</uni-popup> -->
  15. <!-- 开始时间选择器 -->
  16. <uni-datetime-picker :end="endTime" @change="setTimeRange(item)"
  17. v-else-if="timeFlag && '9' == item.type && '开始时间' == item.elementName" v-model="item.defaultValue"
  18. :clear-icon="false" type="datetime" />
  19. <!-- 结束时间选择器 -->
  20. <uni-datetime-picker :start="startTime" @change="setTimeRange(item)" :disabled="disableEndTime"
  21. :placeholder="disableEndTime ? '请先确认开始时间' : '确认结束时间'"
  22. v-else-if="timeFlag && '9' == item.type && '结束时间' == item.elementName" v-model="item.defaultValue"
  23. :clear-icon="false" type="datetime" />
  24. <!-- 其他时间选择器 -->
  25. <uni-datetime-picker v-else-if="'9' == item.type" v-model="item.defaultValue" type="datetime" />
  26. </uni-forms-item>
  27. </uni-forms>
  28. </uni-card>
  29. <uni-card margin="10px" spacing="0">
  30. <uni-list-item>
  31. <template v-slot:header>
  32. 上传附件
  33. </template>
  34. </uni-list-item>
  35. <uni-list-item>
  36. <template v-slot:body>
  37. <uni-file-picker v-model="fileList" :autoUpload="false" mode="list" limit="5" file-mediatype="all"
  38. title="选择文件" @select="handleSelect" @progress="handleProgress"
  39. @delete="handleDelete"></uni-file-picker>
  40. </template>
  41. </uni-list-item>
  42. <button type="default" style="background-color: #007aff;color: #ffffff;" @click="submitProcess">提交</button>
  43. </uni-card>
  44. </view>
  45. </template>
  46. <script setup lang="ts">
  47. import { onMounted, reactive, ref } from 'vue'
  48. import { onLoad } from '@dcloudio/uni-app'
  49. import { useUserStore } from '@/store/user.js'
  50. import { getProcessInfo, getProcessForm } from '@/api/work.js'
  51. let processInfo = reactive({
  52. modelName: '流程申请',
  53. control: '',
  54. formId: '',
  55. modelId: '',
  56. tmodelId: '',
  57. isMoreIns: '',
  58. pathJudgeType: ''
  59. })
  60. onLoad((options) => {
  61. const { modelName, modelId, control } = options
  62. processInfo.modelName = modelName
  63. processInfo.modelId = modelId
  64. processInfo.control = control
  65. // 设置导航栏标题
  66. uni.setNavigationBarTitle({
  67. title: processInfo.modelName
  68. });
  69. })
  70. onMounted(() => {
  71. initProcessInfo().then(() => {
  72. initProcessForm()
  73. })
  74. })
  75. const userStore = useUserStore()
  76. function initProcessInfo() {
  77. return new Promise<void>((resolve, reject) => {
  78. getProcessInfo(processInfo)
  79. .then(({ returnParams }) => {
  80. const { formId, tmodelId, isMoreIns, pathJudgeType } = returnParams.flow[0]
  81. processInfo.formId = formId
  82. processInfo.tmodelId = tmodelId
  83. processInfo.isMoreIns = isMoreIns
  84. processInfo.pathJudgeType = pathJudgeType
  85. resolve()
  86. })
  87. })
  88. }
  89. const formElements = ref([])
  90. const startEleIndex = ref(0) // 开始时间
  91. const endEleIndex = ref(0) // 结束时间
  92. function initProcessForm() {
  93. getProcessForm(userStore.user, processInfo).then(({ returnParams }) => {
  94. formElements.value = returnParams.formElements
  95. startEleIndex.value = formElements.value.findIndex((item) => '开始时间' == item.elementName)
  96. endEleIndex.value = formElements.value.findIndex((item) => '结束时间' == item.elementName)
  97. // console.log('startEle', startEleIndex.value);
  98. // console.log('endEle', endEleIndex.value);
  99. if (startEleIndex.value != -1 && endEleIndex.value != -1) { // 判断是否需要计算时间差
  100. // console.log('if (startEleIndex && endEleIndex)');
  101. timeFlag.value = true
  102. disableEndTime.value = true // 计算时间差时默认禁用结束时间选择器
  103. formElements.value[startEleIndex.value].defaultValue = new Date()
  104. }
  105. })
  106. }
  107. const startTime = ref(0) // 开始时间
  108. const endTime = ref(0) // 结束时间
  109. const diffHours = ref(' ') // 时间差
  110. const timeFlag = ref(false) // 是否计算时间差
  111. const disableEndTime = ref(false) // 禁用 结束时间选择器
  112. function setTimeRange(e) {
  113. if (timeFlag.value && '开始时间' == e.elementName) {
  114. startTime.value = e.defaultValue // 设置 开始时间
  115. disableEndTime.value = false // 解除 结束时间选择器 禁用
  116. }
  117. if (timeFlag.value && '结束时间' == e.elementName) {
  118. endTime.value = e.defaultValue // 设置 结束时间
  119. }
  120. if (timeFlag.value && startTime.value && endTime.value) {
  121. const start = new Date(startTime.value).getTime() // 获取 开始时间 时间戳
  122. const end = new Date(endTime.value).getTime() // 获取 结束时间 时间戳
  123. const diffSec = Math.abs(end - start) // 获取 时间戳 差值
  124. diffHours.value = (diffSec / 1000 / 60 / 60).toFixed(2) // 计算 时间差值 并格式化 为只有2位小数
  125. }
  126. }
  127. let fileList = ref([]) // 文件列表
  128. function handleSelect(e) { // 新增文件
  129. console.log('handleSelect', e)
  130. for (const file of e.tempFiles) {
  131. fileList.value.push(file)
  132. }
  133. }
  134. function handleProgress(e) { // 文件上传
  135. console.log('handleProgress', e)
  136. }
  137. function handleDelete(e) { // 移除文件
  138. console.log('handleDelete', e)
  139. fileList.value.splice(fileList.value.indexOf(e.tempFiles), 1)
  140. }
  141. function submitProcess() { // 提交表单
  142. console.log('submitProcess')
  143. }
  144. </script>
  145. <style lang="scss"></style>