classifylistV2.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. <template>
  2. <div class="classify-page">
  3. <div class="top-wrap">
  4. <div class="type-box">
  5. <!-- 中文分类 -->
  6. <div class="item active"
  7. v-permission="[
  8. permissionBtn.classifyBtn.classifyList_cnClassify,
  9. permissionBtn.enClassifyBtn.classifyList_enClassify,
  10. 'and'
  11. ]">
  12. {{ $t('ReportManage.CategoryList.chinese_tabs') }}
  13. </div>
  14. <!-- 英文分类 -->
  15. <div class="item" @click="$emit('typeChange','2')" style="margin-left: 20px;"
  16. v-permission="permissionBtn.enClassifyBtn.classifyList_enClassify">
  17. {{ $t('ReportManage.CategoryList.english_tabs') }}
  18. </div>
  19. </div>
  20. <div style="display:flex;padding:10px;gap:10px">
  21. <!-- 添加分类 -->
  22. <el-button
  23. type="primary"
  24. @click="addClassify"
  25. v-permission="permissionBtn.classifyBtn.classifyList_cnClassify_classifyAdd"
  26. >
  27. {{$t('ReportManage.CategoryList.add_category')}}
  28. </el-button>
  29. <el-input :placeholder="$t('ReportManage.CategoryList.category_name')" v-model="searchVal" style="max-width: 262px;" @change="getList" clearable>
  30. <i slot="prefix" class="el-input__icon el-icon-search"></i>
  31. </el-input>
  32. </div>
  33. </div>
  34. <div class="content-box">
  35. <el-tree
  36. :data="list"
  37. node-key="Id"
  38. :props="{
  39. label: 'ClassifyName',
  40. children: 'Child'
  41. }"
  42. check-strictly
  43. :empty-text="$t('Common.no_classify_msg')"
  44. draggable
  45. indent='76'
  46. :allow-drop="canDropHandle"
  47. @node-drop="dropOverHandle"
  48. >
  49. <div
  50. class="classify-item-wrap"
  51. slot-scope="{ data }"
  52. >
  53. <div>
  54. <span
  55. :class="['tag', data.Enabled==1?'open':'close']"
  56. @click.stop="handleEnableSet(data)">
  57. {{data.Enabled==1?$t('Common.enable'):$t('Common.disable')}}
  58. </span>
  59. <span>{{data.ClassifyName}}</span>
  60. </div>
  61. <div class="opt-box">
  62. <!-- 章节设置 -->
  63. <span class="editsty"
  64. v-if="!data.Child || (data.Child&&!data.Child.length)"
  65. @click="chapterSetting(data)"
  66. v-permission="permissionBtn.classifyBtn.classifyList_cnClassify_chapterSetting">
  67. {{ $t('ReportManage.CategoryList.section_settings') }}
  68. </span>
  69. <img class="icon-drag" src="~@/assets/img/data_m/move_ico2.png" alt="">
  70. <img class="icon-set" src="~@/assets/img/icons/variety_set.png" alt="" @click.stop="handleEdit(data)" v-permission="permissionBtn.classifyBtn.classifyList_cnClassify_classifyEdit">
  71. </div>
  72. </div>
  73. </el-tree>
  74. </div>
  75. <!-- 分类弹窗 -->
  76. <m-dialog
  77. :title="classifyForm.classify_id?$t('ReportManage.CategoryList.edit_category'):$t('ReportManage.CategoryList.add_category')"
  78. :show.sync="classifyForm.show"
  79. v-if="classifyForm.show"
  80. width="650px"
  81. >
  82. <div style="padding-left: 50px">
  83. <el-form
  84. :model="classifyForm"
  85. :rules="formRules"
  86. ref="formRef"
  87. hide-required-asterisk
  88. label-width="auto">
  89. <!-- 分类名称 -->
  90. <el-form-item prop="classify_name" :label="$t('ReportManage.CategoryList.category_name')">
  91. <el-input
  92. type="text"
  93. v-model="classifyForm.classify_name"
  94. :placeholder="$t('ReportManage.CategoryList.category_name_hint')"
  95. style="width:400px;"
  96. />
  97. </el-form-item>
  98. <!-- 上级分类 -->
  99. <el-form-item prop="parent_id" :label="$t('ReportManage.CategoryList.parent_category')">
  100. <el-cascader
  101. v-model="classifyForm.parent_id"
  102. :options="classifyparentArr"
  103. :disabled="classifyForm.classify_id"
  104. style="width:400px;"
  105. ref="classifyRef"
  106. :props="{
  107. checkStrictly: true,
  108. value: 'Id',
  109. label: 'ClassifyName',
  110. children:'Child',
  111. emitPath:false
  112. }"
  113. clearable
  114. @change="changeClassify"
  115. >
  116. </el-cascader>
  117. </el-form-item>
  118. </el-form>
  119. <div v-html="tips" style="color:#999;"></div>
  120. </div>
  121. <div slot="footer" style="margin-top: 20px;">
  122. <el-button
  123. @click="cancelClassify"
  124. style="width: 132px; height: 40px"
  125. >{{ $t('Dialog.cancel_btn') }}</el-button>
  126. <el-button
  127. @click="setClassifyHandle"
  128. type="primary"
  129. style="width: 132px; height: 40px"
  130. >{{ $t('Dialog.confirm_save_btn') }}</el-button>
  131. </div>
  132. </m-dialog>
  133. <!-- 转移报告弹窗 -->
  134. <m-dialog
  135. title="分类报告转移"
  136. :show.sync="isTransferReport"
  137. width="650px"
  138. >
  139. <div>
  140. <el-form
  141. :model="transferForm"
  142. hide-required-asterisk
  143. label-width="auto"
  144. >
  145. <el-form-item prop="classify_name" label="原分类">
  146. <el-cascader
  147. v-model="transferForm.oldClassify"
  148. @change="filterChange"
  149. :options="classifyparentArr"
  150. clearable
  151. placeholder="请选择分类"
  152. style="width:100%;"
  153. ></el-cascader>
  154. </el-form-item>
  155. <!-- 上级分类 -->
  156. <el-form-item prop="parent_id" label="转移至分类">
  157. <el-cascader
  158. v-model="transferForm.newClassify"
  159. @change="filterChange"
  160. :options="classifyparentArr"
  161. clearable
  162. placeholder="请选择分类"
  163. style="width:100%;"
  164. ></el-cascader>
  165. </el-form-item>
  166. </el-form>
  167. </div>
  168. <div slot="footer" style="margin-top: 20px;">
  169. <el-button
  170. @click="isTransferReport=false"
  171. style="width: 132px; height: 40px"
  172. >{{ $t('Dialog.cancel_btn') }}</el-button>
  173. <el-button
  174. @click="handleSaveTransferReport"
  175. type="primary"
  176. style="width: 132px; height: 40px"
  177. >{{ $t('Dialog.confirm_save_btn') }}</el-button>
  178. </div>
  179. </m-dialog>
  180. </div>
  181. </template>
  182. <script>
  183. import mDialog from '@/components/mDialog.vue';
  184. import { classifylist,classifyparent,classifyadd,classifyedit } from 'api/api.js';
  185. import {reportVarietyInterence} from '@/api/modules/reportVariety'
  186. import {classifyPermissionInterface} from '@/api/modules/classifyApi.js'
  187. import { reportV2Interface } from '@/api/modules/reportV2.js'
  188. export default {
  189. components:{mDialog},
  190. computed: {
  191. canSetPermission() {
  192. /* 编辑最小级分类可设置品种 新增分类可设置跑品种 */
  193. if(!this.permissionBtn.classifyBtn.classifyList_cnClassify_connect_variety) return false
  194. if(this.classifyForm.classify_id) {
  195. return this.classifyForm.isLastLevel?true:false
  196. }else {
  197. return true
  198. }
  199. }
  200. },
  201. data() {
  202. return {
  203. typeVal:1,
  204. searchVal:'',
  205. list:[],
  206. classifyForm:{
  207. show:false,
  208. classify_id:0,
  209. classify_name:"",
  210. parent_id: 0,
  211. variety:'',//关联的品种
  212. },
  213. formRules: {
  214. classify_name: [{ required:true,message:this.$t('ReportManage.CategoryList.category_name_hint'),trigger:'blur'}]
  215. },
  216. classifyparentArr:[],
  217. reportVarietyList:[],//中文品种列表
  218. /* 转移报告弹窗 */
  219. isTransferReport: false,
  220. transferForm: {},
  221. tips: `注:若上级分类已关联报告,则新建的第一个子分类默认继承上级分类(父分类)关联的品种、报告、审批流。`
  222. }
  223. },
  224. mounted(){
  225. this.getList()
  226. },
  227. methods: {
  228. /* 报告转移 */
  229. transferReport() {
  230. this.isTransferReport = true;
  231. this.transferForm = {
  232. oldClassify: '',
  233. newClassify: ''
  234. }
  235. },
  236. handleSaveTransferReport() {
  237. },
  238. async getList(type){
  239. const res=await classifylist({
  240. KeyWord:this.searchVal,
  241. })
  242. if(res.Ret===200){
  243. this.list=res.Data.List||[]
  244. this.classifyparentArr=_.cloneDeep(this.list)
  245. this.filterNodes(this.classifyparentArr)
  246. }
  247. },
  248. /* 添加分类默认关联父级品种 */
  249. async changeClassify(id) {
  250. if(!this.classifyForm.classify_id) {
  251. let item = this.$refs.classifyRef.getCheckedNodes(true)
  252. console.log(item)
  253. }
  254. },
  255. // 去设置章节
  256. chapterSetting(row){
  257. this.$router.push({path:'chapterSetting',query:{ id:row.Id,classifyName: row.ClassifyName }})
  258. },
  259. filterNodes(arr) {
  260. arr.length && arr.forEach(item => {
  261. item.Child && item.Child.length && this.filterNodes(item.Child)
  262. if(!item.Child || (item.Child&&!item.Child.length) || item.Level===2) {
  263. delete item.Child
  264. }
  265. })
  266. },
  267. async addClassify(){
  268. this.classifyForm={
  269. show:true,
  270. classify_id:0,
  271. classify_name:"",
  272. parent_id: 0,
  273. variety:'',//关联的品种
  274. }
  275. },
  276. async handleEdit(item){
  277. this.classifyForm={
  278. show:true,
  279. classify_id:item.Id,
  280. classify_name:item.ClassifyName,
  281. parent_id: item.ParentId,
  282. isLastLevel: !item.Child
  283. }
  284. },
  285. async setClassifyHandle(){
  286. await this.$refs.formRef.validate();
  287. const { classify_name,parent_id,classify_id } = this.classifyForm;
  288. let params = {
  289. ClassifyName: classify_name,
  290. ParentId: parent_id,
  291. }
  292. const { Ret,Msg } = classify_id
  293. ? await classifyedit({...params,ClassifyId: classify_id})
  294. : await classifyadd(params)
  295. if(Ret !== 200) return
  296. //this.$message.success(Msg)
  297. this.$message.success(
  298. classify_id
  299. ?this.$t('ReportManage.CategoryList.modification_successful')
  300. :this.$t('ReportManage.CategoryList.addition_successful')
  301. )
  302. this.cancelClassify();
  303. this.getList();
  304. },
  305. /* 取消 */
  306. cancelClassify() {
  307. this.$refs.formRef.resetFields();
  308. this.classifyForm.show = false;
  309. },
  310. //启用\禁用设置
  311. handleEnableSet(item){
  312. // 判断权限
  313. const {classifyBtn,checkPermissionBtn} = this.permissionBtn
  314. if(!checkPermissionBtn(classifyBtn.classifyList_cnClassify_enable)) return
  315. classifyPermissionInterface.enableSet({
  316. ClassifyId:item.Id,
  317. Enabled:item.Enabled==1?0:1
  318. }).then(res=>{
  319. if(res.Ret===200){
  320. //设置成功
  321. this.$message.success(this.$t('ReportManage.CategoryList.setup_successful'))
  322. this.getList()
  323. }
  324. })
  325. },
  326. //控制只能同级拖动
  327. canDropHandle(draggingNode, dropNode, type){
  328. if(type==='inner') return false //禁止向内部拖动
  329. if(draggingNode.level!=dropNode.level) return false
  330. if(draggingNode.data.ParentId!=dropNode.data.ParentId) return false
  331. return true
  332. },
  333. //拖动结束
  334. dropOverHandle(b,a,i,e) {
  335. // 被拖拽节点对应的 Node、结束拖拽时最后进入的节点、被拖拽节点的放置位置
  336. const classifyId=b.data.Id
  337. let list=a.parent.childNodes;
  338. let PrevClassifyId=0,NextClassifyId=0,targetIndex=0;
  339. list.forEach((item,index) => {
  340. if(item.data.Id===classifyId){
  341. targetIndex=index
  342. }
  343. });
  344. if(targetIndex===0){
  345. NextClassifyId=list[1].data.Id
  346. }else if(targetIndex===list.length-1){
  347. PrevClassifyId=list[list.length-1].data.Id
  348. }else{
  349. PrevClassifyId=list[targetIndex-1].data.Id
  350. NextClassifyId=list[targetIndex+1].data.Id
  351. }
  352. const params={
  353. ClassifyId:classifyId,
  354. PrevClassifyId,
  355. NextClassifyId
  356. }
  357. console.log(params);
  358. classifyPermissionInterface.moveSort(params).then(res=>{
  359. if(res.Ret===200){
  360. this.$message.success(this.$t('ReportManage.CategoryList.move_successful'))
  361. }else{
  362. this.getList()
  363. }
  364. })
  365. },
  366. },
  367. }
  368. </script>
  369. <style lang="scss">
  370. .el-cascader .el-input{
  371. width: 100%;
  372. }
  373. .classify-page{
  374. .content-box{
  375. .el-tree-node__content{
  376. height: fit-content;
  377. padding-top: 10px;
  378. padding-bottom: 10px;
  379. border-bottom: 1px solid #C8CDD9;
  380. }
  381. }
  382. }
  383. </style>
  384. <style lang="scss" scoped>
  385. .top-wrap{
  386. display: flex;
  387. justify-content: space-between;
  388. background: #FFFFFF;
  389. border-radius: 4px;
  390. .type-box{
  391. display: flex;
  392. .item{
  393. position: relative;
  394. cursor: pointer;
  395. color: #666;
  396. min-width: 88px;
  397. line-height: 60px;
  398. text-align: center;
  399. }
  400. .active{
  401. color: #0052D9;
  402. &::after{
  403. content: '';
  404. display: block;
  405. width: 100%;
  406. height: 2px;
  407. position: absolute;
  408. bottom: 0px;
  409. left: 0;
  410. background-color: #0052D9;
  411. }
  412. }
  413. }
  414. }
  415. .content-box{
  416. padding: 20px;
  417. margin-top: 20px;
  418. height: calc(100vh - 230px);
  419. overflow-y: auto;
  420. background-color: #FFFFFF;
  421. .classify-item-wrap{
  422. flex: 1;
  423. padding-right: 20px;
  424. display: flex;
  425. justify-content: space-between;
  426. align-items: center;
  427. .tag{
  428. display: inline-block;
  429. min-width: 76px;
  430. line-height: 30px;
  431. text-align: center;
  432. &.open{
  433. background-color: #ECF2FE;
  434. color: #0052D9;
  435. }
  436. &.close{
  437. background-color: #0052D9;
  438. color: #fff;
  439. }
  440. }
  441. .opt-box{
  442. .icon-drag,.icon-set{
  443. width: 16px;
  444. height: 16px;
  445. margin-left: 10px;
  446. }
  447. }
  448. }
  449. }
  450. </style>