阅行客电子档案
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

571 lines
20 KiB

7 months ago
  1. <template>
  2. <div>
  3. <el-dialog ref="dialogTable" title="新增盘点单" :visible="crud.status.cu > 0" append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :before-close="crud.cancelCU">
  4. <span class="dialog-right-top" />
  5. <span class="dialog-left-bottom" />
  6. <div class="setting-dialog">
  7. <el-form ref="form" :model="form" size="small" inline label-width="80px" :rules="rules">
  8. <el-form-item label="选择区域" prop="selectAreaValue" style="margin-right: 10px;">
  9. <treeselect
  10. v-model="form.selectAreaValue"
  11. :options="selectAreaOptions"
  12. multiple
  13. placeholder="请选择(单选)"
  14. style="width: 184px;"
  15. :limit="1"
  16. :limit-text="count => `+${count}`"
  17. />
  18. </el-form-item>
  19. <el-form-item label="选择门类" prop="categoryValue" style="margin-right: 10px;">
  20. <treeselect
  21. ref="treeselect"
  22. v-model="form.categoryValue"
  23. flat
  24. :multiple="false"
  25. placeholder="请选择(单选)"
  26. :options="category"
  27. style="width: 184px;"
  28. :normalizer="normalizer"
  29. :default-expand-level="2"
  30. @select="node=>treeSelectInput(node)"
  31. />
  32. </el-form-item>
  33. <el-form-item label="选择年度" prop="archiveYears" style="margin-right: 0;">
  34. <el-select
  35. v-model="form.archiveYears"
  36. style="width: 184px;"
  37. multiple
  38. filterable
  39. clearable
  40. placeholder="请选择(可多选)"
  41. :collapse-tags="showTags"
  42. @change="changeSelect"
  43. @remove-tag="removeTag"
  44. >
  45. <el-option v-if="yearsOptions.length !== 0" label="全选" value="全选" @click.native="selectAll" />
  46. <el-option
  47. v-for="item in yearsOptions"
  48. :key="item.value"
  49. :label="item.label"
  50. :value="item.value"
  51. />
  52. </el-select>
  53. </el-form-item>
  54. <el-form-item label="盘点方式" prop="arrangeType">
  55. <el-select
  56. v-model="form.arrangeType"
  57. style="width: 184px;"
  58. clearable
  59. placeholder="请选择(单选)"
  60. >
  61. <el-option
  62. v-for="item in checkOptions"
  63. :key="item.value"
  64. :label="item.label"
  65. :value="item.value"
  66. />
  67. </el-select>
  68. </el-form-item>
  69. <el-button class="check-confirm-btn" type="primary" size="mini" @click="handleBuild"><i class="iconfont icon-shengchengpandiandan" />生成盘点单</el-button>
  70. </el-form>
  71. <el-table v-if="isCaseOrFile === 2" v-loading="loading" :data="tableData" height="400px" :cell-class-name="cell">
  72. <el-table-column type="index" align="center" label="序号" width="80" />
  73. <el-table-column align="center" label="状态" width="100">
  74. <template>
  75. <!-- 未盘点 -->
  76. <span class="clear">未盘点</span>
  77. </template>
  78. </el-table-column>
  79. <el-table-column prop="child" align="center" label="子条数目" width="100" />
  80. <el-table-column prop="categoryType" align="center" label="门类级别" width="100">
  81. <template slot-scope="scope">
  82. <span v-if="scope.row.categoryType === 5" style="width:56px">文件级</span>
  83. <span v-if="scope.row.categoryType === 4" style="width:56px">卷内级</span>
  84. <span v-if="scope.row.categoryType === 3" style="width:56px">案卷级</span>
  85. </template>
  86. </el-table-column>
  87. <el-table-column prop="categoryName" align="center" show-overflow-tooltip label="门类名称" width="120" />
  88. <el-table-column prop="fondsNo" align="center" label="全宗号" width="180" show-overflow-tooltip />
  89. <el-table-column prop="archiveNo" align="center" label="档号" width="180" show-overflow-tooltip />
  90. <el-table-column prop="archiveYear" align="center" label="归档年度" width="100" />
  91. <el-table-column prop="maintitle" show-overflow-tooltip label="题名" align="center" width="180" />
  92. <el-table-column prop="securityClass" label="保密程度" align="center" width="85" />
  93. <el-table-column prop="department" label="部门" align="center" width="120" />
  94. <el-table-column prop="caseName" label="盒名称" show-overflow-tooltip align="center" width="120" />
  95. <el-table-column prop="folderLocationDetails" show-overflow-tooltip label="所在位置" align="center" width="300">
  96. <template slot-scope="scope">
  97. <span v-if="!scope.row.folderLocationDetails">-</span>
  98. <span v-else>
  99. <el-tag effect="dark">{{ scope.row.folderLocationDetails }}</el-tag>
  100. </span>
  101. </template>
  102. </el-table-column>
  103. <el-table-column prop="create_time" label="创建时间" align="center" width="150">
  104. <template slot-scope="scope">
  105. <div>{{ scope.row.create_time | parseTime }}</div>
  106. </template>
  107. </el-table-column>
  108. </el-table>
  109. <el-table
  110. v-if="isCaseOrFile === 1"
  111. ref="table"
  112. v-loading="loading"
  113. :cell-class-name="cell"
  114. :data="tableData"
  115. height="400px"
  116. style="width: 100%;"
  117. @row-dblclick="handleCaseDbClick"
  118. >
  119. <el-table-column type="index" label="序号" width="55" align="center" />
  120. <el-table-column align="center" label="状态" width="100">
  121. <template>
  122. <!-- 未盘点 -->
  123. <span class="clear">未盘点</span>
  124. </template>
  125. </el-table-column>
  126. <el-table-column prop="depositNum" label="已装" align="center" min-width="56" />
  127. <el-table-column prop="caseName" label="盒名称" :show-overflow-tooltip="true" align="center" min-width="190" />
  128. <el-table-column prop="tid" label="电子标签" align="center" min-width="180" />
  129. <el-table-column prop="barcode" label="条形码" align="center" min-width="120" />
  130. <el-table-column label="存放位置" align="center" min-width="300">
  131. <template slot-scope="scope">
  132. <span v-if="!scope.row.folderLocationDetails">-</span>
  133. <span v-else>
  134. <el-tag effect="dark">{{ scope.row.folderLocationDetails }}</el-tag>
  135. </span>
  136. </template>
  137. </el-table-column>
  138. <el-table-column prop="update_time" width="175" label="操作时间" align="center">
  139. <template slot-scope="scope">
  140. <div>{{ scope.row.update_time | parseTime }}</div>
  141. </template>
  142. </el-table-column>
  143. </el-table>
  144. <el-pagination v-if="tableData.length !== 0" :page-size.sync="page.size" :total="page.total" :current-page.sync="page.page" style="margin-top: 8px;" layout="total, prev, pager, next, sizes" @size-change="sizeChangeHandler($event)" @current-change="pageChangeHandler" />
  145. <div v-if="tableData.length !== 0" slot="footer" class="dialog-footer">
  146. <el-button :disabled="!(tableData.length)" @click="handleSave">保存</el-button>
  147. </div>
  148. </div>
  149. </el-dialog>
  150. <!-- 档案盒详情 -->
  151. <detailDialog ref="detailDom" />
  152. </div>
  153. </template>
  154. <script>
  155. import Treeselect from '@riophae/vue-treeselect'
  156. import '@riophae/vue-treeselect/dist/vue-treeselect.css'
  157. import { menu } from '@/api/storeManage/levelManage/level'
  158. import { FetchCategoryMenu } from '@/api/system/category/category'
  159. import { previewArrange, addArrange } from '@/api/archivesManage/archivesCheck'
  160. import { FetchInitContorlView } from '@/api/archivesManage/library'
  161. import { findInCase } from '@/api/archivesManage/caseManage'
  162. import { crud, form } from '@crud/crud'
  163. import detailDialog from '../../caseManage/caseList/module/detailDialog'
  164. const defaultForm = {
  165. selectAreaValue: [],
  166. categoryValue: null,
  167. archiveYears: [],
  168. arrangeType: null
  169. }
  170. export default {
  171. name: 'AddCheck',
  172. components: { Treeselect, detailDialog },
  173. mixins: [
  174. crud(),
  175. form(function() {
  176. return Object.assign({ }, defaultForm)
  177. })
  178. ],
  179. data() {
  180. return {
  181. loading: false,
  182. menusIds: [],
  183. tableData: [],
  184. isCaseOrFile: 0,
  185. addFormVisible: false,
  186. selectAreaOptions: [],
  187. nodeKey: 'id',
  188. defaultCheckedKeys: [],
  189. oldCategory: [],
  190. allCategory: [],
  191. category: [],
  192. showTags: true,
  193. yearsOptions: [],
  194. checkOptions: [
  195. {
  196. label: '按盒盘点(H)',
  197. value: 1
  198. },
  199. {
  200. label: '按件盘点(J)',
  201. value: 2
  202. }
  203. ],
  204. page: {
  205. total: 0,
  206. size: 10,
  207. page: 1
  208. },
  209. params: {
  210. page: null,
  211. size: null,
  212. deviceIds: null,
  213. categoryIds: null
  214. },
  215. rules: {
  216. selectAreaValue: [{ required: true, trigger: 'change', message: '请选择区域' }],
  217. categoryValue: [{ required: true, trigger: 'change', message: '请选择门类' }],
  218. archiveYears: [{ required: true, trigger: 'change', message: '请选择年度' }],
  219. arrangeType: [{ required: true, trigger: 'change', message: '请选择盘点方式' }]
  220. }
  221. }
  222. },
  223. created() {
  224. this.getTreeMenu()
  225. this.getCategoryDataTree()
  226. },
  227. methods: {
  228. getTreeMenu() {
  229. menu().then(data => {
  230. const deviceTree = []
  231. let storeroom = {}
  232. let devices = []
  233. data.forEach((item, i) => {
  234. if (!storeroom.id) {
  235. item.storeroomId.label = item.storeroomId.name
  236. storeroom = item.storeroomId
  237. item.label = item.deviceName
  238. devices.push(item)
  239. } else if (storeroom.id !== item.storeroomId.id) {
  240. item.storeroomId.label = item.storeroomId.name
  241. storeroom.children = devices
  242. deviceTree.push(storeroom)
  243. devices = []
  244. item.label = item.deviceName
  245. devices.push(item)
  246. storeroom = item.storeroomId
  247. } else {
  248. item.storeroomId.label = item.storeroomId.name
  249. item.label = item.deviceName
  250. devices.push(item)
  251. }
  252. if (i === data.length - 1) {
  253. item.storeroomId.label = item.storeroomId.name
  254. storeroom.children = devices
  255. deviceTree.push(storeroom)
  256. }
  257. this.selectAreaOptions = deviceTree
  258. })
  259. })
  260. },
  261. filterData(data) {
  262. return data.filter(node => {
  263. if (node.children && node.children.length > 0) {
  264. node.children = this.filterData(node.children) // 递归处理子节点
  265. }
  266. return node.isType !== 3 // 过滤掉isType为3的节点
  267. })
  268. },
  269. getCategoryDataTree() {
  270. FetchCategoryMenu().then(res => {
  271. this.category = this.filterData(res)
  272. })
  273. },
  274. treeSelectInput(value) {
  275. console.log(value)
  276. this.form.categoryValue = value.id
  277. if (this.form.categoryValue) {
  278. let categoryLevel = null
  279. if (value.arrangeType === 1) {
  280. categoryLevel = 3
  281. } else if (value.arrangeType === 2) {
  282. categoryLevel = 2
  283. } else {
  284. categoryLevel = 1
  285. }
  286. this.getYear(categoryLevel)
  287. } else {
  288. this.yearsOptions = []
  289. this.form.archiveYears = []
  290. }
  291. },
  292. getYear(categoryLevel) {
  293. const params = {
  294. 'categoryId': this.form.categoryValue,
  295. 'categoryLevel': categoryLevel,
  296. 'ignore': false,
  297. 'isdel': false,
  298. 'page': 0,
  299. 'size': 10
  300. }
  301. FetchInitContorlView(params).then(data => {
  302. if (data) {
  303. this.yearsOptions = data.yearGroup.map(item => {
  304. const json = {}
  305. json.value = item
  306. json.label = item
  307. return json
  308. })
  309. }
  310. })
  311. },
  312. selectAll() {
  313. if (this.form.archiveYears.length < this.yearsOptions.length) {
  314. this.form.archiveYears = []
  315. this.yearsOptions.map((item) => {
  316. this.form.archiveYears.push(item.value)
  317. })
  318. this.form.archiveYears.unshift('全选')
  319. } else {
  320. this.form.archiveYears = []
  321. }
  322. },
  323. changeSelect(val) {
  324. if (!val.includes('全选') && val.length === this.yearsOptions.length) {
  325. this.form.archiveYears.unshift('全选')
  326. } else if (val.includes('全选') && (val.length - 1) < this.yearsOptions.length) {
  327. this.form.archiveYears = this.form.archiveYears.filter((item) => {
  328. return item !== '全选'
  329. })
  330. }
  331. },
  332. removeTag(val) {
  333. if (val === '全选') {
  334. this.form.archiveYears = []
  335. }
  336. },
  337. // 生成盘点单
  338. handleBuild() {
  339. this.$refs['form'].validate(valid => {
  340. if (!valid) {
  341. return
  342. }
  343. this.loading = true
  344. const paramsNo = this.getParams()
  345. this.params.deviceIds = paramsNo.deviceIds
  346. this.params.categoryIds = paramsNo.categoryIds
  347. this.params.arrangeType = paramsNo.arrangeType
  348. this.params.archiveYears = paramsNo.archiveYears
  349. this.params.page = this.page.page - 1
  350. this.params.size = this.page.size
  351. this.doPreArrange(this.params)
  352. })
  353. },
  354. handleSave() {
  355. const params = this.getParams()
  356. // 新增盘点
  357. addArrange(params).then(res => {
  358. // this.tableData = res.detaills
  359. if (res) {
  360. this.crud.refresh()
  361. this.$message({
  362. message: '新增成功',
  363. type: 'success'
  364. })
  365. this.addFormVisible = false
  366. this.crud.refresh()
  367. } else {
  368. this.$message.error('新增失败')
  369. }
  370. })
  371. },
  372. getParams() {
  373. const room = this.selectAreaOptions.map(item => { return item.id }) // 所有区域id
  374. if (this.form.selectAreaValue.length > 0 && this.form.categoryValue.length > 0) {
  375. let deviceIds = this.form.selectAreaValue.filter(item => !room.includes(item)) // 选中的设备id
  376. const devIds = JSON.parse(JSON.stringify(deviceIds))
  377. let region = []
  378. this.selectAreaOptions.forEach(item => {
  379. if (this.form.selectAreaValue.includes(item.id)) {
  380. region.push(item.name)
  381. const arr = item.children.map(val => { return val.id }) // 区域内所有设备
  382. deviceIds = deviceIds.concat(arr)
  383. }
  384. if (devIds.length > 0) {
  385. item.children.forEach(val => {
  386. if (devIds.includes(val.id) && !region.includes(item.name)) {
  387. region.push(item.name) // 含设备的区域
  388. }
  389. })
  390. }
  391. })
  392. region = region.join(',') // 区域str
  393. // const categoryIds = this.form.categoryValue.filter(item => item !== 0)
  394. if (this.form.arrangeType === 1) {
  395. this.isCaseOrFile = 1
  396. } else {
  397. this.isCaseOrFile = 2
  398. }
  399. let archiveYearsValue
  400. if (this.form.archiveYears.includes('全选')) {
  401. archiveYearsValue = null
  402. } else {
  403. archiveYearsValue = this.form.archiveYears.join(',')
  404. }
  405. const categoryIds = []
  406. categoryIds.push(this.form.categoryValue)
  407. const params = {
  408. 'categoryIds': categoryIds,
  409. 'deviceIds': deviceIds,
  410. 'region': region,
  411. 'arrangeType': this.form.arrangeType,
  412. 'archiveYears': archiveYearsValue
  413. }
  414. return params
  415. }
  416. },
  417. // 预盘点
  418. doPreArrange(params) {
  419. previewArrange(params).then(res => {
  420. this.tableData = res.content
  421. this.page.total = res.totalElements
  422. this.loading = false
  423. })
  424. },
  425. // 每页条数改变
  426. sizeChangeHandler(e) {
  427. this.loading = true
  428. this.page.size = e
  429. this.page.page = 1
  430. this.params.size = e
  431. this.params.page = 0
  432. this.doPreArrange(this.params)
  433. this.loading = false
  434. },
  435. // 当前页改变
  436. pageChangeHandler(e) {
  437. this.loading = true
  438. this.page.page = e
  439. this.params.page = e - 1
  440. this.doPreArrange(this.params)
  441. this.loading = false
  442. },
  443. // 单元格样式
  444. cell({ row, columnIndex }) {
  445. if (columnIndex === 1) {
  446. return 'fail-clear'
  447. }
  448. },
  449. handleCaseDbClick(row) {
  450. this.$refs.detailDom.caseTabIndex = 0
  451. this.$refs.detailDom.rowData = row
  452. const params = {
  453. caseId: row.id
  454. }
  455. findInCase(params).then(res => {
  456. console.log(res)
  457. if (res) {
  458. this.$refs.detailDom.tableData = res.archives_o
  459. this.$refs.detailDom.queryFields = res.field_o
  460. this.$refs.detailDom.queryCnFields = res.cnField_o
  461. this.$refs.detailDom.collectLevel = parseInt(res.archives_o[0].categoryLevel)
  462. } else {
  463. this.$refs.detailDom.tableData = []
  464. }
  465. })
  466. this.$refs.detailDom.detailVisible = true
  467. },
  468. handleClose() {
  469. this.getTreeMenu()
  470. this.getCategoryDataTree()
  471. this.tableData = []
  472. this.isCaseOrFile = 0
  473. this.$refs['form'].resetFields()
  474. },
  475. normalizer(node) {
  476. if (node.children && !node.children.length) {
  477. delete node.children
  478. }
  479. return {
  480. id: node.id,
  481. label: node.cnName,
  482. children: node.children,
  483. isDisabled: node.isType !== 2
  484. }
  485. }
  486. }
  487. }
  488. </script>
  489. <style lang="scss" scoped>
  490. ::v-deep .el-dialog{
  491. width: 864px;
  492. .el-dialog__body .el-form-item .el-form-item__content{
  493. width: 184px !important;
  494. }
  495. .el-form{
  496. position: relative;
  497. }
  498. .check-confirm-btn{
  499. position: absolute;
  500. right: 5px;
  501. bottom: 20px;
  502. }
  503. }
  504. // @import '~@/assets/styles/lend-manage.scss';
  505. // .el-form{
  506. // display: flex;
  507. // flex-wrap: wrap;
  508. // padding-left: 12px;
  509. // }
  510. // ::v-deep .el-dialog{
  511. // width: 1000px;
  512. // // height: 520px;
  513. // }
  514. // ::v-deep .el-dialog .el-dialog__header .el-dialog__close::before{
  515. // position: absolute;
  516. // right: -190px;
  517. // bottom: -12px;
  518. // }
  519. // ::v-deep .el-dialog__body{
  520. // padding: 30px 0;
  521. // }
  522. // ::v-deep .el-dialog .dialog-footer{
  523. // margin: 0 auto !important;
  524. // }
  525. // ::v-deep .el-tag.el-tag--info{
  526. // height: 24px !important;
  527. // line-height: 24px !important;
  528. // }
  529. // ::v-deep .el-input__inner{
  530. // height: 30px !important;
  531. // }
  532. // //滚动条
  533. // ::v-deep ::-webkit-scrollbar-corner{
  534. // background: transparent;
  535. // }
  536. // // 树形选择器
  537. // ::v-deep .vue-treeselect__placeholder, .vue-treeselect__single-value{
  538. // line-height: 30px;
  539. // }
  540. // ::v-deep .vue-treeselect--has-value .vue-treeselect__multi-value{
  541. // margin-bottom: 0;
  542. // }
  543. // ::v-deep .vue-treeselect__multi-value-item-container{
  544. // padding-top: 2px;
  545. // line-height: 20px;
  546. // }
  547. // ::v-deep .el-dialog .el-form .vue-treeselect__control{
  548. // height: 30px !important;
  549. // line-height: 18px;
  550. // }
  551. // ::v-deep .vue-treeselect__limit-tip{
  552. // background: #13439E;
  553. // border-radius: 3px;
  554. // margin: 2px;
  555. // padding: 0 3px;
  556. // .vue-treeselect__limit-tip-text{
  557. // padding: 2px 2px;
  558. // color: #fff;
  559. // }
  560. // }
  561. </style>