RewardDialog.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <template>
  2. <el-dialog :model-value="visible" @update:model-value="updateVisible" title="奖惩操作" width="500px">
  3. <div v-if="data" 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;">{{ data.fulfillerName || '未指派' }}</span></div>
  6. <div style="font-size: 13px; margin-top: 4px;">订单号:{{ data.orderNo }}</div>
  7. <div style="font-size: 13px; margin-top: 4px; display:flex; align-items:center; gap:6px;">
  8. 服务类型:
  9. <el-tag :type="getTypeTag(data.type)" size="small">{{ getTypeName(data.type) }}</el-tag>
  10. <el-tag v-if="data.type === 'transport' && data.transportType === 'round'" size="small" effect="plain" type="warning">往返</el-tag>
  11. <el-tag v-if="data.splitType === 'pick'" size="small" effect="dark" color="#409eff" style="border:none; color:white;">接</el-tag>
  12. <el-tag v-if="data.splitType === 'drop'" size="small" effect="dark" color="#67c23a" style="border:none; color:white;">送</el-tag>
  13. <el-tag v-if="data.type === 'transport' && data.transportType === 'pick' && !data.splitType" size="small" effect="plain">单程接</el-tag>
  14. <el-tag v-if="data.type === 'transport' && data.transportType === 'drop' && !data.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="updateVisible(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, watch } from 'vue'
  51. import { ElMessage } from 'element-plus'
  52. const props = defineProps({
  53. visible: Boolean,
  54. data: Object
  55. })
  56. const emit = defineEmits(['update:visible', 'success'])
  57. const rewardForm = reactive({
  58. type: 'reward',
  59. item: 'points',
  60. value: 10,
  61. reason: ''
  62. })
  63. watch(() => props.visible, (val) => {
  64. if (val) {
  65. rewardForm.type = 'reward'
  66. rewardForm.item = 'points'
  67. rewardForm.value = 10
  68. rewardForm.reason = ''
  69. }
  70. })
  71. const getTypeTag = (type) => {
  72. const map = { transport: '', feeding: 'warning', washing: 'success' }
  73. return map[type]
  74. }
  75. const getTypeName = (type) => {
  76. const map = { transport: '宠物接送', feeding: '上门喂遛', washing: '上门洗护' }
  77. return map[type]
  78. }
  79. const updateVisible = (val) => {
  80. emit('update:visible', val)
  81. }
  82. const handleSubmit = () => {
  83. if (!rewardForm.reason) {
  84. ElMessage.warning('请输入奖惩原因')
  85. return
  86. }
  87. ElMessage.success(`操作成功:${rewardForm.type === 'reward' ? '奖励' : '惩罚'}已执行`)
  88. updateVisible(false)
  89. emit('success')
  90. }
  91. </script>