extra-class.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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="courseItemChange(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="[
  78. { required: true, message: '请输入课程时长', trigger: 'blur' },
  79. ]"
  80. >
  81. <el-input-number
  82. size="small"
  83. style="width: 90%!important;"
  84. class="number-input"
  85. v-model="list.form[scope.$index].courseTotalMinuties"
  86. :controls="false"
  87. :precision="0"
  88. @change="$listeners.priceChange(scope.row, scope.$index)"
  89. :min="0"
  90. :disabled="isDisabled"
  91. placeholder="课程时长"
  92. />
  93. </el-form-item>
  94. </template>
  95. </el-table-column>
  96. <el-table-column
  97. label="现价(元)"
  98. prop="courseCurrentPrice"
  99. key="courseCurrentPrice"
  100. width="150">
  101. <template slot-scope="scope">
  102. <el-form-item
  103. :prop="'form.' + scope.$index + '.courseCurrentPrice'"
  104. :rules="{ required: true, message: '请输入现价', trigger: 'blur' }"
  105. >
  106. <!-- $listeners.moneyChange -->
  107. <el-input-number
  108. size="small"
  109. style="width: 90%!important;"
  110. class="number-input"
  111. v-model="list.form[scope.$index].courseCurrentPrice"
  112. :controls="false"
  113. :precision="0"
  114. :min="0"
  115. @change="change"
  116. placeholder="请输入现价"
  117. />
  118. </el-form-item>
  119. </template>
  120. </el-table-column>
  121. <el-table-column
  122. prop="courseOriginalPrice"
  123. key="courseOriginalPrice"
  124. label="原价(元)">
  125. <template slot-scope="scope">
  126. <el-form-item
  127. :prop="'form.' + scope.$index + '.courseOriginalPrice'"
  128. :rules="{ required: true, message: '请输入原价', trigger: 'blur' }"
  129. >
  130. <el-input-number
  131. size="small"
  132. style="width: 90%!important;"
  133. class="number-input"
  134. v-model="list.form[scope.$index].courseOriginalPrice"
  135. :controls="false"
  136. :precision="0"
  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
  150. v-if="form.length > 1"
  151. @click="$listeners.remove && $listeners.remove(scope.$index)"
  152. class="el-icon-circle-close"
  153. style="margin-bottom: 24px;cursor: pointer;"
  154. ></i>
  155. </template>
  156. </el-table-column>
  157. </el-table>
  158. <el-button
  159. icon="el-icon-circle-plus-outline"
  160. plain
  161. v-if="!isCommon && $listeners.create"
  162. type="info"
  163. size="small"
  164. style="width: 100%;margin: 20px 0;"
  165. @click="$listeners.create"
  166. >新增课程类型</el-button>
  167. </el-form>
  168. </template>
  169. <script>
  170. import { courseType, boolOptions } from '@/constant'
  171. import { objectToOptions } from '@/utils'
  172. import { classTimeList, array2object } from '@/utils/searchArray'
  173. import numeral from 'numeral'
  174. import MusicStore from '@/views/resetTeaming/store'
  175. export default {
  176. props: ['form', 'isCommon', 'isDisabled', 'isUserType', 'courseUnitPriceSettingsByType', 'clearable'],
  177. data() {
  178. return {
  179. courseType,
  180. courseTypeOptions: this.courseUnitPriceSettingsByType,
  181. boolOptionsOptions: objectToOptions(boolOptions),
  182. }
  183. },
  184. computed: {
  185. list() {
  186. return {
  187. form: this.form
  188. }
  189. },
  190. classTimeList() {
  191. return array2object(classTimeList)
  192. },
  193. },
  194. methods: {
  195. change(val) {
  196. this.$listeners.moneyChange()
  197. },
  198. isOptionDisabled(key) {
  199. const selected = this.form.map(item => item.courseType)
  200. return selected.includes(key)
  201. },
  202. getOldMoney(index) {
  203. return numeral(this.list.form[index].courseTotalMinuties * this.list.form[index].unitPrice).format('0,0.00')
  204. },
  205. courseItemChange(item, index) {
  206. this.$listeners.priceChange(item, index)
  207. this.$refs.form.validateField(`form.${index}.courseTotalMinuties`)
  208. },
  209. validatorCourseTotalMinuties(index) {
  210. return (rule, value, callback) => {
  211. const { courseType } = this.list.form[index]
  212. if (courseType && value > 1 && this.classTimeList[courseType] && value < this.classTimeList[courseType]) {
  213. callback(new Error(`单节课不得少于${this.classTimeList[courseType]}分钟`))
  214. return
  215. }
  216. callback()
  217. }
  218. }
  219. },
  220. }
  221. </script>
  222. <style lang="less" scoped>
  223. .number-input{
  224. /deep/ .el-input__inner {
  225. text-align: left;
  226. }
  227. }
  228. </style>