RewardDialog.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <template>
  2. <el-dialog v-model="dialogVisible" title="奖惩操作" width="500px">
  3. <div v-if="order" style="padding: 0 10px;">
  4. <div style="margin-bottom: 20px; font-size: 14px; color: #606266; line-height: 1.6; background: #fdf6ec; padding: 10px; border-radius: 4px;">
  5. <div>奖惩履约者:<span style="font-weight: bold; color: #303133;">{{ order.fulfillerName || '未指派' }}</span></div>
  6. <div style="font-size: 13px; margin-top: 4px;">订单号:{{ order.orderNo }}</div>
  7. <div style="font-size: 13px; margin-top: 4px; display:flex; align-items:center; gap:6px;">
  8. 服务类型:
  9. <el-tag :type="getTypeTag(order.type)" size="small">{{ getTypeName(order.type) }}</el-tag>
  10. <el-tag v-if="order.type === 'transport' && order.transportType === 'round'" size="small" effect="plain" type="warning">往返</el-tag>
  11. <el-tag v-if="order.splitType === 'pick'" size="small" effect="dark" color="#409eff" style="border:none; color:white;">接</el-tag>
  12. <el-tag v-if="order.splitType === 'drop'" size="small" effect="dark" color="#67c23a" style="border:none; color:white;">送</el-tag>
  13. <el-tag v-if="order.type === 'transport' && order.transportType === 'pick' && !order.splitType" size="small" effect="plain">单程接</el-tag>
  14. <el-tag v-if="order.type === 'transport' && order.transportType === 'drop' && !order.splitType" size="small" effect="plain" type="success">单程送</el-tag>
  15. </div>
  16. </div>
  17. <el-form :model="rewardForm" label-width="80px">
  18. <el-form-item label="操作类型">
  19. <el-radio-group v-model="rewardForm.type">
  20. <el-radio label="reward">奖励 (增加)</el-radio>
  21. <el-radio label="punish">惩罚 (扣除)</el-radio>
  22. </el-radio-group>
  23. </el-form-item>
  24. <el-form-item label="调整项目">
  25. <el-radio-group v-model="rewardForm.item">
  26. <el-radio label="points">积分</el-radio>
  27. <el-radio label="amount">金额 (元)</el-radio>
  28. </el-radio-group>
  29. </el-form-item>
  30. <el-form-item label="数额" required>
  31. <el-input-number v-model="rewardForm.value" :min="1" :step="10" />
  32. </el-form-item>
  33. <el-form-item label="原因备注" required>
  34. <el-input
  35. v-model="rewardForm.reason"
  36. type="textarea"
  37. :rows="3"
  38. placeholder="请输入奖惩原因..."
  39. />
  40. </el-form-item>
  41. </el-form>
  42. </div>
  43. <template #footer>
  44. <el-button @click="dialogVisible = false">取消</el-button>
  45. <el-button type="primary" @click="handleSubmit">确认执行</el-button>
  46. </template>
  47. </el-dialog>
  48. </template>
  49. <script setup>
  50. import { reactive, computed, watch } from 'vue'
  51. import { ElMessage } from 'element-plus'
  52. const props = defineProps({
  53. visible: Boolean,
  54. order: Object
  55. })
  56. const emit = defineEmits(['update:visible', 'submit'])
  57. const dialogVisible = computed({
  58. get: () => props.visible,
  59. set: (val) => emit('update:visible', val)
  60. })
  61. const rewardForm = reactive({
  62. type: 'reward',
  63. item: 'points',
  64. value: 10,
  65. reason: ''
  66. })
  67. watch(() => props.visible, (val) => {
  68. if (val) {
  69. rewardForm.type = 'reward'
  70. rewardForm.item = 'points'
  71. rewardForm.value = 10
  72. rewardForm.reason = ''
  73. }
  74. })
  75. const getTypeTag = (type) => {
  76. const map = { transport: '', feeding: 'warning', washing: 'success' }
  77. return map[type]
  78. }
  79. const getTypeName = (type) => {
  80. const map = { transport: '宠物接送', feeding: '上门喂遛', washing: '上门洗护' }
  81. return map[type]
  82. }
  83. const handleSubmit = () => {
  84. if(!rewardForm.reason) {
  85. ElMessage.warning('请输入奖惩原因')
  86. return
  87. }
  88. emit('submit', rewardForm)
  89. dialogVisible.value = false
  90. }
  91. </script>