customSheetEdit.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. <template>
  2. <div class="customSheet-wrap">
  3. <div class="wrap-top">
  4. <ul class="form-ul">
  5. <li>
  6. <selectTarget
  7. ref="selectRef"
  8. @select="handleSelectTarget"
  9. :selectStyleType="2"
  10. />
  11. </li>
  12. <li>
  13. 表格名称
  14. <el-input
  15. v-model="sheetForm.name"
  16. placeholder="请输入表格名称"
  17. style="width:200px"
  18. clearable>
  19. </el-input>
  20. </li>
  21. <li>
  22. 表格分类
  23. <el-select
  24. v-model="sheetForm.classify"
  25. placeholder="请选择表格分类"
  26. clearable
  27. >
  28. <el-option
  29. v-for="item in classifyArr"
  30. :key="item.ExcelClassifyId"
  31. :label="item.ExcelClassifyName"
  32. :value="item.ExcelClassifyId"
  33. />
  34. </el-select>
  35. </li>
  36. <li>
  37. 表格类型
  38. <el-select
  39. v-model="sheetForm.sheetType"
  40. style="width:150px;"
  41. >
  42. <el-option
  43. v-for="item in sheetTypeOption"
  44. :key="item.key"
  45. :label="item.label"
  46. :value="item.key"
  47. />
  48. </el-select>
  49. </li>
  50. <li>
  51. 表格说明
  52. <el-tooltip
  53. effect="dark"
  54. >
  55. <div
  56. slot="content"
  57. v-html="rules"
  58. style="line-height: 20px;width:350px"
  59. ></div>
  60. <i class="el-icon-question" />
  61. </el-tooltip>
  62. </li>
  63. <li v-if="saveTime" style="color:#999999 ;">
  64. 最近保存时间:{{ saveTime }}
  65. </li>
  66. </ul>
  67. <div>
  68. <el-button type="primary" size="medium" @click="saveSheetHandle">保存</el-button>
  69. <el-button type="primary" size="medium" plain @click="backHandle">返回</el-button>
  70. </div>
  71. </div>
  72. <CustomTable
  73. :sheetType="sheetForm.sheetType"
  74. ref="customTableRef"
  75. @autoSave="autoSaveFun"
  76. />
  77. </div>
  78. </template>
  79. <script>
  80. import * as sheetInterface from '@/api/modules/sheetApi.js';
  81. import { dataBaseInterface } from 'api/api.js';
  82. import selectTarget from '@/views/chartRelevance_manage/components/selectTarget.vue';
  83. import CustomTable from './components/CustomTable.vue'
  84. import html2canvas from 'html2canvas';
  85. export default {
  86. components: { selectTarget,CustomTable },
  87. beforeRouteEnter(to, from, next) {
  88. if(to.query.id){
  89. to.matched[1].name=`编辑表格`
  90. }else{
  91. to.matched[1].name='添加表格'
  92. }
  93. next()
  94. },
  95. watch:{
  96. sheetForm:{
  97. handler(newVal){
  98. console.log(newVal,'newVal','newVal');
  99. if(this.sheetInit && this.sheetId) this.autoSaveFun()
  100. },
  101. deep:true
  102. }
  103. },
  104. beforeRouteLeave(to,from,next){
  105. if(to.path!='/addMixedSheet'){
  106. this.markFinishStatus()
  107. }
  108. next()
  109. },
  110. data() {
  111. return {
  112. sheetId: this.$route.query.id || '',
  113. classifyArr: [],
  114. rules: `表格说明:<br>
  115. 从ETA指标库和ETA预测指标库向表格添加指标,以第一个添加指标的日期序列为准,默认取最新12个值的日期,其他指标匹配日期,若某日期无值,则通过线性插值法【(Y-Y1)/(X-X1)=(Y2-Y1)/(X2-X1)】计算填入,区分颜色表示,日期默认降序,可切换排序,指标更新时,日期和数据值自动更新;`,
  116. sheetForm: {
  117. sheetType: 1
  118. },
  119. sheetTypeOption: [
  120. { key: 1,label: '指标列+日期行' },
  121. { key: 2,label: '指标行+日期列' },
  122. ],
  123. saveTime:"",
  124. sheetInit:false,
  125. isCanEdit:false
  126. }
  127. },
  128. methods: {
  129. backHandle() {
  130. this.$router.back()
  131. },
  132. /* 获取表格详情 */
  133. async getDetail() {
  134. if(!this.sheetId) return
  135. const res = await sheetInterface.sheetDetail({
  136. ExcelInfoId: Number(this.sheetId)
  137. })
  138. if(res.Ret !== 200) return
  139. this.isCanEdit = res.Data.CanEdit
  140. if(!res.Data.CanEdit){
  141. this.$message.warning(`${res.Data.Editor}正在编辑中`)
  142. setTimeout(()=>{
  143. this.backHandle()
  144. },1000)
  145. return
  146. }
  147. const { ExcelName,ExcelClassifyId,ExcelType,TableData,ModifyTime} = res.Data;
  148. this.sheetForm = {
  149. name: ExcelName,
  150. classify: ExcelClassifyId,
  151. sheetType: ExcelType
  152. }
  153. this.saveTime = this.$moment(ModifyTime).format('YYYY-MM-DD HH:mm:ss')
  154. this.$nextTick(()=>{
  155. this.sheetInit=true
  156. })
  157. this.$refs.customTableRef.initSheetData(TableData);
  158. },
  159. /* 选择指标push指标数组 */
  160. async handleSelectTarget(e) {
  161. if(!e) return
  162. const { EdbName,EdbInfoId,Unit,Frequency } = e;
  163. if(this.$refs.customTableRef.config.data.find(_ => _.EdbInfoId===EdbInfoId)) return this.$message.warning('指标已存在')
  164. const {Data} = this.$refs.customTableRef.config.data.length
  165. ? await sheetInterface.getEdbInsertDataOther({
  166. EdbInfoId: EdbInfoId,
  167. DateList: this.$refs.customTableRef.dateArr,
  168. SortType: this.$refs.customTableRef.config.order===1 ? 'desc' : 'asc'
  169. })
  170. : await sheetInterface.getEdbInsertDataA({
  171. EdbInfoId: EdbInfoId,
  172. SortType: this.$refs.customTableRef.config.order===1 ? 'desc' : 'asc',
  173. Num: 12
  174. })
  175. this.$refs.customTableRef.updateEdbData({
  176. Data: Data.Data.map(_ => ({..._,DataTimeType: 1,})),
  177. EdbAliasName: '',
  178. EdbName,
  179. Unit,
  180. Frequency,
  181. EdbInfoId,
  182. })
  183. this.$refs.selectRef.search_txt =''
  184. },
  185. /* 获取分类 */
  186. getClassify() {
  187. sheetInterface.excelClassifyOne({Source: 2}).then(res => {
  188. if(res.Ret !==200) return
  189. this.classifyArr = res.Data.AllNodes || [];
  190. })
  191. },
  192. autoSaveFun:_.debounce(async function(){
  193. if(!this.sheetId) return
  194. const { name,classify,sheetType } = this.sheetForm;
  195. if(!name || !classify) return this.$message.warning(name ? '请选择表格分类' : '请输入表格名称')
  196. if(!document.getElementsByClassName('table')[0]) return this.$message.warning('请添加表格')
  197. let params = {
  198. ExcelName: name,
  199. ExcelType: sheetType,
  200. ExcelClassifyId: classify,
  201. ExcelImage:'',
  202. Source: 3,
  203. TableData: this.$refs.customTableRef.getSaveParams()
  204. };
  205. console.log("自动保存");
  206. const res = await sheetInterface.sheetEdit({ ExcelInfoId: Number(this.sheetId),...params })
  207. if(res.Ret !==200) return
  208. this.updateTime = this.$moment().format('YYYY-MM-DD HH:mm:ss')
  209. },1500),
  210. /* 保存表格 */
  211. saveSheetHandle: _.debounce(async function() {
  212. const { name,classify,sheetType } = this.sheetForm;
  213. if(!name || !classify) return this.$message.warning(name ? '请选择表格分类' : '请输入表格名称')
  214. if(!document.getElementsByClassName('table')[0]) return this.$message.warning('请添加表格')
  215. let canvas = await html2canvas(document.getElementsByClassName('table')[0],{
  216. scale:2,
  217. useCORS: true,
  218. backgroundColor:null,
  219. imageTimeout:0,
  220. allowTaint:true,
  221. })
  222. let imagesrc = canvas.toDataURL('image/png');
  223. // console.log(imagesrc)
  224. const formData = new FormData();
  225. formData.append('Image',imagesrc);
  226. const { Data } = await dataBaseInterface.uploadImg(formData)
  227. let params = {
  228. ExcelName: name,
  229. ExcelType: sheetType,
  230. ExcelClassifyId: classify,
  231. ExcelImage: Data.ResourceUrl,
  232. Source: 2,
  233. TableData: this.$refs.customTableRef.getSaveParams()
  234. };
  235. let isAdd = this.sheetId?false:true
  236. const res = this.sheetId
  237. ? await sheetInterface.sheetEdit({ ExcelInfoId: Number(this.sheetId),...params })
  238. : await sheetInterface.sheetAdd(params)
  239. if(res.Ret !==200) return
  240. this.sheetId = this.sheetId || res.Data.ExcelInfoId;
  241. this.$message.success('保存成功')
  242. this.saveTime = this.$moment().format('YYYY-MM-DD HH:mm:ss')
  243. isAdd && this.$router.replace({path:'/addCustomSheet',query:{id:this.sheetId}})
  244. // this.$router.replace({
  245. // path: '/sheetList',
  246. // query: {
  247. // code: UniqueCode,
  248. // id: ExcelInfoId
  249. // }
  250. // })
  251. },300),
  252. markFinishStatus(){
  253. if((!this.sheetId) || (!this.isCanEdit)) return
  254. sheetInterface.markSheetEditStatus({ExcelInfoId: +this.sheetId,Status:2}).then(res=>{
  255. if(res.Ret != 200) return
  256. })
  257. }
  258. },
  259. created() {
  260. this.getClassify();
  261. this.getDetail();
  262. },
  263. mounted(){
  264. window.addEventListener('beforeunload',this.markFinishStatus)
  265. },
  266. beforeDestroy(){
  267. window.removeEventListener('beforeunload',this.markFinishStatus)
  268. }
  269. }
  270. </script>
  271. <style scoped lang="scss">
  272. *{ box-sizing: border-box; }
  273. .customSheet-wrap {
  274. min-height: calc(100vh - 120px);
  275. .wrap-top {
  276. display: flex;
  277. justify-content: space-between;
  278. align-items: center;
  279. margin-bottom: 20px;
  280. padding: 20px;
  281. background: #fff;
  282. border: 1px solid #ececec;
  283. border-radius: 4px;
  284. box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
  285. display: flex;
  286. z-index: 1;
  287. .form-ul {
  288. flex: 1;
  289. display: flex;
  290. align-items: center;
  291. li {
  292. margin: 0 10px;
  293. padding-top: 40px;
  294. &:first-child {
  295. padding-top: 0;
  296. }
  297. }
  298. }
  299. }
  300. }
  301. </style>