BAIINFOTargetbase.vue 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355
  1. <template>
  2. <div class="smmTarget-container target-container" id="box">
  3. <span
  4. v-show="!isLeftWrapShow"
  5. class="slide-btn-icon slide-right"
  6. @click="isLeftWrapShow = !isLeftWrapShow"
  7. >
  8. <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
  9. </span>
  10. <div class="left-cont minHeight" id="left" v-show="isLeftWrapShow">
  11. <span
  12. v-show="isLeftWrapShow"
  13. class="slide-btn-icon slide-left"
  14. @click="isLeftWrapShow = !isLeftWrapShow"
  15. >
  16. <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
  17. </span>
  18. <div class="left-top">
  19. <el-button
  20. v-permission="permissionBtn.dataSourcePermission.bcyfData_export"
  21. style="width: 100%"
  22. type="primary"
  23. plain
  24. size="medium"
  25. @click="exportClick"
  26. :loading="btnload"
  27. >导出Excel</el-button
  28. >
  29. <el-autocomplete
  30. style="margin: 20px 0; width: 100%"
  31. prefix-icon="el-icon-search"
  32. v-model="leftSearchVal"
  33. :fetch-suggestions="handleLeftSearch"
  34. :trigger-on-focus="false"
  35. placeholder="指标名称/指标ID"
  36. @select="handleSelectLeftSearchval"
  37. popper-class="el-autocomplete-suggestion-data-entry"
  38. clearable
  39. >
  40. <template slot-scope="scope">
  41. <div v-if="scope.item.nodata" style="text-align: center">
  42. 暂无数据
  43. </div>
  44. <div v-else>
  45. {{ scope.item.IndexName }}
  46. </div>
  47. </template>
  48. </el-autocomplete>
  49. </div>
  50. <div class="scroll-wrap">
  51. <el-tree
  52. ref="treeRef"
  53. class="target_tree custom-tree"
  54. :data="classifyList"
  55. node-key="UniqueCode"
  56. :props="{
  57. label: 'ClassifyName',
  58. children: 'Children',
  59. }"
  60. draggable
  61. :current-node-key="select_node"
  62. :expand-on-click-node="false"
  63. check-strictly
  64. empty-text="暂无分类"
  65. @current-change="nodeChangeHandle"
  66. :default-expanded-keys="defaultShowNodes"
  67. @node-expand="handleNodeExpand"
  68. @node-collapse="handleNodeCollapse"
  69. :allow-drag="canDragHandle"
  70. :allow-drop="canDropHandle"
  71. @node-drop="dropOverHandle"
  72. >
  73. <div class="custom-tree-node" slot-scope="{ node, data }">
  74. <span
  75. class="text_oneLine"
  76. :style="`width:${
  77. (select_node === data.UniqueCode &&
  78. (node.Nodewidth || data.NodeWidth + 'px')) ||
  79. ''
  80. }`"
  81. >{{ data.ClassifyName }}</span
  82. >
  83. <div v-if="select_node === data.UniqueCode">
  84. <img
  85. src="~@/assets/img/data_m/move_ico.png"
  86. v-if="data.Button.MoveButton"
  87. alt=""
  88. style="width: 14px; height: 14px; margin-right: 5px"
  89. @click.stop="clickClassifyHandle('move', data, node)"
  90. />
  91. <img
  92. src="~@/assets/img/set_m/add.png"
  93. style="width: 14px; height: 14px; margin-right: 5px"
  94. @click.stop="clickClassifyHandle('add', data, node)"
  95. v-if="data.Button.AddButton&&permissionBtn.isShowBtn('dataSourcePermission','bcyfData_classifyOpt_add')"
  96. />
  97. <img
  98. v-permission="permissionBtn.dataSourcePermission.bcyfData_edit"
  99. src="~@/assets/img/set_m/edit.png"
  100. v-if="data.Button.OpButton&&permissionBtn.isShowBtn('dataSourcePermission','bcyfData_classifyOpt_edit')"
  101. alt=""
  102. style="width: 14px; height: 14px; margin-right: 5px"
  103. @click.stop="clickClassifyHandle('edit', data, node)"
  104. />
  105. <img
  106. src="~@/assets/img/set_m/clean.png"
  107. v-if="data.Button.cleanButton"
  108. alt=""
  109. style="width: 14px; height: 14px; margin-right: 5px"
  110. @click.stop="clickClassifyHandle('clean', data, node)"
  111. />
  112. <img
  113. src="~@/assets/img/set_m/del.png"
  114. v-if="data.Button.DeleteButton&&permissionBtn.isShowBtn('dataSourcePermission','bcyfData_classifyOpt_delete')"
  115. alt=""
  116. style="width: 14px; height: 14px"
  117. @click.stop="clickClassifyHandle('del', data, node)"
  118. />
  119. <img
  120. src="~@/assets/img/set_m/del_icon.png"
  121. v-if="data.Button.targetDelButton&&permissionBtn.isShowBtn('dataSourcePermission','bcyfData_classifyOpt_delete')"
  122. alt=""
  123. style="width: 14px; height: 14px; margin-right: 5px"
  124. @click.stop="clickClassifyHandle('delTarget', data, node)"
  125. />
  126. </div>
  127. </div>
  128. </el-tree>
  129. <div class="add-cont" @click="addClassifyHandle" v-if="permissionBtn.isShowBtn('dataSourcePermission','bcyfData_classifyOpt_add')">
  130. <img
  131. src="~@/assets/img/set_m/add_ico.png"
  132. alt=""
  133. style="width: 16px; height: 16px; margin: 10px"
  134. />
  135. <span>添加分类</span>
  136. </div>
  137. </div>
  138. <span
  139. class="move-btn resize"
  140. v-drag
  141. id="resize"
  142. @mousemove="dynamicNode && resetNodeStyle(dynamicNode)"
  143. >
  144. </span>
  145. </div>
  146. <div
  147. class="right-cont minHeight"
  148. id="right"
  149. v-loading="dataloading"
  150. element-loading-text="获取数据中..."
  151. >
  152. <template v-if="rightShow">
  153. <div class="right-box" @scroll="scrollHandle">
  154. <div class="data-header">
  155. <lz-table
  156. :tableOption="tableOption"
  157. tableType="header"
  158. ref="table"
  159. source="baiinfo"
  160. @editTarget="editTargetByTable"
  161. />
  162. </div>
  163. <div class="data-cont" v-if="dateArr.length">
  164. <lz-table
  165. :tableOption="tableOption"
  166. tableType="data"
  167. :dateArr="dateArr"
  168. source="baiinfo"
  169. />
  170. </div>
  171. <div v-else class="nodata"></div>
  172. </div>
  173. <div
  174. class="frequency-list"
  175. v-if="rightShow && !isShowSingleData && frequencyList.length > 1"
  176. >
  177. <el-button
  178. type="primary"
  179. class="frequency-btn"
  180. :plain="select_frequency !== item.key"
  181. v-for="item in frequencyList"
  182. :key="item.key"
  183. @click="changeFrequency(item.key)"
  184. >{{ item.key || "全部" }}</el-button
  185. >
  186. </div>
  187. </template>
  188. <div v-else class="nodata-cont">
  189. <tableNoData text="暂无数据"/>
  190. </div>
  191. </div>
  192. <!-- 添加/编辑分类弹窗 -->
  193. <m-dialog
  194. :show.sync="openClassifyDia"
  195. width="700px"
  196. :title="classifyForm.title"
  197. @close="cancelDialogHandle"
  198. >
  199. <div class="dialog-cont smmTarget-dialog-cont">
  200. <el-form
  201. ref="classifyFormRef"
  202. label-position="left"
  203. hide-required-asterisk
  204. label-width="80px"
  205. :model="classifyForm"
  206. :rules="classifyFormRules"
  207. >
  208. <!-- 是二级分类 -->
  209. <el-form-item
  210. label="一级目录"
  211. v-if="classifyForm.parent_classify_name"
  212. >
  213. <span>{{ classifyForm.parent_classify_name }}</span>
  214. </el-form-item>
  215. <!-- 是分类 -->
  216. <el-form-item
  217. label="分类名称"
  218. prop="classify_name"
  219. v-if="classifyForm.type === 'classify'"
  220. >
  221. <el-input
  222. v-model="classifyForm.classify_name"
  223. style="width: 80%"
  224. placeholder="请输入分类名称"
  225. />
  226. </el-form-item>
  227. <!-- 是指标 -->
  228. <template v-else>
  229. <el-form-item label="指标名称">
  230. <span>{{ classifyForm.classify_name }}</span>
  231. </el-form-item>
  232. <el-form-item label="频度" prop="frequency">
  233. <el-select
  234. placeholder="请选择频度"
  235. style="width: 80%"
  236. v-model="classifyForm.frequency"
  237. >
  238. <el-option
  239. v-for="item in frequencyArr"
  240. :key="item"
  241. :label="item"
  242. :value="item"
  243. >
  244. </el-option>
  245. </el-select>
  246. </el-form-item>
  247. <el-form-item label="单位" prop="unit">
  248. <el-select
  249. placeholder="请选择单位"
  250. style="width: 80%"
  251. v-model="classifyForm.unit"
  252. >
  253. <el-option
  254. v-for="item in unitArr"
  255. :key="item"
  256. :label="item"
  257. :value="item"
  258. >
  259. </el-option>
  260. </el-select>
  261. </el-form-item>
  262. <el-form-item
  263. label="分类名称"
  264. prop="classifys_id"
  265. v-if="classifyForm.by !== 'table'"
  266. >
  267. <el-cascader
  268. style="width: 80%"
  269. :key="cascaderKey"
  270. placeholder="请选择分类名称"
  271. v-model="classifyForm.classifys_id"
  272. :options="cascaderList"
  273. :props="{
  274. value: 'ClassifyId',
  275. label: 'ClassifyName',
  276. children: 'Children',
  277. }"
  278. />
  279. </el-form-item>
  280. </template>
  281. </el-form>
  282. </div>
  283. <div class="dia-bot">
  284. <el-button
  285. type="primary"
  286. style="margin-right: 20px"
  287. @click="saveClassifyHandle"
  288. >保存</el-button
  289. >
  290. <el-button type="primary" plain @click="cancelDialogHandle"
  291. >取消</el-button
  292. >
  293. </div>
  294. </m-dialog>
  295. </div>
  296. </template>
  297. <script>
  298. import lzTable from "@/components/lzTable.vue";
  299. import { baiinfoInterface } from "@/api/api.js";
  300. import mDialog from "@/components/mDialog.vue";
  301. import leftMixin from "./mixins/leftMixin.js";
  302. import { unitArr } from "@/utils/defaultOptions";
  303. export default {
  304. name: "",
  305. components: { lzTable, mDialog },
  306. mixins: [leftMixin],
  307. watch: {},
  308. data() {
  309. return {
  310. isLeftWrapShow:true,
  311. exportBase:
  312. process.env.VUE_APP_API_ROOT + "/datamanage/export/baiinfoList", //ssm数据导出接口
  313. dataloading: false,
  314. rightShow: false,
  315. select_classify: 0,
  316. classifyList: [],
  317. select_frequency: "",
  318. frequencyList: [],
  319. tableOption: [],
  320. dateArr: [], //最长的日期数组
  321. btnload: false,
  322. page_no: 1,
  323. page_size: 20,
  324. havemore: true, //是否还有数据
  325. leftSearchVal: "", //左侧搜索值
  326. leftSearchTradeCode: "", //如果是搜索选择的 则有此code
  327. select_quota: "", // 选择的指标名
  328. select_Unit: "", // 选择的单位
  329. select_ModifyTime: "", //选中的更新时间
  330. select_breed: "", // 选中的分类名称
  331. isShowSingleData: false, //右侧是否展示的是单个指标数据
  332. singleDataCode: "",
  333. cascaderList: [], //移动指标分类列表
  334. cascaderKey: 0,
  335. openClassifyDia: false, //分类弹窗
  336. classifyForm: {
  337. title: "添加分类",
  338. classify_name: "", //分类名称
  339. classify_id: "", //分类id
  340. parent_classify_name: "", //如果是二级分类,这是所属一级分类的名称
  341. parent_classify_id: "", //如果是二级分类,这是所属一级分类的id
  342. type: "classify", //classify|index 对分类还是指标进行操作
  343. classifys_id: [], //如果是指标,这是选中的分类id[一级分类id,二级分类id]
  344. BaseFromBaiinfoIndexId: "", //如果是指标,这是指标的唯一id
  345. }, //弹窗可编辑信息
  346. classifyFormRules: {
  347. classify_name: [
  348. { required: true, message: "分类名称不能为空", trigger: "blur" },
  349. ],
  350. }, //可编辑信息校验
  351. frequencyArr: ["日度", "周度", "旬度", "月度", "季度", "年度"],
  352. unitArr,
  353. };
  354. },
  355. methods: {
  356. /* 获取分类 */
  357. getClassify() {
  358. baiinfoInterface.classifyList().then((res) => {
  359. if (res.Ret !== 200) return;
  360. let Data = res.Data.List || [];
  361. //对分类数据做处理:
  362. this.classifyList = this.formatClassifyData(Data, 1, 0);
  363. });
  364. },
  365. formatClassifyData(arr, level, topParentNodeId) {
  366. arr.forEach((item) => {
  367. const { ClassifyId, BaseFromBaiinfoIndexId, BaseFromBaiinfoIndexCode } =
  368. item;
  369. //每条数据添加UniqueCode属性,由ClassifyId BaseFromBaiinfoIndexId BaseFromBaiinfoIndexCode拼接
  370. item.UniqueCode = `${ClassifyId}_${BaseFromBaiinfoIndexId}_${BaseFromBaiinfoIndexCode}`;
  371. //添加Button属性,用于控制操作栏
  372. item.Button = {
  373. AddButton: true,
  374. OpButton: true,
  375. DeleteButton: true,
  376. MoveButton: true,
  377. cleanButton: false,
  378. targetDelButton: false,
  379. };
  380. //未分类禁用所有操作栏
  381. if (item.ClassifyId === 0) {
  382. item.Button = {
  383. AddButton: false,
  384. OpButton: false,
  385. DeleteButton: false,
  386. MoveButton: false,
  387. cleanButton: false,
  388. targetDelButton: false,
  389. };
  390. }
  391. //二级分类禁用添加按钮
  392. if (item.Level === 2) {
  393. item.Button = {
  394. AddButton: false,
  395. OpButton: true,
  396. DeleteButton: true,
  397. MoveButton: true,
  398. cleanButton: false,
  399. targetDelButton: false,
  400. };
  401. }
  402. //指标禁用删除按钮
  403. if (item.BaseFromBaiinfoIndexCode) {
  404. item.Button = {
  405. AddButton: false,
  406. OpButton: true,
  407. DeleteButton: false,
  408. MoveButton: true,
  409. cleanButton: true,
  410. targetDelButton: true,
  411. };
  412. //未分类下的指标,禁用清除按钮
  413. if (topParentNodeId === 0) {
  414. item.Button["cleanButton"] = false;
  415. }
  416. }
  417. //非一级分类添加一级父节点id
  418. if (level !== 1) {
  419. item.topParentNodeId = topParentNodeId;
  420. }
  421. if (item.Children && item.Children.length) {
  422. this.formatClassifyData(
  423. item.Children,
  424. level + 1,
  425. level === 1 ? item.ClassifyId : item.ParentId
  426. );
  427. }
  428. });
  429. return arr;
  430. },
  431. /* 获取频度 */
  432. async getFrequency(defaultSelect) {
  433. const res = await baiinfoInterface.frequencyList({
  434. ClassifyId: this.select_classify,
  435. });
  436. if (res.Ret !== 200) return;
  437. this.frequencyList = res.Data
  438. ? res.Data.map((item) => {
  439. return {
  440. key: item.Frequency,
  441. };
  442. })
  443. : [];
  444. //设置当前选中的频度,若传入有默认选项则选中默认频度,否则选中列表第一个
  445. this.select_frequency =
  446. defaultSelect ||
  447. (this.frequencyList.length ? this.frequencyList[0].key : "");
  448. !this.frequencyList.length && this.nodataDeal();
  449. },
  450. /* 获取数据 */
  451. getDataList: _.throttle(function () {
  452. this.isShowSingleData = false;
  453. this.dataloading = true;
  454. baiinfoInterface
  455. .dataList({
  456. ClassifyId: this.select_classify,
  457. Frequency: this.select_frequency,
  458. PageSize: this.page_size,
  459. CurrentIndex: this.page_no,
  460. })
  461. .then((res) => {
  462. this.rightShow = true;
  463. if (res.Ret !== 200) return;
  464. // 找出最多的页码 判断是否还有数据
  465. let page_arrs = res.Data.map((item) => item.Paging.Pages);
  466. let totalPage = Math.max.apply(Math, page_arrs);
  467. this.havemore = this.page_no < totalPage ? true : false;
  468. // 合并数据
  469. if (this.page_no === 1) {
  470. this.tableOption = res.Data;
  471. } else {
  472. this.tableOption.forEach((item) => {
  473. res.Data.forEach((_item) => {
  474. if (item.IndexCode === _item.IndexCode) {
  475. item.DataList = item.DataList.concat(_item.DataList);
  476. }
  477. });
  478. });
  479. }
  480. // 合并所有指标中的日期 作为日期数组
  481. let arr = res.Data.map((item) => {
  482. return item.DataList;
  483. });
  484. let obj = [];
  485. for (let i of arr) {
  486. for (let j of i) {
  487. obj.push(j.DataTime);
  488. }
  489. }
  490. let arr2 = [...new Set(obj)].sort().reverse();
  491. let concatArr = [...new Set([...this.dateArr, ...arr2])]
  492. .sort()
  493. .reverse();
  494. this.dateArr = this.page_no === 1 ? arr2 : concatArr;
  495. /* 不满6个追加6个空的显示一排 别问 问就是为了美观 */
  496. if (this.tableOption.length < 7)
  497. for (let i = 0; i < 7; i++) {
  498. this.tableOption.push({
  499. DataList: [],
  500. });
  501. if (this.tableOption.length >= 7) break;
  502. }
  503. //数据最大长度小于12个 追加数据满12个 别问 问就是为了美观
  504. if (this.dateArr.length < 12)
  505. for (let i = 0; i < 12; i++) {
  506. this.dateArr.push("");
  507. if (this.dateArr.length >= 12) break;
  508. }
  509. this.dataloading = false;
  510. this.page_no === 1 &&
  511. this.$nextTick(() => {
  512. this.rightShow && this.initWidth();
  513. });
  514. });
  515. }, 200),
  516. // 获取单个指标数据
  517. async getTargetDataList(code) {
  518. this.isShowSingleData = true;
  519. this.dataloading = true;
  520. try {
  521. const res = await baiinfoInterface.getTargetDataList({
  522. IndexCode: code,
  523. });
  524. this.rightShow = true;
  525. if (res.Ret !== 200) return;
  526. const DataList = res.Data.Data || [];
  527. // 设置为没有更多数据
  528. this.haveMore = false;
  529. // 合并数据
  530. this.tableOption = [
  531. {
  532. DataList: DataList,
  533. ...res.Data,
  534. },
  535. ];
  536. // 这里是单个指标所以不用合并日期
  537. const arr = DataList.map((item) => item.DataTime);
  538. this.dateArr = [...new Set(arr)].sort().reverse();
  539. /* 不满6个追加6个空的显示一排 别问 问就是为了美观 */
  540. for (let i = 0; i < 7; i++) {
  541. this.tableOption.push({
  542. DataList: [],
  543. });
  544. if (this.tableOption.length >= 7) break;
  545. }
  546. //数据最大长度小于12个 追加数据满12个 别问 问就是为了美观
  547. if (this.dateArr.length < 12)
  548. for (let i = 0; i < 12; i++) {
  549. this.dateArr.push("");
  550. if (this.dateArr.length >= 12) break;
  551. }
  552. this.select_quota = res.Data.IndexName;
  553. this.select_Unit = res.Data.Unit;
  554. this.select_frequency = res.Data.Frequency;
  555. this.select_ModifyTime = res.Data.ModifyTime || "";
  556. this.dataloading = false;
  557. this.rightShow && this.initWidth();
  558. } catch (err) {
  559. console.log(err);
  560. }
  561. },
  562. /* 改变品种 */
  563. changeClassify(id) {
  564. this.select_classify = id;
  565. this.select_breed = id;
  566. this.leftSearchVal = "";
  567. this.leftSearchTradeCode = "";
  568. this.select_Unit = "";
  569. this.select_ModifyTime = "";
  570. },
  571. /* 改变频度 */
  572. changeFrequency(key) {
  573. this.select_frequency = key;
  574. this.leftSearchVal = "";
  575. this.getDataList();
  576. },
  577. initWidth() {
  578. this.$nextTick(() => {
  579. $(".right-box")[0].style.width =
  580. this.$refs.table.$el.clientWidth + 5 + "px";
  581. $(".right-box")[0].scrollTop = 0;
  582. $(".right-box")[0].scrollLeft = 0;
  583. });
  584. },
  585. /* 无频度的异常显示处理 7*12*/
  586. nodataDeal() {
  587. this.tableOption = [];
  588. this.dateArr = [];
  589. for (let i = 0; i < 7; i++) {
  590. this.tableOption.push({
  591. DataList: [],
  592. });
  593. if (this.tableOption.length >= 7) break;
  594. }
  595. for (let i = 0; i < 12; i++) {
  596. this.dateArr.push("");
  597. if (this.dateArr.length >= 12) break;
  598. }
  599. },
  600. /* 滚动加载 */
  601. scrollHandle(e) {
  602. if (this.isShowSingleData) return;
  603. const dom = e.target;
  604. let total = dom.scrollTop + dom.clientHeight;
  605. if (total >= dom.scrollHeight && this.havemore) {
  606. this.page_no++;
  607. console.log("load下一页");
  608. this.getDataList();
  609. }
  610. },
  611. /* 数据导出 */
  612. exportClick() {
  613. this.btnload = true;
  614. const link = document.createElement("a");
  615. link.href = this.exportSmmapi;
  616. link.download = "";
  617. link.click();
  618. console.log({
  619. IndexName: this.select_quota,
  620. IndexCode: this.leftSearchTradeCode,
  621. sendIndexCode: this.escapeStr(this.leftSearchTradeCode),
  622. TypeName: this.select_breed,
  623. sendTypeName: this.escapeStr(this.select_breed),
  624. Frequency: this.select_frequency,
  625. UnitName: this.select_Unit,
  626. ModifyTime: this.select_ModifyTime,
  627. sendToken: this.escapeStr(localStorage.getItem("auth") || ""),
  628. url: this.exportSmmapi,
  629. });
  630. setTimeout(() => {
  631. this.btnload = false;
  632. }, 5000);
  633. },
  634. //左侧搜索
  635. async handleLeftSearch(query, cb) {
  636. cb([]);
  637. if (!query) return;
  638. const res = await baiinfoInterface.getTargetListByName({
  639. Keyword: query,
  640. });
  641. if (res.Ret === 200) {
  642. let arr = res.Data || [];
  643. if (!arr.length) {
  644. cb([{ nodata: true }]);
  645. } else {
  646. cb(arr);
  647. }
  648. }
  649. },
  650. // 选中左侧搜索值
  651. handleSelectLeftSearchval(e) {
  652. if (!e.IndexCode) return;
  653. //this.select_frequency=e.Frequency
  654. //this.select_classify=e.Type2+'#'+e.Type3
  655. this.leftSearchTradeCode = e.IndexCode;
  656. this.leftSearchVal = e.IndexName;
  657. this.select_quota = e.IndexName;
  658. this.select_Unit = e.Unit;
  659. this.select_ModifyTime = e.ModifyTime;
  660. this.select_breed = "";
  661. // 关闭watcher
  662. this.isAuto = false;
  663. // 获取单独指标数据
  664. this.getTargetDataList(e.IndexCode);
  665. this.$nextTick(() => {
  666. //找到父节点并展开
  667. const targetData = this.getTargetData(e.IndexCode, this.classifyList);
  668. if (targetData) {
  669. //一级节点
  670. const { topParentNodeId, UniqueCode } = targetData;
  671. this.handleNodeExpand({ UniqueCode: `${topParentNodeId}_0_` });
  672. //二级节点
  673. if (topParentNodeId !== 0) {
  674. const secondNodeId = UniqueCode.split("_")[0];
  675. this.handleNodeExpand({ UniqueCode: `${secondNodeId}_0_` });
  676. }
  677. //节点样式变化
  678. const tree = $(".target_tree")[0];
  679. let width = tree.offsetWidth;
  680. let label_width =
  681. width > 500 ? "auto" : width <= 500 ? 90 : 0.7 * width;
  682. targetData.NodeWidth = label_width;
  683. this.select_node = UniqueCode;
  684. this.$refs.treeRef.setCurrentNode(targetData);
  685. const node = this.$refs.treeRef.getCurrentNode();
  686. this.resetNodeStyle(node);
  687. }
  688. //this.handleScrollLeftWrap()
  689. });
  690. },
  691. // 左侧滚动
  692. handleScrollLeftWrap() {
  693. let top = $(".act")[0].offsetTop;
  694. $(".classify-list").animate({
  695. scrollTop: top - 200,
  696. });
  697. },
  698. getTargetData(code, arr) {
  699. for (const item of arr) {
  700. if (item.BaseFromBaiinfoIndexCode === code) return item;
  701. if (item.Children && item.Children.length) {
  702. const _item = this.getTargetData(code, item.Children);
  703. if (_item) return _item;
  704. }
  705. }
  706. },
  707. // 对[#,;]转义
  708. escapeStr(str) {
  709. return str.replace(/#/g, escape("#")).replace(/;/g, escape(";"));
  710. },
  711. //节点操作:
  712. clickClassifyHandle(type, data, node) {
  713. const optionMap = {
  714. /* 'move':this.moveNode,移动 */
  715. add: this.addClassifyHandle, //添加分类
  716. edit: this.editClassifyHandle, //编辑分类/移动指标
  717. del: this.deleteClassifyHandle, //删除分类
  718. clean: this.cleanClassifyHandle, //清除指标分类
  719. delTarget: this.deleteTarget, //删除指标
  720. };
  721. optionMap[type] && optionMap[type](data, node);
  722. },
  723. //添加一二级分类
  724. addClassifyHandle(data = null, node = null) {
  725. this.classifyForm = {
  726. ...this.classifyForm,
  727. ...(data
  728. ? {
  729. title: "添加分类",
  730. classify_name: "",
  731. parent_classify_name: data.ClassifyName,
  732. parent_classify_id: data.ClassifyId,
  733. }
  734. : {
  735. title: "添加分类",
  736. classify_name: "",
  737. }),
  738. };
  739. this.openDialogHandle();
  740. },
  741. //编辑一二级分类,编辑指标
  742. async editClassifyHandle(data, node) {
  743. //console.log('data',data,'node',node)
  744. console.log("dataClassify", data);
  745. const { level, parent } = node;
  746. const parentNodeId = parent.data.ClassifyId;
  747. const {
  748. ClassifyName,
  749. topParentNodeId,
  750. ClassifyId,
  751. BaseFromBaiinfoIndexId,
  752. } = data;
  753. let tempForm = {
  754. parent_classify_name: "",
  755. parent_classify_id: "",
  756. };
  757. let type = "classify";
  758. let classifys_id = [];
  759. //是二级分类(二级,且父节点不是未分类节点)
  760. if (level === 2 && parentNodeId !== 0) {
  761. const { parent } = node;
  762. tempForm.parent_classify_id = data.ParentId;
  763. tempForm.parent_classify_name = parent.data.ClassifyName;
  764. }
  765. //是指标(三级,或二级,父节点为未分类节点)
  766. if (level === 3 || (level === 2 && parentNodeId === 0)) {
  767. type = "index";
  768. this.cascaderKey++; //更新el-cascader
  769. //获取cascaderList数据
  770. const res = await baiinfoInterface.classifyNameList();
  771. if (res.Ret !== 200) return;
  772. this.cascaderList = res.Data.List;
  773. //如果指标不在未分类节点下,需回显值
  774. if (parentNodeId) {
  775. classifys_id = [topParentNodeId, parentNodeId];
  776. }
  777. }
  778. this.classifyForm = {
  779. ...{
  780. title: type === "index" ? "编辑指标" : "编辑分类",
  781. classify_name: ClassifyName,
  782. classify_id: ClassifyId,
  783. type,
  784. classifys_id,
  785. BaseFromBaiinfoIndexId: BaseFromBaiinfoIndexId || "",
  786. unit: this.select_Unit,
  787. frequency: this.select_frequency,
  788. },
  789. ...tempForm,
  790. };
  791. this.openDialogHandle();
  792. },
  793. //从表格点击编辑指标
  794. editTargetByTable(data) {
  795. console.log("dataTable", data);
  796. const { Unit, Frequency, IndexName, ClassifyId, BaseFromBaiinfoIndexId } =
  797. data;
  798. this.classifyForm = {
  799. title: "编辑指标",
  800. classify_name: IndexName,
  801. classify_id: ClassifyId || this.select_classify,
  802. classifys_id: [0, ClassifyId || this.select_classify || 0],
  803. BaseFromBaiinfoIndexId: BaseFromBaiinfoIndexId || "",
  804. type: "index",
  805. unit: Unit,
  806. frequency: Frequency,
  807. by: "table",
  808. };
  809. this.openDialogHandle();
  810. },
  811. //删除一二级分类
  812. deleteClassifyHandle(data, node) {
  813. const { Children, ClassifyId } = data;
  814. //如果分类下有子分类或指标
  815. let hintText =
  816. Children && Children.length
  817. ? "删除分类将同步删除分类下所有子分类,确认删除吗?"
  818. : "删除分类不可恢复,确定删除吗?";
  819. this.$confirm(hintText, "提示", {
  820. confirmButtonText: "确定",
  821. cancelButtonText: "取消",
  822. type: "warning",
  823. })
  824. .then(() => {
  825. //删除接口
  826. baiinfoInterface
  827. .deleteClassifyItem({
  828. ClassifyId,
  829. })
  830. .then((res) => {
  831. if (res.Ret !== 200) return;
  832. this.$message.success("删除成功");
  833. this.getClassify();
  834. });
  835. })
  836. .catch(() => {});
  837. },
  838. //清除指标分类
  839. cleanClassifyHandle(data, node) {
  840. const { BaseFromBaiinfoIndexId } = data;
  841. baiinfoInterface
  842. .cleanClassify({
  843. BaseFromBaiinfoIndexId,
  844. })
  845. .then((res) => {
  846. if (res.Ret !== 200) return;
  847. this.$message.success("清除分类成功");
  848. this.getClassify();
  849. });
  850. },
  851. //删除指标
  852. deleteTarget(data, node) {
  853. const { BaseFromBaiinfoIndexId } = data;
  854. this.$confirm("指标删除后不可被引用,确认删除吗?", "提示", {
  855. confirmButtonText: "确定",
  856. cancelButtonText: "取消",
  857. type: "warning",
  858. })
  859. .then(() => {
  860. baiinfoInterface
  861. .deleteSMMtarget({
  862. BaseFromBaiinfoIndexId,
  863. })
  864. .then((res) => {
  865. if (res.Ret !== 200) return;
  866. this.$message.success("删除成功");
  867. this.getClassify();
  868. });
  869. //删除指标接口
  870. })
  871. .catch(() => {});
  872. },
  873. //打开分类弹窗
  874. openDialogHandle() {
  875. //this.$refs.classifyFormRef.clearValidate();
  876. this.openClassifyDia = true;
  877. },
  878. //关闭分类弹窗
  879. cancelDialogHandle() {
  880. this.$refs.classifyFormRef.clearValidate();
  881. this.openClassifyDia = false;
  882. this.classifyForm.classify_name = "";
  883. this.classifyForm.type = "classify";
  884. },
  885. //保存更改
  886. async saveClassifyHandle() {
  887. const {
  888. type,
  889. title,
  890. classify_name,
  891. classifys_id,
  892. parent_classify_id,
  893. classify_id,
  894. BaseFromBaiinfoIndexId,
  895. } = this.classifyForm;
  896. let res = null;
  897. let optionType = title.includes("添加") ? "添加" : "编辑";
  898. //对分类进行操作
  899. if (type === "classify") {
  900. //检查classify_name
  901. if (!classify_name.length) {
  902. this.$message.warning("请输入分类名称");
  903. return;
  904. }
  905. //添加分类
  906. if (title.includes("添加")) {
  907. res = await baiinfoInterface.addClassifyItem({
  908. ParentId: parent_classify_id || 0,
  909. ClassifyName: classify_name,
  910. });
  911. //编辑分类
  912. } else {
  913. res = await baiinfoInterface.editClassifyItem({
  914. ClassifyId: classify_id,
  915. ClassifyName: classify_name,
  916. });
  917. }
  918. }
  919. //对指标进行操作
  920. if (type === "index") {
  921. //检查classifys_id
  922. if (!classifys_id.length) {
  923. this.$message.warning("请选择分类");
  924. return;
  925. }
  926. //编辑指标
  927. res = await baiinfoInterface.editSmmTarget({
  928. ClassifyId: classifys_id[1] || 0,
  929. BaseFromBaiinfoIndexId: BaseFromBaiinfoIndexId,
  930. //单位,频度
  931. Unit: this.classifyForm.unit || "",
  932. Frequency: this.classifyForm.frequency || "",
  933. });
  934. }
  935. if (res.Ret !== 200) return;
  936. this.$message.success(`${optionType}成功`);
  937. this.getClassify();
  938. this.cancelDialogHandle();
  939. //判断是分类还是指标,请求对应详情
  940. this.checkNode(this.dynamicNode.data, this.dynamicNode);
  941. },
  942. checkNode(data, node) {
  943. const { level, parent } = node;
  944. const parentNodeId = parent.data.ClassifyId;
  945. const Children = data.Children || [];
  946. //如果是二级分类 或是一级分类的未分类
  947. if (
  948. (level === 2 && parentNodeId !== 0 && Children.length) ||
  949. (level === 1 && data.ClassifyId === 0 && Children.length)
  950. ) {
  951. this.getClassifyData(data.ClassifyId);
  952. //如果是指标
  953. } else if (level === 3 || (level === 2 && parentNodeId === 0)) {
  954. this.getBaiinfoData(data.BaseFromBaiinfoIndexCode);
  955. //如果是一级分类或空的二级指标
  956. } else if (level === 1 || (level === 2 && !Children.length)) {
  957. this.rightShow = false;
  958. this.isShowSingleData = false;
  959. }
  960. },
  961. //改变选中节点
  962. nodeChangeHandle(data, node) {
  963. if (data.UniqueCode === this.select_node) return;
  964. this.dynamicNode = node;
  965. this.select_node = data.UniqueCode;
  966. this.page_no = 1;
  967. this.page_size = 20;
  968. this.resetNodeStyle(node);
  969. this.checkNode(data, node);
  970. },
  971. //获取二级分类的表格数据
  972. async getClassifyData(id) {
  973. this.select_classify = id;
  974. this.select_frequency = "";
  975. await this.getFrequency();
  976. this.getDataList();
  977. },
  978. //获取指标数据
  979. getBaiinfoData(code) {
  980. this.singleDataCode = code;
  981. this.getTargetDataList(code);
  982. },
  983. //判断节点是否能放入
  984. canDropHandle(draggingNode, dropNode, type) {
  985. //console.log('drag',draggingNode)
  986. //console.log('drop',dropNode)
  987. const { level } = draggingNode;
  988. const dragParentId = draggingNode.data.ParentId;
  989. const dropClassifyId = dropNode.data.ClassifyId;
  990. const dropParentId = dropNode.data.ParentId;
  991. let canDrop = false;
  992. //level===1 一级节点 可以在一级节点之间移动 当dropNode不为未分类时,可以移动
  993. if (
  994. level === 1 &&
  995. dropNode.level === 1 &&
  996. type !== "inner" &&
  997. dropClassifyId !== 0
  998. ) {
  999. canDrop = true;
  1000. }
  1001. //level===2 二级节点 或 未分类下的指标
  1002. if (level === 2) {
  1003. //是未分类下的指标
  1004. if (dragParentId === 0) {
  1005. //在当前目录(未分类)内移动
  1006. //移动到其他分类下的二级目录内
  1007. if (
  1008. (dropNode.level === 2 && dropParentId === 0 && type !== "inner") ||
  1009. (dropNode.level === 2 && dropParentId !== 0 && type === "inner") ||
  1010. (dropNode.level === 3 && type !== "inner") ||
  1011. (dropNode.level === 1 && type === "inner" && dropClassifyId === 0)
  1012. ) {
  1013. canDrop = true;
  1014. }
  1015. } else {
  1016. //是二级节点
  1017. //在目录内移动
  1018. //跨目录移动
  1019. if (
  1020. (dropNode.level === 2 && type !== "inner" && dropParentId !== 0) ||
  1021. (dropNode.level === 1 && type === "inner" && dropClassifyId !== 0)
  1022. ) {
  1023. canDrop = true;
  1024. }
  1025. }
  1026. }
  1027. //level===3 指标
  1028. if (level === 3) {
  1029. if (
  1030. (dropNode.level === 2 && type === "inner" && dropParentId !== 0) ||
  1031. (dropNode.level === 3 && type !== "inner")
  1032. ) {
  1033. canDrop = true;
  1034. }
  1035. }
  1036. return canDrop;
  1037. },
  1038. //拖拽移动节点处理
  1039. dropOverHandle(draggingNode, dropNode, type, event) {
  1040. const { level, data } = draggingNode;
  1041. const parentNodeId = data.ParentId;
  1042. //是指标
  1043. if (level === 3 || (level === 2 && parentNodeId === 0)) {
  1044. this.moveSMMTarge(draggingNode, dropNode, type, event);
  1045. }
  1046. //是目录
  1047. if (level === 1 || (level == 2 && parentNodeId !== 0)) {
  1048. this.moveCatalog(draggingNode, dropNode, type, event);
  1049. }
  1050. },
  1051. //移动目录
  1052. moveCatalog(drag, drop, type, event) {
  1053. let PrevClassifyId = 0,
  1054. NextClassifyId = 0,
  1055. ClassifyId = 0,
  1056. ParentId = 0;
  1057. const list = drop.parent.childNodes;
  1058. ParentId = drop.parent.data.ClassifyId || 0;
  1059. ClassifyId = drag.data.ClassifyId;
  1060. //目录间移动
  1061. if (drag.level === drop.level) {
  1062. //console.log(drop.data.ClassifyName)
  1063. //找到最后进入的节点处于父节点的哪个位置
  1064. const index = list.findIndex((item) => {
  1065. return item.data.ClassifyId === drag.data.ClassifyId;
  1066. });
  1067. //如果在第一个
  1068. if (index === 0) {
  1069. PrevClassifyId = 0;
  1070. NextClassifyId = list[index + 1].data.ClassifyId;
  1071. } else if (index === list.length - 1) {
  1072. //如果在最后一个
  1073. PrevClassifyId = list[index - 1].data.ClassifyId;
  1074. NextClassifyId = 0;
  1075. } else {
  1076. PrevClassifyId = list[index - 1].data.ClassifyId;
  1077. NextClassifyId = list[index + 1].data.ClassifyId;
  1078. }
  1079. //跨目录移动,默认在第一个
  1080. } else if (drag.level === 2 && type === "inner") {
  1081. ParentId = drop.data.ClassifyId;
  1082. PrevClassifyId = 0;
  1083. NextClassifyId =
  1084. drop.data.Children.length > 1 ? drop.data.Children[0].ClassifyId : 0;
  1085. }
  1086. //console.log('移动目录')
  1087. /* console.log('ClassifyId',ClassifyId,'ParentId',ParentId)
  1088. console.log('PrevClassifyId',PrevClassifyId,'NextClassifyId',NextClassifyId) */
  1089. baiinfoInterface
  1090. .moveCatalog({
  1091. ClassifyId,
  1092. ParentId,
  1093. PrevClassifyId,
  1094. NextClassifyId,
  1095. })
  1096. .then((res) => {
  1097. if (res.Ret !== 200) return;
  1098. this.$message.success("移动成功!");
  1099. this.getClassify();
  1100. });
  1101. },
  1102. //移动指标
  1103. moveSMMTarge(drag, drop, type, event) {
  1104. let PrevBaseFromBaiinfoIndexId = 0,
  1105. NextBaseFromBaiinfoIndexId = 0,
  1106. ClassifyId = 0,
  1107. BaseFromBaiinfoIndexId = 0;
  1108. BaseFromBaiinfoIndexId = drag.data.BaseFromBaiinfoIndexId;
  1109. const list = drop.parent.childNodes;
  1110. ClassifyId = drop.data.ClassifyId;
  1111. if (type === "inner") {
  1112. PrevBaseFromBaiinfoIndexId = 0;
  1113. NextBaseFromBaiinfoIndexId =
  1114. drop.data.Children > 1
  1115. ? drop.data.Children[0].BaseFromBaiinfoIndexId
  1116. : 0;
  1117. } else {
  1118. const index = list.findIndex((item) => {
  1119. return (
  1120. item.data.BaseFromBaiinfoIndexId ===
  1121. drag.data.BaseFromBaiinfoIndexId
  1122. );
  1123. });
  1124. if (index === 0) {
  1125. PrevBaseFromBaiinfoIndexId = 0;
  1126. NextBaseFromBaiinfoIndexId =
  1127. list[index + 1].data.BaseFromBaiinfoIndexId;
  1128. } else if (index === list.length - 1) {
  1129. PrevBaseFromBaiinfoIndexId =
  1130. list[index - 1].data.BaseFromBaiinfoIndexId;
  1131. NextBaseFromBaiinfoIndexId = 0;
  1132. } else {
  1133. PrevBaseFromBaiinfoIndexId =
  1134. list[index - 1].data.BaseFromBaiinfoIndexId;
  1135. NextBaseFromBaiinfoIndexId =
  1136. list[index + 1].data.BaseFromBaiinfoIndexId;
  1137. }
  1138. }
  1139. /* console.log('ClassifyId',ClassifyId,'BaseFromBaiinfoIndexId',BaseFromBaiinfoIndexId)
  1140. console.log('PrevBaseFromBaiinfoIndexId',PrevBaseFromBaiinfoIndexId,'NextBaseFromBaiinfoIndexId',NextBaseFromBaiinfoIndexId)
  1141. console.log('移动指标') */
  1142. baiinfoInterface
  1143. .moveSMMtarget({
  1144. ClassifyId,
  1145. BaseFromBaiinfoIndexId,
  1146. PrevBaseFromBaiinfoIndexId,
  1147. NextBaseFromBaiinfoIndexId,
  1148. })
  1149. .then((res) => {
  1150. if (res.Ret !== 200) return;
  1151. this.$message.success("移动成功!");
  1152. this.getClassify();
  1153. });
  1154. },
  1155. },
  1156. computed: {
  1157. exportSmmapi() {
  1158. // smm数据导出接口
  1159. let urlStr = this.exportBase;
  1160. // token
  1161. urlStr += `?${localStorage.getItem("auth") || ""}`;
  1162. if (this.isShowSingleData) {
  1163. // 指标id
  1164. urlStr += `&IndexCode=${
  1165. this.isShowSingleData ? this.singleDataCode : ""
  1166. }`;
  1167. // 指标名称参数
  1168. urlStr += `&IndexName=${this.select_quota}`;
  1169. /* // 指标id
  1170. urlStr+=`&IndexCode=${this.leftSearchTradeCode}` */
  1171. // 分类名称
  1172. urlStr += `&TypeName=${this.select_breed}`;
  1173. // 频度
  1174. urlStr += `&Frequency=${this.select_frequency}`;
  1175. // 单位
  1176. urlStr += `&UnitName=${this.select_Unit}`;
  1177. // 修改时间
  1178. urlStr += `&ModifyTime=${this.select_ModifyTime}`;
  1179. } else {
  1180. // 目录id
  1181. urlStr += `&ClassifyId=${
  1182. this.isShowSingleData ? "" : this.select_classify
  1183. }`;
  1184. }
  1185. return this.escapeStr(urlStr);
  1186. },
  1187. },
  1188. created() {},
  1189. mounted() {
  1190. this.getClassify();
  1191. },
  1192. };
  1193. </script>
  1194. <style lang="scss">
  1195. @import "../css/customtree.scss";
  1196. @import "../css/baseTargetPage.scss";
  1197. .smmTarget-dialog-cont {
  1198. .el-cascader {
  1199. .el-input {
  1200. width: 100% !important;
  1201. }
  1202. }
  1203. }
  1204. </style>
  1205. <style lang="scss" scoped>
  1206. .smmTarget-container {
  1207. display: flex;
  1208. * {
  1209. box-sizing: border-box;
  1210. }
  1211. .minHeight {
  1212. height: calc(100vh - 120px);
  1213. background-color: #fff;
  1214. box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
  1215. border-radius: 4px;
  1216. }
  1217. div::-webkit-scrollbar {
  1218. width: 5px !important;
  1219. }
  1220. .left-cont {
  1221. min-width: 300px;
  1222. width: 300px;
  1223. margin-right: 20px;
  1224. padding: 30px 0;
  1225. overflow: hidden;
  1226. position: relative;
  1227. .left-top {
  1228. padding: 0 20px;
  1229. }
  1230. .scroll-wrap {
  1231. padding: 0 10px;
  1232. height: calc(100vh - 280px);
  1233. overflow-y: auto;
  1234. .target_tree {
  1235. color: #333;
  1236. .label-input .el-input__inner {
  1237. height: 25px;
  1238. line-height: 25px;
  1239. }
  1240. .custom-tree-node {
  1241. display: flex !important;
  1242. justify-content: space-between;
  1243. align-items: center;
  1244. display: block;
  1245. flex: 1;
  1246. .node_label {
  1247. margin-right: 2px;
  1248. }
  1249. .el-icon-view {
  1250. color: #409eff;
  1251. font-size: 18px;
  1252. margin-left: 5px;
  1253. }
  1254. }
  1255. }
  1256. .add-cont {
  1257. margin: 50px 0 20px;
  1258. display: flex;
  1259. align-items: center;
  1260. justify-content: center;
  1261. color: #409eff;
  1262. font-size: 16px;
  1263. cursor: pointer;
  1264. }
  1265. }
  1266. .move-btn {
  1267. height: 100%;
  1268. width: 4px;
  1269. position: absolute;
  1270. right: 0px;
  1271. top: 0;
  1272. &:hover {
  1273. cursor: col-resize;
  1274. }
  1275. }
  1276. .classify-list {
  1277. padding: 0 20px;
  1278. /* margin-top: 20px; */
  1279. height: calc(100vh - 280px);
  1280. overflow-y: auto;
  1281. .classify-item {
  1282. font-size: 14px;
  1283. color: #666;
  1284. margin-bottom: 20px;
  1285. &:hover {
  1286. cursor: pointer;
  1287. color: #409eff;
  1288. }
  1289. &.act {
  1290. color: #409eff;
  1291. }
  1292. }
  1293. }
  1294. }
  1295. .right-cont {
  1296. padding: 30px;
  1297. .right-box {
  1298. max-width: 100%;
  1299. max-height: calc(100vh - 240px);
  1300. border-left: 1px solid #dcdfe6;
  1301. border-right: 1px solid #dcdfe6;
  1302. overflow: auto;
  1303. .data-header {
  1304. width: 100%;
  1305. position: sticky;
  1306. top: 0;
  1307. z-index: 2;
  1308. }
  1309. .data-cont {
  1310. height: calc(100vh - 444px);
  1311. }
  1312. .nodata {
  1313. height: calc(100vh - 460px);
  1314. border: 1px solid #dcdfe6;
  1315. font-size: 16px;
  1316. color: #999;
  1317. }
  1318. }
  1319. .frequency-list {
  1320. margin-top: 20px;
  1321. display: flex;
  1322. flex-wrap: wrap;
  1323. .frequency-btn {
  1324. width: 112px;
  1325. }
  1326. }
  1327. .nodata-cont {
  1328. width: 150px !important;
  1329. text-align: center;
  1330. color: #666;
  1331. font-size: 16px;
  1332. margin: 0 auto;
  1333. }
  1334. }
  1335. }
  1336. .dialog-cont {
  1337. padding-left: 50px;
  1338. }
  1339. .dia-bot {
  1340. display: flex;
  1341. justify-content: center;
  1342. }
  1343. </style>