punchin-edit.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. <template>
  2. <main-layout :showHome="true" :showBack="true">
  3. <template>
  4. <uni-forms ref="punchInForm" :modelValue="punchInFormData" :label-width="80" :rules="punchInFormRules">
  5. <uni-section title="基本信息" padding="16px" type="line">
  6. <uni-forms-item label="任务名称" required name="taskName">
  7. <uni-easyinput v-model="punchInFormData.taskName" placeholder="请输入任务名称" />
  8. </uni-forms-item>
  9. <uni-forms-item label="奖励数" required name="rewardNum">
  10. <uni-easyinput v-model="punchInFormData.rewardNum" placeholder="请输入奖励数" type="number" />
  11. </uni-forms-item>
  12. <uni-forms-item label="周末双倍" required name="weekendDoubleFlag">
  13. <uni-data-checkbox v-model="punchInFormData.weekendDoubleFlag" :localdata="statusRange"></uni-data-checkbox>
  14. </uni-forms-item>
  15. <uni-forms-item label="全勤双倍" required name="fullAttendanceFlag">
  16. <uni-data-checkbox v-model="punchInFormData.fullAttendanceFlag" :localdata="statusRange"></uni-data-checkbox>
  17. </uni-forms-item>
  18. <uni-forms-item label="打卡类型" required name="category">
  19. <uni-data-select :localdata="categoryRange" v-model="punchInFormData.category"></uni-data-select>
  20. </uni-forms-item>
  21. <uni-forms-item label="规则描述" name="description">
  22. <uni-easyinput type="textarea" v-model="punchInFormData.description" placeholder="请输入任务描述" />
  23. </uni-forms-item>
  24. </uni-section>
  25. <uni-section title="计数配置" padding="16px" type="line" v-if="punchInFormData.category == 1">
  26. <uni-forms-item label="判断规则" required name="rule">
  27. <uni-data-select :localdata="ruleRange" v-model="punchInFormData.rule"></uni-data-select>
  28. </uni-forms-item>
  29. <uni-forms-item label="数值" required name="countTrack">
  30. <uni-easyinput v-model="punchInFormData.countTrack" placeholder="请输入目标数值" type="digit" />
  31. </uni-forms-item>
  32. </uni-section>
  33. <uni-section title="计时配置" padding="16px" type="line" v-if="punchInFormData.category == 2">
  34. <uni-forms-item label="判断规则" required name="rule">
  35. <uni-data-select :localdata="ruleRange" v-model="punchInFormData.rule"></uni-data-select>
  36. </uni-forms-item>
  37. <uni-forms-item label="时间" required name="timeTrack">
  38. <picker mode="time" :value="punchInFormData.timeTrack" @change="timeChange">
  39. <view class="pick-box">{{punchInFormData.timeTrack}}</view>
  40. </picker>
  41. </uni-forms-item>
  42. </uni-section>
  43. <view class="button-container">
  44. <button type="default" style="width:300rpx;" @click="cancel">取消</button>
  45. <button type="primary" style="color:#ffffff;backgroundColor:#2A82E4;width:300rpx;" @click="savePunchIn">保存</button>
  46. </view>
  47. </uni-forms>
  48. </template>
  49. </main-layout>
  50. </template>
  51. <script setup>
  52. import { ref } from 'vue';
  53. import { onLoad } from '@dcloudio/uni-app';
  54. import { punchInApi } from '@/service/apis';
  55. import { ruleRange, categoryRange, statusRange } from '@/common/constants/punchin.js';
  56. // 组件
  57. /**
  58. * 打卡任务表单
  59. */
  60. const punchInForm = ref(null);
  61. // 属性
  62. /**
  63. * 打卡任务表单数据
  64. */
  65. const punchInFormData = ref({
  66. "rewardNum": 1,
  67. "weekendDoubleFlag": 1,
  68. "fullAttendanceFlag": 1,
  69. "category": 0,
  70. "rule": 0,
  71. "countTrack": 10,
  72. "timeTrack": "00:00"
  73. });
  74. /**
  75. * 打卡任务表单规则
  76. */
  77. const punchInFormRules = ref({
  78. taskName: {
  79. rules: [{
  80. required: true,
  81. errorMessage: '任务名称不能为空'
  82. }]
  83. },
  84. rewardNum: {
  85. rules: [{
  86. required: true,
  87. errorMessage: '奖励数值不能为空'
  88. }, {
  89. format: 'number',
  90. errorMessage: "请输入有效数字"
  91. }, {
  92. minimum:1,
  93. errorMessage: "最小值{minimum}"
  94. }]
  95. },
  96. weekendDoubleFlag: {
  97. rules: [{
  98. required: true,
  99. errorMessage: '周末双倍奖励不能为空'
  100. }]
  101. },
  102. fullAttendanceFlag: {
  103. rules: [{
  104. required: true,
  105. errorMessage: '全勤奖励不能为空'
  106. }]
  107. },
  108. category: {
  109. rules: [{
  110. required: true,
  111. errorMessage: '任务类型不能为空'
  112. }]
  113. },
  114. description: {
  115. rules: [{
  116. maxLength: 100,
  117. errorMessage: '描述不能超过{maxLength}个字符'
  118. }]
  119. },
  120. rule: {
  121. rules: [{
  122. required: true,
  123. errorMessage: '判断规则不能为空'
  124. }]
  125. },
  126. countTrack: {
  127. rules: [{
  128. required: true,
  129. errorMessage: '数值不能为空'
  130. }, {
  131. format: 'number',
  132. errorMessage: "请输入有效数字"
  133. }, {
  134. minimum:1,
  135. errorMessage: "最小值{minimum}"
  136. }]
  137. },
  138. timeTrack: {
  139. rules: [{
  140. required: true,
  141. errorMessage: '数值不能为空'
  142. }]
  143. }
  144. });
  145. /**
  146. * 周末双倍奖励开关改变监听
  147. */
  148. const weekendDoubleSwitchChange = (e) => {
  149. punchInFormData.value.weekendDoubleFlag = e.detail.value;
  150. }
  151. /**
  152. * 全勤奖励开关改变监听
  153. */
  154. const fullAttendanceSwitchChange = (e) => {
  155. punchInFormData.value.fullAttendanceFlag = e.detail.value;
  156. }
  157. /**
  158. * 时间选择监听
  159. */
  160. const timeChange = (e) => {
  161. punchInFormData.value.timeTrack = e.detail.value;
  162. }
  163. /**
  164. * 保存打卡任务
  165. */
  166. const savePunchIn = () => {
  167. punchInForm.value.validate(['id']).then(() => {
  168. return punchInApi.addPunchIn(punchInFormData.value)
  169. }).then(datt => {
  170. uni.showToast({
  171. title: '保存成功',
  172. icon: 'success',
  173. duration: 2000
  174. });
  175. setTimeout(() => {
  176. uni.navigateBack();
  177. }, 2000);
  178. });
  179. }
  180. /**
  181. * 后退
  182. */
  183. const cancel = () => {
  184. uni.navigateBack();
  185. }
  186. onLoad(async (e) => {
  187. if (e.id) {
  188. const res = await punchInApi.queryPunchInById({"id": e.id});
  189. res.fullAttendanceFlag = res.fullAttendanceFlag ? 1 : 0;
  190. res.weekendDoubleFlag = res.weekendDoubleFlag ? 1 : 0;
  191. punchInFormData.value = res;
  192. }
  193. });
  194. </script>
  195. <style lang="scss" scoped>
  196. .pick-box {
  197. display: flex;
  198. box-sizing: border-box;
  199. flex-direction: row;
  200. align-items: center;
  201. border: 1px solid #dcdfe6;
  202. border-radius: 4px;
  203. width: auto;
  204. position: relative;
  205. overflow: hidden;
  206. flex: 1;
  207. line-height: 1;
  208. font-size: 14px;
  209. height: 35px;
  210. padding-left: 10px;
  211. }
  212. .button-container {
  213. background-color: #FFFFFF;
  214. display: flex; /* 使用Flexbox布局 */
  215. justify-content: space-between; /* 按钮之间的空间分布 */
  216. padding: 20rpx; /* 容器两侧的空白填充 */
  217. }
  218. </style>