addMusic.vue 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. <template>
  2. <div>
  3. <el-form :model="musicForm" label-width="110px" ref="form">
  4. <el-form-item label="选择学员" prop="studentId" v-if="this.chioseStudent" :rules="[
  5. { required: true, message: '请选择学员', trigger: 'blur' },
  6. ]">
  7. <el-select
  8. style="width: 400px !important"
  9. v-model.trim="musicForm.studentId"
  10. clearable
  11. placeholder="请选择"
  12. remote
  13. filterable
  14. :remote-method="remoteMethod"
  15. :loading="remoteLoading"
  16. >
  17. <el-option
  18. v-for="item in studentList"
  19. :key="item.userId"
  20. :label="item.username"
  21. :value="item.userId"
  22. >
  23. <span style="float: left">{{ item.username }}</span>
  24. <span style="float: right; color: #8492a6; font-size: 13px">{{
  25. item.parentsPhone
  26. }}</span>
  27. </el-option>
  28. </el-select>
  29. </el-form-item>
  30. <el-form-item
  31. label="乐器分类"
  32. prop="goodsCategoryId"
  33. :rules="[
  34. { required: true, message: '请选择乐器分类', trigger: 'blur' },
  35. ]"
  36. >
  37. <el-form-item>
  38. <el-select
  39. style="width: 400px !important"
  40. v-model.trim="musicForm.goodsCategoryId"
  41. filterable
  42. clearable
  43. @change="changeCategory"
  44. placeholder="乐器分类"
  45. >
  46. <el-option
  47. v-for="(item, index) in typeList"
  48. :key="index"
  49. :label="item.label"
  50. :value="item.value"
  51. ></el-option>
  52. </el-select>
  53. </el-form-item>
  54. </el-form-item>
  55. <el-form-item
  56. label="乐器名称"
  57. prop="goodsId"
  58. :rules="[
  59. { required: true, message: '请选择乐器名称', trigger: 'blur' },
  60. ]"
  61. >
  62. <el-select
  63. style="width: 400px !important"
  64. :disabled="!musicForm.goodsCategoryId"
  65. v-model.trim="musicForm.goodsId"
  66. filterable
  67. clearable
  68. placeholder="乐器名称"
  69. >
  70. <el-option
  71. v-for="(item, index) in musicList"
  72. :key="index"
  73. :label="item.name"
  74. :value="item.id"
  75. ></el-option>
  76. </el-select>
  77. </el-form-item>
  78. <el-form-item
  79. label="是否乐保"
  80. prop="status"
  81. :rules="[
  82. { required: true, message: '请选择是否乐保', trigger: 'blur' },
  83. ]"
  84. >
  85. <el-select
  86. style="width: 400px !important"
  87. v-model.trim="musicForm.status"
  88. clearable
  89. placeholder="是否乐保"
  90. >
  91. <el-option value="0" label="否"></el-option>
  92. <el-option value="1" label="是"></el-option>
  93. </el-select>
  94. </el-form-item>
  95. <el-form-item
  96. label="乐保结束日期"
  97. :rules="[
  98. { required: true, message: '请选择乐保结束日期', trigger: 'blur' },
  99. ]"
  100. v-if="musicForm.status == 1"
  101. prop="date"
  102. >
  103. <el-date-picker
  104. style="width: 400px"
  105. v-model="musicForm.date"
  106. clearable
  107. type="datetime"
  108. value-format="yyyy-MM-dd HH:mm:ss"
  109. default-time="23:59:59"
  110. :picker-options="pickerOptions"
  111. placeholder="乐保结束日期"
  112. >
  113. </el-date-picker>
  114. </el-form-item>
  115. </el-form>
  116. </div>
  117. </template>
  118. <script>
  119. import { goodsQuery } from "@/api/businessManager";
  120. import { addStudentInstrument, updateStudentInstrument } from "@/api/buildTeam";
  121. import { getToken, getTenantId } from "@/utils/auth";
  122. import { getTimes } from "@/utils";
  123. import axios from "axios";
  124. import dayjs from "dayjs";
  125. export default {
  126. props: ["categoryList", "operationData", "operationStatus", "chioseStudent"],
  127. data() {
  128. return {
  129. musicForm: {
  130. studentId: this.$route.query.userId,
  131. goodsId: "",
  132. goodsCategoryId: "",
  133. status: "",
  134. date: null,
  135. },
  136. pickerOptions: {
  137. firstDayOfWeek: 1,
  138. disabledDate(time) {
  139. let times = dayjs(dayjs().format("YYYY-MM-DD")).valueOf();
  140. return times > time.getTime();
  141. },
  142. },
  143. typeList: this.categoryList,
  144. musicList: [],
  145. remoteLoading: false,
  146. studentList: [],
  147. };
  148. },
  149. async mounted() {
  150. console.log(this.operationData);
  151. let operationData = this.operationData;
  152. if (operationData) {
  153. let musicForm = this.musicForm;
  154. musicForm.goodsCategoryId = operationData.goodsCategoryId;
  155. if (operationData.goodsCategoryId) {
  156. await this.changeCategory(operationData.goodsCategoryId);
  157. }
  158. musicForm.studentId = operationData.studentId;
  159. musicForm.goodsId = operationData.goodsId;
  160. musicForm.goodsName = operationData.goodsName;
  161. musicForm.status = operationData.status + "";
  162. musicForm.date = operationData.endTime || null;
  163. musicForm.id = operationData.id;
  164. this.remoteMethod(musicForm.studentId);
  165. }
  166. },
  167. methods: {
  168. changeCategory(val) {
  169. this.musicForm.goodsName = "";
  170. this.musicForm.goodsId = null;
  171. if (val) {
  172. goodsQuery({
  173. goodsCategoryId: val,
  174. rows: 99999,
  175. type: "INSTRUMENT",
  176. }).then((res) => {
  177. if (res.code == 200 && res.data) {
  178. this.musicList = res.data.rows;
  179. }
  180. });
  181. }
  182. },
  183. addMusicSubmit() {
  184. this.$refs.form.validate(async (res) => {
  185. if (res) {
  186. try {
  187. const { date, status, ...rest } = this.musicForm;
  188. let obj = {
  189. ...rest,
  190. status,
  191. };
  192. // 是否有乐保
  193. if (status == 1) {
  194. if (this.operationData && this.operationData.startTime) {
  195. obj.startTime = this.operationData.startTime;
  196. } else {
  197. obj.startTime = dayjs().format("YYYY-MM-DD HH:mm") + ":00";
  198. }
  199. obj.endTime = date;
  200. } else {
  201. obj.startTime = "";
  202. obj.endTime = "";
  203. }
  204. if (this.operationStatus == "create") {
  205. const res = await addStudentInstrument(obj);
  206. this.$message.success("添加成功");
  207. } else if (this.operationStatus == "update") {
  208. const res = await updateStudentInstrument(obj);
  209. this.$message.success("修改成功");
  210. }
  211. this.$emit("close");
  212. this.$emit("getList");
  213. } catch (e) {
  214. console.log(e);
  215. }
  216. }
  217. });
  218. },
  219. remoteMethod(query) {
  220. if (query !== "") {
  221. this.remoteLoading = true;
  222. // 发请求搜索
  223. const url = "/api-web/studentManage/queryStudentList";
  224. const options = {
  225. method: "post",
  226. headers: {
  227. Authorization: getToken(),
  228. tenantId: getTenantId(),
  229. },
  230. data: {
  231. rows: 999999,
  232. search: query,
  233. },
  234. url,
  235. };
  236. this.remoteLoading = true;
  237. // this.studentList = []
  238. axios(options).then((res) => {
  239. this.remoteLoading = false;
  240. let result = res.data;
  241. if (result.code == 200) {
  242. // Array.prototype.splice.apply(this.studentList, result.data.rows);
  243. if (result.data.rows && result.data.rows.length > 0) {
  244. result.data.rows.forEach((item) => {
  245. this.studentList.unshift(item);
  246. });
  247. this.studentList = this.deweight(this.studentList, "studentId");
  248. }
  249. // this.studentList = this.studentList.concat(result.data.rows);
  250. }
  251. });
  252. }
  253. },
  254. // 制定属性去重
  255. deweight(arr, key) {
  256. let res = [];
  257. arr.forEach((item) => {
  258. let list = [];
  259. res.forEach((resitem) => {
  260. list.push(resitem[key]);
  261. });
  262. if (list.indexOf(item[key]) === -1) {
  263. res.push(item);
  264. }
  265. });
  266. return res;
  267. },
  268. },
  269. };
  270. </script>
  271. <style lang="scss" scoped>
  272. .width100 {
  273. width: 100%!important;
  274. }
  275. </style>