extra-class.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. <template>
  2. <el-form
  3. ref="form"
  4. :model="list"
  5. >
  6. <el-table
  7. :data="form"
  8. style="width: 100%;text-alogn: center;"
  9. >
  10. <el-table-column
  11. label="课程类型"
  12. prop="courseType"
  13. key="courseType"
  14. width="150">
  15. <template slot-scope="scope">
  16. <el-form-item
  17. :prop="'form.' + scope.$index + '.courseType'"
  18. :rules="{ required: true, message: '请选择课程类型', trigger: 'change' }"
  19. >
  20. <el-select
  21. style="width: 90%!important;"
  22. size="small"
  23. v-model="list.form[scope.$index].courseType"
  24. placeholder="课程类型"
  25. clearable
  26. @change="$listeners.priceChange(scope.row, scope.$index)"
  27. :disabled="isDisabled"
  28. >
  29. <el-option
  30. v-for="(item, key) in courseUnitPriceSettingsByType"
  31. :key="key"
  32. :disabled="isOptionDisabled(key)"
  33. :label="courseType[key]"
  34. :value="key"
  35. ></el-option>
  36. </el-select>
  37. </el-form-item>
  38. </template>
  39. </el-table-column>
  40. <el-table-column
  41. label="是否可选"
  42. v-if="isCommon"
  43. prop="isStudentOptional"
  44. key="isStudentOptional"
  45. width="150">
  46. <template slot-scope="scope">
  47. <el-form-item
  48. :prop="'form.' + scope.$index + '.isStudentOptional'"
  49. :rules="{ required: true, message: '请选择是否可选', trigger: 'change' }"
  50. >
  51. <el-select
  52. style="width: 90%!important;"
  53. size="small"
  54. v-model="list.form[scope.$index].isStudentOptional"
  55. placeholder="是否可选"
  56. :disabled="isDisabled"
  57. clearable
  58. >
  59. <el-option
  60. v-for="(item, index) in boolOptionsOptions"
  61. :key="index"
  62. :label="item.label"
  63. :value="item.value"
  64. ></el-option>
  65. </el-select>
  66. </el-form-item>
  67. </template>
  68. </el-table-column>
  69. <el-table-column
  70. label="课程时长(分钟)"
  71. prop="courseTotalMinuties"
  72. key="courseTotalMinuties"
  73. width="150">
  74. <template slot-scope="scope">
  75. <el-form-item
  76. :prop="'form.' + scope.$index + '.courseTotalMinuties'"
  77. :rules="{ required: true, message: '请输入课程时长', trigger: 'blur' }"
  78. >
  79. <el-input-number
  80. size="small"
  81. style="width: 90%!important;"
  82. class="number-input"
  83. v-model="list.form[scope.$index].courseTotalMinuties"
  84. :controls="false"
  85. :precision="0"
  86. @change="$listeners.priceChange(scope.row, scope.$index)"
  87. :min="1"
  88. :disabled="isDisabled"
  89. placeholder="课程时长"
  90. />
  91. </el-form-item>
  92. </template>
  93. </el-table-column>
  94. <el-table-column
  95. label="现价(元)"
  96. prop="courseCurrentPrice"
  97. key="courseCurrentPrice"
  98. width="150">
  99. <template slot-scope="scope">
  100. <el-form-item
  101. :prop="'form.' + scope.$index + '.courseCurrentPrice'"
  102. :rules="{ required: true, message: '请输入现价', trigger: 'blur' }"
  103. >
  104. <!-- $listeners.moneyChange -->
  105. <el-input-number
  106. size="small"
  107. style="width: 90%!important;"
  108. class="number-input"
  109. v-model="list.form[scope.$index].courseCurrentPrice"
  110. :controls="false"
  111. :precision="2"
  112. :min="0"
  113. @change="change"
  114. :disabled="!isUserType"
  115. placeholder="请输入现价"
  116. />
  117. </el-form-item>
  118. </template>
  119. </el-table-column>
  120. <el-table-column
  121. prop="courseOriginalPrice"
  122. key="courseOriginalPrice"
  123. label="原价(元)">
  124. <template slot-scope="scope">
  125. <el-form-item
  126. :prop="'form.' + scope.$index + '.courseOriginalPrice'"
  127. :rules="{ required: true, message: '请输入原价', trigger: 'blur' }"
  128. >
  129. <el-input-number
  130. size="small"
  131. style="width: 90%!important;"
  132. class="number-input"
  133. :disabled="isDisabled"
  134. v-model="list.form[scope.$index].courseOriginalPrice"
  135. :controls="false"
  136. :precision="2"
  137. :min="0"
  138. placeholder="请输入原价"
  139. />
  140. </el-form-item>
  141. </template>
  142. </el-table-column>
  143. <el-table-column
  144. v-if="clearable"
  145. prop="close"
  146. key="close"
  147. width="60">
  148. <template slot-scope="scope">
  149. <i v-if="form.length > 1" @click="$listeners.remove && $listeners.remove(scope.$index)" class="el-icon-circle-close"></i>
  150. </template>
  151. </el-table-column>
  152. </el-table>
  153. <el-button
  154. icon="el-icon-circle-plus-outline"
  155. plain
  156. v-if="!isCommon && $listeners.create"
  157. type="info"
  158. size="small"
  159. style="width: 100%;margin: 20px 0;"
  160. @click="$listeners.create"
  161. >新增课程类型</el-button>
  162. </el-form>
  163. </template>
  164. <script>
  165. import { courseType, boolOptions } from '@/constant'
  166. import { objectToOptions } from '@/utils'
  167. import numeral from 'numeral'
  168. export default {
  169. props: ['form', 'isCommon', 'isDisabled', 'isUserType', 'courseUnitPriceSettingsByType', 'clearable'],
  170. data() {
  171. return {
  172. courseType,
  173. courseTypeOptions: this.courseUnitPriceSettingsByType,
  174. boolOptionsOptions: objectToOptions(boolOptions),
  175. }
  176. },
  177. computed: {
  178. list() {
  179. console.log(this.form)
  180. return {
  181. form: this.form
  182. }
  183. }
  184. },
  185. methods: {
  186. change(val) {
  187. this.$listeners.moneyChange()
  188. },
  189. isOptionDisabled(key) {
  190. const selected = this.form.map(item => item.courseType)
  191. return selected.includes(key)
  192. },
  193. getOldMoney(index) {
  194. return numeral(this.list.form[index].courseTotalMinuties * this.list.form[index].unitPrice).format('0,0.00')
  195. },
  196. },
  197. }
  198. </script>
  199. <style lang="less" scoped>
  200. .number-input{
  201. /deep/ .el-input__inner {
  202. text-align: left;
  203. }
  204. }
  205. </style>