dialog.newtask.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  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="form" label-position="right"
  6. label-width="120px" label-prefix=":">
  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 prop="drillSite" label="演练地点">
  21. <el-input v-model="formData.drillSite" placeholder="请输入演练地点" :length="50"/>
  22. </el-form-item>
  23. </el-col>
  24. <el-col :span="12">
  25. <el-form-item prop="drillStartTime" label="培训开始时间">
  26. <el-date-picker style="width: 100%" required v-model="formData.drillStartTime"
  27. :picker-options="startDatepickerOptions"
  28. type="datetime" placeholder="选择日期" @change="startDateChanged" width="180">
  29. </el-date-picker>
  30. </el-form-item>
  31. </el-col>
  32. <el-col :span="12">
  33. <el-form-item prop="drillEndTime" label="培训结束时间">
  34. <el-date-picker style="width: 100%" required v-model="formData.drillEndTime"
  35. :picker-options="endDatepickerOptions" @change="endDateChanged"
  36. type="datetime" placeholder="选择日期">
  37. </el-date-picker>
  38. </el-form-item>
  39. </el-col>
  40. <el-col :span="24">
  41. <el-form-item label="演练类型" prop="type">
  42. <el-select style="width: 100%" v-model="formData.type" placeholder="请选择演练类型">
  43. <el-option v-for="dict in dict.type.core_drill_type" :key="dict.value" :label="dict.label"
  44. :value="parseInt(dict.value)">
  45. </el-option>
  46. </el-select>
  47. </el-form-item>
  48. </el-col>
  49. <el-col :span="24">
  50. <el-form-item prop="presetCase" label="预设案由">
  51. <div style="display: flex;justify-content: flex-end; margin-bottom: 10px">
  52. <el-button type="primary" @click="selectMaterials">参考演练库</el-button>
  53. </div>
  54. <k-textarea v-model="formData.presetCase" placeholder="请输入预设案由" :length="2000"/>
  55. </el-form-item>
  56. </el-col>
  57. <el-col :span="24">
  58. <el-form-item prop="drillSituation" label="演练情况">
  59. <k-textarea v-model="formData.drillSituation" placeholder="请输入演练情况" :length="2000"/>
  60. </el-form-item>
  61. </el-col>
  62. <el-col :span="12">
  63. <el-form-item prop="absenceList" label="参与人员">
  64. <k-select :multiple="true" v-model="formData.absenceList" url="/user/find/all"
  65. :params="{ orgId: formData.orgId }" placeholder="请选择缺席人员"
  66. @select="absenceUserSelectChanged"></k-select>
  67. </el-form-item>
  68. </el-col>
  69. <el-col :span="12">
  70. <el-form-item prop="absentList" label="缺席人员">
  71. <k-select :multiple="true" v-model="formData.absentList" url="/user/find/all"
  72. :params="{ orgId: formData.orgId }" @select="absentUserSelectChanged"
  73. placeholder="请选择缺席人员">
  74. </k-select>
  75. </el-form-item>
  76. </el-col>
  77. <el-col :span="24">
  78. <el-form-item label="上传文件" prop="fileList">
  79. <K-file-upload ref="upload" :defaultValue="formFileListDefualtValue" v-model="formData.fileList"/>
  80. </el-form-item>
  81. </el-col>
  82. <el-col :span="24">
  83. <el-form-item prop="imageList" label="上传图片">
  84. <imgUpload ref="uploadimage" type="more" :value="formData.imageList" @input="imageListChanged">
  85. </imgUpload>
  86. </el-form-item>
  87. </el-col>
  88. </el-row>
  89. </el-form>
  90. </div>
  91. <div slot="footer" class="dialog-footer">
  92. <el-button @click="onHide">取消</el-button>
  93. <el-button type="primary" @click="onSave">暂存</el-button>
  94. <el-button type="primary" @click="onSubmit">提交</el-button>
  95. </div>
  96. </DialogCom>
  97. <dialog-drill-dictionary-select
  98. ref="DialogDrillDictionarySelect"
  99. :defaultSelect=defaultSelect
  100. @select="materialsSelect"
  101. :orgId="this.$store.getters.orgId">
  102. </dialog-drill-dictionary-select>
  103. </div>
  104. </template>
  105. <script>
  106. import {mapState, mapMutations} from "vuex";
  107. import {getDrillTask, recordDrillTask} from "@/api/core/drill/drillTask";
  108. import dayjs from "dayjs";
  109. import KTextarea from "@/components/common/textarea.vue";
  110. import KSelect from "@/components/common/userselect.vue";
  111. import imgUpload from "@/components/ImageUpload/index.vue";
  112. import KFileUpload from "@/components/K-FileUpload/index.vue";
  113. import DialogDrillDictionarySelect from "@/views/core/drill/task/dialog.select.drillDictionary.vue";
  114. export default {
  115. components: {KTextarea, KSelect, imgUpload,KFileUpload,DialogDrillDictionarySelect},
  116. data() {
  117. const params = this.$route.params;
  118. return {
  119. id: params ? params.id : null,
  120. isShow: false,
  121. formData: this.reset(),
  122. formDataRules: {
  123. drillStartTime: [{required: true, message: "请选择演练开始时间"}],
  124. drillEndTime: [{required: true, message: "请选择演练结束时间"}],
  125. drillSite: [{required: true, message: "请输入演练地点"}],
  126. type: [{required: true, message: "请选择演练项目"}],
  127. presetCase: [{required: true, message: "请输入预设案由"}],
  128. drillSituation: [{required: true, message: "请输入预设案由"}],
  129. absenceList: [{required: true, type: "array", message: "请选择参与人员", trigger: ['blur', 'change']}],
  130. imageList: [{required: true, message: "请上传图片"}],
  131. fileList: [{required: true, message: "请上传文件"}],
  132. },
  133. startDatepickerOptions: {
  134. disabledDate(time) {
  135. return false;
  136. },
  137. },
  138. endDatepickerOptions: {
  139. disabledDate: this.endDisabledDate,
  140. },
  141. drillTypeOptions: [],
  142. formFileListDefualtValue: [],
  143. defaultSelect: [],
  144. };
  145. },
  146. dicts: ["core_drill_type","core_drill_type"],
  147. props: {},
  148. watch: {},
  149. computed: {
  150. ...mapState(["loginUser", "org"]),
  151. },
  152. methods: {
  153. ...mapMutations([]),
  154. reset(other = {}) {
  155. return {
  156. drillStartTime: null,
  157. drillEndTime: null,
  158. content: "",
  159. drillSite: "",
  160. type: null,
  161. title: "",
  162. eduJobId: null,
  163. imageList: "",
  164. absenceList: [],
  165. absentList: [],
  166. orgList: [],
  167. fileList: [],
  168. ...other,
  169. };
  170. },
  171. async refresh(id, other) {
  172. if (!id) {
  173. this.reset(other);
  174. return;
  175. }
  176. getDrillTask(id).then((response) => {
  177. this.loading = false;
  178. // _this.formData = response.data;
  179. if (response.data.taskUserList) {
  180. let list1 = response.data.taskUserList.filter((element) =>
  181. element.type === 1
  182. );
  183. console.log("list1", list1)
  184. response.data.absenceList = list1 ? list1.map((a) => {
  185. return a.userId;
  186. })
  187. : [];
  188. let list2 = response.data.taskUserList.filter((element) =>
  189. element.type === 2
  190. );
  191. console.log("list2", list2)
  192. response.data.absentList = list2 ? list2.map((a) => {
  193. return a.userId;
  194. })
  195. : [];
  196. } else {
  197. response.data.absenceList = [];
  198. response.data.absentList = [];
  199. }
  200. if (response.data.imageList == null) {
  201. response.data.imageList = "";
  202. }
  203. if (response.data.fileList == null) {
  204. response.data.fileList = [];
  205. }
  206. this.formData = response.data;
  207. });
  208. console.log("getDrillTask", this.formData);
  209. },
  210. async show(id, other = {}) {
  211. this.isShow = true;
  212. },
  213. imageListChanged(list) {
  214. this.formData.imageList = list;
  215. console.log("imageListChanged", this.formData.imageList);
  216. },
  217. absentUserSelectChanged(list) {
  218. // 将类型为2的数据删除
  219. if (this.formData.absentList) {
  220. this.formData.absentList = this.formData.absentList.filter(
  221. (x) => x.type == 1
  222. );
  223. } else {
  224. this.formData.absentList = [];
  225. }
  226. let tempList = list.map((x) => {
  227. return {
  228. userId: x.id,
  229. userName: x.name,
  230. type: 2,
  231. };
  232. });
  233. if (!tempList) return;
  234. this.formData.absentList = this.formData.absentList.concat(tempList);
  235. console.log("absentUserSelectChanged", list, this.formData.absentList);
  236. },
  237. absenceUserSelectChanged(list) {
  238. // 将类型为1的数据删除
  239. if (this.formData.absenceList) {
  240. this.formData.absenceList = this.formData.absenceList.filter(
  241. (x) => x.type == 2
  242. );
  243. } else {
  244. this.formData.absenceList = [];
  245. }
  246. let tempList = list.map((x) => {
  247. return {
  248. userId: x.id,
  249. userName: x.name,
  250. type: 1,
  251. };
  252. });
  253. if (!tempList) return;
  254. this.formData.absenceList = this.formData.absenceList.concat(tempList);
  255. console.log("absenceUserSelectChanged", list, this.formData.absenceList);
  256. },
  257. // 事件
  258. onHide() {
  259. this.isShow = false;
  260. this.formData = this.reset();
  261. this.$refs["uploadimage"].clearFiles();
  262. this.$refs["upload"].clearFiles();
  263. },
  264. async onSave() {
  265. if (!this.validatePerson()) {
  266. this.$message.error("参与人员与缺席人员重复,请重新选择!");
  267. return;
  268. }
  269. let request = {submitType: 1, ...this.formData};
  270. if (request.drillStartTime)
  271. request.drillStartTime = dayjs(request.drillStartTime).format("YYYY-MM-DD HH:mm:ss");
  272. if (request.drillEndTime)
  273. request.drillEndTime = dayjs(request.drillEndTime).format("YYYY-MM-DD HH:mm:ss");
  274. recordDrillTask(request).then((v) => {
  275. this.$emit("success", this.formData);
  276. this.onHide();
  277. this.$modal.msgSuccess("培训登记暂存成功");
  278. });
  279. },
  280. async onSubmit() {
  281. await this.$refs.form.validate();
  282. console.log("onSubmit this.formData", this.formData);
  283. if (!this.validatePerson()) {
  284. this.$message.error("参与人员与缺席人员重复,请重新选择!");
  285. } else {
  286. let request = {submitType: 2, ...this.formData};
  287. if (request.drillStartTime)
  288. request.drillStartTime = dayjs(request.drillStartTime).format("YYYY-MM-DD HH:mm:ss");
  289. if (request.drillEndTime)
  290. request.drillEndTime = dayjs(request.drillEndTime).format("YYYY-MM-DD HH:mm:ss");
  291. recordDrillTask(request).then((v) => {
  292. this.$emit("success", this.formData);
  293. this.onHide();
  294. this.$modal.msgSuccess("演练登记提交成功");
  295. });
  296. }
  297. },
  298. validatePerson() {
  299. for (let i = 0; i < this.formData.absenceList.length; i++) {
  300. let absence = this.formData.absenceList[i];
  301. if (this.formData.absentList.indexOf(absence) >= 0) {
  302. return false;
  303. }
  304. }
  305. return true;
  306. },
  307. uploadTriggerEvent(value) {
  308. },
  309. endDisabledDate(time) {
  310. //小于开始日期禁止选择
  311. let startDate = new Date();
  312. startDate.setTime(startDate.getTime() - 3600 * 1000 * 24);
  313. if (this.formData.drillStartTime) {
  314. startDate = new Date(
  315. dayjs(this.formData.drillStartTime).format("YYYY-MM-DD")
  316. );
  317. startDate.setTime(startDate.getTime() - 3600 * 1000 * 24);
  318. }
  319. return time.getTime() < new Date(startDate).getTime();
  320. },
  321. endDateChanged(time) {
  322. console.log("startDateChanged", time, this.formData.drillStartTime, this.formData.drillEndTime)
  323. if (dayjs(this.formData.drillStartTime).isAfter(dayjs(this.formData.drillEndTime))) {
  324. this.formData.drillStartTime = this.formData.drillEndTime;
  325. console.log("trainingEndDateTime", this.formData.drillEndTime)
  326. }
  327. },
  328. startDateChanged(time) {
  329. console.log(
  330. "startDateChanged",
  331. time,
  332. this.formData.drillStartTime,
  333. this.formData.drillEndTime
  334. );
  335. if (
  336. dayjs(this.formData.drillStartTime).isAfter(
  337. dayjs(this.formData.drillEndTime)
  338. )
  339. ) {
  340. this.formData.drillEndTime = this.formData.drillStartTime;
  341. console.log("trainingEndDateTime", this.formData.drillEndTime);
  342. }
  343. },
  344. selectMaterials() {
  345. this.$refs["DialogDrillDictionarySelect"].show();
  346. },
  347. materialsSelect(){
  348. },
  349. },
  350. mounted() {
  351. },
  352. };
  353. </script>
  354. <!-- <style lang="less">
  355. .edu-training-edit {
  356. }
  357. </style> -->