dataEdit.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. <template>
  2. <div class="edit-data-page">
  3. <div class="wrap-top">
  4. <div class="left-handle">
  5. <el-form
  6. ref="form"
  7. label-position="right"
  8. inline
  9. label-width="120px"
  10. :model="formData"
  11. :rules="formRules"
  12. >
  13. <el-form-item :label="$t('Edb.Detail.e_name')" prop="targetName">
  14. <el-input
  15. v-model="formData.targetName"
  16. style="width: 150px"
  17. :placeholder="$t('Edb.InputHolderAll.input_name')"
  18. />
  19. </el-form-item>
  20. <el-form-item :label="$t('ManualEntryPage.label_vaiety')" prop="menu">
  21. <el-cascader
  22. v-model="formData.menu"
  23. :options="classifyOptions"
  24. :props="{
  25. label: 'ClassifyName',
  26. value: 'ClassifyId',
  27. children: 'Child',
  28. emitPath: false,
  29. }"
  30. clearable
  31. :placeholder="$t('Edb.InputHolderAll.input_menu')"
  32. />
  33. </el-form-item>
  34. <el-form-item :label="$t('Edb.Detail.e_fre')" prop="frequency">
  35. <el-select
  36. v-model="formData.frequency"
  37. :placeholder="$t('Edb.InputHolderAll.input_fre')"
  38. style="width: 120px"
  39. clearable
  40. >
  41. <el-option
  42. v-for="item in frequencyArr"
  43. :key="item.label"
  44. :label="item.label"
  45. :value="item.value"
  46. >
  47. </el-option>
  48. </el-select>
  49. </el-form-item>
  50. <el-form-item :label="$t('Edb.Detail.e_unit')" prop="unit">
  51. <selectUnit
  52. v-model="formData.unit"
  53. style="width: 120px"
  54. />
  55. </el-form-item>
  56. </el-form>
  57. </div>
  58. <div class="right-handle">
  59. <div>
  60. <el-button type="primary" size="medium" @click="handleSaveEdb"><!-- 保存 -->{{$t('Dialog.confirm_save_btn')}}</el-button>
  61. <el-button type="primary" size="medium" plain @click="$router.go(-1)"><!-- 取消 -->{{$t('Dialog.back_btn')}}</el-button>
  62. </div>
  63. </div>
  64. </div>
  65. <div class="main">
  66. <div id="excel-container"></div>
  67. </div>
  68. </div>
  69. </template>
  70. <script>
  71. import { dataInterence } from '@/api/api.js';
  72. import { formRules } from '../databaseComponents/util';
  73. import { unitArr,frequencySelectList } from '@/utils/defaultOptions';
  74. import { mapState } from 'vuex';
  75. export default {
  76. data() {
  77. return {
  78. edb_id: this.$route.query.edbid,
  79. formData: {
  80. targetName: '',
  81. menu: '',
  82. frequency: '',
  83. unit: ''
  84. },
  85. formRules,
  86. unitArr,
  87. /* frequencyArr, */
  88. classifyOptions: [],
  89. edbInfo: {},
  90. excelData: [
  91. {
  92. r:0,
  93. c:0,
  94. v:{
  95. m: this.$t('Edb.Detail.e_date'),
  96. v: this.$t('Edb.Detail.e_date'),
  97. bg:'#bbb'
  98. },
  99. },
  100. {
  101. r:0,
  102. c:1,
  103. v:{
  104. m:this.$t('Edb.Detail.e_value'),
  105. v:this.$t('Edb.Detail.e_value'),
  106. bg:'#bbb'
  107. },
  108. },
  109. ],
  110. }
  111. },
  112. computed: {
  113. excelOptions() {
  114. return {
  115. container: 'excel-container',
  116. lang: this.$i18nt.locale, // 设定表格语言
  117. showinfobar: false,//顶部info
  118. showsheetbar:false,//底部sheet页 暂禁止添加多个表格
  119. showtoolbarConfig:{
  120. image: false,//图片
  121. print: false,//打印
  122. chart: false, // '图表'
  123. postil: false, //'批注'
  124. pivotTable: false, //'数据透视表'
  125. function: false, // '公式'
  126. frozenMode: false, // '冻结方式'
  127. sortAndFilter: false, // '排序和筛选'
  128. conditionalFormat: false, // '条件格式'
  129. dataVerification: false, // '数据验证'
  130. splitColumn: false, // '分列'
  131. screenshot: false, // '截图'
  132. findAndReplace: false, // '查找替换'
  133. },
  134. cellRightClickConfig: {
  135. insertColumn: false,
  136. matrix: false,
  137. chart: false, // 图表生成
  138. image: false, // 插入图片
  139. link: false, // 插入链接
  140. copyAs: false,
  141. },
  142. data: [{
  143. column: 2,
  144. scrollTop: 0,
  145. scrollLeft: 0,
  146. defaultColWidth: 200,
  147. defaultRowHeight: 20,
  148. frozen: [
  149. {
  150. type: 'row'
  151. }
  152. ],
  153. celldata: this.excelData,
  154. }],
  155. hook:{
  156. cellUpdateBefore(r,c,value){
  157. // 禁止更新第一行
  158. if(r===0) return false
  159. },
  160. cellMousedownBefore(e,{r,c}){
  161. if(r===0) return false
  162. },
  163. },
  164. }
  165. },
  166. ...mapState({
  167. currentLang: state => state.lang,
  168. }),
  169. frequencyArr(){
  170. return frequencySelectList(['半年度'])
  171. }
  172. },
  173. mounted() {
  174. this.getClassify();
  175. if(this.$route.query.id) {
  176. this.getEdbDetail()
  177. }else {
  178. this.initExcelOptions();
  179. }
  180. },
  181. beforeDestroy() {
  182. luckysheet.destroy();
  183. },
  184. methods: {
  185. async getEdbDetail() {
  186. const res = await dataInterence.getEdbDetailV2({
  187. TradeCode: this.$route.query.id,
  188. })
  189. if (res.Ret!==200) return
  190. this.edbInfo = res.Data;
  191. this.formData = {
  192. targetName: this.edbInfo.Detail.SecName,
  193. menu: this.edbInfo.Detail.ClassifyId,
  194. frequency: this.edbInfo.Detail.Frequency,
  195. unit: this.edbInfo.Detail.Unit
  196. }
  197. this.initData()
  198. },
  199. /* 重置数据 */
  200. initData() {
  201. this.excelData = [
  202. {
  203. r:0,
  204. c:0,
  205. v:{
  206. m:"日期",
  207. v:"日期",
  208. bg:'#bbb'
  209. },
  210. },
  211. {
  212. r:0,
  213. c:1,
  214. v:{
  215. m:"值",
  216. v:"值",
  217. bg:'#bbb'
  218. },
  219. },
  220. ]
  221. this.edbInfo.Detail.DataList&&this.edbInfo.Detail.DataList.forEach((item,index) => {
  222. this.excelData.push({
  223. r: index+1,
  224. c:0,
  225. v:{
  226. m:item.Dt,
  227. v:item.Dt
  228. },
  229. })
  230. this.excelData.push({
  231. r: index+1,
  232. c:1,
  233. v:{
  234. m:item.Close,
  235. v:item.Close
  236. },
  237. })
  238. })
  239. luckysheet.create(this.excelOptions)
  240. },
  241. getClassify() {
  242. dataInterence.getClassify().then(res =>{
  243. if(res.Ret === 200 && res.Data.List) {
  244. this.classifyOptions = res.Data.List||[];
  245. }
  246. })
  247. },
  248. /* 保存 */
  249. async handleSaveEdb() {
  250. let data = luckysheet.getAllSheets()[0]
  251. await this.$refs.form.validate();
  252. if(data.celldata.length < 3) return this.$message.warning(this.$t('AdjustDataPage.input_content_msg'));
  253. const { targetName,menu,frequency,unit} = this.formData;
  254. //处理数据格式
  255. let result_obj = {},DataList=[];
  256. data.celldata.forEach(item => {
  257. if(result_obj[item.r]&&item.c===1) {
  258. result_obj[item.r] = {
  259. Date: result_obj[item.r].v.m,
  260. Value: Number(item.v.m)
  261. }
  262. } else {
  263. result_obj[item.r] = item
  264. }
  265. })
  266. for(let key in result_obj) {
  267. if(result_obj[key].Date && !isNaN(result_obj[key].Value)) DataList.push(result_obj[key]);
  268. }
  269. const { Ret,Data } = await dataInterence.editEdbDataV2({
  270. EdbName: targetName,
  271. Frequency: frequency,
  272. Unit: unit,
  273. ClassifyId: menu,
  274. TradeCode: this.$route.query.id,
  275. Data: DataList
  276. })
  277. if(Ret !== 200) return
  278. // this.$message.success('保存成功')
  279. this.$message.success(this.$t('MsgPrompt.saved_msg'))
  280. this.$router.replace({path:'/dataList'});
  281. },
  282. initExcelOptions() {
  283. this.$nextTick(() => {
  284. luckysheet.create(this.excelOptions)
  285. })
  286. },
  287. }
  288. }
  289. </script>
  290. <style lang="scss" scoped>
  291. *{ box-sizing: border-box; }
  292. .edit-data-page {
  293. .wrap-top {
  294. display: flex;
  295. flex-wrap: wrap;
  296. justify-content: space-between;
  297. /* align-items: center; */
  298. margin-bottom: 20px;
  299. padding: 20px;
  300. background: #fff;
  301. border: 1px solid #ececec;
  302. border-radius: 4px;
  303. box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
  304. z-index: 1;
  305. .min-top {
  306. margin-bottom: 10px;
  307. display: flex;
  308. flex-wrap: wrap;
  309. align-items: center;
  310. color: #606266;
  311. li { margin-right: 35px; }
  312. }
  313. .left-handle{
  314. flex: 1;
  315. }
  316. .right-handle {
  317. min-width: 155px;
  318. display: flex;
  319. flex-direction: row-reverse;
  320. align-items: center;
  321. }
  322. .el-form{
  323. width:100%;
  324. }
  325. .tips-cont {
  326. margin-right: 20px;
  327. }
  328. }
  329. .main {
  330. position: relative;
  331. height: 650px;
  332. display: flex;
  333. .table-cont {
  334. width: 260px;
  335. flex-shrink: 0;
  336. margin-right: 20px;
  337. /* height: 600px;
  338. overflow-y: scroll; */
  339. }
  340. #excel-container {
  341. margin:0;padding:0;
  342. width:100%;
  343. }
  344. }
  345. }
  346. </style>
  347. <style lang="scss">
  348. .luckysheet .toolbar {
  349. background: none;
  350. margin: 0;
  351. padding: 0;
  352. }
  353. .luckysheet-input-box {
  354. z-index: 99999;
  355. }
  356. </style>