extra-class.vue 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  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="header">
  102. <p style="position: relative">
  103. 现价(元)
  104. <el-tooltip placement="top" popper-class="mTooltip">
  105. <div slot="content">学生实际缴费金额</div>
  106. <i
  107. class="el-icon-question"
  108. style="font-size: 18px; color: #f56c6c"
  109. ></i>
  110. </el-tooltip>
  111. </p>
  112. </template>
  113. <template slot-scope="scope">
  114. <el-form-item
  115. :prop="'form.' + scope.$index + '.courseCurrentPrice'"
  116. :rules="{ required: true, message: '请输入现价', trigger: 'blur' }"
  117. >
  118. <!-- $listeners.moneyChange -->
  119. <el-input-number
  120. size="small"
  121. style="width: 90%!important;"
  122. class="number-input"
  123. v-model="list.form[scope.$index].courseCurrentPrice"
  124. :controls="false"
  125. :precision="0"
  126. :min="0"
  127. @change="change"
  128. placeholder="请输入现价"
  129. />
  130. </el-form-item>
  131. </template>
  132. </el-table-column>
  133. <el-table-column
  134. prop="courseOriginalPrice"
  135. key="courseOriginalPrice"
  136. label="原价(元)">
  137. <template slot-scope="scope">
  138. <el-form-item
  139. :prop="'form.' + scope.$index + '.courseOriginalPrice'"
  140. :rules="{ required: true, message: '请输入原价', trigger: 'blur' }"
  141. >
  142. <el-input-number
  143. size="small"
  144. style="width: 90%!important;"
  145. class="number-input"
  146. v-model="list.form[scope.$index].courseOriginalPrice"
  147. :controls="false"
  148. :precision="0"
  149. :min="0"
  150. placeholder="请输入原价"
  151. />
  152. </el-form-item>
  153. </template>
  154. </el-table-column>
  155. <el-table-column
  156. v-if="clearable"
  157. prop="close"
  158. key="close"
  159. width="60">
  160. <template slot-scope="scope">
  161. <i
  162. v-if="form.length > 1"
  163. @click="$listeners.remove && $listeners.remove(scope.$index)"
  164. class="el-icon-circle-close"
  165. style="margin-bottom: 24px;cursor: pointer;"
  166. ></i>
  167. </template>
  168. </el-table-column>
  169. </el-table>
  170. <el-button
  171. icon="el-icon-circle-plus-outline"
  172. plain
  173. v-if="!isCommon && $listeners.create"
  174. type="info"
  175. size="small"
  176. style="width: 100%;margin: 20px 0;"
  177. @click="$listeners.create"
  178. >新增课程类型</el-button>
  179. </el-form>
  180. </template>
  181. <script>
  182. import { courseType, boolOptions } from '@/constant'
  183. import { objectToOptions } from '@/utils'
  184. import { classTimeList, array2object } from '@/utils/searchArray'
  185. import numeral from 'numeral'
  186. import MusicStore from '@/views/resetTeaming/store'
  187. export default {
  188. props: ['form', 'isCommon', 'isDisabled', 'isUserType', 'courseUnitPriceSettingsByType', 'clearable'],
  189. data() {
  190. return {
  191. courseType,
  192. courseTypeOptions: this.courseUnitPriceSettingsByType,
  193. boolOptionsOptions: objectToOptions(boolOptions),
  194. }
  195. },
  196. computed: {
  197. list() {
  198. return {
  199. form: this.form
  200. }
  201. },
  202. classTimeList() {
  203. return array2object(classTimeList)
  204. },
  205. },
  206. methods: {
  207. change(val) {
  208. this.$listeners.moneyChange()
  209. },
  210. isOptionDisabled(key) {
  211. const selected = this.form.map(item => item.courseType)
  212. return selected.includes(key)
  213. },
  214. getOldMoney(index) {
  215. return numeral(this.list.form[index].courseTotalMinuties * this.list.form[index].unitPrice).format('0,0.00')
  216. },
  217. courseItemChange(item, index) {
  218. this.$listeners.priceChange(item, index)
  219. this.$refs.form.validateField(`form.${index}.courseTotalMinuties`)
  220. },
  221. validatorCourseTotalMinuties(index) {
  222. return (rule, value, callback) => {
  223. const { courseType } = this.list.form[index]
  224. if (courseType && value > 1 && this.classTimeList[courseType] && value < this.classTimeList[courseType]) {
  225. callback(new Error(`单节课不得少于${this.classTimeList[courseType]}分钟`))
  226. return
  227. }
  228. callback()
  229. }
  230. }
  231. },
  232. }
  233. </script>
  234. <style lang="less" scoped>
  235. .number-input{
  236. /deep/ .el-input__inner {
  237. text-align: left;
  238. }
  239. }
  240. </style>