许成详 6 years ago
parent
commit
a7da22e1cb

+ 19
- 14
src/pages/system/library/books/detail.vue View File

@@ -14,13 +14,12 @@
14 14
           <el-input v-model="formData.BookBarcode" :style="{ width: '200px' }" :disabled="true"></el-input>
15 15
         </el-form-item>
16 16
         <el-form-item label="案场" prop="CaseId">
17
-          <el-select v-model="formData.CaseId" placeholder="请选择案场">
17
+          <el-select v-model="formData.CaseId" placeholder="请选择案场" @change="filterTypes">
18 18
             <el-option
19 19
               v-for="item in cases"
20 20
               :key="item.CaseId"
21 21
               :label="item.CaseName"
22 22
               :value="item.CaseId"
23
-              @change="filterTypes"
24 23
             ></el-option>
25 24
           </el-select>
26 25
         </el-form-item>
@@ -109,8 +108,8 @@ export default {
109 108
     if (id) {
110 109
       this.active = 1
111 110
 
112
-      this.getInfo({
113
-        BookId: id
111
+      this.getInfo({ id }).then((x) => {
112
+        this.filterTypes(x.CaseId)
114 113
       }).catch(err => {
115 114
         this.$message({
116 115
           showClose: true,
@@ -136,6 +135,7 @@ export default {
136 135
   watch: {
137 136
     detail: {
138 137
       handler (nv, ov) {
138
+        console.log(nv)
139 139
         if (nv.BookId === this.formData.BookId) {
140 140
           return
141 141
         }
@@ -150,12 +150,13 @@ export default {
150 150
       },
151 151
       immediate: true,
152 152
     },
153
-    formData: {
154
-      handler (nv) {
155
-        this.mergeDetail(nv)
156
-      },
157
-      deep: true,
158
-    },
153
+    // formData: {
154
+    //   handler (nv) {
155
+    //     console.log('----------', nv)
156
+    //     this.bookImg = nv.BookImg
157
+    //   },
158
+    //   deep: true,
159
+    // },
159 160
   },
160 161
   methods: {
161 162
     ...mapMutations({
@@ -189,18 +190,22 @@ export default {
189 190
     },
190 191
 
191 192
     uploadSuccess(res) {
192
-      this.formData.BookImg = res.result.url
193
+      this.$set(this.formData, 'BookImg', res.result.url)
194
+      // this.formData.BookImg = res.result.url
193 195
     },
194 196
 
195 197
     filterTypes(val) {
196
-      const CaseId = val
197
-      this.getTypeList({ page: 0, CaseId, pagesize: 10000 })
198
+      this.getTypeList({ page: 0, caseid: val, pagesize: 10000 })
198 199
     },
199 200
 
200 201
     submit() {
201 202
       this.$refs.ruleForm.validate(valid => {
202 203
         if (valid) {
203
-          this.updateDetail()
204
+          if (!this.formData.Price) {
205
+            this.formData.Price = 0
206
+          }
207
+
208
+          this.updateDetail(this.formData)
204 209
             .then(() => {
205 210
               this.$message({
206 211
                 showClose: true,

+ 62
- 14
src/pages/system/library/books/list.vue View File

@@ -3,7 +3,7 @@
3 3
     <div>
4 4
       <el-form inline>
5 5
         <el-form-item label="案场">
6
-          <el-select v-model="caseId" size="medium" placeholder="请选择案场" @change="filterList">
6
+          <el-select v-model="caseId" size="medium" placeholder="请选择案场">
7 7
             <el-option
8 8
               v-for="item in cases"
9 9
               :key="item.CaseId"
@@ -19,19 +19,18 @@
19 19
           <el-input v-model="bookName"></el-input>
20 20
         </el-form-item>
21 21
         <el-form-item :style="{ float: 'right' }">
22
-          <el-button type="primary" size="medium">搜索</el-button>
22
+          <el-button type="primary" size="medium" @click="filterList">搜索</el-button>
23 23
         </el-form-item>
24 24
       </el-form>
25 25
     </div>
26 26
     <div>
27 27
       <el-button plain @click="editBook()" size="medium">图书录入</el-button>
28
-      <el-button plain @click="showBatchInput()" size="medium">批量导入</el-button>
29
-      <el-button type="text" size="medium">点击下载导入模板</el-button>
28
+      <el-button plain @click="showDialog = true" size="medium">批量导入</el-button>
30 29
       <div :style="{ margin: '10px 0' }">
31 30
         <el-table :data="list" border style="width: 100%">
32
-          <el-table-column label="图片" width="250">
31
+          <el-table-column label="图片" width="128">
33 32
             <template slot-scope="scope">
34
-              <img width="150" :src="scope.row.BookImg" alt>
33
+              <img width="64" :src="scope.row.BookImg" alt>
35 34
             </template>
36 35
           </el-table-column>
37 36
           <el-table-column prop="BookBarcode" label="条码"></el-table-column>
@@ -85,6 +84,19 @@
85 84
         ></el-pagination>
86 85
       </div>
87 86
     </div>
87
+    <el-dialog
88
+      title="批量导入"
89
+      :visible.sync="showDialog"
90
+      width="50%">
91
+      <div :style="{ margin: 'auto', width: '80%' }">
92
+        <div><el-button @click="showBatchInput" :style="{ width: '100%' }">上传文件</el-button></div>
93
+        <div><el-button type="text" size="medium" :style="{ float: 'right' }">下载导入模板</el-button></div>
94
+      </div>
95
+      <span slot="footer" class="dialog-footer">
96
+        <el-button type="primary" @click="showDialog = false">确 定</el-button>
97
+        <el-button @click="showDialog = false">取 消</el-button>
98
+      </span>
99
+    </el-dialog>
88 100
   </div>
89 101
 </template>
90 102
 
@@ -100,7 +112,8 @@ export default {
100 112
       caseId: '',
101 113
       bookBarcode: '',
102 114
       bookName: '',
103
-      inputRef: window.document.createElement('input')
115
+      inputRef: window.document.createElement('input'),
116
+      showDialog: false,
104 117
     }
105 118
   },
106 119
   computed: {
@@ -128,19 +141,20 @@ export default {
128 141
       getList: 'getBookList',
129 142
       getTypeList: 'getTypeList',
130 143
       deleteBook: 'deleteBook',
131
-      setBookRecommend: 'setBookRecommend'
144
+      setBookRecommend: 'updateBookDetail',
145
+      batchImport: 'batchImport',
132 146
     }),
133 147
 
134 148
     // 查询过滤
135 149
     filterList({ page = 0 } = {}) {
136 150
       const caseId = this.caseId || this.defaultCase
137
-      this.getTypeList({ page: 0, pagesize: 1000, CaseId: caseId })
151
+      this.getTypeList({ page: 0, pagesize: 1000, caseid: caseId })
138 152
 
139 153
       this.getList({
140 154
         page,
141
-        CaseId: caseId,
142
-        BookBarcode: this.bookBarcode,
143
-        BookName: this.bookName
155
+        caseid: caseId,
156
+        barcode: this.bookBarcode,
157
+        name: this.bookName
144 158
       }).catch(err => {
145 159
         this.$message({
146 160
           showClose: true,
@@ -192,6 +206,7 @@ export default {
192 206
     // 设为/取消推荐
193 207
     setRecommend(book) {
194 208
       const tipMsg = book.IsRecommend === 1 ? '确定取消推荐?' : '确认设置为推荐?'
209
+      book.IsRecommend = Math.abs(book.IsRecommend - 1)
195 210
 
196 211
       this.$confirm(tipMsg, '提示', {
197 212
         confirmButtonText: '是',
@@ -241,6 +256,14 @@ export default {
241 256
     importBatch(e) {
242 257
       // 需要指定案场
243 258
       const caseName = this.getCaseName(this.caseId)
259
+      const file = e.target.files[0]
260
+      if (!file) {
261
+        this.$message({
262
+          showClose: true,
263
+          message: '请选择导入文件',
264
+          type: 'error'
265
+        })
266
+      }
244 267
 
245 268
       this.$confirm(`数据将被导入至【${caseName}】案场, 是否继续?`, '提示', {
246 269
         confirmButtonText: '确定',
@@ -248,8 +271,33 @@ export default {
248 271
         type: 'warning'
249 272
       })
250 273
         .then(() => {
251
-          // TODO
252
-          // const file = e.target.files[0];
274
+          const data = {
275
+            caseId: this.caseId,
276
+            excel: file,
277
+          }
278
+
279
+          this.batchImport(data).then(() => {
280
+            this.$confirm(`数据导入完成, 点击【确定】刷新页面`, '提示', {
281
+              confirmButtonText: '确定',
282
+              cancelButtonText: '取消',
283
+              type: 'warning'
284
+            }).then(() => {
285
+              window.location.reload()
286
+            })
287
+          }).catch((err) => {
288
+            this.$message({
289
+              showClose: true,
290
+              message: err,
291
+              type: 'error'
292
+            })
293
+          })
294
+
295
+          // const loading = this.$loading({
296
+          //   lock: true,
297
+          //   text: '数据导入中, 可能耗时较长, 请稍后 ...',
298
+          // })
299
+
300
+          // window.setTimeout(() => loading.close(), 2000)
253 301
         })
254 302
         .catch(x => x)
255 303
     },

+ 11
- 33
src/pages/system/library/books/types/detail.vue View File

@@ -28,7 +28,7 @@
28 28
         <el-input v-model="formData.BookTypeName" :style="{ width: '200px' }"></el-input>
29 29
       </el-form-item>
30 30
       <el-form-item :style="{ paddingTop: '40px' }">
31
-        <el-button type="primary" @click="submit()">立即创建</el-button>
31
+        <el-button type="primary" @click="submit()">保存</el-button>
32 32
         <el-button @click="$router.back()">取消</el-button>
33 33
       </el-form-item>
34 34
     </el-form>
@@ -62,9 +62,7 @@ export default {
62 62
   created() {
63 63
     const id = this.$route.params.id
64 64
     if (id) {
65
-      this.getInfo({
66
-        BookTypeId: id
67
-      }).catch(err => {
65
+      this.getInfo({ id }).catch(err => {
68 66
         this.$message({
69 67
           showClose: true,
70 68
           message: err,
@@ -82,27 +80,6 @@ export default {
82 80
     ...mapLibSate({
83 81
       detail: s => s.type.detail,
84 82
     }),
85
-    // formData: {
86
-    //   get: function() {
87
-    //     if (this.detail && this.detail.BookTypeId) {
88
-    //       return this.detail
89
-    //     }
90
-
91
-    //     return {
92
-    //       BookTypeId: '',
93
-    //       BookTypeName: '',
94
-    //       BookTypeImg: '',
95
-    //       CaseId: this.defaultCase,
96
-    //       OrgId: this.orgid,
97
-    //       Status: 1,
98
-    //       CreateDate: new Date()
99
-    //     }
100
-    //   },
101
-    //   set: function(val) {
102
-    //     console.log(val)
103
-    //     this.mergeDetail(val)
104
-    //   }
105
-    // }
106 83
   },
107 84
   watch: {
108 85
     detail: {
@@ -121,12 +98,12 @@ export default {
121 98
       },
122 99
       immediate: true,
123 100
     },
124
-    formData: {
125
-      handler (nv) {
126
-        this.mergeDetail(nv)
127
-      },
128
-      deep: true,
129
-    },
101
+    // formData: {
102
+    //   handler (nv) {
103
+    //     this.mergeDetail(nv)
104
+    //   },
105
+    //   deep: true,
106
+    // },
130 107
   },
131 108
   methods: {
132 109
     ...mapMutations({
@@ -138,13 +115,14 @@ export default {
138 115
     }),
139 116
 
140 117
     uploadSuccess(res) {
141
-      this.formData.BookTypeImg = res.result.url
118
+      this.$set(this.formData, 'BookTypeImg', res.result.url)
119
+      // this.formData.BookTypeImg = res.result.url
142 120
     },
143 121
 
144 122
     submit() {
145 123
       this.$refs.ruleForm.validate(valid => {
146 124
         if (valid) {
147
-          this.updateDetail()
125
+          this.updateDetail(this.formData)
148 126
             .then(() => {
149 127
               this.$message({
150 128
                 showClose: true,

+ 11
- 7
src/pages/system/library/books/types/list.vue View File

@@ -3,7 +3,7 @@
3 3
     <div>
4 4
       <el-form inline>
5 5
         <el-form-item label="案场">
6
-          <el-select v-model="caseId" size="medium" placeholder="请选择案场" @change="filterList">
6
+          <el-select v-model="caseId" size="medium" placeholder="请选择案场">
7 7
             <el-option
8 8
               v-for="item in cases"
9 9
               :key="item.CaseId"
@@ -13,7 +13,7 @@
13 13
           </el-select>
14 14
         </el-form-item>
15 15
         <el-form-item :style="{ float: 'right' }">
16
-          <el-button type="primary" size="medium">搜索</el-button>
16
+          <el-button type="primary" size="medium" @click="filterList">搜索</el-button>
17 17
         </el-form-item>
18 18
       </el-form>
19 19
     </div>
@@ -21,9 +21,9 @@
21 21
       <el-button plain @click="editType()" size="medium">新增分类</el-button>
22 22
       <div :style="{ margin: '10px 0' }">
23 23
         <el-table :data="list" border style="width: 100%">
24
-          <el-table-column label="图片" width="250">
24
+          <el-table-column label="图片" width="128">
25 25
             <template slot-scope="scope">
26
-              <img width="150" :src="scope.row.BookTypeImg" alt>
26
+              <img width="64" :src="scope.row.BookTypeImg" alt>
27 27
             </template>
28 28
           </el-table-column>
29 29
           <el-table-column prop="BookTypeName" label="名称"></el-table-column>
@@ -43,7 +43,7 @@
43 43
         <el-pagination
44 44
           layout="prev, pager, next"
45 45
           :current-page="page"
46
-          :total="1000"
46
+          :total="pagenum"
47 47
           @current-change="pageChange">
48 48
         </el-pagination>
49 49
       </div>
@@ -75,6 +75,7 @@ export default {
75 75
     ...mapLibSate({
76 76
       list: s => s.type.list,
77 77
       page: s => s.type.page,
78
+      pagenum: s => s.type.pagenum,
78 79
     })
79 80
   },
80 81
   created() {
@@ -83,13 +84,16 @@ export default {
83 84
   methods: {
84 85
     ...mapActions({
85 86
       getList: 'getTypeList',
86
-      deleteType: 'deleteType'
87
+      deleteType: 'deleteType',
87 88
     }),
88 89
 
89 90
     filterList({ page = 0 } = {}) {
91
+      const caseId = this.caseId || this.defaultCase
92
+      if (!caseId) return
93
+
90 94
       this.getList({
91 95
         page,
92
-        CaseId: this.caseId || this.defaultCase
96
+        caseid: caseId,
93 97
       }).catch(err => {
94 98
         this.$message({
95 99
           showClose: true,

+ 116
- 16
src/store/library/index.js View File

@@ -6,6 +6,7 @@ export default {
6 6
 
7 7
   state: {
8 8
     page: 0,
9
+    pagenum: 0,
9 10
     list: [
10 11
       {
11 12
         BookId: '1',
@@ -31,6 +32,7 @@ export default {
31 32
     detail: {},
32 33
     type: {
33 34
       page: 0,
35
+      pagenum: 0,
34 36
       list: [
35 37
         {
36 38
           BookTypeId: '1',
@@ -54,6 +56,8 @@ export default {
54 56
       },
55 57
     },
56 58
     stock: {
59
+      page: 0,
60
+      pagenum: 0,
57 61
       list: [
58 62
         {
59 63
           RecordId: '1',
@@ -96,7 +100,33 @@ export default {
96 100
     },
97 101
     setBorrowList (state, payload) { // 更新借阅记录
98 102
       state.borrow.list = payload
99
-    }
103
+    },
104
+    setTypeList (state, payload) {
105
+      const { list, pagenum } = payload || {}
106
+      if (!!list) { // eslint-disable-line
107
+        state.type.list = list
108
+        state.type.pagenum = pagenum
109
+      } else {
110
+        state.type.list = []
111
+        state.type.pagenum = 0
112
+      }
113
+    },
114
+    deleteTypeList (state, payload = {}) {
115
+      state.type.list = state.type.list.filter(x => x.BookTypeId !== payload.BookTypeId)
116
+    },
117
+    setBookList (state, payload) {
118
+      const { list, pagenum } = payload || {}
119
+      if (!!list) { // eslint-disable-line
120
+        state.list = list
121
+        state.pagenum = pagenum
122
+      } else {
123
+        state.list = []
124
+        state.pagenum = 0
125
+      }
126
+    },
127
+    deleteBookList (state, payload = {}) {
128
+      state.list = state.list.filter(x => x.BookId !== payload.BookId)
129
+    },
100 130
   },
101 131
   actions: {
102 132
     cancelBorrow ({ commit }, payload) { // 取消预约
@@ -124,53 +154,123 @@ export default {
124 154
     },
125 155
     getTypeList ({ commit }, payload) {
126 156
       return new Promise((resolve, reject) => {
127
-
157
+        ajax({
158
+          ...api.bookType.list,
159
+          queryData: payload,
160
+        }).then((x) => {
161
+          commit('setTypeList', x)
162
+          resolve(x)
163
+        })
164
+          .catch(({ message }) => reject(message))
128 165
       })
129 166
     },
130
-    getTypeDetail ({ commit }, payload) {
167
+    getTypeDetail ({ commit }, payload = {}) {
131 168
       return new Promise((resolve, reject) => {
132
-
169
+        ajax({
170
+          ...api.bookType.detail,
171
+          urlData: { ...payload },
172
+        }).then((x) => {
173
+          commit('mergeTypeDetail', x)
174
+          resolve(x)
175
+        })
176
+          .catch(({ message }) => reject(message))
133 177
       })
134 178
     },
135
-    updateTypeDetail ({ commit }, payload) {
179
+    updateTypeDetail ({ commit }, payload = {}) {
136 180
       return new Promise((resolve, reject) => {
181
+        const id = payload.BookTypeId
182
+        payload.CreateDate = ''
137 183
 
184
+        const apiConf = !id ? api.bookType.save : api.bookType.update
185
+        ajax({
186
+          ...apiConf,
187
+          data: payload,
188
+        }).then((x) => {
189
+          commit('mergeTypeDetail', x)
190
+          resolve(x)
191
+        })
192
+          .catch(({ message }) => reject(message))
138 193
       })
139 194
     },
140 195
     deleteType ({ commit }, payload) {
141 196
       return new Promise((resolve, reject) => {
142
-
197
+        ajax({
198
+          ...api.bookType.delete,
199
+          urlData: { id: payload.BookTypeId },
200
+        }).then(() => {
201
+          commit('deleteTypeList', payload)
202
+          resolve()
203
+        })
204
+          .catch(({ message }) => reject(message))
143 205
       })
144 206
     },
145 207
     getBookList ({ commit }, payload) {
146 208
       return new Promise((resolve, reject) => {
147
-
209
+        ajax({
210
+          ...api.book.list,
211
+          queryData: payload,
212
+        }).then((x) => {
213
+          console.log(x)
214
+          commit('setBookList', x)
215
+          resolve(x)
216
+        })
217
+          .catch((err) => console.log(err) && reject(err.message))
148 218
       })
149 219
     },
150
-    getBookDetail ({ commit }, payload) {
220
+    getBookDetail ({ commit }, payload = {}) {
151 221
       return new Promise((resolve, reject) => {
152
-
222
+        ajax({
223
+          ...api.book.detail,
224
+          urlData: { ...payload },
225
+        }).then((x) => {
226
+          commit('mergeBookDetail', x)
227
+          resolve(x)
228
+        })
229
+          .catch(({ message }) => reject(message))
153 230
       })
154 231
     },
155
-    updateBookDetail ({ commit }, payload) {
232
+    updateBookDetail ({ commit }, payload = {}) {
156 233
       return new Promise((resolve, reject) => {
234
+        const id = payload.BookId
157 235
 
236
+        const apiConf = !id ? api.book.save : api.book.update
237
+        ajax({
238
+          ...apiConf,
239
+          data: payload,
240
+        }).then((x) => {
241
+          commit('mergeBookDetail', x)
242
+          resolve(x)
243
+        })
244
+          .catch(({ message }) => reject(message))
158 245
       })
159 246
     },
160
-    deleteBook ({ commit }, payload) {
247
+    deleteBook ({ commit }, payload = {}) {
161 248
       return new Promise((resolve, reject) => {
162
-
249
+        ajax({
250
+          ...api.book.delete,
251
+          urlData: { id: payload.BookId },
252
+        }).then((x) => {
253
+          commit('deleteBookList', payload)
254
+          resolve(x)
255
+        })
256
+          .catch(({ message }) => reject(message))
163 257
       })
164 258
     },
165
-    setBookRecommend ({ commit }, payload) {
259
+    getStockList ({ commit }, payload) {
166 260
       return new Promise((resolve, reject) => {
167 261
 
168 262
       })
169 263
     },
170
-    getStockList ({ commit }, payload) {
264
+    batchImport(_, payload) {
171 265
       return new Promise((resolve, reject) => {
172
-
266
+        ajax({
267
+          ...api.book.import,
268
+          data: payload,
269
+        }).then(() => {
270
+          resolve()
271
+        })
272
+          .catch(({ message }) => reject(message))
173 273
       })
174
-    },
274
+    }
175 275
   },
176 276
 }

+ 30
- 0
src/util/api.js View File

@@ -975,6 +975,36 @@ const $api = {
975 975
       method: 'post',
976 976
       url: `${baseUrl}${common}/booktype`
977 977
     },
978
+    delete: {
979
+      method: 'delete',
980
+      url: `${baseUrl}${common}/booktype/:id`
981
+    },
982
+  },
983
+  book: {
984
+    list: {
985
+      method: 'get',
986
+      url: `${baseUrl}${common}/book`
987
+    },
988
+    detail: {
989
+      method: 'get',
990
+      url: `${baseUrl}${common}/book/:id`
991
+    },
992
+    save: {
993
+      method: 'post',
994
+      url: `${baseUrl}${common}/book`
995
+    },
996
+    update: {
997
+      method: 'put',
998
+      url: `${baseUrl}${common}/book`
999
+    },
1000
+    delete: {
1001
+      method: 'delete',
1002
+      url: `${baseUrl}${common}/book/:id`
1003
+    },
1004
+    import: {
1005
+      method: 'post',
1006
+      url: `${baseUrl}${common}/book/excel`
1007
+    },
978 1008
   },
979 1009
 }
980 1010
 export default $api