newGroupActivity.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  1. <template>
  2. <div class="mod-groupActivity">
  3. <div class="new-page-title">
  4. <div class="line" />
  5. <div class="text">
  6. {{
  7. !dataForm.groupActivityId
  8. ? this.$i18n.t('groups.newJoinGroupActivity')
  9. : this.$i18n.t('groups.editGroupActivities')}}
  10. </div>
  11. </div>
  12. <el-form
  13. :model="dataForm"
  14. :rules="dataRule"
  15. ref="dataForm"
  16. label-width="auto"
  17. size="small"
  18. class="form-box"
  19. >
  20. <el-form-item
  21. :label="this.$i18n.t('groups.eventName')"
  22. prop="activityName"
  23. >
  24. <el-input
  25. :placeholder="this.$i18n.t('groups.enterEventName')"
  26. maxlength="30"
  27. show-word-limit
  28. :disabled="
  29. dataForm.activityStatus > 2 && dataForm.activityStatus != 5
  30. "
  31. v-model="dataForm.activityName"
  32. class="groupActivity-input"
  33. ></el-input>
  34. </el-form-item>
  35. <!-- <el-form-item label="关联商品"
  36. prop="activityName">
  37. <div>
  38. <el-col :span="5"
  39. v-for="(groupProd, index) in dataForm.groupProds"
  40. :key="index">
  41. <el-card :body-style="{ padding: '0px' }"
  42. style="height: 160px;width: 120px">
  43. <img :src="groupProd.pic"
  44. style="height:104px;width:100%">
  45. <div class="card-prod-bottom">
  46. <span class="card-prod-name">{{groupProd.prodName}}</span>
  47. <el-button type="text"
  48. class="card-edit-sku-button"
  49. @click="editSkuhandle(groupProd.prodId)">编辑</el-button>
  50. <el-button type="text"
  51. class="card-prod-name-button"
  52. @click="deleteProd(index)">{{$t("text.delBtn")}}</el-button>
  53. </div>
  54. </el-card>
  55. </el-col>
  56. <el-col>
  57. <el-button type="primary"
  58. plain
  59. size="mini"
  60. :style="dataForm.groupProds?'':'margin-top:160px;'"
  61. @click="selectProdHandle()">{{$t("product.select")}}</el-button>
  62. </el-col>
  63. </div>
  64. </el-form-item>-->
  65. <el-form-item
  66. ref="startTime"
  67. :label="this.$i18n.t('group.actStartTime')"
  68. prop="startTime"
  69. >
  70. <el-date-picker
  71. v-model="dataForm.startTime"
  72. :disabled="
  73. dataForm.activityStatus
  74. ? dataForm.activityStatus !== 1 && dataForm.activityStatus != 5
  75. : false
  76. "
  77. value-format="yyyy-MM-dd HH:mm:ss"
  78. type="datetime"
  79. class="date-picker groupActivity-input"
  80. :placeholder="this.$i18n.t('groups.selectEventStartTime')"
  81. ></el-date-picker>
  82. </el-form-item>
  83. <el-form-item
  84. ref="endTime"
  85. :label="this.$i18n.t('groups.eventEndTime')"
  86. prop="endTime"
  87. >
  88. <el-date-picker
  89. v-model="dataForm.endTime"
  90. :disabled="
  91. dataForm.activityStatus
  92. ? dataForm.activityStatus > 2 && dataForm.activityStatus != 5
  93. : false
  94. "
  95. value-format="yyyy-MM-dd HH:mm:ss"
  96. type="datetime"
  97. class="date-picker groupActivity-input"
  98. :placeholder="this.$i18n.t('groups.selectEventEndTime')"
  99. ></el-date-picker>
  100. </el-form-item>
  101. <!-- <el-form-item label="活动开始时间"
  102. prop="selectTime">
  103. <el-date-picker v-model="selectTime"
  104. value-format="yyyy-MM-dd HH:mm:ss"
  105. type="datetimerange"
  106. :range-separator="this.$i18n.t('time.tip')"
  107. :start-placeholder="this.$i18n.t('time.start')"
  108. :onPick="checkTimeHandle()"
  109. :end-placeholder="this.$i18n.t('time.end')">
  110. </el-date-picker>
  111. </el-form-item>-->
  112. <el-form-item
  113. :label="this.$i18n.t('group.groupNum')"
  114. prop="groupNumber"
  115. >
  116. <el-input
  117. type="number"
  118. @change="groupNumCheck"
  119. min="2"
  120. max="1000000000"
  121. v-model="dataForm.groupNumber"
  122. :disabled="
  123. dataForm.activityStatus
  124. ? dataForm.activityStatus !== 1 && dataForm.activityStatus != 5
  125. : false
  126. "
  127. class="groupActivity-input"
  128. >
  129. <template slot="append">{{ $t("groups.people") }}</template>
  130. </el-input>
  131. </el-form-item>
  132. <el-form-item
  133. :label="this.$i18n.t('groups.groupValidityPeriod')"
  134. prop="groupValidTime"
  135. >
  136. <el-input
  137. type="number"
  138. :disabled="
  139. dataForm.activityStatus
  140. ? dataForm.activityStatus !== 1 && dataForm.activityStatus != 5
  141. : false
  142. "
  143. v-model="dataForm.groupValidTime"
  144. class="groupActivity-input"
  145. onkeyup="value=value.replace(/^(0+)|[^\d]+/g,'')"
  146. >
  147. <template slot="append">{{ $t("groups.minute") }}</template>
  148. </el-input>
  149. <el-tooltip
  150. class="item"
  151. effect="dark"
  152. :content="this.$i18n.t('groups.tip4')"
  153. placement="right"
  154. >
  155. <i class="el-icon-question"></i>
  156. </el-tooltip>
  157. </el-form-item>
  158. <el-form-item
  159. :label="this.$i18n.t('groups.limitPurchase')"
  160. prop="hasMaxNum"
  161. >
  162. <el-radio-group
  163. :disabled="
  164. dataForm.activityStatus
  165. ? dataForm.activityStatus !== 1 && dataForm.activityStatus != 5
  166. : false
  167. "
  168. v-model="dataForm.hasMaxNum"
  169. >
  170. <el-radio :label="0">{{ $t("station.close") }}</el-radio>
  171. <el-radio :label="1">{{ $t("groups.turnOn") }}</el-radio>
  172. </el-radio-group>
  173. </el-form-item>
  174. <el-form-item
  175. v-if="dataForm.hasMaxNum"
  176. :label="this.$i18n.t('product.maxNum')"
  177. prop="maxNum"
  178. >
  179. <el-input
  180. type="number"
  181. v-model="dataForm.maxNum"
  182. @change="maxNumCheck"
  183. :disabled="
  184. dataForm.activityStatus
  185. ? dataForm.activityStatus !== 1 && dataForm.activityStatus != 5
  186. : false
  187. "
  188. min="1"
  189. max="100000000"
  190. class="groupActivity-input"
  191. >
  192. <template slot="append">{{ $t("groups.memberPeople") }}</template>
  193. </el-input>
  194. </el-form-item>
  195. <el-form-item
  196. :label="this.$i18n.t('groups.simulation')"
  197. prop="hasRobot"
  198. >
  199. <div>
  200. <el-radio-group
  201. :disabled="
  202. dataForm.activityStatus
  203. ? dataForm.activityStatus > 2 && dataForm.activityStatus != 5
  204. : false
  205. "
  206. v-model="dataForm.hasRobot"
  207. >
  208. <el-radio :label="0">{{ $t("station.close") }}</el-radio>
  209. <el-radio :label="1">{{ $t("groups.turnOn") }}</el-radio>
  210. </el-radio-group>
  211. <div class="auxiliary-font">
  212. <span>{{ $t("groups.tip5") }} </span>
  213. </div>
  214. </div>
  215. </el-form-item>
  216. <el-form-item
  217. :label="this.$i18n.t('groups.groupLeaderOffer')"
  218. prop="hasLeaderPrice"
  219. >
  220. <el-radio-group
  221. :disabled="
  222. dataForm.activityStatus
  223. ? dataForm.activityStatus !== 1 && dataForm.activityStatus != 5
  224. : false
  225. "
  226. v-model="dataForm.hasLeaderPrice"
  227. >
  228. <el-radio :label="0">{{ $t("station.close") }}</el-radio>
  229. <el-radio :label="1">{{ $t("groups.turnOn") }}</el-radio>
  230. </el-radio-group>
  231. <div class="auxiliary-font">{{ $t("groups.tip6") }}</div>
  232. <div class="auxiliary-font font-color-red">
  233. {{ $t("groups.tip7") }}
  234. </div>
  235. </el-form-item>
  236. <el-form-item
  237. :label="this.$i18n.t('groups.groupMode')"
  238. prop="hasGroupTip"
  239. >
  240. <el-radio-group
  241. :disabled="
  242. dataForm.activityStatus
  243. ? dataForm.activityStatus > 2 && dataForm.activityStatus != 5
  244. : false
  245. "
  246. v-model="dataForm.hasGroupTip"
  247. >
  248. <el-radio :label="0">{{ $t("station.close") }}</el-radio>
  249. <el-radio :label="1">{{ $t("groups.turnOn") }}</el-radio>
  250. </el-radio-group>
  251. <div class="auxiliary-font">{{ $t("groups.tip8") }}</div>
  252. </el-form-item>
  253. <el-form-item
  254. :label="this.$i18n.t('groups.activityWarmUp')"
  255. prop="isPreheat"
  256. >
  257. <el-radio-group
  258. :disabled="(dataForm.activityStatus
  259. ? dataForm.activityStatus !== 1 && dataForm.activityStatus != 5
  260. : false) || showEventPreview"
  261. v-model="dataForm.isPreheat"
  262. >
  263. <el-radio :label="0">{{ $t("station.close") }}</el-radio>
  264. <el-radio :label="1">{{ $t("groups.turnOn") }}</el-radio>
  265. </el-radio-group>
  266. <div class="auxiliary-font">{{ $t("groups.tip9") }}</div>
  267. </el-form-item>
  268. <el-form-item>
  269. <div class="default-btn" @click="back()" size="mini">{{
  270. $t("shopFeature.edit.back")
  271. }}</div>
  272. <div v-if="dataForm.status !== 0 && dataForm.status !== 5" class="default-btn primary-btn" type="primary" size="mini" @click="dataFormSubmit()">{{
  273. $t("groups.submit")
  274. }}</div>
  275. <div v-if="dataForm.status !== 0 && dataForm.status !== 5" class="default-btn primary-btn" type="primary" size="mini" @click="submitAndManageProds()">{{
  276. $t("groups.submitAndProducts")
  277. }}</div>
  278. </el-form-item>
  279. </el-form>
  280. <!-- 商品选择弹窗 测试完之后添加这个链接 dataUrl='/group/prod/getNotGroupProdPage'-->
  281. <prods-select
  282. v-if="groupSelectProdVisible"
  283. ref="ProdsSelect"
  284. @refreshSelectProds="selectGroupProds"
  285. ></prods-select>
  286. </div>
  287. </template>
  288. <script>
  289. import ProdsSelect from '@/components/prods-select'
  290. import { Debounce } from '@/utils/debounce'
  291. export default {
  292. name: 'newGroupActivity',
  293. data () {
  294. var validateTime = (rule, value, callback) => {
  295. if (Date.parse(this.dataForm.startTime) < Date.parse(new Date())) {
  296. this.showEventPreview = true
  297. } else {
  298. this.showEventPreview = false
  299. }
  300. // if (!this.dataForm.groupActivityId && rule.field === 'startTime' && new Date() > Date.parse(value)) {
  301. // callback(new Error(this.$i18n.t('groups.activityTimeTime')))
  302. // }
  303. if (this.dataForm.status !== 5 && rule.field === 'endTime' && new Date() > Date.parse(value)) {
  304. // callback(new Error(this.$i18n.t('groups.endTime')))
  305. callback()
  306. }
  307. if (Date.parse(this.dataForm.startTime) >= Date.parse(this.dataForm.endTime)) {
  308. // callback(new Error(this.$i18n.t('groups.endTimeIsTooSmall')))
  309. callback()
  310. } else if (this.dataForm.status === 1 && this.dataForm.groupActivityId && Date.parse(this.validEndTime) > Date.parse(this.dataForm.endTime)) {
  311. // callback(new Error(this.$i18n.t('groups.extendedEndTime')))
  312. callback()
  313. } else {
  314. callback()
  315. }
  316. }
  317. var validateGroupNumber = (rule, value, callback) => {
  318. if (this.dataForm.groupNumber < 2) {
  319. callback(new Error(this.$i18n.t('groups.tip1')))
  320. } else {
  321. callback()
  322. }
  323. }
  324. var validateactivityName = (rule, value, callback) => {
  325. if (!this.dataForm.activityName.trim()) {
  326. callback(new Error(this.$i18n.t('groups.pleaseEnterEventName')))
  327. } else {
  328. callback()
  329. }
  330. }
  331. var validateGroupValidTime = (rule, value, callback) => {
  332. if (this.dataForm.groupValidTime < 15) {
  333. callback(new Error(this.$i18n.t('groups.tip2')))
  334. } else if (this.dataForm.groupValidTime > 48 * 60) {
  335. callback(new Error(this.$i18n.t('groups.tip3')))
  336. } else {
  337. callback()
  338. }
  339. }
  340. return {
  341. showEventPreview: false,
  342. groupSelectProdVisible: false,
  343. roleList: [],
  344. selectTime: [],
  345. // dialogWidth:'895px',
  346. dataForm: {
  347. groupActivityId: null,
  348. shopId: null,
  349. activityName: null,
  350. status: null,
  351. startTime: null,
  352. endTime: null,
  353. groupValidTime: null,
  354. groupNumber: null,
  355. hasMaxNum: 0,
  356. maxNum: null,
  357. hasRobot: 0,
  358. hasLeaderPrice: 0,
  359. isPreheat: 0,
  360. hasGroupTip: 0,
  361. groupOrderCount: null,
  362. groupNumberCount: null,
  363. createTime: null,
  364. updateTime: null,
  365. groupProds: [],
  366. validEndTime: []
  367. },
  368. isSubmit: false,
  369. groupProdAndSkuLists: [],
  370. dataRule: {
  371. activityName: [
  372. { required: true, message: this.$i18n.t('groups.pleaseEnterEventName'), trigger: 'blur' },
  373. { validator: validateactivityName, trigger: 'blur' }
  374. ],
  375. maxNum: [
  376. { required: true, message: this.$i18n.t('groups.pleaseEnterEventNum'), trigger: 'blur' }
  377. ],
  378. groupNumber: [
  379. { required: true, message: this.$i18n.t('groups.pleaseEnteNumGrp'), trigger: 'blur' },
  380. { validator: validateGroupNumber, trigger: 'blur' }
  381. ],
  382. groupValidTime: [
  383. { required: true, message: this.$i18n.t('groups.pleaseEnterTimeGroup'), trigger: 'blur' },
  384. { validator: validateGroupValidTime, trigger: 'blur' }
  385. ],
  386. startTime: [
  387. { required: true, message: this.$i18n.t('groups.startTimeCannotBeEmpty'), trigger: 'blur' },
  388. { validator: validateTime, trigger: 'blur' }
  389. ],
  390. endTime: [
  391. { required: true, message: this.$i18n.t('groups.endTimeCannotBeEmpty'), trigger: 'blur' },
  392. { validator: validateTime, trigger: 'blur' }
  393. ]
  394. }
  395. }
  396. },
  397. watch: {
  398. newStartTime (newVal, oldVal) {
  399. this.$refs.endTime.clearValidate('endTime')
  400. },
  401. newEndTime (newVal, oldVal) {
  402. this.$refs.startTime.clearValidate('startTime')
  403. }
  404. },
  405. computed: {
  406. newStartTime: function () {
  407. return JSON.parse(JSON.stringify(this.dataForm.startTime))
  408. },
  409. newEndTime: function () {
  410. return JSON.parse(JSON.stringify(this.dataForm.endTime))
  411. }
  412. },
  413. components: {
  414. ProdsSelect
  415. },
  416. mounted () {
  417. this.init()
  418. },
  419. methods: {
  420. init () {
  421. this.dataForm.groupActivityId = this.$route.query.groupActivityId || null
  422. let navTitles = JSON.parse(JSON.stringify(this.$store.state.common.selectMenu))
  423. let title = !this.$route.query.groupActivityId ? this.$i18n.t('groups.newJoinGroupActivity') : this.$i18n.t('groups.editGroupActivities')
  424. navTitles.splice(navTitles.length - 1, 1, title)
  425. this.$store.commit('common/updateSelectMenu', navTitles)
  426. this.dataForm.activityStatus = null
  427. this.isSubmit = false
  428. this.$refs['dataForm'].resetFields()
  429. if (this.dataForm.groupActivityId) {
  430. this.$http({
  431. url: this.$http.adornUrl('/group/activity/info/' + this.dataForm.groupActivityId),
  432. method: 'get',
  433. params: this.$http.adornParams()
  434. }).then(({ data }) => {
  435. if (Date.parse(data.startTime) < Date.parse(new Date())) {
  436. this.showEventPreview = true
  437. } else {
  438. this.showEventPreview = false
  439. }
  440. this.dataForm = data
  441. this.validEndTime = data.endTime
  442. })
  443. }
  444. },
  445. // 表单提交
  446. dataFormSubmit: Debounce(function () {
  447. this.$refs['dataForm'].validate((valid) => {
  448. if (valid) {
  449. if (this.isSubmit) {
  450. return false
  451. }
  452. this.isSubmit = true
  453. this.$http({
  454. url: this.$http.adornUrl('/group/activity'),
  455. method: this.dataForm.groupActivityId ? 'put' : 'post',
  456. data: this.$http.adornData(this.dataForm)
  457. }).then(({ data }) => {
  458. this.selectTime = []
  459. this.$message({
  460. message: this.$i18n.t('publics.operation'),
  461. type: 'success',
  462. duration: 1500,
  463. onClose: () => {
  464. this.back()
  465. this.isSubmit = false
  466. }
  467. })
  468. }).catch((e) => {
  469. this.isSubmit = false
  470. })
  471. }
  472. })
  473. }),
  474. // 选择商品操作
  475. selectProdHandle () {
  476. this.groupSelectProdVisible = true
  477. this.$nextTick(() => {
  478. this.$refs.ProdsSelect.init(this.dataForm.groupProds)
  479. })
  480. },
  481. // 选商品回调
  482. selectGroupProds (prods) {
  483. if (prods) {
  484. let prodIds = []
  485. this.dataForm.groupProds = prods
  486. for (let index = 0; index < prods.length; index++) {
  487. prodIds.push(prods[index].prodId)
  488. }
  489. this.getProdAndSkuListsByProdIds(prodIds)
  490. prodIds = []
  491. }
  492. },
  493. groupNumCheck () {
  494. var maxNum = Math.round(this.dataForm.groupNumber)
  495. if (!maxNum) {
  496. maxNum = 2
  497. } else if (maxNum < 2) {
  498. maxNum = 2
  499. } else if (maxNum > 500) {
  500. maxNum = 500
  501. }
  502. this.dataForm.groupNumber = maxNum
  503. },
  504. maxNumCheck () {
  505. var maxNum = Math.round(this.dataForm.maxNum)
  506. if (!maxNum) {
  507. maxNum = 1
  508. } else if (maxNum < 1) {
  509. maxNum = 1
  510. } else if (maxNum > 1000000000) {
  511. maxNum = 1000000000
  512. }
  513. this.dataForm.maxNum = maxNum
  514. },
  515. // 通过商品id列表,查询所有的对应的sku列表
  516. getProdAndSkuListsByProdIds (prodIds) {
  517. if (prodIds) {
  518. this.$http({
  519. url: this.$http.adornUrl('/group/activity/getProdAndSkuLists?prodIds=' + prodIds),
  520. method: 'get',
  521. params: {}
  522. }).then(({ data }) => {
  523. this.groupProdAndSkuLists = data
  524. })
  525. }
  526. },
  527. // 删除活动商品
  528. deleteProd (index) {
  529. this.dataForm.groupProds.splice(index, 1)
  530. },
  531. // 提交并管理活动商品
  532. submitAndManageProds: Debounce(function () {
  533. this.$refs['dataForm'].validate((valid) => {
  534. if (valid) {
  535. if (this.isSubmit) {
  536. return false
  537. }
  538. this.isSubmit = true
  539. this.$http({
  540. url: this.$http.adornUrl('/group/activity'),
  541. method: this.dataForm.groupActivityId ? 'put' : 'post',
  542. data: this.$http.adornData(this.dataForm)
  543. }).then(({ data }) => {
  544. this.$message({
  545. message: this.$i18n.t('publics.operation'),
  546. type: 'success',
  547. duration: 1500,
  548. onClose: () => {
  549. this.back()
  550. if (!this.dataForm.groupActivityId) {
  551. this.dataForm.groupActivityId = data
  552. }
  553. this.isSubmit = false
  554. this.$router.push({
  555. path: '/group-groupProd',
  556. query: { activityId: this.dataForm.groupActivityId }
  557. })
  558. }
  559. })
  560. }).catch(() => {
  561. this.isSubmit = false
  562. })
  563. }
  564. })
  565. }),
  566. back () {
  567. this.$router.push({
  568. name: 'group-groupActivity'
  569. })
  570. }
  571. }
  572. }
  573. </script>
  574. <style lang="scss">
  575. .mod-groupActivity {
  576. .date-picker {
  577. width: 60%;
  578. }
  579. .groupActivity-input {
  580. width: 60%;
  581. }
  582. .auxiliary-font {
  583. font-size: 12px;
  584. color: #cbc0cb;
  585. line-height: 20px;
  586. }
  587. .font-color-red {
  588. color: crimson;
  589. }
  590. .groupActivity-input {
  591. width: 524px;
  592. }
  593. .form-box {
  594. margin-left: 30px;
  595. }
  596. }
  597. </style>