add.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. <template>
  2. <div class="app-container goods-add">
  3. <el-divider content-position="left">商品信息</el-divider>
  4. <el-form ref="addItem" :rules="rules" :model="addData" label-width="120px">
  5. <el-row :gutter="40" style="width: 600px">
  6. <el-col :span="23">
  7. <el-form-item label="商品名称:" prop="title">
  8. <el-input v-model="addData.title" placeholder="请输入商品名称"/>
  9. </el-form-item>
  10. </el-col>
  11. <el-col :span="23">
  12. <el-form-item label="商品主图:" prop="picUrl">
  13. <Upload v-model="mainPicUrl" :limit="10" />
  14. <div class="tip">第一张图片将作为商品列表图片,最多上传10张,多张图片之间可随意调整位置,支持jpg、png格式,推荐750*750px;</div>
  15. </el-form-item>
  16. </el-col>
  17. </el-row>
  18. <el-row :gutter="40" style="width: 500px">
  19. <el-col :span="23">
  20. <el-form-item label="支持盲豆兑换:" prop="exchangeShow">
  21. <el-switch
  22. v-model="addData.exchangeShow"
  23. :active-value="1"
  24. :inactive-value="0"
  25. />
  26. <div class="tip">关闭则不再兑换大厅显示,不支持盲豆兑换。</div>
  27. </el-form-item>
  28. </el-col>
  29. </el-row>
  30. <el-row :gutter="40" style="width: 500px">
  31. <el-col :span="23">
  32. <el-form-item label="商品分类:" prop="categoryId">
  33. <el-select
  34. v-model="addData.categoryId"
  35. placeholder="请选择商品分类"
  36. clearable
  37. >
  38. <el-option :label="item.name" :value="item.categoryId" v-for="(item, index) in goodsCategoryItemsList" :key="index" />
  39. </el-select>
  40. </el-form-item>
  41. </el-col>
  42. </el-row>
  43. <el-row :gutter="40" style="width: 500px">
  44. <el-col :span="23">
  45. <el-form-item label="供应商:" prop="supplerId">
  46. <el-select
  47. v-model="addData.supplerId"
  48. placeholder="请选择供应商"
  49. clearable
  50. >
  51. <el-option :label="item.name" :value="item.id" v-for="(item, index) in SupplierList" :key="index" />
  52. </el-select>
  53. <a style="margin-left: 20px;color:#3983EF;" @click="handleAdd">创建供应商</a>
  54. </el-form-item>
  55. </el-col>
  56. </el-row>
  57. <el-row :gutter="40" style="width: 500px">
  58. <el-col :span="23">
  59. <el-form-item label="商品采购链接:">
  60. <el-input v-model="addData.shoppingLink" placeholder="请输入商品采购链接"/>
  61. </el-form-item>
  62. </el-col>
  63. </el-row>
  64. <el-row :gutter="40" style="width: 500px">
  65. <el-col :span="23">
  66. <el-form-item label="商品标签:">
  67. <el-select
  68. v-model="addData.tagIds"
  69. placeholder="请选择商品标签"
  70. multiple
  71. clearable
  72. >
  73. <el-option :label="item.name" :value="item.tagId" v-for="(item, index) in goodsTagItemsList" :key="index" />
  74. </el-select>
  75. </el-form-item>
  76. </el-col>
  77. <el-col :span="23">
  78. <el-form-item label="商家信息:">
  79. <Upload v-model="MerchantInformation" :limit="10" />
  80. <div class="tip">上传商家营业执照</div>
  81. </el-form-item>
  82. </el-col>
  83. </el-row>
  84. <el-divider content-position="left">价格库存</el-divider>
  85. <el-row>
  86. <el-col :span="23">
  87. <el-form-item label="启用多SKU:">
  88. <el-switch
  89. v-model="addData.multiSku"
  90. :active-value="1"
  91. :inactive-value="0"
  92. />
  93. </el-form-item>
  94. </el-col>
  95. </el-row>
  96. <el-row>
  97. <el-col :span="22">
  98. <el-form-item prop="skuList">
  99. <Spec ref="spec" @valid="update" :multiSku="addData.multiSku" />
  100. </el-form-item>
  101. </el-col>
  102. </el-row>
  103. <el-row v-if="addData.multiSku === 0" :gutter="40" style="width: 600px">
  104. <el-col :span="23">
  105. <el-form-item label="价格:" prop="value">
  106. <el-input v-model="addData.value" type="number" placeholder="请输入商品价格">
  107. <template slot="append">元</template>
  108. </el-input>
  109. </el-form-item>
  110. </el-col>
  111. <el-col :span="23">
  112. <el-form-item label="兑换盲豆数量:" prop="exchangePrice">
  113. <el-input v-model="addData.exchangePrice" type="number" placeholder="请输入盲豆数量">
  114. <template slot="append">盲豆</template>
  115. </el-input>
  116. </el-form-item>
  117. </el-col>
  118. <el-col :span="23">
  119. <el-form-item label="采购价格:" prop="cost">
  120. <el-input v-model="addData.cost" type="number" placeholder="请输入商品采购价格">
  121. <template slot="append">元</template>
  122. </el-input>
  123. </el-form-item>
  124. </el-col>
  125. <el-col :span="23">
  126. <el-form-item label="商品编码:" prop="goodsCode">
  127. <el-input v-model="addData.goodsCode" type="text" placeholder="请输入商品编码">
  128. </el-input>
  129. </el-form-item>
  130. </el-col>
  131. <el-col :span="23">
  132. <el-form-item label="库存:" prop="quantity">
  133. <el-input v-model="addData.quantity" type="number" placeholder="请输入商品库存">
  134. <template slot="append">件</template>
  135. </el-input>
  136. </el-form-item>
  137. </el-col>
  138. </el-row>
  139. <!-- <el-divider content-position="left">商品详情</el-divider> -->
  140. <el-row>
  141. <el-col :span="22">
  142. <el-form-item label="商品详情" prop="description">
  143. <wang-editor ref="editor" v-model="addData.description" />
  144. </el-form-item>
  145. </el-col>
  146. </el-row>
  147. </el-form>
  148. <br>
  149. <el-row>
  150. <el-col :span="24" style="text-align: center">
  151. <el-button type="info" @click="$router.replace('/goods/list')">取消</el-button>
  152. <el-button type="primary" @click="updateItem()">保存</el-button>
  153. </el-col>
  154. </el-row>
  155. <add-supplier
  156. v-if="createShow"
  157. :dialog-show="createShow"
  158. @close="close"
  159. />
  160. </div>
  161. </template>
  162. <script>
  163. import Upload from '@/components/DragImageUpload'
  164. import WangEditor from '@/components/WangEditor'
  165. import Spec from './components/spec'
  166. import TinyEditor from '@/components/TinyEditor'
  167. import { getGoodsDetail, addGoods } from '@/api/business/goods'
  168. import { goodsCategoryItems } from '@/api/business/category'
  169. import { getSupplierList } from '@/api/business/supplier'
  170. import { goodsTagItems } from '@/api/business/tag'
  171. import { publicFileGetUrl } from "@/api/common"
  172. import { accDiv, accMul } from '@/utils/util'
  173. import AddSupplier from "../supplier/components/addSupplier";
  174. export default {
  175. components: {
  176. TinyEditor,
  177. WangEditor,
  178. Upload,
  179. Spec,
  180. AddSupplier
  181. },
  182. data() {
  183. return {
  184. IMG_URL: publicFileGetUrl,
  185. id: this.$route.query.id,
  186. goodsCategoryItemsList: [],
  187. SupplierList: [],
  188. goodsTagItemsList: [],
  189. addData: {
  190. multiSku: 0,
  191. description: ''
  192. },
  193. createShow:false,
  194. rules: {
  195. title: [{ required: true, message: '请输入商品名称', trigger: 'blur' }],
  196. picUrl: [{ required: true, message: '请上传商品图片', trigger: 'change' }],
  197. categoryId: [{ required: true, message: '请选择商品分类', trigger: 'change' }],
  198. supplerId: [{ required: true, message: '请选择供应商', trigger: 'change' }],
  199. exchangeShow: [{ required: true, message: '请选择是否支持盲豆兑换', trigger: 'change' }],
  200. multiSku: [{ required: true, message: '请选择SKU类型', trigger: 'change' }],
  201. value: [
  202. { required: true, message: '请输商品入价格', trigger: 'blur' },
  203. { pattern: /^([1-9]\d*(\.\d{1,2})?|([0](\.([0][1-9]|[1-9]\d{0,1}))))$/, message: "请输入正确的金额,最多两位小数", trigger: ["blur", "change"] }
  204. ],
  205. exchangePrice: [
  206. { required: true,message:'请输入盲豆数量', trigger: 'blur' },
  207. { pattern: /^([1-9]\d*)$/, message: "请输入正确盲豆数量", trigger: ["blur", "change"] }
  208. ],
  209. cost: [
  210. { required: false, message: '请输入采购价格', trigger: 'blur' },
  211. { pattern: /^([1-9]\d*(\.\d{1,2})?|([0](\.([0][1-9]|[1-9]\d{0,1}))))$/, message: "请输入正确的金额,最多两位小数", trigger: ["blur", "change"] }
  212. ],
  213. quantity: [
  214. { required: true, message: '请输入库存', trigger: 'blur' },
  215. { pattern: /^([1-9]\d*)$/, message: "请输入正确的数字", trigger: ["blur", "change"] }
  216. ],
  217. description: [{ required: true, message: '请输入商品详情', trigger: 'blur' }]
  218. }
  219. }
  220. },
  221. computed: {
  222. mainPicUrl: {
  223. get() {
  224. return this.addData.picUrl ? this.addData.picUrl.split(',').map(item => {
  225. return {
  226. fileName: item
  227. }
  228. }) : []
  229. },
  230. set(val) {
  231. this.$set(this.addData, 'picUrl', val.map(item => { return item.fileName }).toString())
  232. }
  233. },
  234. MerchantInformation:{
  235. get() {
  236. return this.addData.merchantInfo ? this.addData.merchantInfo.split(',').map(item => {
  237. return {
  238. fileName: item
  239. }
  240. }) : []
  241. },
  242. set(val) {
  243. this.$set(this.addData, 'merchantInfo', val.map(item => { return item.fileName }).toString())
  244. }
  245. }
  246. },
  247. created() {
  248. this.getGoodsCategoryItems()
  249. this.getSupplierItems()
  250. this.getGoodsTagItems()
  251. if (this.id) {
  252. getGoodsDetail(this.id).then(res => {
  253. const { goodsId, title, goodsCode, picUrl,merchantInfo, exchangeShow, multiSku, value, exchangePrice, cost, quantity, description, skuList, categoryId, supplerId, shoppingLink, tagIds } = res.data
  254. this.addData = {
  255. value: accDiv(value, 100),
  256. cost: cost == '' || cost == null ? '' : accDiv(cost, 100),
  257. goodsId, title, goodsCode, picUrl,merchantInfo, exchangeShow, multiSku, exchangePrice, quantity, description, skuList, categoryId, supplerId, shoppingLink, tagIds
  258. }
  259. if(description) {
  260. this.$refs.editor.setContent(description)
  261. }
  262. if (multiSku && skuList instanceof Array && skuList.length > 0) {
  263. this.$nextTick(() => {
  264. this.$refs.spec.setSkuList(skuList)
  265. })
  266. }
  267. })
  268. }
  269. },
  270. methods: {
  271. getGoodsCategoryItems(){
  272. goodsCategoryItems({}).then(res => {
  273. this.goodsCategoryItemsList = res && res.data
  274. })
  275. },
  276. //获取供应商
  277. getSupplierItems(){
  278. getSupplierList({name:""}).then(res => {
  279. this.SupplierList = res && res.rows
  280. })
  281. },
  282. handleAdd() {
  283. this.createShow = true;
  284. },
  285. close(){
  286. this.createShow = false;
  287. this.getSupplierItems()
  288. },
  289. getGoodsTagItems(){
  290. goodsTagItems({}).then(res => {
  291. this.goodsTagItemsList = res && res.data
  292. })
  293. },
  294. updateItem() {
  295. if (this.addData.multiSku == 1) {
  296. this.$refs.spec.getSkuList()
  297. } else {
  298. this.update()
  299. }
  300. },
  301. update(skuList) {
  302. this.$refs.addItem.validate((valid, items) => {
  303. if (valid) {
  304. this.addData.skuList = skuList
  305. const { value, cost,exchangePrice, description, ...rest } = this.addData
  306. addGoods({...rest, ...{
  307. value: accMul(value, 100),
  308. cost: cost == '' || cost == null ? '' : accMul(cost, 100),
  309. exchangePrice: accMul(exchangePrice, 1),
  310. description: encodeURI(description)
  311. }}).then(res => {
  312. if (res.code === 0) {
  313. this.$message({
  314. message: this.addData.goodsId ? '修改成功!' : '添加成功!',
  315. type: 'success'
  316. })
  317. this.$store.dispatch('tagsView/delView', this.$route)
  318. this.$router.go(-1)
  319. }
  320. })
  321. } else {
  322. if (items && Object.keys(items).length>0) {
  323. this.$message({
  324. message: items[Object.keys(items)[0]][0].message,
  325. type: 'warning'
  326. })
  327. }
  328. }
  329. })
  330. }
  331. }
  332. }
  333. </script>
  334. <style lang="scss">
  335. .goods-add {
  336. .tip {
  337. font-size: 12px;
  338. color: #999;
  339. }
  340. .el-divider {
  341. .is-left {
  342. color: #409EFF;
  343. font-size: 20px;
  344. font-weight: bolder;
  345. left: 10px;
  346. }
  347. }
  348. }
  349. </style>