edit.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638
  1. <template>
  2. <el-dialog :title="title" :visible.sync="dialogVisible" :close-on-click-modal="false" :close-on-press-escape="false" append-to-body class="bpmn-agent-dialog" width="60%" top="10vh" @open="getFormData" @close="closeDialog">
  3. <div style="padding: 15px">
  4. <el-form ref="agentForm" v-loading="dialogLoading" class="bpmnForm" :element-loading-text="$t('common.loading')" :model="bpmAgent" :rules="rules" :label-width="formLabelWidth" label-position="left" @submit.native.prevent>
  5. <el-row v-if="srcList.length > 0">
  6. <el-col :span="24">
  7. <el-form-item label="代理人参考图片:">
  8. <div class="imageListClass">
  9. <div v-for="(item,index) in srcList" :key="index">
  10. <el-image :src="item" class="sinImageList" :preview-src-list="srcList" />
  11. </div>
  12. </div>
  13. </el-form-item>
  14. </el-col>
  15. </el-row>
  16. <el-row>
  17. <el-col :span="24">
  18. <el-form-item label="标题:" prop="title">
  19. <el-input v-if="!readonly" v-model="bpmAgent.title" placeholder="请输入标题" />
  20. <span v-else>{{ bpmAgent.title }}</span>
  21. </el-form-item>
  22. </el-col>
  23. </el-row>
  24. <el-row :gutter="20">
  25. <el-col :span="12">
  26. <el-form-item label="生效时间:" prop="effectiveTime">
  27. <el-date-picker v-if="!readonly" v-model="bpmAgent.effectiveTime" class="time" type="date" value-format="yyyy-MM-dd" placeholder="请选择生效时间" />
  28. <span v-else>{{ bpmAgent.effectiveTime }}</span>
  29. </el-form-item>
  30. </el-col>
  31. <el-col :span="12">
  32. <el-form-item label="失效时间:" prop="expiryTime">
  33. <el-date-picker v-if="!readonly" v-model="bpmAgent.expiryTime" class="time" type="date" value-format="yyyy-MM-dd" placeholder="请选择失效时间" />
  34. <span v-else>{{ bpmAgent.expiryTime }}</span>
  35. </el-form-item>
  36. </el-col>
  37. </el-row>
  38. <el-row :gutter="20">
  39. <el-col :span="12">
  40. <el-form-item label="委托人:" prop="delegatorId">
  41. <ibps-user-selector
  42. v-if="!readonly"
  43. v-model="bpmAgent.delegatorId"
  44. :type="type"
  45. :filter="filter"
  46. :multiple="multiple"
  47. :filtrate="filtrate"
  48. :store="store"
  49. :disabled="disabled"
  50. :readonly-text="readonlyText"
  51. placeholder="请选择委托人"
  52. @change-link-data="callbackDelegatorrInfo"
  53. />
  54. <span v-else>{{ bpmAgent.delegatorName }}</span>
  55. </el-form-item>
  56. </el-col>
  57. <el-col :span="12">
  58. <el-form-item v-if="bpmAgent.agentType === 'all' || bpmAgent.agentType === 'part'" label="代理人:" prop="agenterId">
  59. <ibps-user-selector
  60. v-if="!readonly"
  61. v-model="bpmAgent.agenterId"
  62. :type="type"
  63. :filter="filter"
  64. :multiple="multiple"
  65. :filtrate="filtrate"
  66. :store="store"
  67. :disabled="disabled"
  68. :readonly-text="readonlyText"
  69. placeholder="请选择代理人"
  70. @change-link-data="callbackAgenterInfo"
  71. />
  72. <span v-else>{{ bpmAgent.agenterName }}</span>
  73. </el-form-item>
  74. </el-col>
  75. </el-row>
  76. <el-row>
  77. <el-col :span="24">
  78. <el-form-item>
  79. <template slot="label">
  80. 委托人角色:
  81. <help-tip :title="formAsterisk.title" :content="formAsterisk.content" />
  82. </template>
  83. <el-checkbox-group v-if="!readonly" v-model="checkRoleList">
  84. <el-checkbox v-for="item in roleList" :key="item.id" :label="item.id">{{ item.name }}</el-checkbox>
  85. </el-checkbox-group>
  86. <span v-else>{{ getWeiTuoName(checkRoleList,roleList) }}</span>
  87. </el-form-item>
  88. </el-col>
  89. </el-row>
  90. <el-row>
  91. <el-col :span="24">
  92. <el-form-item label="代理人角色:">
  93. <span>{{ daiRoleName }}</span>
  94. </el-form-item>
  95. </el-col>
  96. </el-row>
  97. <!-- 全部代理 || 部分代理 -->
  98. <el-row :gutter="20">
  99. <el-col :span="12" col>
  100. <el-form-item label="代理类型:" prop="agentType">
  101. <el-radio-group v-if="!readonly" v-model="bpmAgent.agentType">
  102. <el-radio v-for="option in agentTypeOptions" :key="option.value" :label="option.value">{{ option.label }}</el-radio>
  103. </el-radio-group>
  104. <el-tag v-else :type="bpmAgent.agentType | optionsFilter(agentTypeOptions, 'type')">{{ bpmAgent.agentType | optionsFilter(agentTypeOptions, 'label') }}</el-tag>
  105. </el-form-item>
  106. </el-col>
  107. <el-col :span="12" col>
  108. <el-form-item label="是否启用:" prop="isEnabled">
  109. <el-switch v-if="!readonly" v-model="bpmAgent.isEnabled" active-value="enabled" inactive-value="disabled" />
  110. <el-tag v-else :type="bpmAgent.isEnabled | optionsFilter(statusOptions, 'type')">{{ bpmAgent.isEnabled | optionsFilter(statusOptions, 'label') }}</el-tag>
  111. </el-form-item>
  112. </el-col>
  113. </el-row>
  114. <div v-if="bpmAgent.agentType === 'part'">
  115. <el-form-item label="流程定义">
  116. <div v-if="!readonly" class="dialog-right">
  117. <bpm-definition-selector button multiple @callback="updateDefine" />
  118. <el-button class="ibps-icon-remove ibps-ml-10" type="danger" @click="handleAllDelete(multipleSelection)">删除</el-button>
  119. </div>
  120. </el-form-item>
  121. <el-form-item v-loading="rowLoading" label-width="0px" :element-loading-text="$t('common.loading')">
  122. <el-table ref="multipleTable" border :data="bpmAgent.bpmAgentDefPoList" tooltip-effect="dark" style="width: 100%" @selection-change="handleSelectionChange">
  123. <el-table-column v-if="!readonly" type="selection" width="45" />
  124. <el-table-column label="流程名称">
  125. <template slot-scope="scope">{{ scope.row.procDefName ? scope.row.procDefName : scope.row.name }}</template>
  126. </el-table-column>
  127. <el-table-column v-if="!readonly" label="操作" width="55">
  128. <template slot-scope="scope">
  129. <el-button type="danger" icon="el-icon-delete" circle @click="handleDelete(scope.$index, scope.row)" />
  130. </template>
  131. </el-table-column>
  132. </el-table>
  133. </el-form-item>
  134. </div>
  135. <!-- 条件代理 -->
  136. <div v-if="bpmAgent.agentType === 'condition'">
  137. <el-form-item label="流程名称:">
  138. <bpm-definition-selector v-model="bpmAgent.procDefId" :disabled="readonly" />
  139. </el-form-item>
  140. <el-form-item label="流程代理条件:">
  141. <div v-if="!readonly" class="dialog-right">
  142. <el-button class="ibps-icon-add" type="primary" @click="openConditionDialog">添加</el-button>
  143. <el-button class="ibps-icon-remove ibps-ml-5" type="danger">删除</el-button>
  144. </div>
  145. </el-form-item>
  146. <el-form-item v-loading="rowLoading" label-width="20px" :element-loading-text="$t('common.loading')">
  147. <el-table ref="multipleTable" :data="bpmAgent.bpmAgentConditionPoList" tooltip-effect="dark" style="width: 100%" @selection-change="handleConditionChange">
  148. <el-table-column type="selection" width="55" />
  149. <el-table-column label="代理人">
  150. <template slot-scope="scope">{{ scope.row.agenterName }}</template>
  151. </el-table-column>
  152. <el-table-column label="条件名称">
  153. <template slot-scope="scope">{{ scope.row.name }}</template>
  154. </el-table-column>
  155. <el-table-column prop="address" label="管理" width="100px" show-overflow-tooltip>
  156. <el-button type="primary" icon="el-icon-edit" circle @click="handleEdit(scope.$index, scope.row)" />
  157. <el-button type="danger" icon="el-icon-delete" circle @click="handleRemove(scope.$index, scope.row)" />
  158. </el-table-column>
  159. </el-table>
  160. </el-form-item>
  161. </div>
  162. </el-form>
  163. </div>
  164. <div slot="footer" class="el-dialog--center">
  165. <ibps-toolbar :actions="toolbars" @action-event="handleActionEvent" />
  166. </div>
  167. <!-- 添加规则弹窗 -->
  168. <condition :def-id="bpmAgent.procDefId" :visible="conditionDialogVisible" @callback="callbackBpmAgentConditionPoList" @close="(visible) => (conditionDialogVisible = visible)" />
  169. </el-dialog>
  170. </template>
  171. <script>
  172. import { save, get } from '@/api/platform/bpmn/bpmAgent'
  173. import { agentTypeOptions, statusOptions } from './constants'
  174. import ActionUtils from '@/utils/action'
  175. import IbpsEmployeeSelector from '@/business/platform/org/employee/selector'
  176. import BpmDefinitionSelector from '@/business/platform/bpmn/definition/selector'
  177. import ibpsUserSelector from '@/business/platform/org/selector'
  178. import curdPost from '@/business/platform/form/utils/custom/joinCURD.js'
  179. import helpTip from '@/business/platform/form/formbuilder/right-aside/components/help-tip.vue'
  180. import Condition from './condition'
  181. import { load } from '@/api/platform/org/employee'
  182. import { setTimeout } from 'timers'
  183. export default {
  184. components: {
  185. IbpsEmployeeSelector,
  186. BpmDefinitionSelector,
  187. Condition,
  188. ibpsUserSelector,
  189. helpTip
  190. },
  191. props: {
  192. visible: {
  193. type: Boolean,
  194. default: false
  195. },
  196. readonly: {
  197. type: Boolean,
  198. default: false
  199. },
  200. id: String,
  201. title: String
  202. },
  203. data () {
  204. const { first = '', second = '' } = this.$store.getters.level
  205. const level = second || first
  206. return {
  207. level,
  208. formName: 'agentForm',
  209. formLabelWidth: '110px',
  210. dialogVisible: this.visible,
  211. conditionDialogVisible: false, // 条件规则界面
  212. dialogLoading: false,
  213. rowLoading: false,
  214. statusOptions: statusOptions,
  215. agentTypeOptions: agentTypeOptions,
  216. defaultForm: {},
  217. multipleSelection: [],
  218. conditionSelection: [],
  219. bpmAgent: {
  220. title: '',
  221. procDefId: '',
  222. procDefKey: '',
  223. delegatorId: this.$store.getters.userId,
  224. delegatorName: this.$store.getters.name,
  225. effectiveTime: '',
  226. expiryTime: '',
  227. agenterId: '',
  228. agenterName: '',
  229. agentType: 'all',
  230. isEnabled: 'enabled',
  231. bpmAgentDefPoList: [],
  232. bpmAgentConditionPoList: [],
  233. bpmAgentRoleList: []
  234. },
  235. rules: {
  236. title: [
  237. { required: true, message: this.$t('validate.required') },
  238. { min: 1, max: 64, message: '长度不能超过64个字符', trigger: 'blur' }
  239. ],
  240. delegatorId: [{ required: true, message: this.$t('validate.required') }],
  241. agenterId: [{ required: true, message: this.$t('validate.required') }],
  242. effectiveTime: [{ required: true, message: this.$t('validate.required') }],
  243. expiryTime: [{ required: true, message: this.$t('validate.required') }]
  244. },
  245. toolbars: [
  246. {
  247. key: 'save',
  248. hidden: () => {
  249. return this.readonly
  250. }
  251. },
  252. { key: 'cancel' }
  253. ],
  254. url: '',
  255. srcList: [],
  256. // 委托人和代理人 选择器修改通用选择器,需要这些参数
  257. type: 'user',
  258. filter: [{
  259. descVal: '2',
  260. includeSub: true,
  261. old: 'position',
  262. partyId: '',
  263. partyName: '',
  264. scriptContent: '',
  265. type: 'user',
  266. userType: 'position'
  267. }],
  268. multiple: false,
  269. filtrate: true,
  270. store: 'id',
  271. disabled: false,
  272. readonlyText: 'null',
  273. roleList: [],
  274. checkRoleList: [],
  275. daiRoleName: '',
  276. yuanRoleList: [],
  277. daiRoleList: [],
  278. formAsterisk: {
  279. title: '角色代理',
  280. content: '该委托人角色代理主要用于菜单权限与编辑按钮权限'
  281. }
  282. }
  283. },
  284. computed: {
  285. formId () {
  286. return this.id
  287. }
  288. },
  289. watch: {
  290. visible: {
  291. handler: function (val, oldVal) {
  292. this.dialogVisible = this.visible
  293. },
  294. immediate: true
  295. },
  296. 'bpmAgent.delegatorId': {
  297. handler: function (val, oldVal) {
  298. this.getWeiTuo(this.bpmAgent.delegatorId, 1)
  299. },
  300. immediate: true,
  301. deep: true
  302. },
  303. 'bpmAgent.agenterId': {
  304. handler: function (val, oldVal) {
  305. this.getWeiTuo(this.bpmAgent.agenterId, 2)
  306. },
  307. immediate: true,
  308. deep: true
  309. }
  310. },
  311. created () {
  312. this.defaultForm = JSON.parse(JSON.stringify(this.bpmAgent))
  313. this.getImage()
  314. this.getInit()
  315. },
  316. mounted () {
  317. this.$nextTick(() => {
  318. if (this.$refs.multipleTable) {
  319. this.$refs.multipleTable.doLayout()
  320. }
  321. })
  322. },
  323. methods: {
  324. // 初始化
  325. getInit () {
  326. this.filter[0].partyId = this.$store.getters.userInfo.employee.positions || ''
  327. },
  328. handleEdit () {
  329. this.rowLoading = true
  330. setTimeout(() => {
  331. this.rowLoading = false
  332. // TODO:
  333. })
  334. },
  335. handleRemove () {
  336. this.rowLoading = true
  337. setTimeout(() => {
  338. this.rowLoading = false
  339. // TODO:
  340. })
  341. },
  342. callbackBpmAgentConditionPoList (data) {
  343. },
  344. handleDelete (index, arr) {
  345. this.rowLoading = true
  346. setTimeout(() => {
  347. if (arr !== []) {
  348. this.bpmAgent.bpmAgentDefPoList.splice(index, 1)
  349. } else {
  350. arr.forEach((i) => {
  351. this.bpmAgent.bpmAgentDefPoList.forEach((l) => {
  352. if (i.procDefKey === l.procDefKey) {
  353. this.bpmAgent.bpmAgentDefPoList.splice(l, 1)
  354. }
  355. })
  356. })
  357. }
  358. this.rowLoading = false
  359. })
  360. },
  361. handleAllDelete (arr) {
  362. this.rowLoading = true
  363. setTimeout(() => {
  364. if (!this.$utils.isEmpty(arr)) {
  365. arr.forEach((i) => {
  366. this.bpmAgent.bpmAgentDefPoList.forEach((l) => {
  367. if (i.procDefKey === l.procDefKey) {
  368. this.bpmAgent.bpmAgentDefPoList.splice(l, 1)
  369. }
  370. })
  371. })
  372. }
  373. this.rowLoading = false
  374. })
  375. },
  376. handleSelectionChange (val) {
  377. this.multipleSelection = val
  378. },
  379. handleConditionChange (val) {
  380. this.conditionSelection = val
  381. },
  382. handleActionEvent ({ key }) {
  383. switch (key) {
  384. case 'save':
  385. this.handleSave()
  386. break
  387. case 'cancel':
  388. this.closeDialog()
  389. break
  390. default:
  391. break
  392. }
  393. },
  394. // 保存数据
  395. handleSave () {
  396. this.$refs[this.formName].validate((valid) => {
  397. if (valid) {
  398. this.saveData()
  399. } else {
  400. ActionUtils.saveErrorMessage()
  401. }
  402. })
  403. },
  404. // 提交保存数据
  405. saveData () {
  406. const data = JSON.parse(JSON.stringify(this.bpmAgent))
  407. data.effectiveTime = new Date(this.bpmAgent.effectiveTime).getTime() || ''
  408. data.expiryTime = new Date(this.bpmAgent.expiryTime).getTime() || ''
  409. // 检测生效时间日期是否发布日期在之前。
  410. if (data.effectiveTime > data.expiryTime) {
  411. ActionUtils.error('生效时间与失效时间范围不合法!')
  412. return
  413. }
  414. if (this.$utils.isEmpty(this.bpmAgent.bpmAgentDefPoList) && this.bpmAgent.agentType === 'part') {
  415. ActionUtils.error('流程定义数据不能为空!')
  416. return
  417. }
  418. this.bpmAgent.bpmAgentRoleList = this.checkRoleList
  419. save(this.bpmAgent)
  420. .then((response) => {
  421. this.$emit('callback', this)
  422. ActionUtils.saveSuccessMessage(response.message, (rtn) => {
  423. if (this.$utils.isEmpty(this.formId)) {
  424. this.$refs[this.formName].resetFields()
  425. }
  426. if (rtn) {
  427. this.closeDialog()
  428. }
  429. })
  430. })
  431. .catch((err) => {
  432. console.error(err)
  433. })
  434. },
  435. // 关闭当前窗口
  436. closeDialog () {
  437. this.$emit('close', false)
  438. this.$refs[this.formName].resetFields()
  439. this.daiRoleName = ''
  440. this.roleList = []
  441. this.checkRoleList = []
  442. },
  443. /**
  444. * 表单验证
  445. */
  446. formValidate () {
  447. if (this.readonly) return
  448. this.$nextTick(() => {
  449. this.$refs[this.formName].validate(() => {})
  450. })
  451. },
  452. /**
  453. * 获取表单数据
  454. */
  455. getFormData () {
  456. if (this.$utils.isEmpty(this.formId)) {
  457. // 重置表单
  458. this.bpmAgent = JSON.parse(JSON.stringify(this.defaultForm))
  459. this.formValidate()
  460. return
  461. }
  462. this.dialogLoading = true
  463. get({
  464. id: this.formId
  465. })
  466. .then((response) => {
  467. this.bpmAgent = response.data
  468. this.checkRoleList = response.data.bpmAgentRoleList || []
  469. // this.bpmAgent.bpmAgentRoleList = response.data.bpmAgentRoleList || []
  470. this.formValidate()
  471. this.dialogLoading = false
  472. })
  473. .catch(() => {
  474. this.dialogLoading = false
  475. })
  476. },
  477. addDef () {
  478. alert('打开流程选择器')
  479. },
  480. callbackDelegatorrInfo (value, data, type) {
  481. this.checkRoleList = []
  482. this.bpmAgent.delegatorName = data.name
  483. this.getVerification()
  484. },
  485. callbackAgenterInfo (value, data, type) {
  486. this.checkRoleList = []
  487. this.bpmAgent.agenterName = data.name
  488. this.getVerification()
  489. },
  490. updateDefine (data) {
  491. this.rowLoading = true
  492. const arr = data.map((item) => {
  493. return {
  494. id: '',
  495. agentId: '',
  496. procDefKey: item.defKey,
  497. nodeId: '',
  498. name: item.name
  499. }
  500. })
  501. setTimeout(() => {
  502. if (this.$utils.isEmpty(this.bpmAgent.bpmAgentDefPoList)) {
  503. this.bpmAgent.bpmAgentDefPoList = arr
  504. } else {
  505. this.bpmAgent.bpmAgentDefPoList = this.bpmAgent.bpmAgentDefPoList.concat(arr)
  506. }
  507. this.rowLoading = false
  508. })
  509. },
  510. openConditionDialog () {
  511. if (this.$utils.isEmpty(this.bpmAgent.procDefId)) {
  512. ActionUtils.warning('请选择流程!!')
  513. return
  514. }
  515. this.conditionDialogVisible = true
  516. },
  517. getImage () {
  518. const sql = `select * from t_dlpz where di_dian_ = '${this.level}' order by create_time_ desc LIMIT 1`
  519. curdPost('sql', sql).then((res) => {
  520. if (res.state === 200) {
  521. const datas = res.variables.data
  522. if (datas.length > 0) {
  523. const image = JSON.parse(datas[0].tu_pian_)
  524. const idList = image.map((item) => {
  525. return item.id
  526. })
  527. const ids = idList.join(',')
  528. this.getUrl(ids)
  529. }
  530. }
  531. })
  532. },
  533. getUrl (id) {
  534. const sql1 = `select nei_rong_ from t_ipcc where id_ = '1'`
  535. const sql2 = `select * from ibps_file_attachment where find_in_set(ID_,'${id}')`
  536. Promise.all([curdPost('sql', sql1), curdPost('sql', sql2)]).then(([res1, res2]) => {
  537. if (res1.state === 200 && res2.state === 200) {
  538. const datas1 = res1.variables.data
  539. const datas2 = res2.variables.data
  540. const ip = datas1[0].nei_rong_
  541. const imageList = datas2.map(item => {
  542. return ip + '/' + item.FILE_PATH_
  543. })
  544. this.srcList = imageList
  545. }
  546. })
  547. },
  548. getWeiTuo (id, type = 1, formId = '') {
  549. if (!id) return
  550. return new Promise((resolve, reject) => {
  551. load({ employeeId: id })
  552. .then((response) => {
  553. const data = response
  554. const partyRole = response.variables.partyRoles
  555. if (type === 1) {
  556. this.yuanRoleList = partyRole || []
  557. }
  558. if (type === 2) {
  559. this.daiRoleList = partyRole || []
  560. const roleName = partyRole.map((item) => item.name)
  561. this.daiRoleName = roleName.join(',')
  562. }
  563. this.getRoleList()
  564. resolve(data)
  565. })
  566. .catch(() => {
  567. })
  568. })
  569. },
  570. getRoleList () {
  571. if (this.yuanRoleList.length > 0 && this.daiRoleList.length > 0) {
  572. this.roleList = this.yuanRoleList.filter(item => {
  573. return !this.daiRoleList.some(it => it.id === item.id)
  574. })
  575. }
  576. },
  577. getVerification () {
  578. if (this.bpmAgent.agenterId === this.bpmAgent.delegatorId) {
  579. this.$message.error('委托人和代理人是同一个账号,请重新选择。')
  580. return true
  581. } else {
  582. return false
  583. }
  584. },
  585. getWeiTuoName (data, list) {
  586. const nameList = []
  587. list.forEach((item) => {
  588. if (data.includes(item.id)) {
  589. nameList.push(item.name)
  590. }
  591. })
  592. return nameList.join(',')
  593. }
  594. }
  595. }
  596. </script>
  597. <style lang="scss" scoped>
  598. .bpmn-agent-dialog {
  599. ::v-deep .el-dialog__body {
  600. height: calc(70vh - 110px) !important;
  601. }
  602. .dialog-right {
  603. float: right;
  604. div {
  605. display: inline-block;
  606. }
  607. }
  608. }
  609. .imageListClass {
  610. display: flex;
  611. flex-wrap: wrap;
  612. }
  613. .bpmnForm{
  614. padding: 20px;
  615. }
  616. .time{
  617. width: 100%;
  618. }
  619. .sinImageList{
  620. width: 150px;
  621. height: 150px;
  622. margin: 10px;
  623. }
  624. </style>