audit-area-list.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. <template>
  2. <div :class="$style.wrapHeight">
  3. <div :class="$style.rowHeight">
  4. <audit-advanced-query
  5. :expand="expand"
  6. :search-data="searchData"
  7. :ref-name="searchform"
  8. :search-style="{ height: '150px', left: '20px', top: '57px' }"
  9. :search-fun="handleSearch"
  10. @searchedClick="searchedClick"
  11. >
  12. <!-- 插槽放置搜索内容 -->
  13. <template>
  14. <!-- code name -->
  15. <!-- <a-col :span="12">
  16. <a-form-model-item :label="'领域编号'" prop="code">
  17. <a-input v-model="searchData.code" allow-clear />
  18. </a-form-model-item>
  19. </a-col> -->
  20. <a-col :span="12">
  21. <a-form-model-item :label="'领域名称'" prop="name">
  22. <a-input v-model="searchData.name" allow-clear />
  23. </a-form-model-item>
  24. </a-col>
  25. </template>
  26. </audit-advanced-query>
  27. <a-card>
  28. <SdDataTableEx
  29. ref="sddataTable"
  30. :form-id="formId"
  31. :page-id="pageId"
  32. :data-url="dataUrl"
  33. :columns="columns"
  34. :actions="actions"
  35. :filter-expressions="expressions"
  36. show-selection
  37. :search-fields="['code', 'name']"
  38. :show-advance-query="true"
  39. @searchbtnClick="searchbtnClick"
  40. >
  41. <!-- :check-type="'radio'" -->
  42. <!-- 表格列 -->
  43. <template slot="link" slot-scope="text, record">
  44. <a @click="showFormModal(record.id)">{{ text }}</a>
  45. </template>
  46. <!-- 插槽放置表格内容 -->
  47. <template v-slot:form="{ model }" v-sd-watermark="waterMark" @saved="onSaved">
  48. <!-- code name description -->
  49. <SdFormItem name="code" />
  50. <SdFormItem name="name" />
  51. <SdFormItem name="description">
  52. <a-textarea v-model="model.description" />
  53. </SdFormItem>
  54. </template>
  55. </SdDataTableEx>
  56. </a-card>
  57. <!-- 人员绑定 -->
  58. <a-modal title="人员绑定" :visible="visible" @ok="handleOk" @cancel="handleCancel">
  59. <a-form-model
  60. ref="ruleFormData"
  61. layout="horizontal"
  62. :model="formData"
  63. :rules="rules"
  64. v-bind="formItemLayout"
  65. >
  66. <a-form-model-item label="领域名称" prop="domainName">
  67. <!-- <a-input v-model="formData.domainName" :disabled="true"></a-input> -->
  68. <a-select mode="multiple" :default-value="selectRow" :disabled="true">
  69. <a-select-option v-for="item in currentRow" :key="item.id" :value="item.id">
  70. {{ item.name }}
  71. </a-select-option>
  72. </a-select>
  73. </a-form-model-item>
  74. <!-- 公司 -->
  75. <a-form-model-item label="单位" prop="unitName">
  76. <SdGroupPicker
  77. ref="cRelSelect"
  78. v-model="companyUnit"
  79. :root-node="userNodeTree"
  80. :single="true"
  81. :read-only="false"
  82. @change="changecompany"
  83. />
  84. </a-form-model-item>
  85. <!-- 整改人 -->
  86. <a-form-model-item label="整改人" prop="reformUser">
  87. <a-input v-if="isDisabled" :disabled="true" placeholder="请先选择单位"></a-input>
  88. <sd-user-picker
  89. v-else
  90. ref="peopleRelSelect"
  91. v-model="reformUserValue"
  92. :single="false"
  93. :read-only="false"
  94. :root-node="rootNode"
  95. @change="reformUserChange"
  96. />
  97. </a-form-model-item>
  98. <!-- 初审人 -->
  99. <a-form-model-item label="初审人" prop="checker">
  100. <a-input v-if="isDisabled" :disabled="true" placeholder="请先选择单位"></a-input>
  101. <sd-user-picker
  102. v-else
  103. ref="peopleRelSelect"
  104. v-model="checkerValue"
  105. :single="false"
  106. :read-only="false"
  107. :root-node="rootNode"
  108. @change="checkerValueChange"
  109. />
  110. </a-form-model-item>
  111. <!-- 复审人 -->
  112. <a-form-model-item label="复审人" prop="reviewer">
  113. <a-input v-if="isDisabled" :disabled="true" placeholder="请先选择单位"></a-input>
  114. <sd-user-picker
  115. v-else
  116. ref="peopleRelSelect"
  117. v-model="reviewerValue"
  118. :single="false"
  119. :read-only="false"
  120. :root-node="rootNode"
  121. @change="reviewerValueChange"
  122. />
  123. </a-form-model-item>
  124. </a-form-model>
  125. </a-modal>
  126. </div>
  127. </div>
  128. </template>
  129. <script>
  130. // 筛选组件
  131. import auditAdvancedQuery from '../../components/audit-advanced-query.vue'
  132. import auditAdvancedQueryMixins from '../../components/audit-advanced-query-mixins'
  133. // 表格组件 + 表格扩展组件
  134. import SdDataTableEx from '@/common/components/sd-data-table-ex.vue'
  135. // 表格按钮类型
  136. import TableActionTypes from '@/common/services/table-action-types'
  137. // 表格工具
  138. import TableColumnTypes from '@/common/services/table-column-types'
  139. import SdFormItem from '@/common/components/sd-form-item.vue'
  140. import components from './_import-components/audit-area-list-import'
  141. import { message } from 'ant-design-vue'
  142. import sdUserPicker from '@/common/components/sd-user-picker.vue'
  143. import SdGroupPicker from '@/common/components/sd-group-picker.vue'
  144. import auditModelService from '../model/audit-model-service'
  145. import auditMaintainService from './audit-maintain-service'
  146. import DataService from '../dataUphold/data-config'
  147. import { getUserInfo } from '@/common/store-mixin'
  148. export default {
  149. // 大驼峰文件名
  150. name: 'AuditAreaList',
  151. metaInfo: {
  152. // 页面标题
  153. title: '模型领域',
  154. },
  155. components: {
  156. ...components,
  157. // 引入组件
  158. SdFormItem,
  159. SdDataTableEx,
  160. auditAdvancedQuery,
  161. sdUserPicker,
  162. SdGroupPicker,
  163. },
  164. mixins: [auditAdvancedQueryMixins],
  165. data() {
  166. return {
  167. // 搜索条件
  168. searchData: {
  169. code: '',
  170. name: '',
  171. },
  172. // 搜索接口传参
  173. expressions: [],
  174. // 搜索组件ref
  175. searchform: 'searchform',
  176. // 搜索条件展开
  177. expand: false,
  178. // 列表请求地址
  179. dataUrl: 'api/xcoa-mobile/v1/iam-page/businessList',
  180. // pageId
  181. pageId: 'audit/maintain/iamModelDomain',
  182. // formId
  183. formId: 'iamModelDomain',
  184. // 表头
  185. columns: [
  186. {
  187. title: '序号',
  188. dataIndex: 'sortNumber',
  189. width: '80px',
  190. customRender: (text, record, index) => `${index + 1}`,
  191. },
  192. // code name description
  193. {
  194. title: '领域编号',
  195. // dataIndex: 'id',
  196. dataIndex: 'code',
  197. },
  198. {
  199. title: '领域名称',
  200. dataIndex: 'name',
  201. scopedSlots: { customRender: 'link' },
  202. },
  203. {
  204. title: '创建时间',
  205. dataIndex: 'creationTime',
  206. sdRender: TableColumnTypes.date,
  207. },
  208. {
  209. title: '领域描述',
  210. dataIndex: 'description',
  211. },
  212. ],
  213. // 按钮
  214. actions: [
  215. {
  216. label: '新增',
  217. id: 'create',
  218. permission: 'create',
  219. type: TableActionTypes.primary,
  220. callback: this.showFormModal,
  221. },
  222. { label: '关联人员', permission: null, callback: this.bindPeople },
  223. // 删除
  224. {
  225. label: '删除',
  226. id: 'delete',
  227. type: TableActionTypes.ex.delete, // 删除按钮,不需要回调,会自动处理(对sd-data-table无效)
  228. },
  229. ],
  230. // 表单提交地址
  231. pagePath: 'audit/maintain/iamModelDomain',
  232. // 人员绑定
  233. rules: {
  234. domainName: [{ required: true, message: '请选择领域名称', trigger: 'blur' }],
  235. // 所有选项不能为空
  236. unitName: [
  237. { required: true, message: '请选择单位', trigger: 'blur' },
  238. {
  239. validator: (rule, value, callback) => {
  240. const primary = this.currentRow.map((item) => {
  241. const params = {
  242. domainId: item.id,
  243. unitId: this.formData.unitId,
  244. }
  245. return auditMaintainService.checkBind(params)
  246. })
  247. Promise.all(primary).then((res) => {
  248. if (res.some((item) => !item.data)) {
  249. // 寻找对应的领域
  250. const domain = res
  251. .map((item, index) => !item.data && this.currentRow[index].name)
  252. .filter((item) => item)
  253. .join(',')
  254. callback(new Error('当前公司已绑定' + domain))
  255. } else {
  256. callback()
  257. }
  258. })
  259. // .then((res) => {
  260. // console.log(res)
  261. // if (res.data) {
  262. // callback()
  263. // } else {
  264. // callback(new Error('该单位已绑定'))
  265. // }
  266. // })
  267. // if (value.length === 0) {
  268. // callback(new Error('请选择单位'))
  269. // } else {
  270. // callback()
  271. // }
  272. },
  273. trigger: 'change',
  274. },
  275. ],
  276. reformUser: [{ required: true, message: '请选择整改人', trigger: 'blur' }],
  277. checker: [{ required: true, message: '请选择初审人', trigger: 'blur' }],
  278. reviewer: [{ required: true, message: '请选择复审人', trigger: 'blur' }],
  279. },
  280. // 人员选择器
  281. reformUserValue: [],
  282. checkerValue: [],
  283. reviewerValue: [],
  284. rootNode: {},
  285. companyUnit: null,
  286. isDisabled: true,
  287. flag: true,
  288. visible: false,
  289. formData: {
  290. domainId: '',
  291. domainName: '',
  292. unitName: '',
  293. unitId: '',
  294. reformUser: '',
  295. reformUserAccount: '',
  296. checker: '',
  297. checkerAccount: '',
  298. reviewer: '',
  299. reviewerAccount: '',
  300. },
  301. // 当前选中的行
  302. currentRow: [],
  303. selectRow: [],
  304. formDetail: null,
  305. userNodeTree: [],
  306. }
  307. },
  308. computed: {
  309. formItemLayout() {
  310. return {
  311. layout: 'horizontal',
  312. labelCol: { span: 4 },
  313. wrapperCol: { span: 18 },
  314. }
  315. },
  316. },
  317. created() {
  318. this.initUserCompanyRole()
  319. },
  320. methods: {
  321. initUserCompanyRole() {
  322. auditMaintainService.getGroup().then((res) => {
  323. const roleCompany = ['100000', '100001']
  324. this.userNodeTree = res.data.map((item) => {
  325. return {
  326. code: item.id,
  327. name: item.name,
  328. type: 'Group',
  329. }
  330. })
  331. if (roleCompany.includes(res.data.code)) {
  332. this.userNodeTree = []
  333. }
  334. })
  335. },
  336. // 点击绑定
  337. bindPeople() {
  338. // 获取所有选中的数据
  339. const selectedRows = this.$refs.sddataTable.getSelectedRows()
  340. if (selectedRows.length === 0) return message.warning('请选择模型领域')
  341. // 如果大于1条数据,提示 请选择一条数据
  342. if (selectedRows.length === 1) {
  343. this.$refs.sddataTable.clearSelection()
  344. return window.open('#/sd-frame/audit-bind-people?domainId=' + selectedRows[0].id)
  345. }
  346. if (selectedRows.length > 1) {
  347. const allSelect = this.$refs.sddataTable.getSelectedRows()
  348. this.currentRow = allSelect
  349. this.selectRow = allSelect.map((item) => item.id)
  350. this.formData.domainId = allSelect.map((item) => item.id).join(',')
  351. this.formData.domainName = allSelect.map((item) => item.name).join(',')
  352. this.visible = true
  353. }
  354. },
  355. // 搜索方法
  356. handleSearch() {
  357. // 搜索条件
  358. const searchDataKeys = Object.keys(this.searchData)
  359. this.expressions = searchDataKeys.map((item) => {
  360. return {
  361. dataType: 'str',
  362. name: item,
  363. op: 'like',
  364. stringValue: `%${this.searchData[item]}%`,
  365. }
  366. })
  367. },
  368. // 显示表单
  369. showFormModal(id = null) {
  370. this.$refs.sddataTable.showDetailModal(id, this.pagePath)
  371. },
  372. // 人员绑定
  373. initFormPage() {},
  374. // 保存
  375. handleOk() {
  376. this.$refs.ruleFormData.validate((valid) => {
  377. if (valid) {
  378. const data = this.formData
  379. auditMaintainService.butchBindPeople(data).then((res) => {
  380. message.success('保存成功')
  381. this.$refs.sddataTable.refresh()
  382. // 清空表单校验
  383. this.$refs.sddataTable.clearSelection()
  384. this.handleCancel()
  385. })
  386. }
  387. })
  388. },
  389. handleCancel() {
  390. this.selectRow = []
  391. this.currentRow = []
  392. this.reformUserValue = []
  393. this.checkerValue = []
  394. this.reviewerValue = []
  395. this.companyUnit = []
  396. this.visible = false
  397. this.isDisabled = true
  398. this.$refs.ruleFormData.clearValidate()
  399. },
  400. // 人员变化事件
  401. reformUserChange(val) {
  402. this.reformUserValue = val
  403. // 序列化人员信息使用,分隔
  404. const reformUser = val.map((item) => item.name).join(',')
  405. const reformUserAccount = val.map((item) => item.code).join(',')
  406. this.formData.reformUser = reformUser
  407. this.formData.reformUserAccount = reformUserAccount
  408. },
  409. checkerValueChange(val) {
  410. this.checkerValue = val
  411. const checker = val.map((item) => item.name).join(',')
  412. const checkerAccount = val.map((item) => item.code).join(',')
  413. this.formData.checker = checker
  414. this.formData.checkerAccount = checkerAccount
  415. },
  416. reviewerValueChange(val) {
  417. this.reviewerValue = val
  418. const reviewer = val.map((item) => item.name).join(',')
  419. const reviewerAccount = val.map((item) => item.code).join(',')
  420. this.formData.reviewer = reviewer
  421. this.formData.reviewerAccount = reviewerAccount
  422. },
  423. // 单位变化事件
  424. changecompany(val) {
  425. const unitId = val.map((item) => item.code).join(',')
  426. const unitName = val.map((item) => item.name).join(',')
  427. this.formData.unitName = unitName
  428. this.formData.unitId = unitId
  429. if (val.length > 0) {
  430. this.isDisabled = false
  431. this.rootNode = val
  432. } else {
  433. this.isDisabled = true
  434. }
  435. },
  436. },
  437. }
  438. </script>
  439. <style lang="scss" module>
  440. @use '@/common/design' as *;
  441. .wrap-height {
  442. height: 100%;
  443. .row-height {
  444. position: relative;
  445. display: flex;
  446. flex: auto;
  447. min-height: 100%;
  448. .rightcard {
  449. flex: 1;
  450. width: calc(100% - 20%);
  451. height: 100%;
  452. }
  453. }
  454. }
  455. </style>