approverDrawer.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. <template>
  2. <el-drawer
  3. :append-to-body="true"
  4. title="审批人设置"
  5. v-model="visible"
  6. class="set_promoter"
  7. :show-close="false"
  8. :size="550"
  9. :before-close="saveApprover"
  10. >
  11. <div class="demo-drawer__content">
  12. <div class="drawer_content">
  13. <div class="approver_content">
  14. <el-radio-group v-model="approverConfig.settype" class="clear" @change="changeType">
  15. <el-radio v-for="{ value, label } in setTypes" :key="value" :label="value">{{
  16. label
  17. }}</el-radio>
  18. </el-radio-group>
  19. <el-button type="primary" @click="addApprover" v-if="approverConfig.settype == 1"
  20. >添加/修改成员</el-button
  21. >
  22. <p class="selected_list" v-if="approverConfig.settype == 1">
  23. <span v-for="(item, index) in approverConfig.nodeUserList" :key="index"
  24. >{{ item.name }}
  25. <img
  26. src="@/assets/images/add-close1.png"
  27. @click="removeEle(approverConfig.nodeUserList, item, 'targetId')"
  28. />
  29. </span>
  30. <a
  31. v-if="approverConfig.nodeUserList.length != 0"
  32. @click="approverConfig.nodeUserList = []"
  33. >清除</a
  34. >
  35. </p>
  36. </div>
  37. <div class="approver_manager" v-if="approverConfig.settype == 2">
  38. <p>
  39. <span>发起人的:</span>
  40. <select v-model="approverConfig.directorLevel">
  41. <option v-for="item in directorMaxLevel" :value="item" :key="item"
  42. >{{ item == 1 ? '直接' : '第' + item + '级' }}主管</option
  43. >
  44. </select>
  45. </p>
  46. <p class="tip">找不到主管时,由上级主管代审批</p>
  47. </div>
  48. <div class="approver_self" v-if="approverConfig.settype == 5">
  49. <p>该审批节点设置“发起人自己”后,审批人默认为发起人</p>
  50. </div>
  51. <div class="approver_self_select" v-show="approverConfig.settype == 4">
  52. <el-radio-group v-model="approverConfig.selectMode" style="width: 100%">
  53. <el-radio v-for="{ value, label } in selectModes" :label="value" :key="value">{{
  54. label
  55. }}</el-radio>
  56. </el-radio-group>
  57. <h3>选择范围</h3>
  58. <el-radio-group
  59. v-model="approverConfig.selectRange"
  60. style="width: 100%"
  61. @change="changeRange"
  62. >
  63. <el-radio v-for="{ value, label } in selectRanges" :label="value" :key="value">{{
  64. label
  65. }}</el-radio>
  66. </el-radio-group>
  67. <template v-if="approverConfig.selectRange == 2 || approverConfig.selectRange == 3">
  68. <el-button type="primary" @click="addApprover" v-if="approverConfig.selectRange == 2"
  69. >添加/修改成员</el-button
  70. >
  71. <el-button type="primary" @click="addRoleApprover" v-else>添加/修改角色</el-button>
  72. <p class="selected_list">
  73. <span v-for="(item, index) in approverConfig.nodeUserList" :key="index"
  74. >{{ item.name }}
  75. <img
  76. src="@/assets/images/add-close1.png"
  77. @click="removeEle(approverConfig.nodeUserList, item, 'targetId')"
  78. />
  79. </span>
  80. <a
  81. v-if="approverConfig.nodeUserList.length != 0 && approverConfig.selectRange != 1"
  82. @click="approverConfig.nodeUserList = []"
  83. >清除</a
  84. >
  85. </p>
  86. </template>
  87. </div>
  88. <div class="approver_manager" v-if="approverConfig.settype == 7">
  89. <p>审批终点</p>
  90. <p style="padding-bottom: 20px">
  91. <span>发起人的:</span>
  92. <select v-model="approverConfig.examineEndDirectorLevel">
  93. <option v-for="item in directorMaxLevel" :value="item" :key="item"
  94. >{{ item == 1 ? '最高' : '第' + item }}层级主管</option
  95. >
  96. </select>
  97. </p>
  98. </div>
  99. <div
  100. class="approver_some"
  101. v-if="
  102. (approverConfig.settype == 1 && approverConfig.nodeUserList.length > 1) ||
  103. approverConfig.settype == 2 ||
  104. (approverConfig.settype == 4 && approverConfig.selectMode == 2)
  105. "
  106. >
  107. <p>多人审批时采用的审批方式</p>
  108. <el-radio-group v-model="approverConfig.examineMode" class="clear">
  109. <el-radio :label="1">依次审批</el-radio>
  110. <br />
  111. <el-radio :label="2" v-if="approverConfig.settype != 2"
  112. >会签(须所有审批人同意)</el-radio
  113. >
  114. </el-radio-group>
  115. </div>
  116. <div
  117. class="approver_some"
  118. v-if="approverConfig.settype == 2 || approverConfig.settype == 7"
  119. >
  120. <p>审批人为空时</p>
  121. <el-radio-group v-model="approverConfig.noHanderAction" class="clear">
  122. <el-radio :label="1">自动审批通过/不允许发起</el-radio>
  123. <br />
  124. <el-radio :label="2">转交给审核管理员</el-radio>
  125. </el-radio-group>
  126. </div>
  127. </div>
  128. <div class="demo-drawer__footer clear">
  129. <el-button type="primary" @click="saveApprover">确 定</el-button>
  130. <el-button @click="closeDrawer">取 消</el-button>
  131. </div>
  132. </div>
  133. </el-drawer>
  134. </template>
  135. <script lang="ts" setup>
  136. import { ref, watch, computed } from 'vue'
  137. import { useWorkFlowStoreWithOut } from '@/store/modules/simpleWorkflow'
  138. import { setTypes, selectModes, selectRanges } from '../util'
  139. import { removeEle, setApproverStr } from '../util'
  140. let props = defineProps({
  141. directorMaxLevel: {
  142. type: Number,
  143. default: 0
  144. }
  145. })
  146. let approverConfig = ref({})
  147. let approverVisible = ref(false)
  148. let approverRoleVisible = ref(false)
  149. let checkedRoleList = ref([])
  150. let checkedList = ref([])
  151. let store = useWorkFlowStoreWithOut()
  152. let { setApproverConfig, setApprover } = store
  153. let approverConfig1 = computed(() => store.approverConfig1)
  154. let approverDrawer = computed(() => store.approverDrawer)
  155. let visible = computed({
  156. get() {
  157. return approverDrawer.value
  158. },
  159. set() {
  160. closeDrawer()
  161. }
  162. })
  163. watch(approverConfig1, (val: any) => {
  164. approverConfig.value = val.value
  165. })
  166. let changeRange = () => {
  167. approverConfig.value.nodeUserList = []
  168. }
  169. const changeType = (val) => {
  170. approverConfig.value.nodeUserList = []
  171. approverConfig.value.examineMode = 1
  172. approverConfig.value.noHanderAction = 2
  173. if (val == 2) {
  174. approverConfig.value.directorLevel = 1
  175. } else if (val == 4) {
  176. approverConfig.value.selectMode = 1
  177. approverConfig.value.selectRange = 1
  178. } else if (val == 7) {
  179. approverConfig.value.examineEndDirectorLevel = 1
  180. }
  181. }
  182. const addApprover = () => {
  183. approverVisible.value = true
  184. checkedList.value = approverConfig.value.nodeUserList
  185. }
  186. const addRoleApprover = () => {
  187. approverRoleVisible.value = true
  188. checkedRoleList.value = approverConfig.value.nodeUserList
  189. }
  190. const sureApprover = (data) => {
  191. approverConfig.value.nodeUserList = data
  192. approverVisible.value = false
  193. }
  194. const sureRoleApprover = (data) => {
  195. approverConfig.value.nodeUserList = data
  196. approverRoleVisible.value = false
  197. }
  198. const saveApprover = () => {
  199. approverConfig.value.error = !setApproverStr(approverConfig.value)
  200. setApproverConfig({
  201. value: approverConfig.value,
  202. flag: true,
  203. id: approverConfig1.value.id
  204. })
  205. closeDrawer()
  206. }
  207. const closeDrawer = () => {
  208. setApprover(false)
  209. }
  210. </script>
  211. <style lang="scss" scoped>
  212. .set_promoter {
  213. .approver_content {
  214. padding-bottom: 10px;
  215. border-bottom: 1px solid #f2f2f2;
  216. }
  217. .approver_self_select,
  218. .approver_content {
  219. .el-button {
  220. margin-bottom: 20px;
  221. }
  222. }
  223. .approver_content,
  224. .approver_some,
  225. .approver_self_select {
  226. .el-radio-group {
  227. display: unset;
  228. }
  229. .el-radio {
  230. width: 27%;
  231. margin-bottom: 20px;
  232. height: 16px;
  233. }
  234. }
  235. .approver_manager p {
  236. line-height: 32px;
  237. }
  238. .approver_manager select {
  239. width: 420px;
  240. height: 32px;
  241. background: rgba(255, 255, 255, 1);
  242. border-radius: 4px;
  243. border: 1px solid rgba(217, 217, 217, 1);
  244. }
  245. .approver_manager p.tip {
  246. margin: 10px 0 22px 0;
  247. font-size: 12px;
  248. line-height: 16px;
  249. color: #f8642d;
  250. }
  251. .approver_self {
  252. padding: 28px 20px;
  253. }
  254. .approver_self_select,
  255. .approver_manager,
  256. .approver_content,
  257. .approver_some {
  258. padding: 20px 20px 0;
  259. }
  260. .approver_manager p:first-of-type,
  261. .approver_some p {
  262. line-height: 19px;
  263. font-size: 14px;
  264. margin-bottom: 14px;
  265. }
  266. .approver_self_select h3 {
  267. margin: 5px 0 20px;
  268. font-size: 14px;
  269. font-weight: bold;
  270. line-height: 19px;
  271. }
  272. }
  273. </style>