dialog.addletter.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. <template>
  2. <div class="edu-training-edit">
  3. <DialogCom
  4. :title="title"
  5. @close="onHide"
  6. :visible.sync="isShow"
  7. width="1000px"
  8. >
  9. <div class="page-body">
  10. <el-form
  11. ref="form"
  12. :model="formData"
  13. :rules="formDataRules"
  14. label-width="140px"
  15. >
  16. <el-row>
  17. <el-col :span="12">
  18. <el-form-item label="介绍信编号" prop="letterNo">
  19. <el-input
  20. v-model="formData.letterNo"
  21. placeholder="请输入介绍信编号"
  22. maxlength="15"
  23. />
  24. </el-form-item>
  25. </el-col>
  26. <el-col :span="12">
  27. <el-form-item label="接待机构" prop="receptionOrgIds">
  28. <org-tree-select v-model="formData.receptionOrgIds" ref="orgTreeSelect" :checkShow="true">
  29. </org-tree-select>
  30. </el-form-item>
  31. </el-col>
  32. <el-col :span="24">
  33. <el-form-item prop="reasons" label="来访事由">
  34. <el-input
  35. v-model="formData.reasons"
  36. placeholder="请输入来访事由"
  37. maxlength="100"
  38. />
  39. </el-form-item>
  40. </el-col>
  41. <el-col :span="12">
  42. <el-form-item prop="startTime" label="开具日期">
  43. <!-- <el-date-picker
  44. v-model="formData.range"
  45. type="daterange"
  46. :picker-options="startDatepickerOptions"
  47. range-separator="至"
  48. start-placeholder="有效期开始日期"
  49. end-placeholder="有效期结束日期">
  50. </el-date-picker> -->
  51. <el-date-picker style="width:100%"
  52. v-model="formData.startTime"
  53. type="date"
  54. :picker-options="startDatepickerOptions"
  55. placeholder="请选择开具日期"
  56. >
  57. </el-date-picker>
  58. </el-form-item>
  59. </el-col>
  60. <el-col :span="12">
  61. <el-form-item prop="effectiveDays" label="有效天数">
  62. <el-input-number style="width: 100%" v-model="formData.effectiveDays" :min="1" :max="365"></el-input-number>
  63. </el-form-item>
  64. </el-col>
  65. <el-col :span="12">
  66. <el-form-item label="上传介绍信附件" ref="letterFile" prop="letterFile">
  67. <K-file-upload
  68. ref="uploadFile"
  69. :limit=2
  70. :defaultValue="formFileListDefualtValue"
  71. :fileType="letterFileType"
  72. @input="fileListChanged"
  73. v-model="formData.letterFile"
  74. />
  75. </el-form-item>
  76. </el-col>
  77. <el-col :span="12">
  78. <el-form-item label="备注" prop="description">
  79. <el-input
  80. v-model="formData.description"
  81. placeholder="请输入备注"
  82. maxlength="100"
  83. />
  84. </el-form-item>
  85. </el-col>
  86. </el-row>
  87. <el-row :gutter="10">
  88. <el-col :span="12">
  89. <h3>
  90. <i class="el-icon-collection-tag"></i>
  91. 人员信息
  92. </h3>
  93. </el-col>
  94. <el-col :offset="8" :span="2">
  95. <h3>
  96. <el-button
  97. type="primary"
  98. icon="el-icon-plus"
  99. size="mini"
  100. @click="handleAddUser"
  101. >新增来访人员</el-button
  102. >
  103. </h3>
  104. </el-col>
  105. </el-row>
  106. <el-table border :data="formData.userInfos" max-height="500" style="margin-bottom: 10px;">
  107. <el-table-column label="序号" align="center" type="index" width="70" />
  108. <el-table-column label="来访单位" width="100" align="center" prop="companyName" />
  109. <el-table-column label="来访人员" width="100" align="center" prop="userName" />
  110. <el-table-column label="证件类型" width="100" align="center" prop="idType">
  111. <template slot-scope="scope">
  112. <dict-tag :options="dict.type.letter_id_type" :value="scope.row.idType"/>
  113. </template>
  114. </el-table-column>
  115. <el-table-column label="证件号码" width="200" align="center" prop="idCard">
  116. </el-table-column>
  117. <el-table-column label="证件图片" align="center" prop="imgFile">
  118. <template slot-scope="scope">
  119. <ImageListPreview v-model="scope.row.imgFile"></ImageListPreview>
  120. </template>
  121. </el-table-column>
  122. <el-table-column
  123. label="操作"
  124. align="center" width="100"
  125. class-name="small-padding fixed-width"
  126. >
  127. <template slot-scope="scope">
  128. <el-button size="mini" type="text" @click="editUser(scope.row)"
  129. >编辑</el-button
  130. >
  131. <el-button size="mini" type="text" @click="remove(scope.row)"
  132. >删除</el-button
  133. >
  134. </template>
  135. </el-table-column>
  136. </el-table>
  137. </el-form>
  138. </div>
  139. <DialogCom
  140. title="添加来访人员"
  141. :visible.sync="open"
  142. width="600px"
  143. append-to-body
  144. @close="onHideUser"
  145. >
  146. <el-form
  147. ref="formUser"
  148. :model="userInfo"
  149. :rules="userInfoRules"
  150. label-width="120px"
  151. >
  152. <el-form-item label="来访单位" prop="companyName">
  153. <el-input v-model="userInfo.companyName" maxlength="20" placeholder="请输入来访单位" />
  154. </el-form-item>
  155. <el-form-item label="来访人员" prop="userName">
  156. <el-input v-model="userInfo.userName" maxlength="10" placeholder="请输入来访人员" />
  157. </el-form-item>
  158. <el-form-item label="证件类型" prop="idType">
  159. <el-select style="width:100%" v-model="userInfo.idType" placeholder="请选择证件类型" clearable>
  160. <el-option
  161. v-for="dict in dict.type.letter_id_type"
  162. :key="dict.value"
  163. :label="dict.label"
  164. :value="parseInt(dict.value)"
  165. />
  166. </el-select>
  167. </el-form-item>
  168. <el-form-item label="证件号码" prop="idCard">
  169. <el-input v-model="userInfo.idCard" maxlength="20" placeholder="请输入证件号码" />
  170. </el-form-item>
  171. <el-form-item prop="imgFile" ref="userImgFile" label="上传证件图片">
  172. <!-- <ImageListPreview v-model="userInfo.imgFile"></ImageListPreview> -->
  173. <imgUpload ref="uploadimage" type="more" :value="userInfo.imgFile" :limit=2
  174. @input="imageListChanged"></imgUpload>
  175. </el-form-item>
  176. </el-form>
  177. <div slot="footer" class="dialog-footer">
  178. <el-button type="primary" @click="submitUser">确 定</el-button>
  179. <el-button @click="onHideUser">取 消</el-button>
  180. </div>
  181. </DialogCom>
  182. <div slot="footer" class="dialog-footer">
  183. <el-button type="primary" @click="submitForm">确 定</el-button>
  184. <el-button @click="onHide">取 消</el-button>
  185. </div>
  186. </DialogCom>
  187. </div>
  188. </template>
  189. <script>
  190. import { mapState, mapMutations } from "vuex";
  191. import {
  192. listLetter,
  193. getLetter,
  194. delLetter,
  195. addLetter,
  196. updateLetter,
  197. } from "@/api/core/letter";
  198. import OrgTreeSelect from "@/components/orgTreeSelect";
  199. import KFileUpload from "@/components/K-FileUpload/index.vue";
  200. import dayjs from "dayjs";
  201. import imgUpload from "@/components/ImageUpload";
  202. import DataRangePicker from "@/components/dateTime/daterange.picker.vue";
  203. export default {
  204. components: { OrgTreeSelect, KFileUpload, imgUpload,DataRangePicker },
  205. data() {
  206. const params = this.$route.params;
  207. return {
  208. id: params ? params.id : null,
  209. isShow: false,
  210. title: "录入介绍信",
  211. formData: this.reset(),
  212. formDataRules: {
  213. reasons: [{ required: true, message: "请输入来访事由" }],
  214. letterNo: [{ required: true, message: "请输入介绍信编号" }],
  215. receptionOrgIds: [{ required: true, message: "请选择接待机构" }],
  216. startTime: [{ required: true, message: "请选择开具日期" }],
  217. effectiveDays: [{ required: true, message: "请选择有效天数" }],
  218. userInfos: [{ required: true, message: "请添加来访人员" }],
  219. letterFile:[{ required: true, message: "请上传介绍信附件" }],
  220. },
  221. userInfoRules: {
  222. userName: [{ required: true, message: "请输入来访人员" }],
  223. companyName: [{ required: true, message: "请输入来访单位" }],
  224. idType: [{ required: true, message: "请选择证件类型" }],
  225. idCard: [{ required: true, message: "请输入证件号码" }],
  226. imgFile: [{ required: true, message: "请上传证件图片" }],
  227. },
  228. startDatepickerOptions: {
  229. disabledDate: this.endDisabledDate,
  230. },
  231. // endDatepickerOptions: {
  232. // disabledDate: this.endDisabledDate,
  233. // },
  234. formFileListDefualtValue: [],
  235. open: false,
  236. userInfo: this.resetUserInfo(),
  237. imageList: [],
  238. letterFileType:["pdf", "jpg", "png", "bmp"]
  239. };
  240. },
  241. dicts: ["letter_status","letter_id_type"],
  242. props: {},
  243. watch: {},
  244. created() {},
  245. computed: {
  246. ...mapState(["loginUser", "org"]),
  247. },
  248. methods: {
  249. ...mapMutations([]),
  250. reset(other = {}) {
  251. return {
  252. reasons: null,
  253. letterNo:null,
  254. receptionOrgIds: [],
  255. // range:[],
  256. startTime:new Date(),
  257. effectiveDays:1,
  258. description: null,
  259. letterFile: [],
  260. userInfos: [],
  261. type:1,
  262. status:0,
  263. ...other,
  264. };
  265. },
  266. resetUserInfo() {
  267. return {
  268. userName: null,
  269. companyName: null,
  270. idType:0,
  271. idCard: null,
  272. imgFile: null,
  273. };
  274. },
  275. async show(id, other = {}) {
  276. if (id) {
  277. this.title = "编辑介绍信";
  278. this.isShow = true;
  279. getLetter(id).then((response) => {
  280. // let tempRange=[];
  281. // tempRange.push(dayjs(response.data.startTime));
  282. // tempRange.push(new Date(response.data.endTime));
  283. // response.data.range=tempRange;
  284. this.formData = response.data;
  285. this.formFileListDefualtValue=this.formData.letterFile;
  286. });
  287. }
  288. else
  289. {
  290. this.isShow = true;
  291. this.title = "录入介绍信";
  292. this.formData = this.reset();
  293. }
  294. },
  295. handleAddUser() {
  296. this.open = true;
  297. },
  298. imageListChanged(list) {
  299. this.userInfo.imgFile = list;
  300. this.$refs.userImgFile.clearValidate();
  301. },
  302. fileListChanged(list)
  303. {
  304. this.$refs.letterFile.clearValidate();
  305. },
  306. endDisabledDate(time) {
  307. //小于开始日期禁止选择
  308. let startDate = new Date();
  309. startDate.setTime(startDate.getTime() - 3600 * 1000 * 24);
  310. if (this.formData.trainingStartDateTime) {
  311. startDate = new Date(
  312. dayjs(this.formData.trainingStartDateTime).format("YYYY-MM-DD")
  313. );
  314. startDate.setTime(startDate.getTime() - 3600 * 1000 * 24);
  315. }
  316. return time.getTime() < new Date(startDate).getTime();
  317. },
  318. startDateChanged(time) {
  319. if (
  320. dayjs(this.formData.startTime).isAfter(dayjs(this.formData.endTime))
  321. ) {
  322. this.formData.endTime = this.formData.startTime;
  323. }
  324. },
  325. endDateChanged(time) {
  326. if (
  327. dayjs(this.formData.startTime).isAfter(dayjs(this.formData.endTime))
  328. ) {
  329. this.formData.startTime = this.formData.endTime;
  330. }
  331. },
  332. onHide() {
  333. this.isShow = false;
  334. this.formData = this.reset();
  335. this.$refs["uploadFile"].clearFiles();
  336. },
  337. onHideUser() {
  338. this.open = false;
  339. this.imageList = [];
  340. this.userInfo = this.resetUserInfo();
  341. },
  342. submitUser() {
  343. this.$refs["formUser"].validate((valid) => {
  344. if (valid) {
  345. this.open = false;
  346. console.log("================", this.userInfo);
  347. let userIndex = this.formData.userInfos.findIndex(x=>x.idCard==this.userInfo.idCard);
  348. if(userIndex>-1)
  349. {
  350. this.formData.userInfos.splice(userIndex, 1);
  351. }
  352. this.formData.userInfos.push(this.userInfo);
  353. this.userInfo = this.resetUserInfo();
  354. this.imageList = [];
  355. }
  356. });
  357. },
  358. submitForm() {
  359. this.$refs["form"].validate((valid) => {
  360. if (valid) {
  361. if (this.formData.userInfos.length <= 0) {
  362. this.$message.error("请添加人员");
  363. return;
  364. }
  365. console.log("================", this.formData);
  366. if (this.formData.id != null) {
  367. updateLetter(this.formData).then((response) => {
  368. this.$modal.msgSuccess("编辑成功");
  369. this.isShow = false;
  370. this.formData = this.reset();
  371. this.$emit("success", this.formData);
  372. });
  373. } else {
  374. addLetter(this.formData).then((response) => {
  375. this.$modal.msgSuccess("新增成功");
  376. this.isShow = false;
  377. this.formData = this.reset();
  378. this.$emit("success", this.formData);
  379. });
  380. }
  381. }
  382. });
  383. },
  384. editUser(row) {
  385. this.open = true;
  386. this.userInfo = row;
  387. },
  388. remove(row) {
  389. console.log("================", row);
  390. this.formData.userInfos.splice(this.formData.userInfos.indexOf(row), 1);
  391. },
  392. },
  393. mounted() {},
  394. };
  395. </script>