index.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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. form: []
  60. })
  61. const userStore = useUserStore()
  62. const title = ref('')
  63. onLoad((options) => {
  64. const { modelName, modelId, control } = options
  65. processInfo.modelName = modelName
  66. processInfo.modelId = modelId
  67. processInfo.control = control
  68. title.value = userStore.user.name + '的' + processInfo.modelName
  69. // 设置导航栏标题
  70. uni.setNavigationBarTitle({
  71. title: title.value
  72. });
  73. })
  74. onMounted(() => {
  75. initProcessInfo().then(() => {
  76. initProcessForm()
  77. })
  78. })
  79. function initProcessInfo() {
  80. return new Promise<void>((resolve, reject) => {
  81. getProcessInfo(processInfo)
  82. .then(({ returnParams }) => {
  83. const { formId, tmodelId, isMoreIns, pathJudgeType } = returnParams.flow[0]
  84. processInfo.formId = formId
  85. processInfo.tmodelId = tmodelId
  86. processInfo.isMoreIns = isMoreIns
  87. processInfo.pathJudgeType = pathJudgeType
  88. resolve()
  89. })
  90. })
  91. }
  92. const formElements = ref([])
  93. const startEleIndex = ref(0) // 开始时间
  94. const endEleIndex = ref(0) // 结束时间
  95. function initProcessForm() {
  96. getProcessForm(userStore.user, processInfo).then(({ returnParams }) => {
  97. formElements.value = returnParams.formElements
  98. startEleIndex.value = formElements.value.findIndex((item) => '开始时间' == item.elementName)
  99. endEleIndex.value = formElements.value.findIndex((item) => '结束时间' == item.elementName)
  100. // console.log('startEle', startEleIndex.value);
  101. // console.log('endEle', endEleIndex.value);
  102. if (startEleIndex.value != -1 && endEleIndex.value != -1) { // 判断是否需要计算时间差
  103. // console.log('if (startEleIndex && endEleIndex)');
  104. timeFlag.value = true
  105. disableEndTime.value = true // 计算时间差时默认禁用结束时间选择器
  106. formElements.value[startEleIndex.value].defaultValue = new Date()
  107. }
  108. })
  109. }
  110. const startTime = ref(0) // 开始时间
  111. const endTime = ref(0) // 结束时间
  112. const diffHours = ref(' ') // 时间差
  113. const timeFlag = ref(false) // 是否计算时间差
  114. const disableEndTime = ref(false) // 禁用 结束时间选择器
  115. function setTimeRange(e) {
  116. if (timeFlag.value && '开始时间' == e.elementName) {
  117. startTime.value = e.defaultValue // 设置 开始时间
  118. disableEndTime.value = false // 解除 结束时间选择器 禁用
  119. }
  120. if (timeFlag.value && '结束时间' == e.elementName) {
  121. endTime.value = e.defaultValue // 设置 结束时间
  122. }
  123. if (timeFlag.value && startTime.value && endTime.value) {
  124. const start = new Date(startTime.value).getTime() // 获取 开始时间 时间戳
  125. const end = new Date(endTime.value).getTime() // 获取 结束时间 时间戳
  126. const diffSec = Math.abs(end - start) // 获取 时间戳 差值
  127. diffHours.value = (diffSec / 1000 / 60 / 60).toFixed(2) // 计算 时间差值 并格式化 为只有2位小数
  128. }
  129. }
  130. let fileList = ref([]) // 文件列表
  131. function handleSelect(e) { // 新增文件
  132. console.log('handleSelect', e)
  133. for (const file of e.tempFiles) {
  134. fileList.value.push(file)
  135. }
  136. }
  137. function handleProgress(e) { // 文件上传
  138. console.log('handleProgress', e)
  139. }
  140. function handleDelete(e) { // 移除文件
  141. console.log('handleDelete', e)
  142. fileList.value.splice(fileList.value.indexOf(e.tempFiles), 1)
  143. }
  144. function submitProcess() { // 提交表单
  145. // const form = formElements.value.map(({tableField, defaultValue}) => {
  146. // return { name: tableField, value: defaultValue }
  147. // })
  148. processInfo.form = formElements.value.map(({tableField, defaultValue}) => {
  149. return { name: tableField, value: defaultValue }
  150. })
  151. console.log('submitProcess', processInfo)
  152. console.log('fileList', fileList)
  153. }
  154. </script>
  155. <style lang="scss"></style>