law-case-report-relate-doc.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. <template>
  2. <div :class="$style.wrapper">
  3. <div
  4. v-if="
  5. !flowData.processFormData.processFormPropertyValues.find(
  6. (item) => item.name === 'LAW_CASE_RELATED' || item.name === 'LAW_APPLY_RELATED'
  7. ).readonly
  8. "
  9. :class="$style.header"
  10. >
  11. <a-space>
  12. <a-button
  13. type="primary"
  14. @click="
  15. () => {
  16. visible = true
  17. }
  18. "
  19. >关联案件</a-button
  20. >
  21. <a-button :disabled="selectedRows.length === 0" @click="deleteRelateDoc">删除</a-button>
  22. </a-space>
  23. </div>
  24. <div :class="$style.childTableDiv">
  25. <sd-data-table
  26. ref="childDataTable"
  27. data-url="api/framework/v1/page/businessList"
  28. :columns="columns"
  29. :process-res="processRes"
  30. :process-req="processReq"
  31. :show-selection="
  32. !flowData.processFormData.processFormPropertyValues.find(
  33. (item) => item.name === 'LAW_CASE_RELATED' || item.name === 'LAW_APPLY_RELATED'
  34. ).readonly
  35. "
  36. :selected-datas.sync="selectedRows"
  37. >
  38. <div slot="link" slot-scope="text, record">
  39. <!-- 有阅读权限 -->
  40. <span v-if="record.READ_ONLY.toString() === '0'">
  41. <a
  42. target="_blank"
  43. rel="opener"
  44. :href="
  45. `#/sd-webflow/done-pages/${record.RELATED_INST_ID}?openAuthType=relatedDoc&openAuthParameter=${record.RELATED_INST_ID},${relateDocId},${flowData.instId}`
  46. "
  47. >{{ text }}</a
  48. >
  49. </span>
  50. <!-- 无阅读权限 -->
  51. <span v-else>{{ text }}</span>
  52. </div>
  53. <div slot="read" slot-scope="text, record">
  54. <span
  55. v-if="
  56. !flowData.processFormData.processFormPropertyValues.find(
  57. (item) => item.name === 'LAW_CASE_RELATED' || item.name === 'LAW_APPLY_RELATED'
  58. ).readonly
  59. "
  60. >
  61. <a-switch
  62. :checked="record.READ_ONLY.toString() === '0'"
  63. @click="readChange($event, record)"
  64. /></span>
  65. <span v-else>
  66. <a-badge
  67. v-if="record.READ_ONLY.toString() === '0'"
  68. status="success"
  69. text="启用"
  70. ></a-badge>
  71. <a-badge v-else status="error" text="停用"></a-badge>
  72. </span>
  73. </div>
  74. </sd-data-table>
  75. </div>
  76. <!-- 选择关联文件列表 -->
  77. <a-modal
  78. title="关联案件"
  79. width="50%"
  80. destroy-on-close
  81. :visible="visible"
  82. :body-style="{
  83. padding: '0px 20px',
  84. }"
  85. @cancel="handleCancel"
  86. @ok="handleOk"
  87. >
  88. <!-- 高级搜索 -->
  89. <audit-advanced-query
  90. :expand="expand"
  91. :search-data="formData"
  92. ref-name="searchform"
  93. :search-style="{ height: '135px', top: '105px !important' }"
  94. :search-fun="handleSearch"
  95. @searchedClick="searchedClick"
  96. @resetForm="resetForm"
  97. >
  98. <template>
  99. <a-col :span="12">
  100. <a-form-model-item label="案件名称">
  101. <a-input v-model="formData.CASE_NAME" allow-clear />
  102. </a-form-model-item>
  103. </a-col>
  104. <a-col :span="12">
  105. <a-form-model-item label="案件编号">
  106. <a-input v-model="formData.currentNumber" allow-clear />
  107. </a-form-model-item>
  108. </a-col>
  109. </template>
  110. </audit-advanced-query>
  111. <!-- 查询列表 -->
  112. <sd-data-table-ex
  113. ref="dataTable"
  114. :filter-expressions="expressions"
  115. :show-advance-query="true"
  116. :search-fields="['CASE_NAME', 'currentNumber']"
  117. data-url="api/framework/v1/page/businessList"
  118. :columns="modalColumns"
  119. form-id="onlhead:d0bb8202233c48f0b5148776754461e1"
  120. show-selection
  121. @searchbtnClick="searchbtnClick"
  122. >
  123. <div slot="link" slot-scope="text, record">
  124. <a rel="opener" target="_blank" :href="`#/sd-webflow/done-pages/${record.instId}`">{{
  125. text
  126. }}</a>
  127. </div>
  128. </sd-data-table-ex>
  129. </a-modal>
  130. </div>
  131. </template>
  132. <script>
  133. import pageService from '@/common/services/page-service.js'
  134. import { message } from '@/common/one-ui'
  135. import auditAdvancedQuery from '@product/iam/components/audit-advanced-query.vue'
  136. import auditAdvancedQueryMixins from '@product/iam/components/audit-advanced-query-mixins'
  137. import components from './_import-components/law-case-report-relate-doc-import'
  138. export default {
  139. name: 'LawCaseReportRelateDoc',
  140. components: {
  141. auditAdvancedQuery,
  142. ...components,
  143. },
  144. mixins: [auditAdvancedQueryMixins],
  145. props: {
  146. value: {
  147. type: Array,
  148. default: () => {
  149. return []
  150. },
  151. },
  152. fields: {
  153. type: Array,
  154. default: () => {
  155. return []
  156. },
  157. },
  158. flowData: {
  159. type: Object,
  160. default: () => {
  161. return {}
  162. },
  163. },
  164. relatedDoc: {
  165. type: Object,
  166. default: function() {
  167. return this.flowData.processFormData.processFormPropertyValues.find(
  168. (e) => e.dataType === 'relateddoc'
  169. )
  170. },
  171. },
  172. },
  173. data() {
  174. return {
  175. expressions: [
  176. {
  177. dataType: 'int',
  178. name: 'FLOW_STATUS',
  179. op: 'eq',
  180. intValue: 5,
  181. },
  182. ],
  183. formData: {
  184. CASE_NAME: '',
  185. currentNumber: '',
  186. },
  187. selectedRows: [], // 列表选中内容
  188. visible: false, // 是否显示选择列表
  189. columns: [
  190. {
  191. title: '标题',
  192. dataIndex: 'CASE_NAME',
  193. scopedSlots: { customRender: 'link' },
  194. },
  195. {
  196. title: '阅读权限',
  197. width: '200px',
  198. dataIndex: 'READ_ONLY',
  199. scopedSlots: { customRender: 'read' },
  200. },
  201. { title: '案件ID', dataIndex: 'RELATED_CASE_ID', sdCandidate: true, sdHidden: true },
  202. ],
  203. modalColumns: [
  204. {
  205. title: '案件名称',
  206. sorter: true,
  207. dataIndex: 'CASE_NAME',
  208. scopedSlots: { customRender: 'link' },
  209. },
  210. { title: '案件类型', sorter: true, dataIndex: 'CASE_TYPE' },
  211. { title: '案件编号', sorter: true, dataIndex: 'currentNumber' },
  212. ],
  213. }
  214. },
  215. computed: {
  216. relateDocId() {
  217. return this.relatedDoc?.value
  218. },
  219. },
  220. metaInfo: {
  221. title: '关联案件',
  222. },
  223. methods: {
  224. emitValue(val) {
  225. val.forEach((e) => {
  226. e.id = e.id || 'fakeId_' + Math.random()
  227. })
  228. this.$emit('update:related', val)
  229. this.$refs.childDataTable.refresh(false)
  230. },
  231. // 删除关联文件
  232. deleteRelateDoc() {
  233. const selectId = this.selectedRows.map((item) => item.id)
  234. // 删除关联文件
  235. this.delete(this.selectedRows.map((item) => item.RELATED_ID))
  236. this.selectedRows = []
  237. this.emitValue(this.value.filter((t) => !selectId.includes(t.id)))
  238. },
  239. readChange() {
  240. if (!arguments[0]) {
  241. arguments[1].READ_ONLY = 1
  242. } else {
  243. arguments[1].READ_ONLY = 0
  244. }
  245. },
  246. processReq(req) {
  247. req.data.formId = 'onlhead:d0bb8202233c48f0b5148776754461e1'
  248. return req
  249. },
  250. processRes(res) {
  251. res.data = this.value
  252. res.totalSize = this.value.length
  253. return res
  254. },
  255. handleCancel() {
  256. this.visible = false
  257. },
  258. handleOk() {
  259. if (this.$refs.dataTable.getSelectedRows().length) {
  260. const relateData = this.value || []
  261. let resData =
  262. relateData.length === 0
  263. ? this.$refs.dataTable.getSelectedRows()
  264. : this.$refs.dataTable.getSelectedRows().filter((item) => {
  265. return (
  266. relateData.filter((doc) => {
  267. return doc.RELATED_CASE_ID === item.id
  268. }).length === 0
  269. )
  270. })
  271. // 选择过的文件不做处理
  272. resData = resData.map((item) => {
  273. return {
  274. RELATED_CASE_ID: item.id,
  275. CASE_NAME: item.CASE_NAME,
  276. CASE_TYPE: item.CASE_TYPE,
  277. RELATED_INST_ID: item.instId,
  278. READ_ONLY: 0,
  279. }
  280. })
  281. const allPromist = []
  282. resData.forEach((item) => {
  283. allPromist.push(this.save(item))
  284. })
  285. Promise.all(allPromist).then((res) => {
  286. // 根据返回值记录关联文档ID
  287. resData.forEach((item, index) => {
  288. item.RELATED_ID = res[index].data.pageFormData.beanId
  289. })
  290. const endData = relateData.concat(resData)
  291. this.emitValue(endData)
  292. this.handleCancel()
  293. })
  294. } else {
  295. message.warning('您未选择任何文档,请至少选择一项!')
  296. }
  297. },
  298. save(e) {
  299. const t = {
  300. eventId: 'save',
  301. inputs: [
  302. { name: 'srcFlowId', value: this.flowData.processId },
  303. { name: 'targetInstId', value: e.RELATED_INST_ID },
  304. { name: 'targetTitle', value: e.CASE_NAME },
  305. { name: 'targetFlowId', value: e.flowId ? '' : '' },
  306. { name: 'readAuth', value: 1 },
  307. { name: 'uuid', value: this.relateDocId },
  308. ],
  309. pageFlowId: 'string',
  310. pagePath: '/doc/relate/oaRelatedDoc',
  311. }
  312. return pageService.save(t)
  313. },
  314. delete(e) {
  315. const t = { ids: e.join() }
  316. pageService.delete(t, 'oaRelatedDoc').then((e) => {
  317. message.success('删除成功')
  318. })
  319. },
  320. // 查询
  321. handleSearch() {
  322. this.expressions = []
  323. this.expressions.push({
  324. dataType: 'int',
  325. name: 'FLOW_STATUS',
  326. op: 'eq',
  327. intValue: 5,
  328. })
  329. // 案件名称
  330. if (this.formData.CASE_NAME) {
  331. this.expressions.push({
  332. dataType: 'str',
  333. name: 'CASE_NAME',
  334. op: 'like',
  335. stringValue: `%${this.formData.CASE_NAME}%`,
  336. })
  337. }
  338. // 案件编号
  339. if (this.formData.currentNumber) {
  340. this.expressions.push({
  341. dataType: 'str',
  342. name: 'currentNumber',
  343. op: 'like',
  344. stringValue: `%${this.formData.currentNumber}%`,
  345. })
  346. }
  347. },
  348. resetForm() {
  349. this.formData = {
  350. CASE_NAME: '',
  351. currentNumber: '',
  352. }
  353. this.expressions = [
  354. {
  355. dataType: 'int',
  356. name: 'FLOW_STATUS',
  357. op: 'eq',
  358. intValue: 5,
  359. },
  360. ]
  361. },
  362. },
  363. }
  364. </script>
  365. <style module lang="scss">
  366. @use '@/common/design' as *;
  367. .header {
  368. background: #fff;
  369. padding: 20px 20px 0px 20px;
  370. text-align: right;
  371. }
  372. .wrapper {
  373. table {
  374. th:nth-child(4) {
  375. display: none;
  376. }
  377. td:nth-child(4) {
  378. display: none;
  379. }
  380. }
  381. background: #fff;
  382. :global(.ant-table-tbody) {
  383. .clickable-cell {
  384. color: $primary-color;
  385. cursor: pointer;
  386. &:hover {
  387. color: $primary-5;
  388. }
  389. &:active {
  390. color: $primary-7;
  391. }
  392. }
  393. }
  394. .child-table-div {
  395. background: #fff;
  396. padding: 0 20px;
  397. }
  398. :global .caption_sd-child-table_common {
  399. display: none;
  400. }
  401. }
  402. </style>