dialog.addletter.vue 13 KB

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