eidtCamp.vue 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. <template>
  2. <div>
  3. <el-dialog
  4. class="dialog"
  5. width="630px"
  6. :title="title"
  7. :visible.sync="lookVisible"
  8. :before-close="onClose"
  9. >
  10. <el-form class="elForm" label-position="top" :model="formes" label-width="100px" ref="eidtCamp">
  11. <el-form-item
  12. label="训练营标题"
  13. :rules="[{ required: true, message: '请输入训练营标题' }]"
  14. prop="name"
  15. >
  16. <el-input class="w100" v-model="formes.name"></el-input>
  17. </el-form-item>
  18. <el-form-item label="适用分部" prop="organIds" :rules="[{ required: true, message: '请选择分部' }]">
  19. <el-select style="width: 100% !important;" v-model="formes.organIds" multiple clearable filterable @change="handleChangeOrgan">
  20. <el-option :label="o.name" :value="o.id + ''" v-for="(o) in organs" :key="o.id"></el-option>
  21. </el-select>
  22. </el-form-item>
  23. <el-form-item label="适用乐团" prop="musicGroupIds" :rules="[{ required: true, message: '请选择乐团' }]">
  24. <el-select style="width: 100% !important;" v-model="formes.musicGroupIds" multiple clearable filterable>
  25. <el-option :label="o.musicGroupName" :value="o.musicGroupId" v-for="(o) in musicGroups" :key="o.musicGroupId"></el-option>
  26. </el-select>
  27. </el-form-item>
  28. <div class="wrap">
  29. <el-form-item
  30. prop="applyTime"
  31. label="报名时间"
  32. :rules="[{ required: true, message: '请选择报名时间' }]"
  33. >
  34. <el-date-picker
  35. v-model.trim="formes.applyTime"
  36. class="w100"
  37. type="daterange"
  38. value-format="yyyy-MM-dd"
  39. @change="
  40. () => {
  41. formes.trainTime = [];
  42. }
  43. "
  44. range-separator="至"
  45. start-placeholder="报名开始日期"
  46. end-placeholder="报名结束日期"
  47. :picker-options="payDate()"
  48. >
  49. </el-date-picker>
  50. </el-form-item>
  51. <el-form-item
  52. prop="trainTime"
  53. label="训练时间"
  54. :rules="[{ required: true, message: '请选择训练时间' }]"
  55. >
  56. <el-date-picker
  57. v-model.trim="formes.trainTime"
  58. type="daterange"
  59. value-format="yyyy-MM-dd"
  60. class="w100"
  61. range-separator="至"
  62. start-placeholder="训练开始日期"
  63. end-placeholder="训练结束日期"
  64. :picker-options="payendTimer"
  65. >
  66. </el-date-picker>
  67. </el-form-item>
  68. </div>
  69. <div class="wrap">
  70. <el-form-item label="打卡标准"
  71. prop="signStandard"
  72. :rules="[
  73. { required: true, message: '请输入打卡标准' },
  74. { pattern: /^[1-9][0-9]*$/, message: '请输入大于0的正整数',}
  75. ]"
  76. >
  77. <el-input placeholder="请输入打卡标准" v-model="formes.signStandard">
  78. <template slot="append">分钟/天</template>
  79. </el-input>
  80. </el-form-item>
  81. <el-form-item label="达标天数"
  82. prop="standardDays"
  83. :rules="[
  84. { required: true, message: '请输入最低打卡天数' },
  85. { pattern: /^[1-9][0-9]*$/, message: '请输入大于0的正整数',}
  86. ]"
  87. >
  88. <el-input placeholder="请输入最低打卡天数" v-model="formes.standardDays">
  89. <template slot="append">天</template>
  90. </el-input>
  91. </el-form-item>
  92. </div>
  93. <!-- <el-form-item
  94. label="封面图"
  95. prop="picUrl"
  96. :rules="[
  97. {
  98. required: true,
  99. message: '请上传训练营封面图',
  100. trigger: 'blur',
  101. },
  102. ]"
  103. >
  104. <upload
  105. class="uploadImg"
  106. v-model="formes.picUrl"
  107. ref="uploadImg"
  108. ></upload>
  109. <p style="color: red">格式为jpg、png、gif图片</p>
  110. </el-form-item> -->
  111. </el-form>
  112. <div slot="footer" class="dialog-footer">
  113. <el-button @click="onClose">取 消</el-button>
  114. <el-button type="primary" @click="submitMsg">确 定</el-button>
  115. </div>
  116. </el-dialog>
  117. </div>
  118. </template>
  119. <script>
  120. import Upload from "@/components/Upload/index";
  121. import { addTrainingCamp, resetTrainingCamp } from "../api";
  122. import { getTimes } from "@/utils";
  123. import { queryEmployeeOrganByUser } from "@/api/systemManage";
  124. import { queryOrganMusicInfos } from "@/api/zeroManager";
  125. let that;
  126. export default {
  127. name: "eidtCamp",
  128. components: {
  129. Upload,
  130. },
  131. data() {
  132. return {
  133. title: "",
  134. organs: [], // 当前员工分部列表
  135. musicGroups: [], // 所选分部的乐团列表
  136. timer: '',
  137. formes: {
  138. id: "",
  139. name: "",
  140. picUrl: "",
  141. applyTime: [],
  142. trainTime: [],
  143. organIds: [], // 分部,多选
  144. musicGroupIds: [], // 适用乐团
  145. signStandard: null, // 打开标准
  146. standardDays: null, // 达标天数
  147. },
  148. lookVisible: false,
  149. chioseIdList: null,
  150. activeRow: null,
  151. };
  152. },
  153. mounted() {
  154. that = this;
  155. this.init();
  156. },
  157. methods: {
  158. async init() {
  159. const res = await queryEmployeeOrganByUser()
  160. if (Array.isArray(res?.data)){
  161. this.organs = res.data
  162. }
  163. },
  164. /** 获取分部乐团列表 */
  165. async getOrganMusicInfos(){
  166. const organId = (this.formes?.organIds || []).join(',')
  167. console.log("🚀 ~ organId:", organId)
  168. if (!organId) return;
  169. const res = await queryOrganMusicInfos({organId})
  170. if (Array.isArray(res?.data)){
  171. this.musicGroups = res.data
  172. }
  173. },
  174. /** 分部选项改变 */
  175. handleChangeOrgan(){
  176. this.formes.musicGroupIds = []
  177. clearTimeout(this.timer)
  178. this.timer = setTimeout(() => {
  179. this.getOrganMusicInfos()
  180. }, 1000)
  181. },
  182. openDioag(row) {
  183. if (row && row.id) {
  184. this.activeRow = row;
  185. this.title = "修改训练营";
  186. this.formes = {
  187. ...row,
  188. organIds: row.organIds?.split(','),
  189. musicGroupIds: row.musicGroupIds?.split(','),
  190. applyTime: [row.applyStartDate, row.applyEndDate],
  191. trainTime: [row.trainStartDate, row.trainEndDate],
  192. };
  193. this.getOrganMusicInfos()
  194. } else {
  195. this.title = "新建训练营";
  196. }
  197. this.lookVisible = true;
  198. },
  199. onClose() {
  200. this.activeRow = null
  201. this.formes = {
  202. id: "",
  203. name: "",
  204. picUrl: "",
  205. applyTime: [],
  206. trainTime: [],
  207. organIds: [], // 分部,多选
  208. musicGroupIds: [], // 适用乐团
  209. signStandard: null, // 打开标准
  210. standardDays: null, // 达标天数
  211. };
  212. this.$refs["eidtCamp"].resetFields();
  213. this.lookVisible = false;
  214. },
  215. submitMsg() {
  216. this.$refs.eidtCamp.validate(async (flag) => {
  217. if (flag) {
  218. try {
  219. if (this.activeRow && this.activeRow.id) {
  220. let { applyTime, trainTime, organIds,musicGroupIds, ...rest } = this.formes;
  221. let params = {
  222. ...rest,
  223. organIds: organIds?.join(','),
  224. musicGroupIds: musicGroupIds?.join(','),
  225. ...getTimes(applyTime, ["applyStartDate", "applyEndDate"]),
  226. ...getTimes(trainTime, ["trainStartDate", "trainEndDate"]),
  227. };
  228. const res = await resetTrainingCamp({ ...params });
  229. this.$message.success("修改成功");
  230. this.onClose();
  231. this.$emit("getList");
  232. } else {
  233. let { applyTime, trainTime, organIds,musicGroupIds, ...rest } = this.formes;
  234. let params = {
  235. ...rest,
  236. organIds: organIds?.join(','),
  237. musicGroupIds: musicGroupIds?.join(','),
  238. ...getTimes(applyTime, ["applyStartDate", "applyEndDate"]),
  239. ...getTimes(trainTime, ["trainStartDate", "trainEndDate"]),
  240. };
  241. const res = await addTrainingCamp({ ...params });
  242. this.$message.success("新建成功");
  243. this.onClose();
  244. this.$emit("getList");
  245. }
  246. } catch (e) {
  247. console.log(e);
  248. }
  249. }
  250. });
  251. },
  252. getName(val) {
  253. this.formes.fileName = val.data.name;
  254. },
  255. payDate() {
  256. let self = this;
  257. return {
  258. firstDayOfWeek: 1,
  259. disabledDate(time) {
  260. return time.getTime() + 86400000 < new Date().getTime();
  261. },
  262. };
  263. },
  264. },
  265. computed: {
  266. payendTimer: () => {
  267. return {
  268. firstDayOfWeek: 1,
  269. disabledDate(time) {
  270. if (Array.isArray(that.formes.applyTime) && that.formes.applyTime[1]) {
  271. return (
  272. time.getTime() <=
  273. new Date(that.formes.applyTime[1]).getTime()
  274. );
  275. } else {
  276. return time.getTime() <= new Date().getTime();
  277. }
  278. },
  279. };
  280. },
  281. },
  282. };
  283. </script>
  284. <style lang="scss" scoped>
  285. @import '@/styles/custom.scss';
  286. .w100 {
  287. width: 100%;
  288. }
  289. .wrap{
  290. display: flex;
  291. align-items: center;
  292. ::v-deep .el-form-item:not(:last-child){
  293. margin-right: 20px;
  294. }
  295. .el-form-item{
  296. flex: 1;
  297. }
  298. ::v-deep{
  299. .el-range-separator{
  300. padding: 0;
  301. }
  302. }
  303. }
  304. </style>