123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643 |
- <template>
- <div class="sandList-container">
- <div class="main-top">
- <el-button type="primary" @click="addSand">添加沙盘</el-button>
- <div>
- <el-input
- v-model="search_txt"
- style="width: 250px; margin-right: 20px"
- placeholder="沙盘名称"
- >
- <i slot="prefix" class="el-input__icon el-icon-search"></i>
- </el-input>
- <el-cascader
- :options="classifyArr"
- :props="classifyProps"
- v-model="classify"
- clearable
- placeholder="品种筛选"
- />
- </div>
- </div>
- <div class="main-bottom">
- <el-table
- :data="tableData"
- style="box-shadow: 0px 3px 6px rgba(155, 170, 219, 0.2)"
- :key="tableKey"
- row-key="VersionCode"
- :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
- :load="loadChildList"
- @sort-change="sortChangeHandle"
- element-loading-text="加载中..."
- v-loading="tableLoading"
- lazy
- border
- max-height="600"
- ref="table"
- >
- <el-table-column
- v-for="item in tableColums"
- :key="item.label"
- :label="item.label"
- :prop="item.key"
- :width="item.widthsty"
- :min-width="item.minwidthsty"
- :sortable="item.sortable"
- align="center"
- >
- <!-- :sortable="item.sortable?'custom':false" -->
- <template slot-scope="scope">
- <span>{{ scope.row[item.key] }}</span>
- <el-button
- size="mini"
- type="text"
- v-if="scope.row.key === 'more' && item.key === 'CurrVersion'"
- @click.native="openHistorySand(scope.row)"
- >更多</el-button
- >
- </template>
- </el-table-column>
- <el-table-column width="260" align="center" label="操作">
- <template slot-scope="scope">
- <template v-if="scope.row.key !== 'more'">
- <el-button
- type="text"
- @click="handleSand(scope.row, 'edit')"
- v-if="scope.row.CanEdit"
- >编辑</el-button
- >
- <el-button
- type="text"
- @click="handleSand(scope.row, 'edit')"
- v-if="!scope.row.CanEdit"
- >{{scope.row.Editor||''}}编辑中...</el-button
- >
- <el-button
- type="text"
- style="color: #f00"
- @click="handleSand(scope.row, 'del')"
- >删除</el-button
- >
- <el-button
- type="text"
- @click="handleSand(scope.row, 'view')"
- >查看</el-button
- >
- <el-button type="text" @click="copyImg(scope.row)"
- >复制图片</el-button
- >
- </template>
- </template>
- </el-table-column>
- <div slot="empty" style="padding: 50px 0 50px">
- <tableNoData text="暂无数据" size="mini"/>
- </div>
- </el-table>
- </div>
- <!-- 历史版本弹窗 -->
- <m-dialog
- :show.sync="openHistoryDia"
- width="700px"
- title="历史版本"
- @close="closeDialog"
- >
- <div class="history-version-wrapper">
- <el-table
- :data="historyList"
- style="box-shadow: 0px 3px 6px rgba(155, 170, 219, 0.2)"
- border
- >
- <el-table-column
- v-for="item in hitoryColums"
- :key="item.label"
- :label="item.label"
- :width="item.widthsty"
- :min-width="item.minwidthsty"
- align="center"
- >
- <template slot-scope="scope">
- <span>{{ scope.row[item.key] }}</span>
- </template>
- </el-table-column>
- <el-table-column align="center" label="操作">
- <template slot-scope="scope">
- <el-button type="text" @click="editChildSand(scope.row)" v-if="scope.row.CanEdit">编辑</el-button>
- <!-- <el-button type="text" @click="handleSand(scope.row, 'editing')" v-else>{{scope.row.Editor||''}}编辑中...</el-button> -->
- <el-button type="text" @click="editChildSand(scope.row)" v-else>{{scope.row.Editor||''}}编辑中...</el-button>
- <el-button type="text" style="color: #f00" @click="removeChildSand(scope.row)">删除</el-button>
- <el-button type="text" @click="handleSand(scope.row, 'view')">查看</el-button>
- <el-button type="text" @click="copyImg(scope.row)">复制图片</el-button>
- </template>
- </el-table-column>
- <div slot="empty" style="padding: 50px 0 50px">
- <tableNoData text="暂无数据" size="mini"/>
- </div>
- </el-table>
- <el-row style="margin-top: 30px">
- <m-page
- :page_no="history_page"
- :pageSize="history_pageSize"
- :total="history_total"
- @handleCurrentChange="hitoryPageChange"
- />
- </el-row>
- </div>
- </m-dialog>
- </div>
- </template>
- <script>
- import { sandInterface, customInterence } from '@/api/api.js';
- import mPage from '@/components/mPage';
- import mDialog from '@/components/mDialog';
- import { copyBlob } from '@/utils/svgToblob'
- export default {
- name: '',
- components: { mPage, mDialog },
- data() {
- return {
- search_txt: '',
- classify: [],
- classifyProps: {
- children: 'Items',
- label: 'ClassifyName',
- value: 'ChartPermissionId',
- },
- classifyArr: [],
- tableLoading: false,
- lockLoding:null,
- tableData: [],
- tableColums: [
- {
- label: '沙盘名称',
- key: 'Name',
- minwidthsty: '100px',
- },
- {
- label: '品种',
- key: 'ChartPermissionName',
- },
- {
- label: '版本',
- key: 'CurrVersion',
- widthsty: '100px',
- },
- {
- label: '更新时间',
- key: 'ModifyTime',
- minwidthsty: '120px',
- /* sortable:true */
- },
- {
- label: '更新人',
- key: 'OpUserName',
- widthsty: '120px',
- },
- ],
- page_no: 1,
- pageSize: 100,
- total: 0,
- openHistoryDia: false, //历史沙盘弹窗
- historyList: [],
- hitoryColums: [
- {
- label: '版本',
- key: 'CurrVersion',
- widthsty: '100px',
- },
- {
- label: '更新时间',
- key: 'ModifyTime',
- minwidthsty: '100px',
- },
- {
- label: '更新人',
- key: 'OpUserName',
- widthsty: '100px',
- },
- ], //历史表格数据列
- open_sandid: '', //打开的沙盘id
- history_page: 1,
- history_pageSize: 10,
- history_total: 0,
- tableBody:null,//表单body的dom,用于监听滚动事件
- tableKey: 0,//数据更新了 表格不更新的问题
- };
- },
- watch: {
- search_txt() {
- this.page_no = 1;
- this.getTableData();
- },
- classify() {
- this.page_no = 1;
- this.getTableData();
- },
- },
- methods: {
- /* 获取表格数据 */
- getTableData: _.debounce(function () {
- this.tableLoading = true;
- sandInterface
- .sandlist({
- PageSize: this.pageSize,
- CurrentIndex: this.page_no,
- Keyword: this.search_txt,
- ChartPermissionId: this.classify.length ? this.classify[1] : 0,
- })
- .then((res) => {
- if (res.Ret !== 200) return;
- const {Data} = res
- const {List,Paging} = Data
- const resData = List.length?res.Data.List.map((item) => ({
- hasChildren: item.VersionTotal > 1,
- ...item,
- ModifyTime: this.$moment(item.ModifyTime).format(
- 'YYYY-MM-DD HH:mm:ss'
- ),
- }))
- : [];
- this.tableData = this.page_no===1 ? resData : this.tableData.concat(resData);
- this.total = Paging.Totals;
- this.tableLoading = false;
- this.isLastPage = Paging.IsEnd
- this.tableKey ++;
- });
- }, 300),
- loadChildList(node, prop, resolve) {
- const { SandboxId,CanEdit } = node;
- sandInterface.childList({ SandboxId }).then((res) => {
- if (res.Ret !== 200) return;
- let arr = res.Data.List.length
- ? res.Data.List.map((item) => ({
- ...item,
- hide_name : item.Name,
- Name: '',
- ChartPermissionName: '',
- isChildList: true,
- ModifyTime: this.$moment(item.ModifyTime).format(
- 'YYYY-MM-DD HH:mm:ss'
- ),
- CanEdit
- }))
- : [];
- res.Data.Paging.Totals > 3
- ? resolve([
- ...arr,
- {
- key: 'more',
- VersionCode: new Date().getTime(),
- SandboxId: res.Data.List[0].SandboxId,
- },
- ])
- : resolve(arr);
- });
- },
- /* 获取品种 */
- getClassify() {
- customInterence
- .getvariety({
- CompanyType: 'ficc',
- })
- .then((res) => {
- if (res.Ret !== 200) return;
- this.classifyArr = res.Data.List;
- });
- },
- /* 添加沙盘 */
- addSand() {
- const { href } = this.$router.resolve({ path: '/sandflow' });
- window.open(href, '_blank');
- },
- goDetail(SandboxId, VersionCode, type) {
- const { href } = this.$router.resolve({
- path: '/sandflow',
- query: {
- id: VersionCode,
- type,
- },
- });
- window.open(href, '_blank');
- },
- /* 编辑 删除沙盘 */
- handleSand(item, type) {
- const { SandboxId, VersionCode } = item;
- if (type === 'edit') {
- // 编辑前校验
- sandInterface
- .mark({
- SandboxId,
- Status: 1,
- })
- .then((res) => {
- // if (res.Ret !== 200) return;
- if(res.Ret===200){
- if(res.Data.Status==1){
- this.$message.warning(res.Data.Msg || '沙盘图正在编辑,不可重复编辑')
- item.CanEdit=false;
- item.Editor=res.Data.Editor || ''
- return
- }else if(res.Data.Status==0){
- if(!item.CanEdit){
- this.getTableData();
- }
- // item.CanEdit=true;
- // item.Editor=res.Data.Editor || ''
- }
- }else{
- this.$message.error(res.ErrMsg || '未知错误,请稍后重试')
- return
- }
- this.goDetail(SandboxId, VersionCode, type);
- });
- }
- type === 'view' && this.goDetail(SandboxId, VersionCode, type);
- // type === 'editing' && this.$message.warning('沙盘图正在编辑,不可重复编辑');
- type === 'del' && this.delHandle(item)
-
- },
- /* 弹窗内的删除 */
- removeChildSand({VersionCode,Name,CurrVersion}) {
- this.$confirm(`<p>确定删除【<span style="color:#409EFF">${Name}</span>】沙盘图<span style="color:#409EFF">版本${CurrVersion}</span>?<p>`, '提示', {
- type: 'warning',
- dangerouslyUseHTMLString: true
- }).then(() => {
- sandInterface.sandDelVersion({ SandboxVersionCode:VersionCode }).then((res) => {
- if (res.Ret !== 200) return;
- this.$message.success('删除成功');
- this.historyList.splice(this.historyList.findIndex(_ => _.VersionCode === VersionCode),1)
- this.page_no = 1;
- this.getTableData();
- });
- }).catch(()=>{})
- },
- editChildSand(item) {
- ({SandboxId,VersionCode,type} = item)
- // 编辑前校验
- sandInterface
- .mark({
- SandboxId,
- Status: 1,
- })
- .then((res) => {
- // if (res.Ret !== 200) return;
- if(res.Ret===200){
- if(res.Data.Status==1){
- this.$message.warning(res.Data.Msg || '沙盘图正在编辑,不可重复编辑')
- item.CanEdit=false;
- item.Editor=res.Data.Editor || ''
- return
- }else if(res.Data.Status==0){
- if(!item.CanEdit){
- this.getTableData();
- }
- // item.CanEdit=true;
- // item.Editor=res.Data.Editor || ''
- }
- }else{
- this.$message.error(res.ErrMsg || '未知错误,请稍后重试')
- return
- }
- this.goDetail(SandboxId, VersionCode, type);
- });
- },
- /* 删除图 */
- delHandle(item) {
- const { SandboxId, VersionCode,isChildList,CurrVersion,hide_name } = item;
- isChildList
- ? this.$confirm(`<p>确定删除【<span style="color:#409EFF">${hide_name}</span>】沙盘图<span style="color:#409EFF">版本${CurrVersion}</span>?<p>`, '提示', {
- type: 'warning',
- dangerouslyUseHTMLString: true
- }).then(() => {
- sandInterface.sandDelVersion({ SandboxVersionCode:VersionCode }).then((res) => {
- if (res.Ret !== 200) return;
- this.$message.success('删除成功');
- this.page_no = 1;
- this.getTableData();
- });
- }).catch(()=>{})
- : this.$confirm('确定删除该沙盘图(包括所有历史版本)?', '提示', {
- type: 'warning',
- }).then(() => {
- sandInterface.sanDelete({ SandboxId }).then((res) => {
- if (res.Ret !== 200) return;
- this.$message.success('删除成功');
- this.page_no = 1;
- this.getTableData();
- });
- }).catch(()=>{});
- },
- /* 历史沙盘版本表格 */
- getHistoryTable(SandboxId) {
- sandInterface
- .verisonlist({
- PageSize: this.history_pageSize,
- CurrentIndex: this.history_page,
- SandboxId,
- })
- .then((res) => {
- if (res.Ret !== 200) return;
- this.historyList =
- res.Data.List &&
- res.Data.List.map((item) => ({
- ...item,
- ModifyTime: this.$moment(item.ModifyTime).format(
- 'YYYY-MM-DD HH:mm:ss'
- ),
- })) ||
- [];
- this.history_total = res.Data.Paging.Totals;
- });
- },
- /* 查看历史沙盘 */
- openHistorySand({ SandboxId }) {
- this.open_sandid = SandboxId;
- this.getHistoryTable(SandboxId);
- this.openHistoryDia = true;
- },
- /* 关闭弹窗 */
- closeDialog() {
- this.openHistoryDia = false;
- this.history_page = 1;
- },
- /* 复制图片 */
- copyImg: _.debounce(function ({ PicUrl }) {
- /* const copyImg = document.createElement('img');
- $('.sandList-container')[0].appendChild(copyImg);
- copyImg.src = PicUrl;
- this.getSelect(copyImg);
- setTimeout(() => {
- document.execCommand('copy');
- $('.sandList-container')[0].removeChild(copyImg);
- this.$message.success('复制成功');
- }); */
- this.lockLoding = this.$loading({
- lock: true,
- text: '复制图片中...',
- target: '.main-bottom',
- spinner: 'el-icon-loading',
- background: 'rgba(255, 255, 255, 0.8)'
- });
- const canvas = document.createElement("canvas");
- const ctx = canvas.getContext("2d");
- const img = new Image();
- img.crossOrigin = "Anonymous";
- img.src = PicUrl;
- img.onload = ()=>{
- canvas.width = img.width;
- canvas.height = img.height;
- ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
- ctx.fillStyle="#fff";
- ctx.fillRect(0, 0, img.width, img.height);
- ctx.drawImage(img, 0, 0);
- canvas.toBlob(async (blob) => {
- const data = [new ClipboardItem({ [blob.type]: blob })];
- await navigator.clipboard.write(data).then(
- () => {
- this.$message.success('复制成功!')
- },
- () => {
- this.$message.success('复制失败,稍后再试')
- }
- ).finally(()=>{
- this.lockLoding && this.lockLoding.close();
- });
- });
- }
- }, 500),
- /* 排序 */
- sortChangeHandle(sortInfo){
- const sortColumn = ['更新时间']
- const {column,order} = sortInfo
- if(!sortColumn.includes(column.label)) return
- //重新请求排序
- console.log(sortInfo)
- },
- /* 滚动条事件 */
- handleScroll:_.throttle(function(){
- const {scrollTop,clientHeight,scrollHeight} = this.tableBody
- if(scrollTop + clientHeight >= scrollHeight-10 && !this.isLastPage&&this.total!==this.tableData.length){
- this.page_no++;
- this.getTableData();
- }
- },300),
- // 选择
- getSelect(targetNode) {
- if (window.getSelection) {
- //chrome等主流浏览器
- var selection = window.getSelection();
- var range = document.createRange();
- range.selectNode(targetNode);
- selection.removeAllRanges();
- selection.addRange(range);
- } else if (document.body.createTextRange) {
- //ie
- var range = document.body.createTextRange();
- range.moveToElementText(targetNode);
- range.select();
- }
- },
- /* 页码改变 */
- handleCurrentChange(page) {
- this.page_no = page;
- this.getTableData();
- },
- hitoryPageChange(page) {
- this.history_page = page;
- this.getHistoryTable(this.open_sandid);
- },
- },
- mounted() {
- this.getTableData();
- this.getClassify();
- this.tableBody = this.$refs.table.bodyWrapper
- this.tableBody.addEventListener('scroll',this.handleScroll)
- },
- beforeDestroy(){
- this.tableBody.removeEventListener('scroll',this.handleScroll)
- }
- };
- </script>
- <style lang="scss">
- .sandList-container {
- .main-top {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 28px;
- padding: 20px 30px;
- background: #fff;
- border: 1px solid #ececec;
- border-radius: 4px;
- box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
- }
- .main-bottom {
- padding: 20px 30px;
- background: #fff;
- border: 1px solid #ececec;
- border-radius: 4px;
- box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
- .el-table {
- height:600px;
- .el-table__row--level-1 {
- td {
- border-right: none;
- }
- }
- .el-table__expand-icon {
- position: absolute;
- left: 5px;
- .el-icon-arrow-right {
- font-size: 14px;
- }
- }
-
- th.gutter{
- background-color:#F0F2F5 !important;
- }
- ::-webkit-scrollbar{
- background-color: transparent;
- &-track{
- background-color:#f5f5f5;
- }
- }
- }
- }
- .history-version-wrapper {
- padding: 0 20px;
- }
- }
- </style>
|