edit.vue 7.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. <template>
  2. <div class="subPage">
  3. <form class="mainForm">
  4. <ul>
  5. <li class="flex-h">
  6. <span>选择案场:<em>*</em></span>
  7. <div class="flex-item">
  8. <div style="width:50%">
  9. <el-select v-model="Case" placeholder="请选择">
  10. <el-option
  11. v-for="item in cases"
  12. :key="item.CaseId"
  13. :label="item.CaseName"
  14. :value="item.CaseId">
  15. </el-option>
  16. </el-select>
  17. </div>
  18. </div>
  19. </li>
  20. <li class="flex-h">
  21. <span>商品名称:<em>*</em></span>
  22. <div class="flex-item">
  23. <div style="width:50%">
  24. <el-input
  25. placeholder="请输入商品名称"
  26. v-model="detail.GoodsName"
  27. clearable>
  28. </el-input>
  29. </div>
  30. </div>
  31. </li>
  32. <li class="flex-h">
  33. <span>商品图片:<em>*</em></span>
  34. <div class="flex-item">
  35. <div style="width:50%">
  36. <el-upload
  37. class="avatar-uploader"
  38. action='string'
  39. :http-request="toolClass.upload"
  40. :show-file-list="false"
  41. :on-success="handleAvatarSuccess">
  42. <img v-if="Image" :src="Image" class="avatar">
  43. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  44. </el-upload>
  45. </div>
  46. </div>
  47. </li>
  48. <li class="flex-h">
  49. <span>商品价格:<em>*</em></span>
  50. <div class="flex-item">
  51. <div style="width:50%">
  52. <el-input
  53. placeholder="请输入商品价格"
  54. v-model="detail.Price"
  55. clearable>
  56. </el-input>
  57. </div>
  58. </div>
  59. </li>
  60. <li class="flex-h">
  61. <span>商品规格:</span>
  62. <div class="flex-item">
  63. <div style="width:50%">
  64. <el-select v-model="detailSpecs" multiple placeholder="请选择" style="width:100%;">
  65. <el-option
  66. v-for="item in (Case === '' ? [] : specs.list)"
  67. :key="item.SpecId"
  68. :label="item.SpecName"
  69. :value="item.SpecId">
  70. </el-option>
  71. </el-select>
  72. </div>
  73. </div>
  74. </li>
  75. <li class="flex-h">
  76. <span>商品类别:<em>*</em></span>
  77. <div class="flex-item">
  78. <div style="width:50%">
  79. <el-select v-model="TypeId" placeholder="请选择商品类型">
  80. <el-option
  81. v-for="item in (Case === '' ? [] : types.list)"
  82. :key="item.TypeId"
  83. :label="item.TypeName"
  84. :value="item.TypeId">
  85. </el-option>
  86. </el-select>
  87. </div>
  88. </div>
  89. </li>
  90. <li style="text-align:center">
  91. <el-button type="primary" size="mini" @click='submit'>保存</el-button>
  92. <el-button type="danger" size="mini" @click="cancel">取消</el-button>
  93. </li>
  94. </ul>
  95. </form>
  96. </div>
  97. </template>
  98. <script>
  99. import { createNamespacedHelpers, mapState } from 'vuex'
  100. const { mapState: mapGoodsState, mapActions: mapGoodsActions } = createNamespacedHelpers('goods')
  101. export default {
  102. name: '',
  103. data () {
  104. return {
  105. limit: 1,
  106. dialogVisible: false,
  107. infoSpecs: null,
  108. }
  109. },
  110. components: {},
  111. computed: {
  112. ...mapGoodsState({
  113. detail: x => x.goodsInfo,
  114. types: x => x.goodsTypes,
  115. specs: x => x.goodsSpecs,
  116. }),
  117. ...mapState({
  118. cases: x => x.app.cases.list,
  119. caseid: x => x.app.cases.default,
  120. orgid: x => x.app.user.OrgId,
  121. }),
  122. Case: {
  123. get () {
  124. return this.detail.CaseId || this.caseid
  125. },
  126. set (val) {
  127. this.UpdateInfo({ ...this.detail, CaseId: val })
  128. this.detail.TypeId = ''
  129. this.GetGoodTypes({ pagesize: 1000, caseid: this.Case })
  130. this.GetGoodSpecs({ pagesize: 1000, caseid: this.Case })
  131. }
  132. },
  133. detailSpecs: {
  134. get () {
  135. // console.log(this.infoSpecs || (this.detail.Specs || []).map(x => x.SpecId))
  136. return this.infoSpecs || (this.detail.Specs || []).map(x => x.SpecId)
  137. },
  138. set (val) {
  139. this.infoSpecs = val
  140. },
  141. },
  142. Image () {
  143. return ((this.detail.Images || [])[0] || {}).ImgUrl
  144. },
  145. TypeId: {
  146. get () {
  147. return this.detail.TypeId
  148. },
  149. set (val) {
  150. this.UpdateInfo({ ...this.detail, TypeId: val })
  151. },
  152. },
  153. },
  154. methods: {
  155. ...mapGoodsActions([
  156. 'GetGoodTypes',
  157. 'GetGoodsByID',
  158. 'AddGoods',
  159. 'UpdateGoods',
  160. 'SetNull',
  161. 'UpdateInfo',
  162. 'GetGoodSpecs',
  163. ]),
  164. submit () {
  165. this.detail.specs = JSON.stringify(this.detailSpecs.map(x => ({ SpecId: x, GoodsPrice: this.detail.Price })))
  166. this.detail.images = (this.detail.Images || []).map(x => {
  167. if (x.response) {
  168. return x.response.result.url
  169. } else {
  170. return x.ImgUrl
  171. }
  172. }).join(',')
  173. if ((this.detail.CaseId || '') === '') {
  174. this.$message({
  175. type: 'error',
  176. message: '案场不能为空'
  177. })
  178. return false
  179. }
  180. if ((this.detail.GoodsName || '') === '') {
  181. this.$message({
  182. type: 'error',
  183. message: '商品名称不能为空'
  184. })
  185. return false
  186. }
  187. if ((this.detail.Images || '') === '') {
  188. this.$message({
  189. type: 'error',
  190. message: '图片不能为空'
  191. })
  192. return false
  193. }
  194. if ((this.detail.Price || '') === '') {
  195. this.$message({
  196. type: 'error',
  197. message: '价格不能为空'
  198. })
  199. return false
  200. }
  201. if ((this.detail.TypeId || '') === '') {
  202. this.$message({
  203. type: 'error',
  204. message: '类别不能为空'
  205. })
  206. return false
  207. }
  208. if ((this.detail.GoodsId || '') === '') {
  209. this.detail.OrgId = this.orgid
  210. if (!this.detail.CaseId || this.detail.CaseId === '') {
  211. this.detail.CaseId = this.caseid
  212. }
  213. this.AddGoods(this.detail)
  214. } else {
  215. this.UpdateGoods(this.detail)
  216. }
  217. this.$message({
  218. type: 'success',
  219. message: '操作成功'
  220. })
  221. this.$router.push({ name: 'goodsInfo' })
  222. },
  223. cancel () {
  224. this.$router.go(-1)
  225. },
  226. handleAvatarSuccess (res, file) {
  227. this.UpdateInfo({ ...this.detail, Images: [{ ImgUrl: res.result.url }] })
  228. },
  229. },
  230. created () {
  231. const { id } = this.$route.query
  232. if (id && id !== '') {
  233. this.GetGoodTypes({ pagesize: 1000, caseid: this.Case })
  234. this.GetGoodSpecs({ pagesize: 1000, caseid: this.Case })
  235. this.GetGoodsByID({ id: id })
  236. }
  237. }
  238. }
  239. </script>
  240. <!-- Add "scoped" attribute to limit CSS to this component only -->
  241. <style lang="scss" scoped>
  242. </style>