basic-form.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. <!--
  2. @description: 基础表单
  3. @Author: linqian
  4. @Date: 2021-07-10
  5. -->
  6. <template>
  7. <div>
  8. <el-form :class="isDetail ? '' : 'v-form-text'" ref="ruleForm" :model="sizeForm" :rules="rules" label-width="160px">
  9. <dg-row>
  10. <dg-col :span="12">
  11. <el-form-item label="审批类型:" prop="applyType">
  12. <div v-if="isDetail">{{ sizeForm.applyType }}</div>
  13. <div v-else>
  14. <dg-select
  15. :data="applyType"
  16. v-model="sizeForm.applyType"
  17. @change="handleChangeApproveType"
  18. :disabled="type == 'edit'"
  19. ></dg-select>
  20. </div>
  21. </el-form-item>
  22. </dg-col>
  23. <dg-col :span="12">
  24. <el-form-item label="流程名称:" prop="processName">
  25. <div v-if="isDetail">{{ sizeForm.processName }}</div>
  26. <div v-else>
  27. <dg-select
  28. :data="processNameType"
  29. v-model="sizeForm.processName"
  30. @change="handleChangeProcessName"
  31. ></dg-select>
  32. </div>
  33. </el-form-item>
  34. </dg-col>
  35. <dg-col :span="12" v-if="isDetail">
  36. <el-form-item label="流程编号:" prop="businessCode">
  37. <div>{{ sizeForm.businessCode }}</div>
  38. </el-form-item>
  39. </dg-col>
  40. <dg-col :span="12" v-if="isDetail">
  41. <el-form-item label="审批单编号:" prop="applicantId">
  42. <div>{{ sizeForm.applicantId }}</div>
  43. </el-form-item>
  44. </dg-col>
  45. <dg-col :span="12">
  46. <!-- 流程名称+申请人姓名+日期 -->
  47. <el-form-item label="审批单标题:" prop="applyTitle">
  48. <div v-if="isDetail">{{ sizeForm.applyTitle }}</div>
  49. <div v-else>
  50. <el-input v-model="sizeForm.applyTitle" :disabled="true"></el-input>
  51. </div>
  52. </el-form-item>
  53. </dg-col>
  54. <dg-col :span="12">
  55. <el-form-item label="申请人姓名:" prop="applicantName">
  56. <div v-if="isDetail">{{ sizeForm.applicantName }}</div>
  57. <div v-else>
  58. <el-input v-model="sizeForm.applicantName" :disabled="true"></el-input>
  59. </div>
  60. </el-form-item>
  61. </dg-col>
  62. <dg-col :span="12">
  63. <el-form-item label="申请人身份证号码:" prop="applicantIdcard">
  64. <div v-if="isDetail">{{ sizeForm.applicantIdcard }}</div>
  65. <div v-else>
  66. <el-input v-model="sizeForm.applicantIdcard" :disabled="true"></el-input>
  67. </div>
  68. </el-form-item>
  69. </dg-col>
  70. <dg-col :span="12">
  71. <el-form-item label="申请人手机号码:" prop="applicantPhoneNo">
  72. <div v-if="isDetail">{{ sizeForm.applicantPhoneNo }}</div>
  73. <div v-else>
  74. <el-input v-model="sizeForm.applicantPhoneNo"></el-input>
  75. </div>
  76. </el-form-item>
  77. </dg-col>
  78. <dg-col :span="12">
  79. <el-form-item label="申请人单位代码:" prop="applicantOrgCode">
  80. <div v-if="isDetail">{{ sizeForm.applicantOrgCode }}</div>
  81. <div v-else>
  82. <el-input v-model="sizeForm.applicantOrgCode" :disabled="true"></el-input>
  83. </div>
  84. </el-form-item>
  85. </dg-col>
  86. <dg-col :span="12">
  87. <el-form-item label="申请人单位名称:" prop="applicantOrgName">
  88. <div v-if="isDetail">{{ sizeForm.applicantOrgName }}</div>
  89. <div v-else>
  90. <el-input v-model="sizeForm.applicantOrgName" :disabled="true"></el-input>
  91. </div>
  92. </el-form-item>
  93. </dg-col>
  94. <dg-col :span="12" v-if="sizeForm.applyType == '1'">
  95. <el-form-item label="应用方:" prop="applyId">
  96. <div v-if="isDetail">{{ sizeForm.applyId }}</div>
  97. <div v-else>
  98. <dg-select :data="[]" v-model="sizeForm.applyId"></dg-select>
  99. </div>
  100. </el-form-item>
  101. </dg-col>
  102. </dg-row>
  103. <dg-row> </dg-row>
  104. <dg-row>
  105. <dg-col :span="8" v-if="isDetail">
  106. <el-form-item label="创建时间:">
  107. {{ sizeForm.createTime }}
  108. </el-form-item>
  109. </dg-col>
  110. </dg-row>
  111. <dg-row>
  112. <dg-col :span="24">
  113. <!-- <component :is="approveComponent"></component> -->
  114. <el-form-item label="审批内容:" class="self-form-item" prop="flowContent">
  115. <div style="display: flex" v-if="!isDetail">
  116. <el-input
  117. type="textarea"
  118. :autosize="{ minRows: 5 }"
  119. v-model="sizeForm.flowContent"
  120. :disabled="true"
  121. ></el-input>
  122. <dg-button style="margin-left: 10px" @click="handleChoice">选择</dg-button>
  123. </div>
  124. <div v-else>
  125. {{ sizeForm.flowContent }}
  126. </div>
  127. </el-form-item>
  128. </dg-col>
  129. </dg-row>
  130. <dg-row>
  131. <dg-col :span="24">
  132. <el-form-item prop="applyReason" label="申请理由:">
  133. <div v-if="isDetail">
  134. {{ sizeForm.applyReason }}
  135. </div>
  136. <div v-else>
  137. <el-input
  138. v-model="sizeForm.applyReason"
  139. type="textarea"
  140. maxlength="300"
  141. show-word-limit
  142. :autosize="{ minRows: 5 }"
  143. ></el-input>
  144. </div>
  145. </el-form-item>
  146. </dg-col>
  147. <!-- 数据资源访问权限 -->
  148. <div v-if="sizeForm.applyType == '2'">
  149. <dg-col :span="13">
  150. <el-form-item label="案件/事件/线索/被查询人员类别:" prop="userType" label-width="250px">
  151. <div v-if="isDetail">{{ sizeForm.userType }}</div>
  152. <div v-else>
  153. <dg-select :data="[]" v-model="sizeForm.userType"></dg-select>
  154. </div>
  155. </el-form-item>
  156. </dg-col>
  157. <dg-col :span="13">
  158. <el-form-item label="案件/事件/线索/被查询人员姓名:" prop="userName" label-width="250px">
  159. <div v-if="isDetail">{{ sizeForm.userName }}</div>
  160. <div v-else>
  161. <el-input v-model="sizeForm.userName"></el-input>
  162. </div>
  163. </el-form-item>
  164. </dg-col>
  165. <dg-col :span="13">
  166. <el-form-item label="案件/事件/线索/被查询人员编码:" prop="userCode" label-width="250px">
  167. <div v-if="isDetail">{{ sizeForm.userCode }}</div>
  168. <div v-else>
  169. <el-input :data="[]" v-model="sizeForm.userCode"></el-input>
  170. </div>
  171. </el-form-item>
  172. </dg-col>
  173. </div>
  174. </dg-row>
  175. <dg-row>
  176. <dg-col :span="24">
  177. <el-form-item label="权限有效期:" prop="permissionValidType">
  178. <div v-if="isDetail">
  179. <span v-if="sizeForm.permissionValidType == '01'"
  180. >{{ sizeForm.startTime | dateFormatter }} 至 {{ sizeForm.endTime | dateFormatter }}</span
  181. >
  182. <span v-else>长期</span>
  183. </div>
  184. <div v-else>
  185. <dg-row>
  186. <dg-col :span="6">
  187. <dg-radio
  188. v-model="sizeForm.permissionValidType"
  189. :label="radio.code"
  190. call-off
  191. v-for="radio in shortBtns"
  192. :key="radio.code"
  193. >{{ radio.text }}</dg-radio
  194. >
  195. </dg-col>
  196. <dg-col :span="10">
  197. <dg-date-picker
  198. :start-value.sync="sizeForm.startTime"
  199. :end-value.sync="sizeForm.endTime"
  200. type="daterange"
  201. range-separator="至"
  202. start-placeholder="开始日期"
  203. end-placeholder="结束日期"
  204. value-format="yyyy-MM-dd HH:mm:ss"
  205. :default-time="['00:00:00', '23:59:59']"
  206. v-show="sizeForm.permissionValidType !== '02'"
  207. :picker-options="pickerOptions"
  208. clearable
  209. :unlink-panels="true"
  210. >
  211. </dg-date-picker>
  212. </dg-col>
  213. </dg-row>
  214. </div>
  215. </el-form-item>
  216. </dg-col>
  217. </dg-row>
  218. <!-- v1.0.0不实现 -->
  219. <!-- <dg-row>
  220. <dg-col :span="12">
  221. <el-form-item label="附件:">
  222. <div v-if="!isDetail">
  223. <p v-for="item in sizeForm.fj" :key="item.url">
  224. <dg-button type="text" class="dg-color-text-65" @click="handleDownLoad(item)"
  225. ><i class="icon iconfont iconl-link dg-color-text-25"></i>
  226. {{ item.name }}</dg-button
  227. >
  228. </p>
  229. </div>
  230. <div v-else>
  231. <dg-upload
  232. ref="upload"
  233. list-type="button"
  234. action="http://192.168.10.14:7300/mock/5d0a8c81e711b09fc48914c0/example/upload"
  235. :on-remove="handleFileRemove"
  236. :before-remove="beforeFileRemove"
  237. multiple
  238. :on-exceed="handleFileExceed"
  239. :on-success="handleFileSuccess"
  240. size="5m"
  241. v-model="sizeForm.fj"
  242. >
  243. </dg-upload>
  244. </div>
  245. </el-form-item>
  246. </dg-col>
  247. </dg-row> -->
  248. </el-form>
  249. <div v-footer>
  250. <dg-button @click="handleCancel">取消</dg-button>
  251. <dg-button type="primary" @click="handleSave">保存</dg-button>
  252. <dg-button type="primary" @click="handleSubmit">提交</dg-button>
  253. </div>
  254. </div>
  255. </template>
  256. <script>
  257. import { checkPhone } from '@/utils/regular';
  258. import appFuncForm from './app-func-form.vue';
  259. import serviceSourceForm from './service-source-form.vue';
  260. import dataSourceForm from './data-source-form.vue';
  261. import moment from 'moment';
  262. import { savePermissionApply } from '@/api/permission-selfhelp-manage';
  263. export default {
  264. name: 'FormItem',
  265. // 接收父页面传过来的属性
  266. props: {
  267. id: [String],
  268. type: {
  269. type: String
  270. }
  271. },
  272. // 页面数据绑定
  273. data() {
  274. const checkPhoneValid = (rule, val, callback) => {
  275. if (!val) {
  276. return callback(new Error('请输入手机号码'));
  277. }
  278. if (val && !checkPhone(val)) {
  279. return callback(new Error('请输入正确格式的手机号码'));
  280. }
  281. callback();
  282. };
  283. return {
  284. sizeForm: {},
  285. approveComponent: 'appFuncForm',
  286. applyType: [
  287. {
  288. label: '应用功能访问权限',
  289. value: '0'
  290. },
  291. {
  292. label: '服务资源访问权限',
  293. value: '1'
  294. },
  295. {
  296. label: '数据资源访问权限',
  297. value: '2'
  298. }
  299. ],
  300. processNameType: [
  301. {
  302. label: '应用功能访问权限申请',
  303. value: '0'
  304. },
  305. {
  306. label: '服务资源访问权限申请',
  307. value: '1'
  308. }
  309. ],
  310. rules: {
  311. flowContent: { required: true, message: '请选择审批内容', trigger: 'blur' },
  312. applyType: { required: true, message: '请选择审批类型', trigger: 'blur' },
  313. processName: { required: true, message: '请输入流程名称', trigger: 'blur' },
  314. applyReason: [{ required: true, message: '请输入申请理由', trigger: 'blur' }],
  315. applicantPhoneNo: [
  316. { required: true, message: '请输入申请人电话号码', trigger: 'blur' },
  317. { validator: checkPhoneValid, trigger: 'blur' }
  318. ],
  319. permissionValidType: { required: true, message: '请选择有效期类型', trigger: 'change' },
  320. applyId: [{ required: true, message: '请选择应用方', trigger: 'blur' }], // 应用方
  321. userName: [{ required: true, message: '请输入人员名称', trigger: 'blur' }],
  322. userType: [{ required: true, message: '请选择人员类型', trigger: 'blur' }],
  323. userCode: [{ required: true, message: '请输入人员编号', trigger: 'blur' }]
  324. },
  325. shortBtns: [
  326. {
  327. text: '自定义',
  328. time: '01',
  329. code: '01'
  330. },
  331. {
  332. text: '长期',
  333. time: '02',
  334. code: '02'
  335. }
  336. ],
  337. pickerOptions: {
  338. disabledDate(currentDate) {
  339. return currentDate.getTime() < Date.now() - 8.64e7;
  340. }
  341. },
  342. applySelectKeys: []
  343. };
  344. },
  345. components: {},
  346. computed: {
  347. isDetail() {
  348. return this.type == 'detail';
  349. }
  350. },
  351. watch: {
  352. 'sizeForm.processName': {
  353. handler(val) {
  354. if (val) {
  355. this.sizeForm.applyTitle =
  356. this.processNameType.find((item) => item.value == val).label +
  357. '-' +
  358. this.sizeForm.applicantName +
  359. '-' +
  360. moment().format('YYYY-MM-DD');
  361. this.sizeForm.businessCode = val;
  362. }
  363. }
  364. },
  365. 'sizeForm.applyType': {
  366. handler(val) {
  367. this.sizeForm.applicantId = val;
  368. }
  369. }
  370. },
  371. methods: {
  372. // 改变流程名称
  373. handleChangeProcessName() {},
  374. // 取消
  375. handleCancel() {
  376. this.$emit.close();
  377. },
  378. // 保存
  379. handleSave() {
  380. this.sizeForm.operateType = '1';
  381. this.save();
  382. },
  383. // 提交
  384. handleSubmit() {
  385. this.$refs.ruleForm.validate((valid) => {
  386. if (valid) {
  387. if ( !this.sizeForm.startTime && !this.sizeForm.endTime) {
  388. this.$message.warning("请选择开始时间和结束时间!");
  389. return;
  390. }
  391. this.sizeForm.operateType = '2';
  392. this.save();
  393. }
  394. });
  395. },
  396. save() {
  397. const { resourceInfos, applyId, userType, userName, userCode, ...otherInfo } = this.sizeForm;
  398. const params = {
  399. resourceInfos,
  400. workFlow: otherInfo
  401. };
  402. savePermissionApply(params).then((res) => {
  403. if (this.sizeForm.operateType == '2') {
  404. this.$message.success('提交成功!');
  405. } else {
  406. this.$message.success('保存成功!');
  407. }
  408. this.$emit('success');
  409. });
  410. },
  411. // 选择
  412. handleChoice() {
  413. const vm = this;
  414. const applyType = vm.sizeForm.applyType;
  415. // 审批内容选择
  416. let component;
  417. if (applyType == '0') {
  418. component = appFuncForm;
  419. } else if (applyType == '1') {
  420. component = serviceSourceForm;
  421. } else {
  422. component = dataSourceForm;
  423. }
  424. const layer = this.$dgLayer({
  425. title: '选择资源',
  426. shadow: [0.4, '#fff'],
  427. props: {
  428. selectKeys: this.applySelectKeys
  429. },
  430. content: component,
  431. area: ['1200px', '700px'],
  432. on: {
  433. success(approveContent, selectKeys, resourceInfos = []) {
  434. vm.sizeForm.resourceInfos = resourceInfos;
  435. vm.applySelectKeys = selectKeys;
  436. vm.sizeForm.flowContent = vm.sizeForm.applicantName + '申请访问资源:' + approveContent;
  437. layer.close(layer.dialogIndex);
  438. },
  439. close() {
  440. layer.close(layer.dialogIndex);
  441. }
  442. }
  443. });
  444. },
  445. // 切换审批类型
  446. handleChangeApproveType(val) {
  447. this.sizeForm.flowContent = '';
  448. this.sizeForm.resourceInfoDTO = [];
  449. if (val == '0') {
  450. this.approveComponent = 'appFuncForm';
  451. }
  452. },
  453. /**
  454. * 下载附件
  455. */
  456. handleDownLoad(item) {},
  457. /**
  458. * 文件列表移除文件时,sizebool false为文件超出
  459. */
  460. handleFileRemove(file, fileList) {
  461. console.log(file, fileList);
  462. },
  463. /**
  464. * 文件上传成功
  465. */
  466. handleFileSuccess(response, file, fileList) {
  467. console.log(response, file, fileList);
  468. },
  469. /**
  470. * 文件超出个数限制时
  471. */
  472. handleFileExceed(files, fileList) {
  473. this.$message.warning(
  474. `当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`
  475. );
  476. },
  477. /**
  478. * 删除文件之前,参数为上传的文件和文件列表,若返回 false 或者返回 Promise 且被 reject,则停止删除。
  479. */
  480. beforeFileRemove(file, fileList, sizeBool) {
  481. if (sizeBool === false) {
  482. return;
  483. }
  484. return this.$confirm(`确定移除 ${file.name}?`);
  485. }
  486. },
  487. created() {
  488. const { name, idcard, securityOrg, securityOrgName, mobile, id } = this.$store.getters.user;
  489. if (!this.id) {
  490. this.sizeForm = {
  491. // 流程标题
  492. applyTitle: '',
  493. applicantId: '0', // id
  494. applicantIdcard: idcard, // 申请人身份证号
  495. applicantName: name, // 申请人姓名
  496. applicantOrgCode: securityOrg, // 申请人机构代码
  497. applicantOrgName: securityOrgName, //申请人机构名称
  498. applicantPhoneNo: mobile, // 申请人号码
  499. flowContent: '', // 审核内容
  500. applyReason: '', // 申请原因
  501. businessCode: '', // 前端无用
  502. operateType: '', // 1--保存 2--提交
  503. applyType: '0',
  504. processName: '',
  505. permissionValidType: '02',
  506. startTime: '',
  507. endTime: '',
  508. resourceInfos: [],
  509. applyId: '', // 应用方
  510. userType: '',
  511. userName: '',
  512. userCode: ''
  513. };
  514. }
  515. },
  516. mounted() {}
  517. };
  518. </script>
  519. <style scoped lang="scss">
  520. // @import './index.scss';
  521. </style>