dialog.newTask.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. <template>
  2. <div class="edu-training-edit">
  3. <DialogCom :title="'培训任务临时登记'" @close="onHide" :visible.sync="isShow" width="960px">
  4. <div class="page-body">
  5. <el-form :model="formData" :rules="formDataRules" size="small" ref="newTask" label-position="right"
  6. label-width="120px">
  7. <el-row>
  8. <!-- 培训主题 -->
  9. <el-col :span="12">
  10. <el-form-item prop="title" label="任务名称">
  11. <el-input
  12. v-model="formData.title"
  13. :maxlength="32"
  14. placeholder="请输入任务名称"
  15. clearable
  16. />
  17. </el-form-item>
  18. </el-col>
  19. <el-col :span="12">
  20. <el-form-item label="培训类型" prop="type">
  21. <el-select style="width: 100%" v-model="formData.type" placeholder="请选择培训类型">
  22. <el-option v-for="dict in dict.type.edu_training_type" :key="dict.value" :label="dict.label"
  23. :value="parseInt(dict.value)"></el-option>
  24. </el-select>
  25. </el-form-item>
  26. </el-col>
  27. <el-col :span="12">
  28. <el-form-item prop="trainingStartDateTime" label="培训开始时间">
  29. <el-date-picker required v-model="formData.trainingStartDateTime" :picker-options="startDatepickerOptions"
  30. format="yyyy-MM-dd HH:mm"
  31. type="datetime" placeholder="选择日期" @change="startDateChanged">
  32. </el-date-picker>
  33. </el-form-item>
  34. </el-col>
  35. <el-col :span="12">
  36. <el-form-item prop="trainingEndDateTime" label="培训结束时间">
  37. <el-date-picker required v-model="formData.trainingEndDateTime" :picker-options="endDatepickerOptions" @change="endDateChanged"
  38. format="yyyy-MM-dd HH:mm"
  39. type="datetime" placeholder="选择日期">
  40. </el-date-picker>
  41. </el-form-item>
  42. </el-col>
  43. <!-- <el-col :span="12">
  44. <el-form-item label="机构类型" prop="execOrgType">
  45. <el-select style="width: 100%" v-model="formData.execOrgType" placeholder="请选择执行机构类型"
  46. @change="execOrgTypeChanged()">
  47. <el-option v-for="dict in getUserOrgType" :key="dict.value" :label="dict.label"
  48. :value="parseInt(dict.value)"></el-option>
  49. </el-select>
  50. </el-form-item>
  51. </el-col>
  52. <el-col :span="12">
  53. <el-form-item v-show="formData.execOrgType" label="培训机构" prop="planExecOrgIdList">
  54. <org-tree-select
  55. v-model="formData.planExecOrgIdList"
  56. :queryData="formData.execOrgType"
  57. ref="orgTreeSelect"
  58. :enabledCheckOrgTypes="formData.execOrgType"
  59. :disable="true">
  60. </org-tree-select>
  61. </el-form-item>
  62. </el-col>-->
  63. <!-- 内容 -->
  64. <el-col :span="24">
  65. <el-form-item prop="content" label="培训内容">
  66. <k-textarea v-model="formData.content" placeholder="请输入培训内容" :length="2000"/>
  67. </el-form-item>
  68. </el-col>
  69. <el-col :span="24">
  70. <el-form-item prop="note" label="培训总结">
  71. <k-textarea v-model="formData.note" placeholder="请输入培训总结" :length="2000"/>
  72. </el-form-item>
  73. </el-col>
  74. <el-col :span="12">
  75. <el-form-item prop="absenceList" label="参会人员">
  76. <k-select :multiple="true" style="width: 100%" v-model="formData.absenceList" url="/user/find/all"
  77. :params="{ orgId: formData.orgId }" placeholder="请选择参会人员"
  78. @select="absenceUserSelectChanged"></k-select>
  79. </el-form-item>
  80. </el-col>
  81. <el-col :span="12">
  82. <el-form-item prop="absentList" label="缺席人员">
  83. <k-select :multiple="true" style="width: 100%" v-model="formData.absentList" url="/user/find/all"
  84. :params="{ orgId: formData.orgId }" @select="absentUserSelectChanged"
  85. placeholder="请选择缺席人员">
  86. </k-select>
  87. </el-form-item>
  88. </el-col>
  89. </el-row>
  90. <el-row>
  91. <el-col :span="24">
  92. <el-form-item prop="imageList" label="培训图片">
  93. <imgUpload ref="uploadimage" type="more" :value="formData.imageList"
  94. @input="imageListChanged"></imgUpload>
  95. </el-form-item>
  96. </el-col>
  97. <el-col :span="10">
  98. <el-form-item label="培训资料" prop="fileList">
  99. <K-file-upload ref="upload" :defaultValue="formFileListDefualtValue" v-model="formData.fileList"/>
  100. </el-form-item>
  101. </el-col>
  102. <el-col :span="14">
  103. <el-form-item label="">
  104. <el-button type="primary" @click="showSelectFile">选取知识库文件</el-button>
  105. </el-form-item>
  106. </el-col>
  107. </el-row>
  108. </el-form>
  109. </div>
  110. <div slot="footer" class="dialog-footer">
  111. <el-button type="primary" @click="onSubmit">确 定</el-button>
  112. <el-button @click="onHide">取 消</el-button>
  113. <!-- <el-button type="primary" @click="onSave">暂存</el-button>-->
  114. </div>
  115. </DialogCom>
  116. <DialogSelectFile
  117. ref="DialogSelectFile"
  118. :defaultSelect=defaultSelect
  119. @select="fileSelected"
  120. :orgId="orgId"
  121. ></DialogSelectFile>
  122. </div>
  123. </template>
  124. <script>
  125. import {mapState, mapMutations} from "vuex";
  126. import {addEduTask, getEduTask, recordEduTask} from "@/api/core/edu/eduTask";
  127. import dayjs from "dayjs";
  128. import KTextarea from "@/components/common/textarea.vue";
  129. import KSelect from "@/components/common/userselect.vue";
  130. import imgUpload from "@/components/ImageUpload/index.vue";
  131. import OrgTreeSelect from '@/components/orgTreeSelect'
  132. import DialogSelectFile from "../plan/dialog.select.file.vue"
  133. import KFileUpload from "@/components/K-FileUpload/index.vue";
  134. export default {
  135. dicts: ['edu_type', 'edu_task_status', 'sys_org_type','edu_training_type'],
  136. components: {KTextarea, KFileUpload, KSelect, imgUpload, OrgTreeSelect, DialogSelectFile},
  137. data() {
  138. const params = this.$route.params;
  139. return {
  140. id: params ? params.id : null,
  141. isShow: false,
  142. formData: this.reset(),
  143. formDataRules: {
  144. title: [{required: true, message: "请输入任务名称"}],
  145. type: [{required: true, message: "请输入培训类型"}],
  146. content: [{required: true, message: "请输入培训内容"}],
  147. absenceList: [{required: true, type: "array", message: "请选择参会人员"}],
  148. startDate: [{required: true, message: "请输入培训开始时间"}],
  149. endDate: [{required: true, message: "请输入培训结束时间"}],
  150. note: [{required: true, message: "请输入培训总结"}],
  151. imageList: [{required: true, message: "请上传培训图片"}],
  152. // fileList: [{required: true, message: "请上传培训文件"}],
  153. },
  154. startDatepickerOptions: {
  155. disabledDate(time) {
  156. return false;
  157. },
  158. },
  159. endDatepickerOptions: {
  160. disabledDate: this.endDisabledDate,
  161. },
  162. orgId: null,
  163. defaultSelect: [],
  164. formFileListDefualtValue: [],
  165. };
  166. },
  167. props: {},
  168. watch: {},
  169. computed: {
  170. ...mapState(["loginUser", "org",]),
  171. getUserOrgType() {
  172. console.log("computed allSysOrgTypes", this.dict.type.sys_org_type, this.$store.getters.orgType);
  173. let tempArry = [];
  174. this.dict.type.sys_org_type.forEach(x => {
  175. if (Number(x.value) >= this.$store.getters.orgType) {
  176. tempArry.push(x);
  177. }
  178. });
  179. // console.log("computed getUserOrgType",tempArry);
  180. return tempArry;
  181. }
  182. },
  183. methods: {
  184. ...mapMutations([]),
  185. reset(other = {}) {
  186. return {
  187. // hostId: null,
  188. // recorderId: null,
  189. trainingStartDateTime: null,
  190. trainingEndDateTime: null,
  191. // dueCount: null,
  192. // actualCount: null,
  193. type: null,
  194. content: null,
  195. title: null,
  196. eduJobId: null,
  197. imageList: "",
  198. absenceList: [],
  199. absentList: [],
  200. orgList: [],
  201. fileList: [],
  202. ...other,
  203. };
  204. },
  205. /*async refresh(id, other) {
  206. // this.formData = id
  207. // ? await this.$api.eduTraining.one(id)
  208. // : this.reset(other);
  209. if (!id) {
  210. this.reset(other);
  211. return;
  212. }
  213. let _this = this;
  214. getEduTask(id).then(response => {
  215. this.loading = false;
  216. // _this.formData = response.data;
  217. if (response.data.taskUserList) {
  218. let list1 = response.data.taskUserList.filter((element) =>
  219. element.type === 1
  220. );
  221. console.log("list1", list1)
  222. response.data.absenceList = list1 ? list1.map((a) => {
  223. return a.userId;
  224. })
  225. : [];
  226. let list2 = response.data.taskUserList.filter((element) =>
  227. element.type === 2
  228. );
  229. console.log("list2", list2)
  230. response.data.absentList = list2 ? list2.map((a) => {
  231. return a.userId;
  232. })
  233. : [];
  234. } else {
  235. response.data.absenceList = [];
  236. response.data.absentList = [];
  237. }
  238. if (response.data.imageList == null) {
  239. response.data.imageList = "";
  240. }
  241. if (response.data.fileList == null) {
  242. response.data.fileList = [];
  243. }
  244. this.formData = response.data;
  245. })
  246. console.log("getEduTask", this.formData);
  247. },*/
  248. async show(id, other = {}) {
  249. this.isShow = true;
  250. },
  251. imageListChanged(list) {
  252. this.formData.imageList = list;
  253. console.log("imageListChanged", this.formData.imageList);
  254. },
  255. showSelectFile() {
  256. this.$refs["DialogSelectFile"].show();
  257. },
  258. fileSelected(list) {
  259. if (!list) return;
  260. let tempArry = [];
  261. let fileNameList=[]
  262. let addFileNameList=[]
  263. this.formData.fileList.forEach(x => {
  264. let fileObj= JSON.parse(x);
  265. fileNameList.push(fileObj.name);
  266. })
  267. list.forEach(x => {
  268. tempArry.forEach(s => {
  269. addFileNameList.push(JSON.parse(s).name);
  270. })
  271. x.fileList.forEach(y => {
  272. let fileObj= JSON.parse(y);
  273. if (fileNameList.indexOf(fileObj.name) == -1&&addFileNameList.indexOf(fileObj.name) == -1) {
  274. tempArry.push(y);
  275. }
  276. })
  277. })
  278. if (this.formData.fileList) {
  279. this.formFileListDefualtValue = this.formData.fileList.concat(tempArry);
  280. } else {
  281. this.formFileListDefualtValue = tempArry;
  282. }
  283. },
  284. absentUserSelectChanged(list) {
  285. console.log(list);
  286. // 将类型为2的数据删除
  287. if (this.formData.taskUserList) {
  288. this.formData.taskUserList = this.formData.taskUserList.filter(x => x.type == 1);
  289. } else {
  290. this.formData.taskUserList = [];
  291. }
  292. let tempList = list.map(x => {
  293. return {
  294. userId: x.id,
  295. userName: x.name,
  296. type: 2
  297. }
  298. })
  299. if (!tempList) return;
  300. this.formData.taskUserList = this.formData.taskUserList.concat(tempList);
  301. console.log("absentUserSelectChanged", list, this.formData.taskUserList);
  302. },
  303. absenceUserSelectChanged(list) {
  304. // 将类型为1的数据删除
  305. if (this.formData.taskUserList) {
  306. this.formData.taskUserList = this.formData.taskUserList.filter(x => x.type == 2);
  307. } else {
  308. this.formData.taskUserList = [];
  309. }
  310. let tempList = list.map(x => {
  311. return {
  312. userId: x.id,
  313. userName: x.name,
  314. type: 1
  315. }
  316. });
  317. if (!tempList) return;
  318. this.formData.taskUserList = this.formData.taskUserList.concat(tempList);
  319. // console.log("absenceUserSelectChanged", list, this.formData.taskUserList,this.formData.absenceList);
  320. // this.formData.absenceList=list.map(item=>item.id);
  321. // console.log("absenceUserSelectChanged", list, this.formData.taskUserList,this.formData.absenceList);
  322. },
  323. // 事件
  324. onHide() {
  325. this.isShow = false;
  326. this.formData = this.reset();
  327. this.$refs["uploadimage"].clearFiles();
  328. this.$refs["upload"].clearFiles();
  329. },
  330. async onSave() {
  331. if (!this.validatePerson()) {
  332. this.$message.error("参与人员与缺席人员重复,请重新选择!");
  333. return;
  334. }
  335. //判断trainingStartDateTime大于trainingEndDateTime就返回
  336. if (dayjs(this.formData.trainingStartDateTime).isAfter(dayjs(this.formData.trainingEndDateTime))) {
  337. this.$message.error("培训开始时间不能大于培训结束时间!");
  338. return;
  339. }
  340. let request = {submitType: 1, ...this.formData};
  341. delete request.absenceList;
  342. delete request.absentList;
  343. if (request.trainingStartDateTime)
  344. request.trainingStartDateTime = dayjs(request.trainingStartDateTime).format('YYYY-MM-DD HH:mm:ss')
  345. if (request.trainingEndDateTime)
  346. request.trainingEndDateTime = dayjs(request.trainingEndDateTime).format('YYYY-MM-DD HH:mm:ss')
  347. // if(request.imageList)
  348. // request.imageList=request.imageList.split(',').map(x=>{return x;});
  349. // request.taskUserList = [];
  350. recordEduTask(request).then((v) => {
  351. this.$emit("success", this.formData);
  352. this.onHide();
  353. this.$modal.msgSuccess("培训登记暂存成功");
  354. });
  355. },
  356. async onSubmit() {
  357. //console.log("onSubmit this.formData", this.formData)
  358. await this.$refs.newTask.validate();
  359. //判断trainingStartDateTime大于trainingEndDateTime就返回
  360. if (dayjs(this.formData.trainingStartDateTime).isAfter(dayjs(this.formData.trainingEndDateTime))) {
  361. this.$message.error("培训开始时间不能大于培训结束时间!");
  362. return;
  363. }
  364. // this.formData.taskUserList=[];
  365. console.log("onSubmit this.formData", this.formData)
  366. console.log(this.formData.taskUserList);
  367. this.formData.taskUserList = this.formData.taskUserList ? this.formData.taskUserList : []
  368. if (this.formData.taskUserList.length == 0 || this.formData.taskUserList.filter(item => item.type == 1).length == 0) {
  369. this.$message.error("参与人员不能为空,请重新选择!");
  370. } else if (!this.validatePerson()) {
  371. this.$message.error("参与人员与缺席人员重复,请重新选择!");
  372. } else {
  373. let request = {submitType: 2, ...this.formData};
  374. delete request.absenceList;
  375. delete request.absentList;
  376. if (request.trainingStartDateTime) {
  377. request.trainingStartDateTime = dayjs(request.trainingStartDateTime).format('YYYY-MM-DD HH:mm:ss')
  378. }
  379. if (request.trainingEndDateTime) {
  380. request.trainingEndDateTime = dayjs(request.trainingEndDateTime).format('YYYY-MM-DD HH:mm:ss')
  381. }
  382. // request.taskUserList = [];
  383. recordEduTask(request).then((v) => {
  384. this.$emit("success", this.formData);
  385. this.onHide();
  386. this.$modal.msgSuccess("培训登记提交成功");
  387. });
  388. // this.$emit("success");
  389. // this.onHide();
  390. }
  391. },
  392. validatePerson() {
  393. for (let i = 0; i < this.formData.absenceList.length; i++) {
  394. let absence = this.formData.absenceList[i];
  395. if (this.formData.absentList.indexOf(absence) >= 0) {
  396. return false;
  397. }
  398. }
  399. return true;
  400. },
  401. uploadTriggerEvent(value) {
  402. },
  403. endDisabledDate(time) {
  404. //小于开始日期禁止选择
  405. let startDate = new Date();
  406. startDate.setTime(startDate.getTime() - 3600 * 1000 * 24);
  407. if (this.formData.trainingStartDateTime) {
  408. startDate = new Date(dayjs(this.formData.trainingStartDateTime).format('YYYY-MM-DD'));
  409. startDate.setTime(startDate.getTime() - 3600 * 1000 * 24);
  410. }
  411. return time.getTime() < new Date(startDate).getTime()
  412. },
  413. startDateChanged(time) {
  414. console.log("startDateChanged", time, this.formData.trainingStartDateTime, this.formData.trainingEndDateTime)
  415. if (dayjs(this.formData.trainingStartDateTime).isAfter(dayjs(this.formData.trainingEndDateTime))) {
  416. this.formData.trainingEndDateTime = this.formData.trainingStartDateTime;
  417. console.log("trainingEndDateTime", this.formData.trainingEndDateTime)
  418. }
  419. },
  420. endDateChanged(time) {
  421. console.log("startDateChanged", time, this.formData.trainingStartDateTime, this.formData.trainingEndDateTime)
  422. if (dayjs(this.formData.trainingStartDateTime).isAfter(dayjs(this.formData.trainingEndDateTime))) {
  423. this.formData.trainingStartDateTime = this.formData.trainingEndDateTime;
  424. console.log("trainingEndDateTime", this.formData.trainingEndDateTime)
  425. }
  426. },
  427. execOrgTypeChanged(row) {
  428. this.$refs['orgTreeSelect'].clear();
  429. this.initRoleList(this.form.execOrgType);
  430. // this.form.planExecOrgIdList = [];
  431. },
  432. },
  433. mounted() {
  434. },
  435. };
  436. </script>
  437. <!-- <style lang="less">
  438. .edu-training-edit {
  439. }
  440. </style> -->