index.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  1. <template>
  2. <el-dialog
  3. v-loading="loading"
  4. :title="title"
  5. :visible.sync="dialogVisible"
  6. :close-on-click-modal="false"
  7. :close-on-press-escape="false"
  8. :show-close="false"
  9. append-to-body
  10. fullscreen
  11. class="dialog paper-detail-dialog"
  12. top="0"
  13. >
  14. <div slot="title" class="dialog-title">
  15. <span class="dialogtitle">{{ title }}</span>
  16. <div>
  17. <ibps-toolbar :actions="toolbars" @action-event="handleActionEvent" />
  18. </div>
  19. </div>
  20. <div class="container">
  21. <div class="left" :style="{width:initWidth}">
  22. <div class="form">
  23. <el-form ref="form" label-width="100px" :model="form" :rules="rules">
  24. <el-row>
  25. <el-col :span="24">
  26. <el-form-item label="表单名称:" prop="biao_dan_ming_che">
  27. <el-input v-model="form.biao_dan_ming_che" size="mini" placeholder="请输入" />
  28. </el-form-item>
  29. </el-col>
  30. </el-row>
  31. <el-row>
  32. <el-col :span="24">
  33. <el-form-item label="表单模板:" prop="biao_dan_mo_ban_">
  34. <ibps-attachment
  35. v-model="form.biao_dan_mo_ban_"
  36. :download="true"
  37. :multiple="false"
  38. accept=".docx"
  39. :readonly="false"
  40. size="mini"
  41. />
  42. </el-form-item>
  43. </el-col>
  44. </el-row>
  45. <el-row>
  46. <el-col :span="24">
  47. <el-form-item label="归档路径:" prop="gui_dang_lu_jing_">
  48. <ibps-custom-dialog
  49. v-model="form.gui_dang_lu_jing_"
  50. size="mini"
  51. template-key="bdmbgdljdhk"
  52. :multiple="false"
  53. type="dialog"
  54. class="custom-dialog"
  55. placeholder="请选择"
  56. icon="el-icon-search"
  57. />
  58. </el-form-item>
  59. </el-col>
  60. </el-row>
  61. <el-row>
  62. <el-col :span="24">
  63. <el-form-item label="审批流程" prop="shen_pi_liu_cheng">
  64. <el-radio-group v-model="form.shen_pi_liu_cheng">
  65. <el-radio label="无需审批">无需审批</el-radio>
  66. <el-radio label="需要审批">需要审批</el-radio>
  67. </el-radio-group>
  68. </el-form-item>
  69. </el-col>
  70. </el-row>
  71. </el-form>
  72. </div>
  73. <div v-show="form.shen_pi_liu_cheng==='需要审批'" class="table">
  74. <el-row>
  75. <el-col :span="24" style="margin:0 0 5px 0">
  76. <div class="button">
  77. <el-button type="danger" size="mini" icon="ibps-icon-close" @click="goSubRemove">删除</el-button>
  78. <el-button type="success" size="mini" icon="ibps-icon-plus" @click="goSubAdd">添加</el-button>
  79. </div>
  80. </el-col>
  81. </el-row>
  82. <el-row>
  83. <el-col :span="24">
  84. <el-table border :data="subForm" @selection-change="handleSelectionChange">
  85. <el-table-column
  86. width="50"
  87. type="selection"
  88. />
  89. <el-table-column
  90. prop=""
  91. label="序号"
  92. width="50"
  93. type="index"
  94. :index="showIndex"
  95. />
  96. <el-table-column prop="jie_dian_ming_cheng_" label="节点名称" width="200">
  97. <template slot-scope="{row}">
  98. <el-input v-model="row.jie_dian_ming_cheng_" size="mini" />
  99. </template>
  100. </el-table-column>
  101. <el-table-column prop="fang_shi_" label="方式" width="120">
  102. <template slot-scope="{row}">
  103. <el-select v-model="row.fang_shi_" placeholder="请选择" size="mini">
  104. <el-tooltip
  105. v-for="item in typeOption"
  106. :key="item.value"
  107. effect="dark"
  108. :content="item.tips"
  109. placement="right"
  110. >
  111. <el-option :label="item.label" :value="item.value" />
  112. </el-tooltip>
  113. </el-select>
  114. </template>
  115. </el-table-column>
  116. <el-table-column prop="yong_hu_lei_xing_" label="用户类型" width="100">
  117. <template slot-scope="{row}">
  118. <el-select v-model="row.yong_hu_lei_xing_" placeholder="请选择" size="mini" @change="onCategoryChange(row)">
  119. <el-option
  120. v-for="item in [{label:'人员',value:'employee'},{label:'角色',value:'role'},{label:'全部',value:'all'}]"
  121. :key="item.value"
  122. :label="item.label"
  123. :value="item.value"
  124. />
  125. </el-select>
  126. </template>
  127. </el-table-column>
  128. <el-table-column prop="chu_li_ren_" label="人员/角色" align="center">
  129. <template slot-scope="{row}">
  130. <ibps-user-selector
  131. v-if="row.yong_hu_lei_xing_==='employee'"
  132. v-model="row.chu_li_ren_"
  133. size="mini"
  134. type="user"
  135. readonly-text="text"
  136. :disabled="false"
  137. placeholder="请选择人员"
  138. :multiple="true"
  139. />
  140. <ibps-role-selector
  141. v-if="row.yong_hu_lei_xing_==='role'"
  142. v-model="row.chu_li_ren_"
  143. :disabled="false"
  144. placeholder="请选择指定角色"
  145. :multiple="false"
  146. />
  147. <span v-if="row.yong_hu_lei_xing_==='all'">/</span>
  148. </template>
  149. </el-table-column>
  150. <!-- <el-table-column prop="zhi_xing_fang_shi_" label="执行方式" width="100">
  151. <template slot-scope="{row}">
  152. <el-select v-model="row.zhi_xing_fang_shi_" placeholder="请选择" size="mini">
  153. <el-option
  154. v-for="item in ['或签','与签']"
  155. :key="item"
  156. :label="item"
  157. :value="item"
  158. />
  159. </el-select>
  160. </template>
  161. </el-table-column> -->
  162. </el-table>
  163. </el-col>
  164. </el-row>
  165. </div>
  166. </div>
  167. </div>
  168. </el-dialog>
  169. </template>
  170. <script>
  171. import dayjs from 'dayjs'
  172. import ibpsUserSelector from '@/business/platform/org/selector'
  173. import IbpsRoleSelector from '@/business/platform/org/role/selector'
  174. import IbpsAttachment from '@/business/platform/file/attachment/selector'
  175. export default {
  176. components: {
  177. IbpsCustomDialog: () => import('@/business/platform/data/templaterender/custom-dialog'),
  178. ibpsUserSelector,
  179. IbpsRoleSelector,
  180. IbpsAttachment
  181. },
  182. props: {
  183. params: {
  184. type: Object,
  185. default: function () {
  186. return {}
  187. }
  188. }
  189. },
  190. data () {
  191. const { userId, position, level } = this.$store.getters
  192. return {
  193. dialogVisible: true,
  194. userId: userId,
  195. position: position,
  196. level: level.second || level.first,
  197. loading: false,
  198. title: '表单模板配置',
  199. toolbars: [
  200. { key: 'save', label: '保存' },
  201. { key: 'cancel', label: '退出', type: 'danger', icon: 'ibps-icon-close' }
  202. ],
  203. initWidth: '1280px',
  204. isEdit: false,
  205. isFinished: false,
  206. readonly: false,
  207. preParams: {},
  208. Ids: [],
  209. form: {
  210. biao_dan_ming_che: '',
  211. biao_dan_mo_ban_: '',
  212. gui_dang_lu_jing_: '',
  213. shen_pi_liu_cheng: '需要审批'
  214. },
  215. typeOption: [
  216. { label: '提前预设', value: 'presets', tips: '流程流转时,将直接推送到指定人员或角色的待办' },
  217. { label: '临时指定', value: 'temp', tips: '流程流转时,由上一节点的操作人在指定人员或角色范围内自行选择流程下一节点的处理人' }
  218. ],
  219. rules: {
  220. biao_dan_ming_che: [
  221. { required: true, message: '表单名称不能为空', trigger: 'blur' }
  222. ],
  223. biao_dan_mo_ban_: [
  224. { required: true, message: '表单模板不能为空', trigger: 'blur' }
  225. ],
  226. gui_dang_lu_jing_: [
  227. { required: true, message: '归档路径不能为空', trigger: 'blur' }
  228. ],
  229. shen_pi_liu_cheng: [
  230. { required: true, message: '审批流程不能为空', trigger: 'blur' }
  231. ]
  232. },
  233. subForm: [],
  234. multipleSelection: []
  235. }
  236. },
  237. watch: {
  238. },
  239. mounted () {
  240. console.log('params', this.params)
  241. this.init()
  242. },
  243. methods: {
  244. handleActionEvent ({ key }) {
  245. switch (key) {
  246. case 'cancel':
  247. this.closeDialog(true)
  248. break
  249. case 'save':
  250. this.goSave('close')
  251. break
  252. default:
  253. break
  254. }
  255. },
  256. showIndex (index) {
  257. // return index + 1 + (this.currentPage - 1) * this.pageSize
  258. return index + 1
  259. },
  260. handleSelectionChange (val) {
  261. this.multipleSelection = val
  262. },
  263. // 用户类型发生改变
  264. onCategoryChange (row) {
  265. const item = this.subForm.find(i => i === row)
  266. item.chu_li_ren_ = ''
  267. },
  268. // 子表添加
  269. goSubAdd () {
  270. if (this.subForm.length >= 4) {
  271. return this.$message.warning('超过流程节点的最大限制!')
  272. }
  273. this.subForm.push({
  274. jie_dian_ming_cheng_: '',
  275. chu_li_ren_: '',
  276. // zhi_xing_fang_shi_: '或签',
  277. yong_hu_lei_xing_: 'employee',
  278. fang_shi_: 'presets'
  279. })
  280. },
  281. // 子表删除
  282. goSubRemove () {
  283. this.subForm = this.subForm.filter(item => !this.multipleSelection.includes(item))
  284. },
  285. // 获取人员部门
  286. getPersonPosition (id) {
  287. const userList = this.$store.getters.userList
  288. const bianzhiUserid = userList.find(i => i.userId === id)
  289. if (bianzhiUserid) {
  290. return bianzhiUserid.positionId
  291. }
  292. },
  293. checkRequired (flag) {
  294. if (this.form.shen_pi_liu_cheng === '需要审批') {
  295. if (this.subForm.length === 0) throw new Error('请填写流程配置!')
  296. for (let i = 0; i < this.subForm.length; i++) {
  297. const item = this.subForm[i]
  298. if (!item.jie_dian_ming_cheng_) throw new Error(`第${i + 1}行缺少节点名称!`)
  299. if (item.yong_hu_lei_xing_ !== 'all' && !item.chu_li_ren_) throw new Error(`第${i + 1}行缺少处理人!`)
  300. }
  301. }
  302. },
  303. async goAdd () {
  304. try {
  305. const obj = this.formatData()
  306. const addParamsRecord = {
  307. tableName: 't_bdmbpzb',
  308. paramWhere: [obj]
  309. }
  310. const { variables: { cont }} = await this.$common.request('add', addParamsRecord)
  311. if (cont.length) {
  312. this.$message.success('添加成功')
  313. this.closeDialog(true)
  314. }
  315. } catch (error) {
  316. this.$message.warning(error.message)
  317. }
  318. },
  319. formatData () {
  320. const obj = {
  321. ...this.form,
  322. liu_cheng_shu_ju_: JSON.stringify({
  323. hasProcess: this.form.shen_pi_liu_cheng === '需要审批' ? 'Y' : 'N',
  324. nodeList: this.subForm.map((item, index) => ({
  325. sn: index + 1,
  326. nodeName: item.jie_dian_ming_cheng_,
  327. conditionType: item.fang_shi_,
  328. executeType: item.yong_hu_lei_xing_,
  329. executor: item.chu_li_ren_
  330. }))
  331. })
  332. }
  333. return obj
  334. },
  335. async goEdit (flag) {
  336. try {
  337. const obj = this.formatData()
  338. const updateParamsRecord = {
  339. tableName: 't_bdmbpzb',
  340. updList: [{
  341. where: {
  342. id_: this.params.id_
  343. },
  344. param: obj
  345. }]
  346. }
  347. await this.$common.request('update', updateParamsRecord)
  348. this.$message.success('修改成功!')
  349. this.closeDialog(true)
  350. } catch (error) {
  351. this.$message.warning(error.message)
  352. throw new Error(error.message)
  353. }
  354. },
  355. goSave (flag) {
  356. try {
  357. this.$refs.form.validate((valid) => {
  358. if (valid) {
  359. this.checkRequired()
  360. if (this.isEdit) {
  361. this.goEdit(flag)
  362. } else {
  363. this.goAdd()
  364. }
  365. } else {
  366. console.log('error submit!!')
  367. return false
  368. }
  369. })
  370. } catch (error) {
  371. this.$message.warning(error.message)
  372. }
  373. },
  374. // 刷新
  375. async goRefresh () {
  376. },
  377. // 关闭当前窗口
  378. closeDialog (needRefresh) {
  379. this.dialogVisible = false
  380. if (needRefresh) {
  381. this.$emit('close')
  382. }
  383. },
  384. async init () {
  385. this.isEdit = !!(this.params && this.params.id_)
  386. if (this.isEdit) {
  387. this.form = this.params
  388. // JSON 解析
  389. const liu_cheng_shu_ju_ = JSON.parse(this.form.liu_cheng_shu_ju_)
  390. console.log(liu_cheng_shu_ju_.nodeList)
  391. liu_cheng_shu_ju_.nodeList.forEach((item, index) => {
  392. this.$set(this.subForm, index, {
  393. jie_dian_ming_cheng_: item.nodeName,
  394. chu_li_ren_: item.executor,
  395. fang_shi_: item.conditionType,
  396. yong_hu_lei_xing_: item.executeType
  397. })
  398. })
  399. } else {
  400. this.form.di_dian_ = this.level
  401. this.form.bian_zhi_ren_ = this.userId
  402. this.form.bian_zhi_bu_men_ = this.position
  403. this.form.bian_zhi_shi_jian = dayjs().format('YYYY-MM-DD HH:mm:ss')
  404. }
  405. }
  406. }
  407. }
  408. </script>
  409. <style lang="scss" scoped>
  410. .paper-detail-dialog {
  411. ::v-deep {
  412. .el-dialog__header {
  413. text-align: center;
  414. }
  415. }
  416. .dialog-title{
  417. display: flex;
  418. align-items: center;
  419. justify-content: center;
  420. div{
  421. z-index: 99999999;
  422. position: absolute;
  423. right:8vw;
  424. }
  425. .dialogtitle{
  426. font-size: 22px;
  427. font-family: SimHei;
  428. font-weight: bold;
  429. color: #222;
  430. }
  431. }
  432. .container {
  433. display: flex;
  434. width: 100%;
  435. justify-content: center;
  436. .left{
  437. height: calc(100vh - 70px);
  438. box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
  439. padding:20px;
  440. overflow-y: auto;
  441. .item{
  442. width: 100%;
  443. }
  444. .title{
  445. margin: 16px 0 6px -16px;
  446. }
  447. .button{
  448. display: flex;
  449. flex-direction: row-reverse;
  450. .el-button{
  451. margin-left: 5px;
  452. }
  453. }
  454. }
  455. }
  456. }
  457. ::v-deep {
  458. .el-form-item__label{
  459. text-align: left
  460. }
  461. }
  462. </style>